@@ -68,7 +68,6 @@ use arrow_select::take::take;
68
68
use num:: cast:: AsPrimitive ;
69
69
use num:: { NumCast , ToPrimitive } ;
70
70
71
-
72
71
/// CastOptions provides a way to override the default cast behaviors
73
72
#[ derive( Debug , Clone , PartialEq , Eq , Hash ) ]
74
73
pub struct CastOptions < ' a > {
@@ -163,7 +162,7 @@ pub fn can_cast_types(from_type: &DataType, to_type: &DataType) -> bool {
163
162
( Map ( from_entries, ordered_from) , Map ( to_entries, ordered_to) ) if ordered_from == ordered_to =>
164
163
match ( key_field ( from_entries) , key_field ( to_entries) , value_field ( from_entries) , value_field ( to_entries) ) {
165
164
( Some ( from_key) , Some ( to_key) , Some ( from_value) , Some ( to_value) ) =>
166
- can_cast_types ( from_key. data_type ( ) , to_key. data_type ( ) ) && can_cast_types ( & from_value. data_type ( ) , & to_value. data_type ( ) ) ,
165
+ can_cast_types ( from_key. data_type ( ) , to_key. data_type ( ) ) && can_cast_types ( from_value. data_type ( ) , to_value. data_type ( ) ) ,
167
166
_ => false
168
167
} ,
169
168
// cast one decimal type to another decimal type
@@ -719,13 +718,9 @@ pub fn cast_with_options(
719
718
( _, FixedSizeList ( ref to, size) ) if * size == 1 => {
720
719
cast_values_to_fixed_size_list ( array, to, * size, cast_options)
721
720
}
722
- ( Map ( _, ordered1) , Map ( _, ordered2) ) if ordered1 == ordered2 =>
723
- cast_map_values (
724
- array. as_map ( ) ,
725
- & to_type,
726
- cast_options,
727
- ordered1. to_owned ( )
728
- ) ,
721
+ ( Map ( _, ordered1) , Map ( _, ordered2) ) if ordered1 == ordered2 => {
722
+ cast_map_values ( array. as_map ( ) , to_type, cast_options, ordered1. to_owned ( ) )
723
+ }
729
724
( Decimal128 ( _, s1) , Decimal128 ( p2, s2) ) => {
730
725
cast_decimal_to_decimal_same_type :: < Decimal128Type > (
731
726
array. as_primitive ( ) ,
@@ -7141,18 +7136,26 @@ mod tests {
7141
7136
let array = builder. finish ( ) ;
7142
7137
7143
7138
let new_ordered = true ;
7144
- let new_type = DataType :: Map ( Arc :: new ( Field :: new ( "entries" , DataType :: Struct (
7145
- vec ! [
7146
- Field :: new( "key" , DataType :: Utf8 , false ) ,
7147
- Field :: new( "value" , DataType :: Utf8 , false ) ,
7148
- ] . into ( )
7149
- ) , false ) ) , new_ordered) ;
7139
+ let new_type = DataType :: Map (
7140
+ Arc :: new ( Field :: new (
7141
+ "entries" ,
7142
+ DataType :: Struct (
7143
+ vec ! [
7144
+ Field :: new( "key" , DataType :: Utf8 , false ) ,
7145
+ Field :: new( "value" , DataType :: Utf8 , false ) ,
7146
+ ]
7147
+ . into ( ) ,
7148
+ ) ,
7149
+ false ,
7150
+ ) ) ,
7151
+ new_ordered,
7152
+ ) ;
7150
7153
7151
- let new_array_result = cast (
7152
- & array,
7153
- & new_type. clone ( ) ) ;
7154
+ let new_array_result = cast ( & array, & new_type. clone ( ) ) ;
7154
7155
assert ! ( !can_cast_types( array. data_type( ) , & new_type) ) ;
7155
- assert ! ( matches!( new_array_result, Err ( ArrowError :: CastError ( t) ) if t == r#"Casting from Map(Field { name: "entries", data_type: Struct([Field { name: "key", data_type: Utf8, nullable: false, dict_id: 0, dict_is_ordered: false, metadata: {} }, Field { name: "value", data_type: Utf8, nullable: true, dict_id: 0, dict_is_ordered: false, metadata: {} }]), nullable: false, dict_id: 0, dict_is_ordered: false, metadata: {} }, false) to Map(Field { name: "entries", data_type: Struct([Field { name: "key", data_type: Utf8, nullable: false, dict_id: 0, dict_is_ordered: false, metadata: {} }, Field { name: "value", data_type: Utf8, nullable: false, dict_id: 0, dict_is_ordered: false, metadata: {} }]), nullable: false, dict_id: 0, dict_is_ordered: false, metadata: {} }, true) not supported"# ) ) ;
7156
+ assert ! (
7157
+ matches!( new_array_result, Err ( ArrowError :: CastError ( t) ) if t == r#"Casting from Map(Field { name: "entries", data_type: Struct([Field { name: "key", data_type: Utf8, nullable: false, dict_id: 0, dict_is_ordered: false, metadata: {} }, Field { name: "value", data_type: Utf8, nullable: true, dict_id: 0, dict_is_ordered: false, metadata: {} }]), nullable: false, dict_id: 0, dict_is_ordered: false, metadata: {} }, false) to Map(Field { name: "entries", data_type: Struct([Field { name: "key", data_type: Utf8, nullable: false, dict_id: 0, dict_is_ordered: false, metadata: {} }, Field { name: "value", data_type: Utf8, nullable: false, dict_id: 0, dict_is_ordered: false, metadata: {} }]), nullable: false, dict_id: 0, dict_is_ordered: false, metadata: {} }, true) not supported"# )
7158
+ ) ;
7156
7159
}
7157
7160
7158
7161
#[ test]
@@ -7180,18 +7183,26 @@ mod tests {
7180
7183
let array = builder. finish ( ) ;
7181
7184
7182
7185
let new_ordered = true ;
7183
- let new_type = DataType :: Map ( Arc :: new ( Field :: new ( "entries" , DataType :: Struct (
7184
- vec ! [
7185
- Field :: new( "key" , DataType :: Utf8 , false ) ,
7186
- Field :: new( "value" , DataType :: Duration ( TimeUnit :: Second ) , false ) ,
7187
- ] . into ( )
7188
- ) , false ) ) , new_ordered) ;
7186
+ let new_type = DataType :: Map (
7187
+ Arc :: new ( Field :: new (
7188
+ "entries" ,
7189
+ DataType :: Struct (
7190
+ vec ! [
7191
+ Field :: new( "key" , DataType :: Utf8 , false ) ,
7192
+ Field :: new( "value" , DataType :: Duration ( TimeUnit :: Second ) , false ) ,
7193
+ ]
7194
+ . into ( ) ,
7195
+ ) ,
7196
+ false ,
7197
+ ) ) ,
7198
+ new_ordered,
7199
+ ) ;
7189
7200
7190
- let new_array_result = cast (
7191
- & array,
7192
- & new_type. clone ( ) ) ;
7201
+ let new_array_result = cast ( & array, & new_type. clone ( ) ) ;
7193
7202
assert ! ( !can_cast_types( array. data_type( ) , & new_type) ) ;
7194
- assert ! ( matches!( new_array_result, Err ( ArrowError :: CastError ( t) ) if t == r#"Casting from Map(Field { name: "entries", data_type: Struct([Field { name: "key", data_type: Utf8, nullable: false, dict_id: 0, dict_is_ordered: false, metadata: {} }, Field { name: "value", data_type: Interval(DayTime), nullable: true, dict_id: 0, dict_is_ordered: false, metadata: {} }]), nullable: false, dict_id: 0, dict_is_ordered: false, metadata: {} }, false) to Map(Field { name: "entries", data_type: Struct([Field { name: "key", data_type: Utf8, nullable: false, dict_id: 0, dict_is_ordered: false, metadata: {} }, Field { name: "value", data_type: Duration(Second), nullable: false, dict_id: 0, dict_is_ordered: false, metadata: {} }]), nullable: false, dict_id: 0, dict_is_ordered: false, metadata: {} }, true) not supported"# ) ) ;
7203
+ assert ! (
7204
+ matches!( new_array_result, Err ( ArrowError :: CastError ( t) ) if t == r#"Casting from Map(Field { name: "entries", data_type: Struct([Field { name: "key", data_type: Utf8, nullable: false, dict_id: 0, dict_is_ordered: false, metadata: {} }, Field { name: "value", data_type: Interval(DayTime), nullable: true, dict_id: 0, dict_is_ordered: false, metadata: {} }]), nullable: false, dict_id: 0, dict_is_ordered: false, metadata: {} }, false) to Map(Field { name: "entries", data_type: Struct([Field { name: "key", data_type: Utf8, nullable: false, dict_id: 0, dict_is_ordered: false, metadata: {} }, Field { name: "value", data_type: Duration(Second), nullable: false, dict_id: 0, dict_is_ordered: false, metadata: {} }]), nullable: false, dict_id: 0, dict_is_ordered: false, metadata: {} }, true) not supported"# )
7205
+ ) ;
7195
7206
}
7196
7207
7197
7208
#[ test]
@@ -7217,18 +7228,24 @@ mod tests {
7217
7228
7218
7229
let array = builder. finish ( ) ;
7219
7230
7220
- let new_type = DataType :: Map ( Arc :: new ( Field :: new ( "entries_new" , DataType :: Struct (
7221
- vec ! [
7222
- Field :: new( "key_new" , DataType :: Utf8 , false ) ,
7223
- Field :: new( "value_values" , DataType :: Utf8 , false ) ,
7224
- ] . into ( )
7225
- ) , false ) ) , false ) ;
7231
+ let new_type = DataType :: Map (
7232
+ Arc :: new ( Field :: new (
7233
+ "entries_new" ,
7234
+ DataType :: Struct (
7235
+ vec ! [
7236
+ Field :: new( "key_new" , DataType :: Utf8 , false ) ,
7237
+ Field :: new( "value_values" , DataType :: Utf8 , false ) ,
7238
+ ]
7239
+ . into ( ) ,
7240
+ ) ,
7241
+ false ,
7242
+ ) ) ,
7243
+ false ,
7244
+ ) ;
7226
7245
7227
7246
assert_ne ! ( new_type, array. data_type( ) . clone( ) ) ;
7228
7247
7229
- let new_array = cast (
7230
- & array,
7231
- & new_type. clone ( ) ) . unwrap ( ) ;
7248
+ let new_array = cast ( & array, & new_type. clone ( ) ) . unwrap ( ) ;
7232
7249
assert_eq ! ( new_type, new_array. data_type( ) . clone( ) ) ;
7233
7250
let map_array = new_array. as_map ( ) ;
7234
7251
@@ -7245,8 +7262,7 @@ mod tests {
7245
7262
. collect :: < Vec < _ > > ( ) ;
7246
7263
assert_eq ! ( & key_string, & vec![ "0" , "1" ] ) ;
7247
7264
7248
- let values_string_array = cast ( map_array
7249
- . values ( ) , & DataType :: Utf8 ) . unwrap ( ) ;
7265
+ let values_string_array = cast ( map_array. values ( ) , & DataType :: Utf8 ) . unwrap ( ) ;
7250
7266
let values_string = values_string_array
7251
7267
. as_any ( )
7252
7268
. downcast_ref :: < StringArray > ( )
@@ -7280,16 +7296,22 @@ mod tests {
7280
7296
7281
7297
let array = builder. finish ( ) ;
7282
7298
7283
- let new_type = DataType :: Map ( Arc :: new ( Field :: new ( "entries" , DataType :: Struct (
7284
- vec ! [
7285
- Field :: new( "key" , DataType :: Utf8 , false ) ,
7286
- Field :: new( "value" , DataType :: Utf8 , false ) ,
7287
- ] . into ( )
7288
- ) , false ) ) , false ) ;
7299
+ let new_type = DataType :: Map (
7300
+ Arc :: new ( Field :: new (
7301
+ "entries" ,
7302
+ DataType :: Struct (
7303
+ vec ! [
7304
+ Field :: new( "key" , DataType :: Utf8 , false ) ,
7305
+ Field :: new( "value" , DataType :: Utf8 , false ) ,
7306
+ ]
7307
+ . into ( ) ,
7308
+ ) ,
7309
+ false ,
7310
+ ) ) ,
7311
+ false ,
7312
+ ) ;
7289
7313
7290
- let new_array = cast (
7291
- & array,
7292
- & new_type. clone ( ) ) . unwrap ( ) ;
7314
+ let new_array = cast ( & array, & new_type. clone ( ) ) . unwrap ( ) ;
7293
7315
assert_eq ! ( new_type, new_array. data_type( ) . clone( ) ) ;
7294
7316
let map_array = new_array. as_map ( ) ;
7295
7317
@@ -7306,8 +7328,7 @@ mod tests {
7306
7328
. collect :: < Vec < _ > > ( ) ;
7307
7329
assert_eq ! ( & key_string, & vec![ "0" , "1" ] ) ;
7308
7330
7309
- let values_string_array = cast ( map_array
7310
- . values ( ) , & DataType :: Utf8 ) . unwrap ( ) ;
7331
+ let values_string_array = cast ( map_array. values ( ) , & DataType :: Utf8 ) . unwrap ( ) ;
7311
7332
let values_string = values_string_array
7312
7333
. as_any ( )
7313
7334
. downcast_ref :: < StringArray > ( )
0 commit comments