Skip to content

Commit 9f8e257

Browse files
authored
Fix canonical vtable (#2118)
1 parent c50a5ee commit 9f8e257

File tree

28 files changed

+213
-175
lines changed

28 files changed

+213
-175
lines changed

encodings/alp/src/alp/array.rs

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -8,11 +8,11 @@ use vortex_array::validity::ArrayValidity;
88
use vortex_array::variants::PrimitiveArrayTrait;
99
use vortex_array::visitor::ArrayVisitor;
1010
use vortex_array::vtable::{
11-
StatisticsVTable, ValidateVTable, ValidityVTable, VariantsVTable, VisitorVTable,
11+
CanonicalVTable, StatisticsVTable, ValidateVTable, ValidityVTable, VariantsVTable,
12+
VisitorVTable,
1213
};
1314
use vortex_array::{
14-
impl_encoding, ArrayDType, ArrayData, ArrayLen, Canonical, IntoArrayData, IntoCanonical,
15-
SerdeMetadata,
15+
impl_encoding, ArrayDType, ArrayData, ArrayLen, Canonical, IntoArrayData, SerdeMetadata,
1616
};
1717
use vortex_dtype::{DType, PType};
1818
use vortex_error::{vortex_bail, vortex_panic, VortexExpect as _, VortexResult};
@@ -131,9 +131,9 @@ impl ValidityVTable<ALPArray> for ALPEncoding {
131131
}
132132
}
133133

