@@ -27,7 +27,7 @@ use crate::error::{ArrowError, Result};
27
27
use num:: Float ;
28
28
29
29
/// Compare the values at two arbitrary indices in two arrays.
30
- pub type DynComparator < ' a > = Box < dyn Fn ( usize , usize ) -> Ordering + ' a > ;
30
+ pub type DynComparator = Box < dyn Fn ( usize , usize ) -> Ordering + Send + Sync > ;
31
31
32
32
/// compares two floats, placing NaNs at last
33
33
fn cmp_nans_last < T : Float > ( a : & T , b : & T ) -> Ordering {
@@ -39,60 +39,50 @@ fn cmp_nans_last<T: Float>(a: &T, b: &T) -> Ordering {
39
39
}
40
40
}
41
41
42
- fn compare_primitives < ' a , T : ArrowPrimitiveType > (
43
- left : & ' a Array ,
44
- right : & ' a Array ,
45
- ) -> DynComparator < ' a >
42
+ fn compare_primitives < T : ArrowPrimitiveType > ( left : & Array , right : & Array ) -> DynComparator
46
43
where
47
44
T :: Native : Ord ,
48
45
{
49
- let left = left. as_any ( ) . downcast_ref :: < PrimitiveArray < T > > ( ) . unwrap ( ) ;
50
- let right = right. as_any ( ) . downcast_ref :: < PrimitiveArray < T > > ( ) . unwrap ( ) ;
46
+ let left: PrimitiveArray < T > = PrimitiveArray :: from ( left. data ( ) . clone ( ) ) ;
47
+ let right: PrimitiveArray < T > = PrimitiveArray :: from ( right. data ( ) . clone ( ) ) ;
51
48
Box :: new ( move |i, j| left. value ( i) . cmp ( & right. value ( j) ) )
52
49
}
53
50
54
- fn compare_boolean < ' a > ( left : & ' a Array , right : & ' a Array ) -> DynComparator < ' a > {
55
- let left = left. as_any ( ) . downcast_ref :: < BooleanArray > ( ) . unwrap ( ) ;
56
- let right = right. as_any ( ) . downcast_ref :: < BooleanArray > ( ) . unwrap ( ) ;
51
+ fn compare_boolean ( left : & Array , right : & Array ) -> DynComparator {
52
+ let left: BooleanArray = BooleanArray :: from ( left. data ( ) . clone ( ) ) ;
53
+ let right: BooleanArray = BooleanArray :: from ( right. data ( ) . clone ( ) ) ;
54
+
57
55
Box :: new ( move |i, j| left. value ( i) . cmp ( & right. value ( j) ) )
58
56
}
59
57
60
- fn compare_float < ' a , T : ArrowPrimitiveType > (
61
- left : & ' a Array ,
62
- right : & ' a Array ,
63
- ) -> DynComparator < ' a >
58
+ fn compare_float < T : ArrowPrimitiveType > ( left : & Array , right : & Array ) -> DynComparator
64
59
where
65
60
T :: Native : Float ,
66
61
{
67
- let left = left. as_any ( ) . downcast_ref :: < PrimitiveArray < T > > ( ) . unwrap ( ) ;
68
- let right = right. as_any ( ) . downcast_ref :: < PrimitiveArray < T > > ( ) . unwrap ( ) ;
62
+ let left: PrimitiveArray < T > = PrimitiveArray :: from ( left. data ( ) . clone ( ) ) ;
63
+ let right: PrimitiveArray < T > = PrimitiveArray :: from ( right. data ( ) . clone ( ) ) ;
69
64
Box :: new ( move |i, j| cmp_nans_last ( & left. value ( i) , & right. value ( j) ) )
70
65
}
71
66
72
- fn compare_string < ' a , T > ( left : & ' a Array , right : & ' a Array ) -> DynComparator < ' a >
67
+ fn compare_string < T > ( left : & Array , right : & Array ) -> DynComparator
73
68
where
74
69
T : StringOffsetSizeTrait ,
75
70
{
76
- let left = left
77
- . as_any ( )
78
- . downcast_ref :: < GenericStringArray < T > > ( )
79
- . unwrap ( ) ;
80
- let right = right
81
- . as_any ( )
82
- . downcast_ref :: < GenericStringArray < T > > ( )
83
- . unwrap ( ) ;
71
+ let left: StringArray = StringArray :: from ( left. data ( ) . clone ( ) ) ;
72
+ let right: StringArray = StringArray :: from ( right. data ( ) . clone ( ) ) ;
73
+
84
74
Box :: new ( move |i, j| left. value ( i) . cmp ( & right. value ( j) ) )
85
75
}
86
76
87
- fn compare_dict_string < ' a , T > ( left : & ' a Array , right : & ' a Array ) -> DynComparator < ' a >
77
+ fn compare_dict_string < T > ( left : & Array , right : & Array ) -> DynComparator
88
78
where
89
79
T : ArrowDictionaryKeyType ,
90
80
{
91
81
let left = left. as_any ( ) . downcast_ref :: < DictionaryArray < T > > ( ) . unwrap ( ) ;
92
82
let right = right. as_any ( ) . downcast_ref :: < DictionaryArray < T > > ( ) . unwrap ( ) ;
93
- let left_keys = left. keys ( ) ;
94
- let right_keys = right. keys ( ) ;
95
83
84
+ let left_keys: PrimitiveArray < T > = PrimitiveArray :: from ( left. keys ( ) . data ( ) . clone ( ) ) ;
85
+ let right_keys: PrimitiveArray < T > = PrimitiveArray :: from ( right. keys ( ) . data ( ) . clone ( ) ) ;
96
86
let left_values = StringArray :: from ( left. values ( ) . data ( ) . clone ( ) ) ;
97
87
let right_values = StringArray :: from ( right. values ( ) . data ( ) . clone ( ) ) ;
98
88
@@ -125,7 +115,7 @@ where
125
115
/// ```
126
116
// This is a factory of comparisons.
127
117
// The lifetime 'a enforces that we cannot use the closure beyond any of the array's lifetime.
128
- pub fn build_compare < ' a > ( left : & ' a Array , right : & ' a Array ) -> Result < DynComparator < ' a > > {
118
+ pub fn build_compare ( left : & Array , right : & Array ) -> Result < DynComparator > {
129
119
use DataType :: * ;
130
120
use IntervalUnit :: * ;
131
121
use TimeUnit :: * ;
0 commit comments