diff --git a/arrow/src/array/ord.rs b/arrow/src/array/ord.rs index 452fbf733f63..998c06e50ebd 100644 --- a/arrow/src/array/ord.rs +++ b/arrow/src/array/ord.rs @@ -126,25 +126,33 @@ where }) } -macro_rules! cmp_dict_primitive { - ($KEY_TYPE:expr, $VALUE_TYPE:ident, $LEFT:ident, $RIGHT:ident) => { - match $KEY_TYPE { - UInt8 => compare_dict_primitive::($LEFT, $RIGHT), - UInt16 => compare_dict_primitive::($LEFT, $RIGHT), - UInt32 => compare_dict_primitive::($LEFT, $RIGHT), - UInt64 => compare_dict_primitive::($LEFT, $RIGHT), - Int8 => compare_dict_primitive::($LEFT, $RIGHT), - Int16 => compare_dict_primitive::($LEFT, $RIGHT), - Int32 => compare_dict_primitive::($LEFT, $RIGHT), - Int64 => compare_dict_primitive::($LEFT, $RIGHT), - t => { - return Err(ArrowError::InvalidArgumentError(format!( - "Dictionaries do not support keys of type {:?}", - t - ))); - } +fn cmp_dict_primitive( + key_type: &DataType, + left: &dyn Array, + right: &dyn Array, +) -> Result +where + VT: ArrowPrimitiveType, + VT::Native: Ord, +{ + use DataType::*; + + Ok(match key_type { + UInt8 => compare_dict_primitive::(left, right), + UInt16 => compare_dict_primitive::(left, right), + UInt32 => compare_dict_primitive::(left, right), + UInt64 => compare_dict_primitive::(left, right), + Int8 => compare_dict_primitive::(left, right), + Int16 => compare_dict_primitive::(left, right), + Int32 => compare_dict_primitive::(left, right), + Int64 => compare_dict_primitive::(left, right), + t => { + return Err(ArrowError::InvalidArgumentError(format!( + "Dictionaries do not support keys of type {:?}", + t + ))); } - }; + }) } /// returns a comparison function that compares two values at two different positions @@ -250,28 +258,14 @@ pub fn build_compare(left: &dyn Array, right: &dyn Array) -> Result cmp_dict_primitive!(key_type_lhs, Int8Type, left, right), - Int16 => { - cmp_dict_primitive!(key_type_lhs, Int16Type, left, right) - } - Int32 => { - cmp_dict_primitive!(key_type_lhs, Int32Type, left, right) - } - Int64 => { - cmp_dict_primitive!(key_type_lhs, Int64Type, left, right) - } - UInt8 => { - cmp_dict_primitive!(key_type_lhs, UInt8Type, left, right) - } - UInt16 => { - cmp_dict_primitive!(key_type_lhs, UInt16Type, left, right) - } - UInt32 => { - cmp_dict_primitive!(key_type_lhs, UInt32Type, left, right) - } - UInt64 => { - cmp_dict_primitive!(key_type_lhs, UInt64Type, left, right) - } + Int8 => cmp_dict_primitive::(key_type_lhs, left, right)?, + Int16 => cmp_dict_primitive::(key_type_lhs, left, right)?, + Int32 => cmp_dict_primitive::(key_type_lhs, left, right)?, + Int64 => cmp_dict_primitive::(key_type_lhs, left, right)?, + UInt8 => cmp_dict_primitive::(key_type_lhs, left, right)?, + UInt16 => cmp_dict_primitive::(key_type_lhs, left, right)?, + UInt32 => cmp_dict_primitive::(key_type_lhs, left, right)?, + UInt64 => cmp_dict_primitive::(key_type_lhs, left, right)?, Utf8 => match key_type_lhs { UInt8 => compare_dict_string::(left, right), UInt16 => compare_dict_string::(left, right),