@@ -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_children_array_vec , array_into_list_array} ;
33
+ use crate :: utils:: 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,29 +312,65 @@ impl PartialOrd for ScalarValue {
312
312
( FixedSizeBinary ( _, _) , _) => None ,
313
313
( LargeBinary ( v1) , LargeBinary ( v2) ) => v1. partial_cmp ( v2) ,
314
314
( LargeBinary ( _) , _) => None ,
315
- ( List ( list_arr1) , List ( list_arr2) )
316
- | ( FixedSizeList ( list_arr1) , FixedSizeList ( list_arr2) ) => {
317
- if list_arr1. data_type ( ) == list_arr2. data_type ( ) {
318
- if list_arr1. len ( ) != list_arr2. len ( ) {
315
+ ( List ( arr1) , List ( arr2) ) => {
316
+ if arr1. data_type ( ) == arr2. data_type ( ) {
317
+ if arr1. len ( ) != arr2. len ( ) {
319
318
return None ;
320
319
}
321
320
322
321
// ScalarValue::List / ScalarValue::FixedSizeList should have only one list.
322
+ assert_eq ! ( arr1. len( ) , 1 ) ;
323
+ assert_eq ! ( arr2. len( ) , 1 ) ;
324
+
325
+ let list_arr1 = arr1. as_list :: < i32 > ( ) ;
326
+ let list_arr2 = arr2. as_list :: < i32 > ( ) ;
327
+
328
+ // Single child data
323
329
assert_eq ! ( list_arr1. len( ) , 1 ) ;
324
330
assert_eq ! ( list_arr2. len( ) , 1 ) ;
325
331
326
- let arr1 = array_into_children_array_vec ( list_arr1) ;
327
- let arr2 = array_into_children_array_vec ( list_arr2) ;
332
+ let arr1 = list_arr1. value ( 0 ) ;
333
+ let arr2 = list_arr2. value ( 0 ) ;
328
334
329
- // Single child data
335
+ let lt_res = arrow:: compute:: kernels:: cmp:: lt ( & arr1, & arr2) . ok ( ) ?;
336
+ let eq_res = arrow:: compute:: kernels:: cmp:: eq ( & arr1, & arr2) . ok ( ) ?;
337
+
338
+ for j in 0 ..lt_res. len ( ) {
339
+ if lt_res. is_valid ( j) && lt_res. value ( j) {
340
+ return Some ( Ordering :: Less ) ;
341
+ }
342
+ if eq_res. is_valid ( j) && !eq_res. value ( j) {
343
+ return Some ( Ordering :: Greater ) ;
344
+ }
345
+ }
346
+
347
+ Some ( Ordering :: Equal )
348
+ } else {
349
+ None
350
+ }
351
+ }
352
+ ( FixedSizeList ( arr1) , FixedSizeList ( arr2) ) => {
353
+ if arr1. data_type ( ) == arr2. data_type ( ) {
354
+ if arr1. len ( ) != arr2. len ( ) {
355
+ return None ;
356
+ }
357
+
358
+ // ScalarValue::List / ScalarValue::FixedSizeList should have only one list.
330
359
assert_eq ! ( arr1. len( ) , 1 ) ;
331
360
assert_eq ! ( arr2. len( ) , 1 ) ;
332
361
333
- let arr1 = & arr1[ 0 ] ;
334
- let arr2 = & arr2[ 0 ] ;
362
+ let list_arr1 = arr1. as_fixed_size_list ( ) ;
363
+ let list_arr2 = arr2. as_fixed_size_list ( ) ;
364
+
365
+ // Single child data
366
+ assert_eq ! ( list_arr1. len( ) , 1 ) ;
367
+ assert_eq ! ( list_arr2. len( ) , 1 ) ;
368
+
369
+ let arr1 = list_arr1. value ( 0 ) ;
370
+ let arr2 = list_arr2. value ( 0 ) ;
335
371
336
- let lt_res = arrow:: compute:: kernels:: cmp:: lt ( arr1, arr2) . ok ( ) ?;
337
- let eq_res = arrow:: compute:: kernels:: cmp:: eq ( arr1, arr2) . ok ( ) ?;
372
+ let lt_res = arrow:: compute:: kernels:: cmp:: lt ( & arr1, & arr2) . ok ( ) ?;
373
+ let eq_res = arrow:: compute:: kernels:: cmp:: eq ( & arr1, & arr2) . ok ( ) ?;
338
374
339
375
for j in 0 ..lt_res. len ( ) {
340
376
if lt_res. is_valid ( j) && lt_res. value ( j) {
0 commit comments