134-
impl IntoCanonical for ALPArray {
135-
fn into_canonical(self) -> VortexResult<Canonical> {
136-
decompress(self).map(Canonical::Primitive)
134+
impl CanonicalVTable<ALPArray> for ALPEncoding {
135+
fn into_canonical(&self, array: ALPArray) -> VortexResult<Canonical> {
136+
decompress(array).map(Canonical::Primitive)
137137
}
138138
}
139139

encodings/alp/src/alp_rd/array.rs

Lines changed: 15 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,9 @@ use vortex_array::patches::{Patches, PatchesMetadata};
77
use vortex_array::stats::StatsSet;
88
use vortex_array::validity::{ArrayValidity, Validity};
99
use vortex_array::visitor::ArrayVisitor;
10-
use vortex_array::vtable::{StatisticsVTable, ValidateVTable, ValidityVTable, VisitorVTable};
10+
use vortex_array::vtable::{
11+
CanonicalVTable, StatisticsVTable, ValidateVTable, ValidityVTable, VisitorVTable,
12+
};
1113
use vortex_array::{
1214
impl_encoding, ArrayDType, ArrayData, ArrayLen, Canonical, IntoCanonical, SerdeMetadata,
1315
};
@@ -194,35 +196,35 @@ impl ALPRDArray {
194196
}
195197
}
196198

197-
impl IntoCanonical for ALPRDArray {
198-
fn into_canonical(self) -> VortexResult<Canonical> {
199-
let left_parts = self.left_parts().into_canonical()?.into_primitive()?;
200-
let right_parts = self.right_parts().into_canonical()?.into_primitive()?;
199+
impl CanonicalVTable<ALPRDArray> for ALPRDEncoding {
200+
fn into_canonical(&self, array: ALPRDArray) -> VortexResult<Canonical> {
201+
let left_parts = array.left_parts().into_canonical()?.into_primitive()?;
202+
let right_parts = array.right_parts().into_canonical()?.into_primitive()?;
201203

202204
// Decode the left_parts using our builtin dictionary.
203-
let left_parts_dict = &self.metadata().dict[0..self.metadata().dict_len as usize];
205+
let left_parts_dict = &array.metadata().dict[0..array.metadata().dict_len as usize];
204206

205-
let decoded_array = if self.is_f32() {
207+
let decoded_array = if array.is_f32() {
206208
PrimitiveArray::new(
207209
alp_rd_decode::<f32>(
208210
left_parts.into_buffer::<u16>(),
209211
left_parts_dict,
210-
self.metadata().right_bit_width,
212+
array.metadata().right_bit_width,
211213
right_parts.into_buffer_mut::<u32>(),
212-
self.left_parts_patches(),
214+
array.left_parts_patches(),
213215
)?,
214-
Validity::from_mask(self.logical_validity()?, self.dtype().nullability()),
216+
Validity::from_mask(array.logical_validity()?, array.dtype().nullability()),
215217
)
216218
} else {
217219
PrimitiveArray::new(
218220
alp_rd_decode::<f64>(
219221
left_parts.into_buffer::<u16>(),
220222
left_parts_dict,
221-
self.metadata().right_bit_width,
223+
array.metadata().right_bit_width,
222224
right_parts.into_buffer_mut::<u64>(),
223-
self.left_parts_patches(),
225+
array.left_parts_patches(),
224226
)?,
225-
Validity::from_mask(self.logical_validity()?, self.dtype().nullability()),
227+
Validity::from_mask(array.logical_validity()?, array.dtype().nullability()),
226228
)
227229
};
228230

encodings/bytebool/src/array.rs

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,10 @@ use vortex_array::stats::StatsSet;
88
use vortex_array::validity::{Validity, ValidityMetadata};
99
use vortex_array::variants::BoolArrayTrait;
1010
use vortex_array::visitor::ArrayVisitor;
11-
use vortex_array::vtable::{ValidateVTable, ValidityVTable, VariantsVTable, VisitorVTable};
12-
use vortex_array::{impl_encoding, ArrayLen, Canonical, IntoCanonical, SerdeMetadata};
11+
use vortex_array::vtable::{
12+
CanonicalVTable, ValidateVTable, ValidityVTable, VariantsVTable, VisitorVTable,
13+
};
14+
use vortex_array::{impl_encoding, ArrayLen, Canonical, SerdeMetadata};
1315
use vortex_buffer::ByteBuffer;
1416
use vortex_dtype::DType;
1517
use vortex_error::{VortexExpect as _, VortexResult};
@@ -100,10 +102,10 @@ impl From<Vec<Option<bool>>> for ByteBoolArray {
100102
}
101103
}
102104

103-
impl IntoCanonical for ByteBoolArray {
104-
fn into_canonical(self) -> VortexResult<Canonical> {
105-
let boolean_buffer = BooleanBuffer::from(self.as_slice());
106-
let validity = self.validity();
105+
impl CanonicalVTable<ByteBoolArray> for ByteBoolEncoding {
106+
fn into_canonical(&self, array: ByteBoolArray) -> VortexResult<Canonical> {
107+
let boolean_buffer = BooleanBuffer::from(array.as_slice());
108+
let validity = array.validity();
107109

108110
Ok(Canonical::Bool(BoolArray::try_new(
109111
boolean_buffer,

encodings/datetime-parts/src/canonical.rs

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,19 @@
11
use vortex_array::array::{PrimitiveArray, TemporalArray};
22
use vortex_array::compute::try_cast;
3-
use vortex_array::{
4-
ArrayDType, Canonical, IntoArrayData as _, IntoArrayVariant as _, IntoCanonical,
5-
};
3+
use vortex_array::vtable::CanonicalVTable;
4+
use vortex_array::{ArrayDType, Canonical, IntoArrayData as _, IntoArrayVariant as _};
65
use vortex_buffer::BufferMut;
76
use vortex_datetime_dtype::{TemporalMetadata, TimeUnit};
87
use vortex_dtype::Nullability::NonNullable;
98
use vortex_dtype::{DType, PType};
109
use vortex_error::{vortex_bail, VortexExpect as _, VortexResult};
1110
use vortex_scalar::PrimitiveScalar;
1211

13-
use crate::DateTimePartsArray;
12+
use crate::{DateTimePartsArray, DateTimePartsEncoding};
1413

15-
impl IntoCanonical for DateTimePartsArray {
16-
fn into_canonical(self) -> VortexResult<Canonical> {
17-
Ok(Canonical::Extension(decode_to_temporal(&self)?.into()))
14+
impl CanonicalVTable<DateTimePartsArray> for DateTimePartsEncoding {
15+
fn into_canonical(&self, array: DateTimePartsArray) -> VortexResult<Canonical> {
16+
Ok(Canonical::Extension(decode_to_temporal(&array)?.into()))
1817
}
1918
}
2019

encodings/dict/src/array.rs

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ use vortex_array::stats::StatsSet;
88
use vortex_array::validity::ArrayValidity;
99
use vortex_array::variants::PrimitiveArrayTrait;
1010
use vortex_array::visitor::ArrayVisitor;
11-
use vortex_array::vtable::{ValidateVTable, ValidityVTable, VisitorVTable};
11+
use vortex_array::vtable::{CanonicalVTable, ValidateVTable, ValidityVTable, VisitorVTable};
1212
use vortex_array::{
1313
impl_encoding, ArrayDType, ArrayData, ArrayLen, Canonical, IntoArrayVariant, IntoCanonical,
1414
SerdeMetadata,
@@ -61,19 +61,19 @@ impl DictArray {
6161

6262
impl ValidateVTable<DictArray> for DictEncoding {}
6363

64-
impl IntoCanonical for DictArray {
65-
fn into_canonical(self) -> VortexResult<Canonical> {
66-
match self.dtype() {
64+
impl CanonicalVTable<DictArray> for DictEncoding {
65+
fn into_canonical(&self, array: DictArray) -> VortexResult<Canonical> {
66+
match array.dtype() {
6767
// NOTE: Utf8 and Binary will decompress into VarBinViewArray, which requires a full
6868
// decompression to construct the views child array.
6969
// For this case, it is *always* faster to decompress the values first and then create
7070
// copies of the view pointers.
7171
DType::Utf8(_) | DType::Binary(_) => {
72-
let canonical_values: ArrayData = self.values().into_canonical()?.into();
73-
take(canonical_values, self.codes())?.into_canonical()
72+
let canonical_values: ArrayData = array.values().into_canonical()?.into();
73+
take(canonical_values, array.codes())?.into_canonical()
7474
}
7575
// Non-string case: take and then canonicalize
76-
_ => take(self.values(), self.codes())?.into_canonical(),
76+
_ => take(array.values(), array.codes())?.into_canonical(),
7777
}
7878
}
7979
}

encodings/fastlanes/src/bitpacking/mod.rs

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -10,11 +10,10 @@ use vortex_array::validity::{Validity, ValidityMetadata};
1010
use vortex_array::variants::PrimitiveArrayTrait;
1111
use vortex_array::visitor::ArrayVisitor;
1212
use vortex_array::vtable::{
13-
StatisticsVTable, ValidateVTable, ValidityVTable, VariantsVTable, VisitorVTable,
14-
};
15-
use vortex_array::{
16-
impl_encoding, ArrayDType, ArrayData, ArrayLen, Canonical, IntoCanonical, RkyvMetadata,
13+
CanonicalVTable, StatisticsVTable, ValidateVTable, ValidityVTable, VariantsVTable,
14+
VisitorVTable,
1715
};
16+
use vortex_array::{impl_encoding, ArrayDType, ArrayData, ArrayLen, Canonical, RkyvMetadata};
1817
use vortex_buffer::ByteBuffer;
1918
use vortex_dtype::{DType, NativePType, PType};
2019
use vortex_error::{vortex_bail, vortex_err, VortexExpect as _, VortexResult};
@@ -254,9 +253,9 @@ impl BitPackedArray {
254253
}
255254
}
256255

257-
impl IntoCanonical for BitPackedArray {
258-
fn into_canonical(self) -> VortexResult<Canonical> {
259-
unpack(self).map(Canonical::Primitive)
256+
impl CanonicalVTable<BitPackedArray> for BitPackedEncoding {
257+
fn into_canonical(&self, array: BitPackedArray) -> VortexResult<Canonical> {
258+
unpack(array).map(Canonical::Primitive)
260259
}
261260
}
262261

encodings/fastlanes/src/delta/mod.rs

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -8,11 +8,11 @@ use vortex_array::validity::{Validity, ValidityMetadata};
88
use vortex_array::variants::PrimitiveArrayTrait;
99
use vortex_array::visitor::ArrayVisitor;
1010
use vortex_array::vtable::{
11-
StatisticsVTable, ValidateVTable, ValidityVTable, VariantsVTable, VisitorVTable,
11+
CanonicalVTable, StatisticsVTable, ValidateVTable, ValidityVTable, VariantsVTable,
12+
VisitorVTable,
1213
};
1314
use vortex_array::{
14-
impl_encoding, ArrayDType, ArrayData, ArrayLen, Canonical, IntoArrayData, IntoCanonical,
15-
RkyvMetadata,
15+
impl_encoding, ArrayDType, ArrayData, ArrayLen, Canonical, IntoArrayData, RkyvMetadata,
1616
};
1717
use vortex_buffer::Buffer;
1818
use vortex_dtype::{match_each_unsigned_integer_ptype, NativePType};
@@ -235,9 +235,9 @@ impl VariantsVTable<DeltaArray> for DeltaEncoding {
235235

236236
impl PrimitiveArrayTrait for DeltaArray {}
237237

238-
impl IntoCanonical for DeltaArray {
239-
fn into_canonical(self) -> VortexResult<Canonical> {
240-
delta_decompress(self).map(Canonical::Primitive)
238+
impl CanonicalVTable<DeltaArray> for DeltaEncoding {
239+
fn into_canonical(&self, array: DeltaArray) -> VortexResult<Canonical> {
240+
delta_decompress(array).map(Canonical::Primitive)
241241
}
242242
}
243243

encodings/fastlanes/src/for/mod.rs

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -8,11 +8,10 @@ use vortex_array::validity::ArrayValidity;
88
use vortex_array::variants::PrimitiveArrayTrait;
99
use vortex_array::visitor::ArrayVisitor;
1010
use vortex_array::vtable::{
11-
StatisticsVTable, ValidateVTable, ValidityVTable, VariantsVTable, VisitorVTable,
12-
};
13-
use vortex_array::{
14-
impl_encoding, ArrayDType, ArrayData, ArrayLen, Canonical, IntoCanonical, SerdeMetadata,
11+
CanonicalVTable, StatisticsVTable, ValidateVTable, ValidityVTable, VariantsVTable,
12+
VisitorVTable,
1513
};
14+
use vortex_array::{impl_encoding, ArrayDType, ArrayData, ArrayLen, Canonical, SerdeMetadata};
1615
use vortex_dtype::DType;
1716
use vortex_error::{vortex_bail, VortexExpect as _, VortexResult};
1817
use vortex_mask::Mask;
@@ -103,9 +102,9 @@ impl ValidityVTable<FoRArray> for FoREncoding {
103102
}
104103
}
105104

106-
impl IntoCanonical for FoRArray {
107-
fn into_canonical(self) -> VortexResult<Canonical> {
108-
decompress(self).map(Canonical::Primitive)
105+
impl CanonicalVTable<FoRArray> for FoREncoding {
106+
fn into_canonical(&self, array: FoRArray) -> VortexResult<Canonical> {
107+
decompress(array).map(Canonical::Primitive)
109108
}
110109
}
111110

encodings/fsst/src/canonical.rs

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,17 @@
11
use arrow_array::builder::make_view;
22
use vortex_array::array::{BinaryView, VarBinArray, VarBinViewArray};
33
use vortex_array::variants::PrimitiveArrayTrait;
4+
use vortex_array::vtable::CanonicalVTable;
45
use vortex_array::{ArrayDType, ArrayLen, Canonical, IntoCanonical};
56
use vortex_buffer::{BufferMut, ByteBuffer};
67
use vortex_dtype::match_each_integer_ptype;
78
use vortex_error::VortexResult;
89

9-
use crate::FSSTArray;
10+
use crate::{FSSTArray, FSSTEncoding};
1011

11-
impl IntoCanonical for FSSTArray {
12-
fn into_canonical(self) -> VortexResult<Canonical> {
13-
self.with_decompressor(|decompressor| {
12+
impl CanonicalVTable<FSSTArray> for FSSTEncoding {
13+
fn into_canonical(&self, array: FSSTArray) -> VortexResult<Canonical> {
14+
array.with_decompressor(|decompressor| {
1415
// FSSTArray has two child arrays:
1516
//
1617
// 1. A VarBinArray, which holds the string heap of the compressed codes.
@@ -21,12 +22,12 @@ impl IntoCanonical for FSSTArray {
2122
// call. We then turn our uncompressed_lengths into an offsets buffer
2223
// necessary for a VarBinViewArray and construct the canonical array.
2324

24-
let bytes = VarBinArray::try_from(self.codes())?.sliced_bytes();
25+
let bytes = VarBinArray::try_from(array.codes())?.sliced_bytes();
2526

2627
// Bulk-decompress the entire array.
2728
let uncompressed_bytes = decompressor.decompress(bytes.as_slice());
2829

29-
let uncompressed_lens_array = self
30+
let uncompressed_lens_array = array
3031
.uncompressed_lengths()
3132
.into_canonical()?
3233
.into_primitive()?;
@@ -55,8 +56,8 @@ impl IntoCanonical for FSSTArray {
5556
VarBinViewArray::try_new(
5657
views,
5758
vec![uncompressed_bytes_array],
58-
self.dtype().clone(),
59-
self.validity(),
59+
array.dtype().clone(),
60+
array.validity(),
6061
)
6162
.map(Canonical::VarBinView)
6263
})

encodings/runend/src/array.rs

Lines changed: 12 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -10,10 +10,12 @@ use vortex_array::stats::{ArrayStatistics, StatsSet};
1010
use vortex_array::validity::ArrayValidity;
1111
use vortex_array::variants::{BoolArrayTrait, PrimitiveArrayTrait};
1212
use vortex_array::visitor::ArrayVisitor;
13-
use vortex_array::vtable::{ValidateVTable, ValidityVTable, VariantsVTable, VisitorVTable};
13+
use vortex_array::vtable::{
14+
CanonicalVTable, ValidateVTable, ValidityVTable, VariantsVTable, VisitorVTable,
15+
};
1416
use vortex_array::{
1517
impl_encoding, ArrayDType, ArrayData, ArrayLen, Canonical, IntoArrayData, IntoArrayVariant,
16-
IntoCanonical, SerdeMetadata,
18+
SerdeMetadata,
1719
};
1820
use vortex_buffer::Buffer;
1921
use vortex_dtype::{DType, PType};
@@ -200,17 +202,17 @@ impl ValidityVTable<RunEndArray> for RunEndEncoding {
200202
}
201203
}
202204

203-
impl IntoCanonical for RunEndArray {
204-
fn into_canonical(self) -> VortexResult<Canonical> {
205-
let pends = self.ends().into_primitive()?;
206-
match self.dtype() {
205+
impl CanonicalVTable<RunEndArray> for RunEndEncoding {
206+
fn into_canonical(&self, array: RunEndArray) -> VortexResult<Canonical> {
207+
let pends = array.ends().into_primitive()?;
208+
match array.dtype() {
207209
DType::Bool(_) => {
208-
let bools = self.values().into_bool()?;
209-
runend_decode_bools(pends, bools, self.offset(), self.len()).map(Canonical::Bool)
210+
let bools = array.values().into_bool()?;
211+
runend_decode_bools(pends, bools, array.offset(), array.len()).map(Canonical::Bool)
210212
}
211213
DType::Primitive(..) => {
212-
let pvalues = self.values().into_primitive()?;
213-
runend_decode_primitive(pends, pvalues, self.offset(), self.len())
214+
let pvalues = array.values().into_primitive()?;
215+
runend_decode_primitive(pends, pvalues, array.offset(), array.len())
214216
.map(Canonical::Primitive)
215217
}
216218
_ => vortex_bail!("Only Primitive and Bool values are supported"),

0 commit comments

Comments
 (0)