diff --git a/arrow/src/array/ord.rs b/arrow/src/array/ord.rs index 187542a03cb1..7fb4668d962b 100644 --- a/arrow/src/array/ord.rs +++ b/arrow/src/array/ord.rs @@ -27,7 +27,7 @@ use crate::error::{ArrowError, Result}; use num::Float; /// Compare the values at two arbitrary indices in two arrays. -pub type DynComparator<'a> = Box Ordering + 'a>; +pub type DynComparator = Box Ordering + Send + Sync>; /// compares two floats, placing NaNs at last fn cmp_nans_last(a: &T, b: &T) -> Ordering { @@ -39,60 +39,50 @@ fn cmp_nans_last(a: &T, b: &T) -> Ordering { } } -fn compare_primitives<'a, T: ArrowPrimitiveType>( - left: &'a Array, - right: &'a Array, -) -> DynComparator<'a> +fn compare_primitives(left: &Array, right: &Array) -> DynComparator where T::Native: Ord, { - let left = left.as_any().downcast_ref::>().unwrap(); - let right = right.as_any().downcast_ref::>().unwrap(); + let left: PrimitiveArray = PrimitiveArray::from(left.data().clone()); + let right: PrimitiveArray = PrimitiveArray::from(right.data().clone()); Box::new(move |i, j| left.value(i).cmp(&right.value(j))) } -fn compare_boolean<'a>(left: &'a Array, right: &'a Array) -> DynComparator<'a> { - let left = left.as_any().downcast_ref::().unwrap(); - let right = right.as_any().downcast_ref::().unwrap(); +fn compare_boolean(left: &Array, right: &Array) -> DynComparator { + let left: BooleanArray = BooleanArray::from(left.data().clone()); + let right: BooleanArray = BooleanArray::from(right.data().clone()); + Box::new(move |i, j| left.value(i).cmp(&right.value(j))) } -fn compare_float<'a, T: ArrowPrimitiveType>( - left: &'a Array, - right: &'a Array, -) -> DynComparator<'a> +fn compare_float(left: &Array, right: &Array) -> DynComparator where T::Native: Float, { - let left = left.as_any().downcast_ref::>().unwrap(); - let right = right.as_any().downcast_ref::>().unwrap(); + let left: PrimitiveArray = PrimitiveArray::from(left.data().clone()); + let right: PrimitiveArray = PrimitiveArray::from(right.data().clone()); Box::new(move |i, j| cmp_nans_last(&left.value(i), &right.value(j))) } -fn compare_string<'a, T>(left: &'a Array, right: &'a Array) -> DynComparator<'a> +fn compare_string(left: &Array, right: &Array) -> DynComparator where T: StringOffsetSizeTrait, { - let left = left - .as_any() - .downcast_ref::>() - .unwrap(); - let right = right - .as_any() - .downcast_ref::>() - .unwrap(); + let left: StringArray = StringArray::from(left.data().clone()); + let right: StringArray = StringArray::from(right.data().clone()); + Box::new(move |i, j| left.value(i).cmp(&right.value(j))) } -fn compare_dict_string<'a, T>(left: &'a Array, right: &'a Array) -> DynComparator<'a> +fn compare_dict_string(left: &Array, right: &Array) -> DynComparator where T: ArrowDictionaryKeyType, { let left = left.as_any().downcast_ref::>().unwrap(); let right = right.as_any().downcast_ref::>().unwrap(); - let left_keys = left.keys(); - let right_keys = right.keys(); + let left_keys: PrimitiveArray = PrimitiveArray::from(left.keys().data().clone()); + let right_keys: PrimitiveArray = PrimitiveArray::from(right.keys().data().clone()); let left_values = StringArray::from(left.values().data().clone()); let right_values = StringArray::from(right.values().data().clone()); @@ -125,7 +115,7 @@ where /// ``` // This is a factory of comparisons. // The lifetime 'a enforces that we cannot use the closure beyond any of the array's lifetime. -pub fn build_compare<'a>(left: &'a Array, right: &'a Array) -> Result> { +pub fn build_compare(left: &Array, right: &Array) -> Result { use DataType::*; use IntervalUnit::*; use TimeUnit::*; diff --git a/arrow/src/compute/kernels/sort.rs b/arrow/src/compute/kernels/sort.rs index a8ba3f46a366..54529facd650 100644 --- a/arrow/src/compute/kernels/sort.rs +++ b/arrow/src/compute/kernels/sort.rs @@ -886,9 +886,9 @@ where } type LexicographicalCompareItem<'a> = ( - &'a ArrayData, // data - Box Ordering + 'a>, // comparator - SortOptions, // sort_option + &'a ArrayData, // data + DynComparator, // comparator + SortOptions, // sort_option ); /// A lexicographical comparator that wraps given array data (columns) and can lexicographically compare data