Skip to content

Commit 8afdff1

Browse files
AdamGSrobert3005
andauthored
Canonicalize constant array with extension dtype (#1322)
also `storage_array` -> `storage_data` seems appropriate. --------- Co-authored-by: Robert Kruszewski <[email protected]>
1 parent afe973f commit 8afdff1

File tree

7 files changed

+24
-11
lines changed

7 files changed

+24
-11
lines changed

encodings/datetime-parts/src/array.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -122,7 +122,7 @@ impl ArrayVariants for DateTimePartsArray {
122122
}
123123

124124
impl ExtensionArrayTrait for DateTimePartsArray {
125-
fn storage_array(&self) -> ArrayData {
125+
fn storage_data(&self) -> ArrayData {
126126
// FIXME(ngates): this needs to be a tuple array so we can implement Compare
127127
// we don't want to write validity twice, so we pull it up to the top
128128
let days = try_cast(self.days(), &self.days().dtype().as_nonnullable()).vortex_unwrap();

vortex-array/src/array/chunked/variants.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -122,10 +122,10 @@ impl StructArrayTrait for ChunkedArray {
122122
impl ListArrayTrait for ChunkedArray {}
123123

124124
impl ExtensionArrayTrait for ChunkedArray {
125-
fn storage_array(&self) -> ArrayData {
125+
fn storage_data(&self) -> ArrayData {
126126
ChunkedArray::from_iter(
127127
self.chunks()
128-
.map(|chunk| chunk.with_dyn(|a| a.as_extension_array_unchecked().storage_array())),
128+
.map(|chunk| chunk.with_dyn(|a| a.as_extension_array_unchecked().storage_data())),
129129
)
130130
.into_array()
131131
}

vortex-array/src/array/constant/canonical.rs

Lines changed: 16 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,12 +2,14 @@ use arrow_array::builder::make_view;
22
use arrow_buffer::{BooleanBuffer, BufferBuilder};
33
use vortex_buffer::Buffer;
44
use vortex_dtype::{match_each_native_ptype, DType, Nullability, PType};
5-
use vortex_error::{vortex_bail, VortexResult};
6-
use vortex_scalar::{BinaryScalar, BoolScalar, Utf8Scalar};
5+
use vortex_error::{vortex_bail, vortex_panic, VortexResult};
6+
use vortex_scalar::{BinaryScalar, BoolScalar, ExtScalar, Scalar, Utf8Scalar};
77

88
use crate::array::constant::ConstantArray;
99
use crate::array::primitive::PrimitiveArray;
10-
use crate::array::{BinaryView, BoolArray, NullArray, VarBinViewArray, VIEW_SIZE_BYTES};
10+
use crate::array::{
11+
BinaryView, BoolArray, ExtensionArray, NullArray, VarBinViewArray, VIEW_SIZE_BYTES,
12+
};
1113
use crate::validity::Validity;
1214
use crate::{ArrayDType, Canonical, IntoArrayData, IntoCanonical};
1315

@@ -63,6 +65,17 @@ impl IntoCanonical for ConstantArray {
6365
return Ok(Canonical::Null(NullArray::new(self.len())));
6466
}
6567

68+
if let Ok(s) = ExtScalar::try_from(scalar) {
69+
let DType::Extension(ext_dtype) = s.dtype() else {
70+
vortex_panic!("ExtScalar has a non-ext dtype {}", s.dtype());
71+
};
72+
73+
let storage_dtype = ext_dtype.storage_dtype();
74+
let storage_scalar = Scalar::new(storage_dtype.clone(), s.value().clone());
75+
let storage_array = ConstantArray::new(storage_scalar, self.len()).into_array();
76+
return ExtensionArray::new(ext_dtype.clone(), storage_array).into_canonical();
77+
}
78+
6679
vortex_bail!("Unsupported scalar type {}", self.dtype())
6780
}
6881
}

vortex-array/src/array/constant/variants.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -210,7 +210,7 @@ impl StructArrayTrait for ConstantArray {
210210
impl ListArrayTrait for ConstantArray {}
211211

212212
impl ExtensionArrayTrait for ConstantArray {
213-
fn storage_array(&self) -> ArrayData {
213+
fn storage_data(&self) -> ArrayData {
214214
let storage_dtype = self.ext_dtype().storage_dtype().clone();
215215
ConstantArray::new(
216216
Scalar::new(storage_dtype, self.scalar_value().clone()),

vortex-array/src/array/extension/mod.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,7 @@ impl ArrayVariants for ExtensionArray {
6666
}
6767

6868
impl ExtensionArrayTrait for ExtensionArray {
69-
fn storage_array(&self) -> ArrayData {
69+
fn storage_data(&self) -> ArrayData {
7070
self.storage()
7171
}
7272
}

vortex-array/src/array/sparse/variants.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -123,11 +123,11 @@ impl StructArrayTrait for SparseArray {
123123
impl ListArrayTrait for SparseArray {}
124124

125125
impl ExtensionArrayTrait for SparseArray {
126-
fn storage_array(&self) -> ArrayData {
126+
fn storage_data(&self) -> ArrayData {
127127
SparseArray::try_new_with_offset(
128128
self.indices().clone(),
129129
self.values()
130-
.with_dyn(|a| a.as_extension_array_unchecked().storage_array()),
130+
.with_dyn(|a| a.as_extension_array_unchecked().storage_data()),
131131
self.len(),
132132
self.indices_offset(),
133133
self.fill_value().clone(),

vortex-array/src/variants.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -317,5 +317,5 @@ pub trait ExtensionArrayTrait: ArrayTrait {
317317
}
318318

319319
/// Returns the underlying [`ArrayData`], without the [`ExtDType`].
320-
fn storage_array(&self) -> ArrayData;
320+
fn storage_data(&self) -> ArrayData;
321321
}

0 commit comments

Comments
 (0)