@@ -24,21 +24,12 @@ use crate::datatypes::TimeUnit;
24
24
use crate :: datatypes:: * ;
25
25
use crate :: error:: { ArrowError , Result } ;
26
26
27
+ use crate :: compute:: kernels:: merge:: FloatCmp ;
27
28
use num:: Float ;
28
29
29
30
/// Compare the values at two arbitrary indices in two arrays.
30
31
pub type DynComparator = Box < dyn Fn ( usize , usize ) -> Ordering + Send + Sync > ;
31
32
32
- /// compares two floats, placing NaNs at last
33
- fn cmp_nans_last < T : Float > ( a : & T , b : & T ) -> Ordering {
34
- match ( a. is_nan ( ) , b. is_nan ( ) ) {
35
- ( true , true ) => Ordering :: Equal ,
36
- ( true , false ) => Ordering :: Greater ,
37
- ( false , true ) => Ordering :: Less ,
38
- _ => a. partial_cmp ( b) . unwrap ( ) ,
39
- }
40
- }
41
-
42
33
fn compare_primitives < T : ArrowPrimitiveType > ( left : & Array , right : & Array ) -> DynComparator
43
34
where
44
35
T :: Native : Ord ,
@@ -57,11 +48,12 @@ fn compare_boolean(left: &Array, right: &Array) -> DynComparator {
57
48
58
49
fn compare_float < T : ArrowPrimitiveType > ( left : & Array , right : & Array ) -> DynComparator
59
50
where
60
- T :: Native : Float ,
51
+ T :: Native : Float + FloatCmp ,
61
52
{
62
53
let left: PrimitiveArray < T > = PrimitiveArray :: from ( left. data ( ) . clone ( ) ) ;
63
54
let right: PrimitiveArray < T > = PrimitiveArray :: from ( right. data ( ) . clone ( ) ) ;
64
- Box :: new ( move |i, j| cmp_nans_last ( & left. value ( i) , & right. value ( j) ) )
55
+ // CubeStore-specific: use `total_cmp` instead of putting NaNs last.
56
+ Box :: new ( move |i, j| left. value ( i) . total_cmp ( right. value ( j) ) )
65
57
}
66
58
67
59
fn compare_string < T > ( left : & Array , right : & Array ) -> DynComparator
@@ -279,8 +271,8 @@ pub mod tests {
279
271
280
272
let cmp = build_compare ( & array, & array) ?;
281
273
282
- assert_eq ! ( Ordering :: Equal , ( cmp) ( 0 , 1 ) ) ;
283
- assert_eq ! ( Ordering :: Equal , ( cmp) ( 1 , 0 ) ) ;
274
+ assert_eq ! ( Ordering :: Less , ( cmp) ( 0 , 1 ) ) ;
275
+ assert_eq ! ( Ordering :: Greater , ( cmp) ( 1 , 0 ) ) ;
284
276
Ok ( ( ) )
285
277
}
286
278
0 commit comments