@@ -538,9 +538,9 @@ pub fn cast_to_variant(input: &dyn Array) -> Result<VariantArray, ArrowError> {
538
538
DataType :: Map ( field, _) => {
539
539
match field. data_type ( ) {
540
540
DataType :: Struct ( _) => {
541
- // Get the struct array for the map entries
542
541
let map_array = input. as_map ( ) ;
543
- let entries = cast_to_variant ( map_array. entries ( ) ) ?;
542
+ let keys = cast_to_variant ( map_array. keys ( ) ) ?;
543
+ let values = cast_to_variant ( map_array. values ( ) ) ?;
544
544
let offsets = map_array. offsets ( ) ;
545
545
546
546
let mut start_offset = offsets[ 0 ] ;
@@ -553,13 +553,14 @@ pub fn cast_to_variant(input: &dyn Array) -> Result<VariantArray, ArrowError> {
553
553
let length = ( end_offset - start_offset) as usize ;
554
554
555
555
let mut tmp_builder = VariantBuilder :: new ( ) ;
556
- let mut list_builder = tmp_builder. new_list ( ) ;
556
+ let mut object_builder = tmp_builder. new_object ( ) ;
557
557
558
558
for i in start_offset..* end_offset {
559
- let value = entries. value ( i as usize ) ;
560
- list_builder. append_value ( value) ;
559
+ let value = values. value ( i as usize ) ;
560
+ object_builder
561
+ . insert ( keys. value ( i as usize ) . as_string ( ) . unwrap ( ) , value) ;
561
562
}
562
- list_builder . finish ( ) ;
563
+ object_builder . finish ( ) ? ;
563
564
let ( metadata, value) = tmp_builder. finish ( ) ;
564
565
let variant = Variant :: try_new ( & metadata, & value) . unwrap ( ) ;
565
566
@@ -627,7 +628,13 @@ fn process_run_end_encoded<R: RunEndIndexType>(
627
628
mod tests {
628
629
use super :: * ;
629
630
use arrow:: array:: {
630
- ArrayRef , BinaryArray , BooleanArray , Date32Array , Date64Array , Decimal128Array , Decimal256Array , Decimal32Array , Decimal64Array , DictionaryArray , FixedSizeBinaryBuilder , Float16Array , Float32Array , Float64Array , GenericByteBuilder , GenericByteViewBuilder , Int16Array , Int32Array , Int64Array , Int8Array , IntervalYearMonthArray , LargeStringArray , MapArray , NullArray , StringArray , StringRunBuilder , StringViewArray , StructArray , Time32MillisecondArray , Time32SecondArray , Time64MicrosecondArray , Time64NanosecondArray , UInt16Array , UInt32Array , UInt64Array , UInt8Array
631
+ ArrayRef , BinaryArray , BooleanArray , Date32Array , Date64Array , Decimal128Array ,
632
+ Decimal256Array , Decimal32Array , Decimal64Array , DictionaryArray , FixedSizeBinaryBuilder ,
633
+ Float16Array , Float32Array , Float64Array , GenericByteBuilder , GenericByteViewBuilder ,
634
+ Int16Array , Int32Array , Int64Array , Int8Array , IntervalYearMonthArray , LargeStringArray ,
635
+ MapArray , NullArray , StringArray , StringRunBuilder , StringViewArray , StructArray ,
636
+ Time32MillisecondArray , Time32SecondArray , Time64MicrosecondArray , Time64NanosecondArray ,
637
+ UInt16Array , UInt32Array , UInt64Array , UInt8Array ,
631
638
} ;
632
639
use arrow:: buffer:: NullBuffer ;
633
640
use arrow_schema:: { Field , Fields } ;
@@ -2029,38 +2036,22 @@ mod tests {
2029
2036
let result = cast_to_variant ( & map_array) . unwrap ( ) ;
2030
2037
// [{"key1":1}]
2031
2038
let variant1 = result. value ( 0 ) ;
2032
- let item = variant1. as_list ( ) . unwrap ( ) . get ( 0 ) . unwrap ( ) ;
2033
2039
assert_eq ! (
2034
- item. as_object( ) . unwrap( ) . get( "keys" ) . unwrap( ) ,
2035
- Variant :: from( "key1" )
2036
- ) ;
2037
- assert_eq ! (
2038
- item. as_object( ) . unwrap( ) . get( "values" ) . unwrap( ) ,
2039
- Variant :: from( 1i32 )
2040
+ variant1. as_object( ) . unwrap( ) . get( "key1" ) . unwrap( ) ,
2041
+ Variant :: from( 1 )
2040
2042
) ;
2041
2043
2042
2044
assert ! ( result. is_null( 1 ) ) ; // Second row is null
2043
2045
2044
2046
// [{"key2":2},{"key3":3}]
2045
2047
let variant2 = result. value ( 2 ) ;
2046
- let item = variant2. as_list ( ) . unwrap ( ) . get ( 0 ) . unwrap ( ) ;
2047
- assert_eq ! (
2048
- item. as_object( ) . unwrap( ) . get( "keys" ) . unwrap( ) ,
2049
- Variant :: from( "key2" )
2050
- ) ;
2051
- assert_eq ! (
2052
- item. as_object( ) . unwrap( ) . get( "values" ) . unwrap( ) ,
2053
- Variant :: from( 2i32 )
2054
- ) ;
2055
-
2056
- let item = variant2. as_list ( ) . unwrap ( ) . get ( 1 ) . unwrap ( ) ;
2057
2048
assert_eq ! (
2058
- item . as_object( ) . unwrap( ) . get( "keys " ) . unwrap( ) ,
2059
- Variant :: from( "key3" )
2049
+ variant2 . as_object( ) . unwrap( ) . get( "key2 " ) . unwrap( ) ,
2050
+ Variant :: from( 2 )
2060
2051
) ;
2061
2052
assert_eq ! (
2062
- item . as_object( ) . unwrap( ) . get( "values " ) . unwrap( ) ,
2063
- Variant :: from( 3i32 )
2053
+ variant2 . as_object( ) . unwrap( ) . get( "key3 " ) . unwrap( ) ,
2054
+ Variant :: from( 3 )
2064
2055
) ;
2065
2056
}
2066
2057
0 commit comments