@@ -13,17 +13,26 @@ use parquet_variant_compute::VariantArray as ArrowVariantArray;
1313use vortex_array:: ArrayRef ;
1414use vortex_array:: ArrayView ;
1515use vortex_array:: ExecutionCtx ;
16+ use vortex_array:: IntoArray ;
17+ use vortex_array:: arrays:: VariantArray ;
1618use vortex_array:: arrays:: scalar_fn:: ExactScalarFn ;
1719use vortex_array:: arrays:: scalar_fn:: ScalarFnArrayView ;
20+ use vortex_array:: arrow:: FromArrowArray ;
21+ use vortex_array:: dtype:: DType ;
1822use vortex_array:: dtype:: FieldName ;
23+ use vortex_array:: dtype:: Nullability ;
1924use vortex_array:: kernel:: ExecuteParentKernel ;
2025use vortex_array:: scalar_fn:: fns:: variant_get:: VariantGet ;
26+ use vortex_array:: validity:: Validity ;
27+ use vortex_buffer:: BitBuffer ;
2128use vortex_error:: VortexResult ;
2229use vortex_error:: vortex_err;
2330
2431use crate :: ParquetVariant ;
2532use crate :: ParquetVariantArrayExt ;
26- use crate :: ParquetVariantData ;
33+
34+ #[ cfg( test) ]
35+ mod tests;
2736
2837#[ derive( Debug ) ]
2938pub ( 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