@@ -358,69 +358,47 @@ impl PartialOrd for ScalarValue {
358
358
( FixedSizeBinary ( _, _) , _) => None ,
359
359
( LargeBinary ( v1) , LargeBinary ( v2) ) => v1. partial_cmp ( v2) ,
360
360
( LargeBinary ( _) , _) => None ,
361
- ( List ( arr1) , List ( arr2) ) | ( FixedSizeList ( arr1) , FixedSizeList ( arr2) ) => {
362
- if arr1. data_type ( ) == arr2. data_type ( ) {
363
- let list_arr1 = as_list_array ( arr1) ;
364
- let list_arr2 = as_list_array ( arr2) ;
365
- if list_arr1. len ( ) != list_arr2. len ( ) {
366
- return None ;
367
- }
368
- for i in 0 ..list_arr1. len ( ) {
369
- let arr1 = list_arr1. value ( i) ;
370
- let arr2 = list_arr2. value ( i) ;
371
-
372
- let lt_res =
373
- arrow:: compute:: kernels:: cmp:: lt ( & arr1, & arr2) . ok ( ) ?;
374
- let eq_res =
375
- arrow:: compute:: kernels:: cmp:: eq ( & arr1, & arr2) . ok ( ) ?;
376
-
377
- for j in 0 ..lt_res. len ( ) {
378
- if lt_res. is_valid ( j) && lt_res. value ( j) {
379
- return Some ( Ordering :: Less ) ;
380
- }
381
- if eq_res. is_valid ( j) && !eq_res. value ( j) {
382
- return Some ( Ordering :: Greater ) ;
383
- }
384
- }
361
+ ( List ( arr1) , List ( arr2) )
362
+ | ( FixedSizeList ( arr1) , FixedSizeList ( arr2) )
363
+ | ( LargeList ( arr1) , LargeList ( arr2) ) => {
364
+ // ScalarValue::List / ScalarValue::FixedSizeList / ScalarValue::LargeList are ensure to have length 1
365
+ assert_eq ! ( arr1. len( ) , 1 ) ;
366
+ assert_eq ! ( arr2. len( ) , 1 ) ;
367
+
368
+ if arr1. data_type ( ) != arr2. data_type ( ) {
369
+ return None ;
370
+ }
371
+
372
+ fn first_array_for_list ( arr : & ArrayRef ) -> ArrayRef {
373
+ if let Some ( arr) = arr. as_list_opt :: < i32 > ( ) {
374
+ arr. value ( 0 )
375
+ } else if let Some ( arr) = arr. as_list_opt :: < i64 > ( ) {
376
+ arr. value ( 0 )
377
+ } else if let Some ( arr) = arr. as_fixed_size_list_opt ( ) {
378
+ arr. value ( 0 )
379
+ } else {
380
+ unreachable ! ( "Since only List / LargeList / FixedSizeList are supported, this should never happen" )
385
381
}
386
- Some ( Ordering :: Equal )
387
- } else {
388
- None
389
382
}
390
- }
391
- ( LargeList ( arr1) , LargeList ( arr2) ) => {
392
- if arr1. data_type ( ) == arr2. data_type ( ) {
393
- let list_arr1 = as_large_list_array ( arr1) ;
394
- let list_arr2 = as_large_list_array ( arr2) ;
395
- if list_arr1. len ( ) != list_arr2. len ( ) {
396
- return None ;
383
+
384
+ let arr1 = first_array_for_list ( arr1) ;
385
+ let arr2 = first_array_for_list ( arr2) ;
386
+
387
+ let lt_res = arrow:: compute:: kernels:: cmp:: lt ( & arr1, & arr2) . ok ( ) ?;
388
+ let eq_res = arrow:: compute:: kernels:: cmp:: eq ( & arr1, & arr2) . ok ( ) ?;
389
+
390
+ for j in 0 ..lt_res. len ( ) {
391
+ if lt_res. is_valid ( j) && lt_res. value ( j) {
392
+ return Some ( Ordering :: Less ) ;
397
393
}
398
- for i in 0 ..list_arr1. len ( ) {
399
- let arr1 = list_arr1. value ( i) ;
400
- let arr2 = list_arr2. value ( i) ;
401
-
402
- let lt_res =
403
- arrow:: compute:: kernels:: cmp:: lt ( & arr1, & arr2) . ok ( ) ?;
404
- let eq_res =
405
- arrow:: compute:: kernels:: cmp:: eq ( & arr1, & arr2) . ok ( ) ?;
406
-
407
- for j in 0 ..lt_res. len ( ) {
408
- if lt_res. is_valid ( j) && lt_res. value ( j) {
409
- return Some ( Ordering :: Less ) ;
410
- }
411
- if eq_res. is_valid ( j) && !eq_res. value ( j) {
412
- return Some ( Ordering :: Greater ) ;
413
- }
414
- }
394
+ if eq_res. is_valid ( j) && !eq_res. value ( j) {
395
+ return Some ( Ordering :: Greater ) ;
415
396
}
416
- Some ( Ordering :: Equal )
417
- } else {
418
- None
419
397
}
398
+
399
+ Some ( Ordering :: Equal )
420
400
}
421
- ( List ( _) , _) => None ,
422
- ( LargeList ( _) , _) => None ,
423
- ( FixedSizeList ( _) , _) => None ,
401
+ ( List ( _) , _) | ( LargeList ( _) , _) | ( FixedSizeList ( _) , _) => None ,
424
402
( Date32 ( v1) , Date32 ( v2) ) => v1. partial_cmp ( v2) ,
425
403
( Date32 ( _) , _) => None ,
426
404
( Date64 ( v1) , Date64 ( v2) ) => v1. partial_cmp ( v2) ,
@@ -3644,24 +3622,6 @@ mod tests {
3644
3622
] ) ] ) ,
3645
3623
) ) ;
3646
3624
assert_eq ! ( a. partial_cmp( & b) , Some ( Ordering :: Less ) ) ;
3647
-
3648
- let a =
3649
- ScalarValue :: List ( Arc :: new (
3650
- ListArray :: from_iter_primitive :: < Int64Type , _ , _ > ( vec ! [
3651
- Some ( vec![ Some ( 10 ) , Some ( 2 ) , Some ( 3 ) ] ) ,
3652
- None ,
3653
- Some ( vec![ Some ( 10 ) , Some ( 2 ) , Some ( 3 ) ] ) ,
3654
- ] ) ,
3655
- ) ) ;
3656
- let b =
3657
- ScalarValue :: List ( Arc :: new (
3658
- ListArray :: from_iter_primitive :: < Int64Type , _ , _ > ( vec ! [
3659
- Some ( vec![ Some ( 10 ) , Some ( 2 ) , Some ( 3 ) ] ) ,
3660
- None ,
3661
- Some ( vec![ Some ( 10 ) , Some ( 2 ) , Some ( 3 ) ] ) ,
3662
- ] ) ,
3663
- ) ) ;
3664
- assert_eq ! ( a. partial_cmp( & b) , Some ( Ordering :: Equal ) ) ;
3665
3625
}
3666
3626
3667
3627
#[ test]
0 commit comments