Skip to content

Commit 8c8dac0

Browse files
authored
Zigzag encode/decode reuses the underlying data vec (#1638)
1 parent 02b1ef3 commit 8c8dac0

File tree

1 file changed

+13
-16
lines changed

1 file changed

+13
-16
lines changed

encodings/zigzag/src/compress.rs

Lines changed: 13 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11
use vortex_array::array::PrimitiveArray;
2-
use vortex_array::stats::ArrayStatistics as _;
32
use vortex_array::validity::Validity;
43
use vortex_array::variants::PrimitiveArrayTrait;
54
use vortex_array::IntoArrayData;
@@ -12,37 +11,35 @@ use crate::ZigZagArray;
1211
pub fn zigzag_encode(parray: PrimitiveArray) -> VortexResult<ZigZagArray> {
1312
let validity = parray.validity();
1413
let encoded = match parray.ptype() {
15-
PType::I8 => zigzag_encode_primitive::<i8>(parray.maybe_null_slice(), validity),
16-
PType::I16 => zigzag_encode_primitive::<i16>(parray.maybe_null_slice(), validity),
17-
PType::I32 => zigzag_encode_primitive::<i32>(parray.maybe_null_slice(), validity),
18-
PType::I64 => zigzag_encode_primitive::<i64>(parray.maybe_null_slice(), validity),
14+
PType::I8 => zigzag_encode_primitive::<i8>(parray.into_maybe_null_slice(), validity),
15+
PType::I16 => zigzag_encode_primitive::<i16>(parray.into_maybe_null_slice(), validity),
16+
PType::I32 => zigzag_encode_primitive::<i32>(parray.into_maybe_null_slice(), validity),
17+
PType::I64 => zigzag_encode_primitive::<i64>(parray.into_maybe_null_slice(), validity),
1918
_ => vortex_bail!(
2019
"ZigZag can only encode signed integers, got {}",
2120
parray.ptype()
2221
),
2322
};
24-
let zz = ZigZagArray::try_new(encoded.into_array())?;
25-
zz.inherit_statistics(parray.statistics());
26-
Ok(zz)
23+
ZigZagArray::try_new(encoded.into_array())
2724
}
2825

2926
fn zigzag_encode_primitive<T: ExternalZigZag + NativePType>(
30-
values: &[T],
27+
values: Vec<T>,
3128
validity: Validity,
3229
) -> PrimitiveArray
3330
where
3431
<T as ExternalZigZag>::UInt: NativePType,
3532
{
36-
PrimitiveArray::from_vec(values.iter().map(|v| T::encode(*v)).collect(), validity)
33+
PrimitiveArray::from_vec(values.into_iter().map(T::encode).collect(), validity)
3734
}
3835

3936
pub fn zigzag_decode(parray: PrimitiveArray) -> VortexResult<PrimitiveArray> {
4037
let validity = parray.validity();
4138
let decoded = match parray.ptype() {
42-
PType::U8 => zigzag_decode_primitive::<i8>(parray.maybe_null_slice(), validity),
43-
PType::U16 => zigzag_decode_primitive::<i16>(parray.maybe_null_slice(), validity),
44-
PType::U32 => zigzag_decode_primitive::<i32>(parray.maybe_null_slice(), validity),
45-
PType::U64 => zigzag_decode_primitive::<i64>(parray.maybe_null_slice(), validity),
39+
PType::U8 => zigzag_decode_primitive::<i8>(parray.into_maybe_null_slice(), validity),
40+
PType::U16 => zigzag_decode_primitive::<i16>(parray.into_maybe_null_slice(), validity),
41+
PType::U32 => zigzag_decode_primitive::<i32>(parray.into_maybe_null_slice(), validity),
42+
PType::U64 => zigzag_decode_primitive::<i64>(parray.into_maybe_null_slice(), validity),
4643
_ => vortex_bail!(
4744
"ZigZag can only decode unsigned integers, got {}",
4845
parray.ptype()
@@ -52,13 +49,13 @@ pub fn zigzag_decode(parray: PrimitiveArray) -> VortexResult<PrimitiveArray> {
5249
}
5350

5451
fn zigzag_decode_primitive<T: ExternalZigZag + NativePType>(
55-
values: &[T::UInt],
52+
values: Vec<T::UInt>,
5653
validity: Validity,
5754
) -> PrimitiveArray
5855
where
5956
<T as ExternalZigZag>::UInt: NativePType,
6057
{
61-
PrimitiveArray::from_vec(values.iter().map(|v| T::decode(*v)).collect(), validity)
58+
PrimitiveArray::from_vec(values.into_iter().map(T::decode).collect(), validity)
6259
}
6360

6461
#[cfg(test)]

0 commit comments

Comments
 (0)