@@ -30,7 +30,7 @@ use crate::cast::{
30
30
} ;
31
31
use crate :: error:: { DataFusionError , Result , _internal_err, _not_impl_err} ;
32
32
use crate :: hash_utils:: create_hashes;
33
- use crate :: utils:: array_into_list_array;
33
+ use crate :: utils:: { array_into_children_array_vec , array_into_list_array} ;
34
34
use arrow:: buffer:: { NullBuffer , OffsetBuffer } ;
35
35
use arrow:: compute:: kernels:: numeric:: * ;
36
36
use arrow:: datatypes:: { i256, Fields , SchemaBuilder } ;
@@ -312,31 +312,39 @@ impl PartialOrd for ScalarValue {
312
312
( FixedSizeBinary ( _, _) , _) => None ,
313
313
( LargeBinary ( v1) , LargeBinary ( v2) ) => v1. partial_cmp ( v2) ,
314
314
( LargeBinary ( _) , _) => None ,
315
- ( List ( arr1) , List ( arr2) ) | ( FixedSizeList ( arr1) , FixedSizeList ( arr2) ) => {
316
- if arr1. data_type ( ) == arr2. data_type ( ) {
317
- let list_arr1 = as_list_array ( arr1) ;
318
- let list_arr2 = as_list_array ( arr2) ;
315
+ ( List ( list_arr1) , List ( list_arr2) )
316
+ | ( FixedSizeList ( list_arr1) , FixedSizeList ( list_arr2) ) => {
317
+ if list_arr1. data_type ( ) == list_arr2. data_type ( ) {
319
318
if list_arr1. len ( ) != list_arr2. len ( ) {
320
319
return None ;
321
320
}
322
- for i in 0 ..list_arr1. len ( ) {
323
- let arr1 = list_arr1. value ( i) ;
324
- let arr2 = list_arr2. value ( i) ;
325
-
326
- let lt_res =
327
- arrow:: compute:: kernels:: cmp:: lt ( & arr1, & arr2) . ok ( ) ?;
328
- let eq_res =
329
- arrow:: compute:: kernels:: cmp:: eq ( & arr1, & arr2) . ok ( ) ?;
330
-
331
- for j in 0 ..lt_res. len ( ) {
332
- if lt_res. is_valid ( j) && lt_res. value ( j) {
333
- return Some ( Ordering :: Less ) ;
334
- }
335
- if eq_res. is_valid ( j) && !eq_res. value ( j) {
336
- return Some ( Ordering :: Greater ) ;
337
- }
321
+
322
+ // ScalarValue::List / ScalarValue::FixedSizeList should have only one list.
323
+ assert_eq ! ( list_arr1. len( ) , 1 ) ;
324
+ assert_eq ! ( list_arr2. len( ) , 1 ) ;
325
+
326
+ let arr1 = array_into_children_array_vec ( list_arr1) ;
327
+ let arr2 = array_into_children_array_vec ( list_arr2) ;
328
+
329
+ // Single child data
330
+ assert_eq ! ( arr1. len( ) , 1 ) ;
331
+ assert_eq ! ( arr2. len( ) , 1 ) ;
332
+
333
+ let arr1 = & arr1[ 0 ] ;
334
+ let arr2 = & arr2[ 0 ] ;
335
+
336
+ let lt_res = arrow:: compute:: kernels:: cmp:: lt ( arr1, arr2) . ok ( ) ?;
337
+ let eq_res = arrow:: compute:: kernels:: cmp:: eq ( arr1, arr2) . ok ( ) ?;
338
+
339
+ for j in 0 ..lt_res. len ( ) {
340
+ if lt_res. is_valid ( j) && lt_res. value ( j) {
341
+ return Some ( Ordering :: Less ) ;
342
+ }
343
+ if eq_res. is_valid ( j) && !eq_res. value ( j) {
344
+ return Some ( Ordering :: Greater ) ;
338
345
}
339
346
}
347
+
340
348
Some ( Ordering :: Equal )
341
349
} else {
342
350
None
@@ -3060,6 +3068,7 @@ impl ScalarType<i64> for TimestampNanosecondType {
3060
3068
}
3061
3069
3062
3070
#[ cfg( test) ]
3071
+ #[ cfg( feature = "parquet" ) ]
3063
3072
mod tests {
3064
3073
use std:: cmp:: Ordering ;
3065
3074
use std:: sync:: Arc ;
@@ -3534,24 +3543,6 @@ mod tests {
3534
3543
] ) ] ) ,
3535
3544
) ) ;
3536
3545
assert_eq ! ( a. partial_cmp( & b) , Some ( Ordering :: Less ) ) ;
3537
-
3538
- let a =
3539
- ScalarValue :: List ( Arc :: new (
3540
- ListArray :: from_iter_primitive :: < Int64Type , _ , _ > ( vec ! [
3541
- Some ( vec![ Some ( 10 ) , Some ( 2 ) , Some ( 3 ) ] ) ,
3542
- None ,
3543
- Some ( vec![ Some ( 10 ) , Some ( 2 ) , Some ( 3 ) ] ) ,
3544
- ] ) ,
3545
- ) ) ;
3546
- let b =
3547
- ScalarValue :: List ( Arc :: new (
3548
- ListArray :: from_iter_primitive :: < Int64Type , _ , _ > ( vec ! [
3549
- Some ( vec![ Some ( 10 ) , Some ( 2 ) , Some ( 3 ) ] ) ,
3550
- None ,
3551
- Some ( vec![ Some ( 10 ) , Some ( 2 ) , Some ( 3 ) ] ) ,
3552
- ] ) ,
3553
- ) ) ;
3554
- assert_eq ! ( a. partial_cmp( & b) , Some ( Ordering :: Equal ) ) ;
3555
3546
}
3556
3547
3557
3548
#[ test]
0 commit comments