@@ -4,7 +4,7 @@ use std::sync::Arc;
44
55use arrow_array:: types:: * ;
66use arrow_array:: {
7- ArrayRef , ArrowPrimitiveType , BooleanArray as ArrowBoolArray , Date32Array , Date64Array ,
7+ Array , ArrayRef , ArrowPrimitiveType , BooleanArray as ArrowBoolArray , Date32Array , Date64Array ,
88 NullArray as ArrowNullArray , PrimitiveArray as ArrowPrimitiveArray ,
99 StructArray as ArrowStructArray , Time32MillisecondArray , Time32SecondArray ,
1010 Time64MicrosecondArray , Time64NanosecondArray , TimestampMicrosecondArray ,
@@ -253,12 +253,13 @@ fn list_to_arrow(list: ListArray) -> VortexResult<ArrayRef> {
253253 . map_err ( |err| err. with_context ( "Failed to cast offsets to PrimitiveArray of i32" ) ) ?,
254254 } ;
255255
256+ let values = list. elements ( ) . into_arrow ( ) ?;
257+
256258 let field_ref = FieldRef :: new ( Field :: new_list_field (
257- infer_data_type ( list . elements ( ) . dtype ( ) ) ? ,
259+ values . data_type ( ) . clone ( ) ,
258260 list. validity ( ) . nullability ( ) . into ( ) ,
259261 ) ) ;
260262
261- let values = list. elements ( ) . into_arrow ( ) ?;
262263 let nulls = list. logical_validity ( ) . to_null_buffer ( ) ?;
263264
264265 Ok ( match offsets. ptype ( ) {
@@ -526,9 +527,10 @@ mod test {
526527 use arrow_array:: cast:: AsArray ;
527528 use arrow_array:: types:: { Int32Type , Int64Type , UInt64Type } ;
528529 use arrow_array:: {
529- PrimitiveArray as ArrowPrimitiveArray , StringViewArray , StructArray as ArrowStructArray ,
530+ ListArray as ArrowListArray , PrimitiveArray as ArrowPrimitiveArray , StringArray ,
531+ StringViewArray , StructArray as ArrowStructArray ,
530532 } ;
531- use arrow_buffer:: NullBufferBuilder ;
533+ use arrow_buffer:: { NullBufferBuilder , OffsetBuffer } ;
532534 use arrow_schema:: { DataType , Field } ;
533535
534536 use crate :: array:: { PrimitiveArray , SparseArray , StructArray } ;
@@ -641,4 +643,24 @@ mod test {
641643 vortex_struct. into_arrow( ) . unwrap( ) . as_struct( )
642644 ) ;
643645 }
646+
647+ #[ test]
648+ fn roundtrip_list ( ) {
649+ let names = Arc :: new ( StringArray :: from_iter ( vec ! [
650+ Some ( "Joseph" ) ,
651+ Some ( "Angela" ) ,
652+ Some ( "Mikhail" ) ,
653+ ] ) ) ;
654+
655+ let arrow_list = ArrowListArray :: new (
656+ Arc :: new ( Field :: new_list_field ( DataType :: Utf8 , true ) ) ,
657+ OffsetBuffer :: from_lengths ( vec ! [ 0 , 2 , 1 ] ) ,
658+ names,
659+ None ,
660+ ) ;
661+
662+ let vortex_list = ArrayData :: from_arrow ( & arrow_list, true ) ;
663+
664+ assert_eq ! ( & arrow_list, vortex_list. into_arrow( ) . unwrap( ) . as_list( ) ) ;
665+ }
644666}
0 commit comments