Skip to content

Commit 0aef5bc

Browse files
committed
stuff
Signed-off-by: Adam Gutglick <adam@spiraldb.com>
1 parent 23df94d commit 0aef5bc

3 files changed

Lines changed: 395 additions & 5 deletions

File tree

encodings/parquet-variant/src/lib.rs

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -29,8 +29,6 @@ mod kernel;
2929
mod operations;
3030
mod validity;
3131
mod variant_get;
32-
#[cfg(test)]
33-
mod variant_get_tests;
3432
mod vtable;
3533

3634
pub use array::ParquetVariantArrayExt;

encodings/parquet-variant/src/variant_get.rs renamed to encodings/parquet-variant/src/variant_get/mod.rs

Lines changed: 44 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -13,17 +13,26 @@ use parquet_variant_compute::VariantArray as ArrowVariantArray;
1313
use vortex_array::ArrayRef;
1414
use vortex_array::ArrayView;
1515
use vortex_array::ExecutionCtx;
16+
use vortex_array::IntoArray;
17+
use vortex_array::arrays::VariantArray;
1618
use vortex_array::arrays::scalar_fn::ExactScalarFn;
1719
use vortex_array::arrays::scalar_fn::ScalarFnArrayView;
20+
use vortex_array::arrow::FromArrowArray;
21+
use vortex_array::dtype::DType;
1822
use vortex_array::dtype::FieldName;
23+
use vortex_array::dtype::Nullability;
1924
use vortex_array::kernel::ExecuteParentKernel;
2025
use vortex_array::scalar_fn::fns::variant_get::VariantGet;
26+
use vortex_array::validity::Validity;
27+
use vortex_buffer::BitBuffer;
2128
use vortex_error::VortexResult;
2229
use vortex_error::vortex_err;
2330

2431
use crate::ParquetVariant;
2532
use crate::ParquetVariantArrayExt;
26-
use crate::ParquetVariantData;
33+
34+
#[cfg(test)]
35+
mod tests;
2736

2837
#[derive(Debug)]
2938
pub(crate) struct VariantGetExecuteParent;
@@ -63,7 +72,7 @@ fn variant_get_impl(
6372
let arrow_result = parquet_variant_compute::variant_get(&inner, options)
6473
.map_err(|e| vortex_err!("variant_get failed: {e}"))?;
6574

66-
// Convert back to Vortex
75+
// Convert back to Vortex.
6776
let result_variant = ArrowVariantArray::try_new(
6877
arrow_result
6978
.as_any()
@@ -72,5 +81,37 @@ fn variant_get_impl(
7281
)
7382
.map_err(|e| vortex_err!("failed to create VariantArray from result: {e}"))?;
7483

75-
ParquetVariantData::from_arrow_variant(&result_variant)
84+
// Ensure the result is always nullable (matching variant_get's return_dtype).
85+
// Arrow may return a non-nullable result when no nulls are present.
86+
let validity = result_variant
87+
.nulls()
88+
.map(|nulls| {
89+
if nulls.null_count() == nulls.len() {
90+
Validity::AllInvalid
91+
} else {
92+
Validity::from(BitBuffer::from(nulls.inner().clone()))
93+
}
94+
})
95+
.unwrap_or(Validity::AllValid);
96+
97+
let metadata = ArrayRef::from_arrow(
98+
result_variant.metadata_field() as &dyn arrow_array::Array,
99+
false,
100+
)?;
101+
let value = result_variant
102+
.value_field()
103+
.map(|v| ArrayRef::from_arrow(v as &dyn arrow_array::Array, true))
104+
.transpose()?;
105+
let typed_value = result_variant
106+
.typed_value_field()
107+
.map(|tv| ArrayRef::from_arrow(tv.as_ref(), true))
108+
.transpose()?;
109+
110+
let pv = ParquetVariant::try_new(validity, metadata, value, typed_value)?;
111+
debug_assert_eq!(
112+
pv.dtype(),
113+
&DType::Variant(Nullability::Nullable),
114+
"variant_get result must be nullable"
115+
);
116+
Ok(VariantArray::new(pv.into_array()).into_array())
76117
}

0 commit comments

Comments
 (0)