2222use crate :: error:: Error :: RowConvertError ;
2323use crate :: error:: { Error , Result } ;
2424use crate :: metadata:: { DataType , RowType } ;
25- use crate :: row:: FlussMap ;
26- use crate :: row:: InternalRow ;
2725use crate :: row:: datum:: {
2826 MICROS_PER_MILLI , MILLIS_PER_SECOND , NANOS_PER_MILLI , append_decimal_to_builder,
2927 millis_nanos_to_micros, millis_nanos_to_nanos,
3028} ;
29+ use crate :: row:: { FlussArray , FlussMap , InternalRow } ;
3130use arrow:: array:: {
3231 ArrayBuilder , ArrayRef , BinaryBuilder , BooleanBuilder , Date32Builder , Decimal128Builder ,
3332 FixedSizeBinaryBuilder , Float32Builder , Float64Builder , Int8Builder , Int16Builder ,
@@ -928,8 +927,8 @@ fn write_map_into(
928927 let key_array = map. key_array ( ) ;
929928 let value_array = map. value_array ( ) ;
930929 for i in 0 ..map. size ( ) {
931- key_writer . write_field_at ( key_array, i) ?;
932- value_writer . write_field_at ( value_array, i) ?;
930+ write_array_element_into_column ( key_writer , key_array, i) ?;
931+ write_array_element_into_column ( value_writer , value_array, i) ?;
933932 }
934933 let last = * offsets. last ( ) . unwrap ( ) ;
935934 offsets. push (
@@ -940,6 +939,57 @@ fn write_map_into(
940939 Ok ( ( ) )
941940}
942941
942+ // FlussArray carries no schema; nested row/map elements need the typed
943+ // inherent accessors (get_row/get_map with explicit types).
944+ fn write_array_element_into_column (
945+ writer : & mut ColumnWriter ,
946+ array : & FlussArray ,
947+ index : usize ,
948+ ) -> Result < ( ) > {
949+ match & mut writer. inner {
950+ TypedWriter :: Struct {
951+ field_writers,
952+ validity,
953+ row_type,
954+ ..
955+ } => {
956+ if array. is_null_at ( index) {
957+ for child in field_writers. iter_mut ( ) {
958+ child. append_null ( ) ;
959+ }
960+ validity. push ( false ) ;
961+ } else {
962+ let nested = array. get_row ( index, row_type) ?;
963+ for ( j, child) in field_writers. iter_mut ( ) . enumerate ( ) {
964+ child. write_field_at ( & nested, j) ?;
965+ }
966+ validity. push ( true ) ;
967+ }
968+ Ok ( ( ) )
969+ }
970+ TypedWriter :: Map {
971+ key_writer,
972+ value_writer,
973+ key_type,
974+ value_type,
975+ offsets,
976+ validity,
977+ } => {
978+ if array. is_null_at ( index) {
979+ validity. push ( false ) ;
980+ let last = * offsets. last ( ) . unwrap ( ) ;
981+ offsets. push ( last) ;
982+ } else {
983+ let nested = array. get_map ( index, key_type, value_type) ?;
984+ write_map_into ( nested, key_writer, value_writer, offsets) ?;
985+ validity. push ( true ) ;
986+ }
987+ Ok ( ( ) )
988+ }
989+ _ => writer. write_field_at ( array, index) ,
990+ }
991+ }
992+
943993fn finish_struct_array (
944994 fields : arrow_schema:: Fields ,
945995 child_arrays : Vec < ArrayRef > ,
0 commit comments