@@ -11,18 +11,21 @@ use arrow_array::types::{
1111} ;
1212use arrow_array:: {
1313 Array , BooleanArray , Date32Array , Decimal128Array , FixedSizeListArray , GenericListViewArray ,
14- PrimitiveArray , StringArray , StructArray , Time64MicrosecondArray , Time64NanosecondArray ,
14+ PrimitiveArray , StringArray , Time64MicrosecondArray , Time64NanosecondArray ,
1515 TimestampMicrosecondArray , TimestampMillisecondArray , TimestampNanosecondArray ,
1616 TimestampSecondArray ,
1717} ;
1818use arrow_buffer:: buffer:: BooleanBuffer ;
19+ use arrow_schema:: Field ;
1920use num_traits:: AsPrimitive ;
2021use vortex:: ArrayRef ;
22+ use vortex:: arrays:: StructArray ;
2123use vortex:: arrow:: FromArrowArray ;
2224use vortex:: buffer:: BufferMut ;
2325use vortex:: dtype:: { DType , DecimalDType , FieldNames , Nullability } ;
2426use vortex:: error:: { VortexExpect , VortexResult , vortex_err} ;
2527use vortex:: scalar:: DecimalType ;
28+ use vortex:: validity:: Validity ;
2629
2730use crate :: convert:: dtype:: FromLogicalType ;
2831use crate :: cpp:: {
@@ -332,7 +335,7 @@ pub fn flat_vector_to_arrow_array(
332335 len * array_elem_size as usize ,
333336 ) ?;
334337 Ok ( Arc :: new ( FixedSizeListArray :: try_new (
335- Arc :: new ( arrow_schema :: Field :: new (
338+ Arc :: new ( Field :: new (
336339 "element" ,
337340 DType :: from_logical_type ( array_child_type, Nullability :: Nullable ) ?
338341 . to_arrow_dtype ( ) ?,
@@ -363,7 +366,7 @@ pub fn flat_vector_to_arrow_array(
363366 }
364367
365368 Ok ( Arc :: new ( GenericListViewArray :: try_new (
366- Arc :: new ( arrow_schema :: Field :: new (
369+ Arc :: new ( Field :: new (
367370 "element" ,
368371 DType :: from_logical_type ( array_child_type, Nullability :: Nullable ) ?
369372 . to_arrow_dtype ( ) ?,
@@ -381,8 +384,8 @@ pub fn flat_vector_to_arrow_array(
381384 flat_vector_to_arrow_array ( & mut vector. struct_vector_get_child ( idx) , len)
382385 } )
383386 . collect :: < Result < Vec < _ > , _ > > ( ) ?;
384- Ok ( Arc :: new ( StructArray :: try_new (
385- DType :: from_logical_type ( vector. logical_type ( ) , Nullability :: Nullable ) ?
387+ Ok ( Arc :: new ( arrow_array :: StructArray :: try_new (
388+ DType :: from_logical_type ( vector. logical_type ( ) , Nullability :: NonNullable ) ?
386389 . to_arrow_schema ( ) ?
387390 . fields ,
388391 children,
@@ -397,28 +400,37 @@ pub fn data_chunk_to_arrow(field_names: &FieldNames, chunk: &DataChunk) -> Vorte
397400 let len = chunk. len ( ) ;
398401
399402 let columns = ( 0 ..chunk. column_count ( ) )
400- . zip ( field_names. iter ( ) )
401- . map ( |( i, name) | {
403+ . map ( |i| {
402404 let mut vector = chunk. get_vector ( i) ;
403405 vector. flatten ( len) ;
404406 flat_vector_to_arrow_array ( & mut vector, len. as_ ( ) )
405407 . map ( |array_data| {
406408 let chunk_len: usize = chunk. len ( ) . as_ ( ) ;
407409 assert_eq ! ( array_data. len( ) , chunk_len) ;
408- ( name , ArrayRef :: from_arrow ( array_data. as_ref ( ) , true ) )
410+ ArrayRef :: from_arrow ( array_data. as_ref ( ) , true )
409411 } )
410412 . map_err ( |e| vortex_err ! ( "duckdb to arrow conversion failure {e}" ) )
411413 } )
412- . collect :: < VortexResult < Vec < _ > > > ( ) ?;
413- vortex:: arrays:: StructArray :: try_from_iter ( columns) . map ( |a| a. to_array ( ) )
414+ . collect :: < VortexResult < Arc < _ > > > ( ) ?;
415+ StructArray :: try_new (
416+ field_names. clone ( ) ,
417+ columns,
418+ len. as_ ( ) ,
419+ Validity :: NonNullable ,
420+ )
421+ . map ( |a| a. to_array ( ) )
414422}
415423
416424#[ cfg( test) ]
417425mod tests {
426+ use std:: ffi:: CString ;
427+
428+ use arrow_array:: cast:: AsArray ;
418429 use arrow_array:: {
419430 BooleanArray , Int32Array , TimestampMicrosecondArray , TimestampMillisecondArray ,
420431 TimestampSecondArray ,
421432 } ;
433+ use vortex:: error:: VortexUnwrap ;
422434
423435 use super :: * ;
424436 use crate :: cpp:: DUCKDB_TYPE ;
@@ -676,4 +688,75 @@ mod tests {
676688 assert_eq ! ( arrow_array. value( 0 ) , 1 ) ;
677689 assert_eq ! ( arrow_array. value( 2 ) , 3 ) ;
678690 }
691+
692+ #[ test]
693+ fn test_fixed_sized_list ( ) {
694+ let values = vec ! [ 1i32 , 2 , 3 , 4 ] ;
695+ let len = values. len ( ) ;
696+
697+ let logical_type =
698+ LogicalType :: array_type ( LogicalType :: new ( DUCKDB_TYPE :: DUCKDB_TYPE_INTEGER ) , 4 )
699+ . vortex_unwrap ( ) ;
700+ let mut vector = Vector :: with_capacity ( logical_type, len) ;
701+
702+ // Populate with data
703+ unsafe {
704+ let mut child = vector. array_vector_get_child ( ) ;
705+ let slice = child. as_slice_mut :: < i32 > ( len) ;
706+ slice. copy_from_slice ( & values) ;
707+ }
708+
709+ // Test conversion
710+ let result = flat_vector_to_arrow_array ( & mut vector, len) . unwrap ( ) ;
711+ let arrow_array = result. as_fixed_size_list ( ) ;
712+
713+ assert_eq ! ( arrow_array. len( ) , len) ;
714+ assert_eq ! (
715+ arrow_array. value( 0 ) . as_primitive:: <Int32Type >( ) ,
716+ & Int32Array :: from_iter( [ 1 , 2 , 3 , 4 ] )
717+ ) ;
718+ }
719+
720+ #[ test]
721+ fn test_struct ( ) {
722+ let values1 = vec ! [ 1i32 , 2 , 3 , 4 ] ;
723+ let values2 = vec ! [ 5i32 , 6 , 7 , 8 ] ;
724+ let len = values1. len ( ) ;
725+
726+ let logical_type = LogicalType :: struct_type (
727+ [
728+ LogicalType :: new ( DUCKDB_TYPE :: DUCKDB_TYPE_INTEGER ) ,
729+ LogicalType :: new ( DUCKDB_TYPE :: DUCKDB_TYPE_INTEGER ) ,
730+ ] ,
731+ [ CString :: new ( "a" ) . unwrap ( ) , CString :: new ( "b" ) . unwrap ( ) ] ,
732+ )
733+ . vortex_unwrap ( ) ;
734+ let mut vector = Vector :: with_capacity ( logical_type, len) ;
735+
736+ // Populate with data
737+ for ( i, values) in
738+ ( 0 ..vector. logical_type ( ) . struct_type_child_count ( ) ) . zip ( [ values1, values2] )
739+ {
740+ unsafe {
741+ let mut child = vector. struct_vector_get_child ( i) ;
742+ let slice = child. as_slice_mut :: < i32 > ( len) ;
743+ slice. copy_from_slice ( & values) ;
744+ }
745+ }
746+
747+ // Test conversion
748+ let result = flat_vector_to_arrow_array ( & mut vector, len) . unwrap ( ) ;
749+ let arrow_array = result. as_struct ( ) ;
750+
751+ assert_eq ! ( arrow_array. len( ) , len) ;
752+ assert_eq ! ( arrow_array. fields( ) . len( ) , 2 ) ;
753+ assert_eq ! (
754+ arrow_array. column( 0 ) . as_primitive:: <Int32Type >( ) ,
755+ & Int32Array :: from_iter( [ 1 , 2 , 3 , 4 ] )
756+ ) ;
757+ assert_eq ! (
758+ arrow_array. column( 1 ) . as_primitive:: <Int32Type >( ) ,
759+ & Int32Array :: from_iter( [ 5 , 6 , 7 , 8 ] )
760+ ) ;
761+ }
679762}
0 commit comments