@@ -460,11 +460,13 @@ impl ValidityVTable<ParquetVariantVTable> for ParquetVariantVTable {
460460mod tests {
461461 use std:: sync:: Arc ;
462462
463+ use arrow_array:: Array ;
463464 use arrow_array:: ArrayRef as ArrowArrayRef ;
464465 use arrow_array:: Int32Array ;
465466 use arrow_array:: StructArray ;
466467 use arrow_array:: builder:: BinaryViewBuilder ;
467468 use arrow_array:: cast:: AsArray ;
469+ use arrow_buffer:: NullBuffer ;
468470 use arrow_schema:: DataType ;
469471 use arrow_schema:: Field ;
470472 use arrow_schema:: Fields ;
@@ -619,6 +621,25 @@ mod tests {
619621 . unwrap ( )
620622 }
621623
624+ fn assert_arrow_variant_storage_roundtrip ( struct_array : StructArray ) -> VortexResult < ( ) > {
625+ let arrow_variant = ArrowVariantArray :: try_new ( & struct_array) . unwrap ( ) ;
626+ let vortex_arr = ParquetVariantArray :: from_arrow_variant ( & arrow_variant) ?;
627+
628+ let mut ctx = LEGACY_SESSION . create_execution_ctx ( ) ;
629+ let roundtripped = vortex_arr. execute_arrow ( None , & mut ctx) ?;
630+
631+ assert_eq ! ( struct_array. to_data( ) , roundtripped. as_struct( ) . to_data( ) ) ;
632+ Ok ( ( ) )
633+ }
634+
635+ fn binary_view_array < const N : usize > ( values : [ & [ u8 ] ; N ] ) -> ArrowArrayRef {
636+ let mut builder = BinaryViewBuilder :: new ( ) ;
637+ for value in values {
638+ builder. append_value ( value) ;
639+ }
640+ Arc :: new ( builder. finish ( ) )
641+ }
642+
622643 #[ test]
623644 fn test_serde_roundtrip_typed_value_variant ( ) {
624645 let outer_metadata =
@@ -697,4 +718,72 @@ mod tests {
697718
698719 Ok ( ( ) )
699720 }
721+
722+ #[ test]
723+ fn test_arrow_variant_roundtrip_unshredded_storage ( ) -> VortexResult < ( ) > {
724+ let mut builder = VariantArrayBuilder :: new ( 3 ) ;
725+ builder. append_variant ( Variant :: from ( 42i32 ) ) ;
726+ builder. append_variant ( Variant :: from ( "hello" ) ) ;
727+ builder. append_variant ( Variant :: from ( true ) ) ;
728+
729+ assert_arrow_variant_storage_roundtrip ( builder. build ( ) . into_inner ( ) . clone ( ) )
730+ }
731+
732+ #[ test]
733+ fn test_arrow_variant_roundtrip_typed_value_only_storage ( ) -> VortexResult < ( ) > {
734+ let metadata = binary_view_array ( [ b"\x01 \x00 " , b"\x01 \x00 " , b"\x01 \x00 " ] ) ;
735+ let typed_value: ArrowArrayRef = Arc :: new ( Int32Array :: from ( vec ! [ 10 , 20 , 30 ] ) ) ;
736+
737+ let struct_array = StructArray :: try_new (
738+ vec ! [
739+ Arc :: new( Field :: new( "metadata" , DataType :: BinaryView , false ) ) ,
740+ Arc :: new( Field :: new( "typed_value" , DataType :: Int32 , false ) ) ,
741+ ]
742+ . into ( ) ,
743+ vec ! [ metadata, typed_value] ,
744+ None ,
745+ )
746+ . unwrap ( ) ;
747+
748+ assert_arrow_variant_storage_roundtrip ( struct_array)
749+ }
750+
751+ #[ test]
752+ fn test_arrow_variant_roundtrip_value_and_typed_value_storage ( ) -> VortexResult < ( ) > {
753+ let metadata = binary_view_array ( [ b"\x01 \x00 " , b"\x01 \x00 " ] ) ;
754+ let value = binary_view_array ( [ b"\x10 " , b"\x11 " ] ) ;
755+ let typed_value: ArrowArrayRef = Arc :: new ( Int32Array :: from ( vec ! [ 1 , 2 ] ) ) ;
756+
757+ let struct_array = StructArray :: try_new (
758+ vec ! [
759+ Arc :: new( Field :: new( "metadata" , DataType :: BinaryView , false ) ) ,
760+ Arc :: new( Field :: new( "value" , DataType :: BinaryView , true ) ) ,
761+ Arc :: new( Field :: new( "typed_value" , DataType :: Int32 , false ) ) ,
762+ ]
763+ . into ( ) ,
764+ vec ! [ metadata, value, typed_value] ,
765+ None ,
766+ )
767+ . unwrap ( ) ;
768+
769+ assert_arrow_variant_storage_roundtrip ( struct_array)
770+ }
771+
772+ #[ test]
773+ fn test_arrow_variant_roundtrip_with_outer_nulls ( ) -> VortexResult < ( ) > {
774+ let metadata = binary_view_array ( [ b"\x01 \x00 " , b"\x01 \x00 " , b"\x01 \x00 " ] ) ;
775+ let value = binary_view_array ( [ b"\x10 " , b"\x00 " , b"\x11 " ] ) ;
776+ let struct_array = StructArray :: try_new (
777+ vec ! [
778+ Arc :: new( Field :: new( "metadata" , DataType :: BinaryView , false ) ) ,
779+ Arc :: new( Field :: new( "value" , DataType :: BinaryView , true ) ) ,
780+ ]
781+ . into ( ) ,
782+ vec ! [ metadata, value] ,
783+ Some ( NullBuffer :: from ( vec ! [ true , false , true ] ) ) ,
784+ )
785+ . unwrap ( ) ;
786+
787+ assert_arrow_variant_storage_roundtrip ( struct_array)
788+ }
700789}
0 commit comments