@@ -27,7 +27,7 @@ use crate::error::{ArrowError, Result};
2727use num:: Float ;
2828
2929/// 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 > ;
3131
3232/// compares two floats, placing NaNs at last
3333fn 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 {
3939 }
4040}
4141
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
4643where
4744 T :: Native : Ord ,
4845{
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 ( ) ) ;
5148 Box :: new ( move |i, j| left. value ( i) . cmp ( & right. value ( j) ) )
5249}
5350
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+
5755 Box :: new ( move |i, j| left. value ( i) . cmp ( & right. value ( j) ) )
5856}
5957
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
6459where
6560 T :: Native : Float ,
6661{
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 ( ) ) ;
6964 Box :: new ( move |i, j| cmp_nans_last ( & left. value ( i) , & right. value ( j) ) )
7065}
7166
72- fn compare_string < ' a , T > ( left : & ' a Array , right : & ' a Array ) -> DynComparator < ' a >
67+ fn compare_string < T > ( left : & Array , right : & Array ) -> DynComparator
7368where
7469 T : StringOffsetSizeTrait ,
7570{
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+
8474 Box :: new ( move |i, j| left. value ( i) . cmp ( & right. value ( j) ) )
8575}
8676
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
8878where
8979 T : ArrowDictionaryKeyType ,
9080{
9181 let left = left. as_any ( ) . downcast_ref :: < DictionaryArray < T > > ( ) . unwrap ( ) ;
9282 let right = right. as_any ( ) . downcast_ref :: < DictionaryArray < T > > ( ) . unwrap ( ) ;
93- let left_keys = left. keys ( ) ;
94- let right_keys = right. keys ( ) ;
9583
84+ let left_keys: PrimitiveArray < T > = PrimitiveArray :: from ( left. keys ( ) . data ( ) . clone ( ) ) ;
85+ let right_keys: PrimitiveArray < T > = PrimitiveArray :: from ( right. keys ( ) . data ( ) . clone ( ) ) ;
9686 let left_values = StringArray :: from ( left. values ( ) . data ( ) . clone ( ) ) ;
9787 let right_values = StringArray :: from ( right. values ( ) . data ( ) . clone ( ) ) ;
9888
@@ -125,7 +115,7 @@ where
125115/// ```
126116// This is a factory of comparisons.
127117// 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 > {
129119 use DataType :: * ;
130120 use IntervalUnit :: * ;
131121 use TimeUnit :: * ;
0 commit comments