You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@arrow.apache.org by vi...@apache.org on 2022/10/30 07:24:36 UTC
[arrow-rs] branch master updated: Compare dictionary and non-dictionary decimal arrays (#2980)
This is an automated email from the ASF dual-hosted git repository.
viirya pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/arrow-rs.git
The following commit(s) were added to refs/heads/master by this push:
new 4311904b7 Compare dictionary and non-dictionary decimal arrays (#2980)
4311904b7 is described below
commit 4311904b7e56d5fd5fdf0e675da1eb84e24c8137
Author: Liang-Chi Hsieh <vi...@gmail.com>
AuthorDate: Sun Oct 30 00:24:30 2022 -0700
Compare dictionary and non-dictionary decimal arrays (#2980)
---
arrow/src/compute/kernels/comparison.rs | 82 +++++++++++++++++++++++++++++++++
1 file changed, 82 insertions(+)
diff --git a/arrow/src/compute/kernels/comparison.rs b/arrow/src/compute/kernels/comparison.rs
index 4d8248a8d..1074aaf31 100644
--- a/arrow/src/compute/kernels/comparison.rs
+++ b/arrow/src/compute/kernels/comparison.rs
@@ -26,6 +26,7 @@
use crate::array::*;
use crate::buffer::{buffer_unary_not, Buffer, MutableBuffer};
use crate::compute::util::combine_option_bitmap;
+#[allow(unused_imports)]
use crate::datatypes::{
ArrowNativeTypeOp, ArrowNumericType, DataType, Date32Type, Date64Type,
Decimal128Type, Decimal256Type, Float32Type, Float64Type, Int16Type, Int32Type,
@@ -2167,6 +2168,12 @@ macro_rules! typed_cmp_dict_non_dict {
(DataType::Float64, DataType::Float64) => {
typed_dict_non_dict_cmp!($LEFT, $RIGHT, left_key_type.as_ref(), Float64Type, $OP_BOOL, $OP_FLOAT)
}
+ (DataType::Decimal128(_, s1), DataType::Decimal128(_, s2)) if s1 == s2 => {
+ typed_dict_non_dict_cmp!($LEFT, $RIGHT, left_key_type.as_ref(), Decimal128Type, $OP_BOOL, $OP)
+ }
+ (DataType::Decimal256(_, s1), DataType::Decimal256(_, s2)) if s1 == s2 => {
+ typed_dict_non_dict_cmp!($LEFT, $RIGHT, left_key_type.as_ref(), Decimal256Type, $OP_BOOL, $OP)
+ }
(DataType::Utf8, DataType::Utf8) => {
typed_dict_string_array_cmp!($LEFT, $RIGHT, left_key_type.as_ref(), i32, $OP)
}
@@ -6653,6 +6660,81 @@ mod tests {
);
}
+ #[test]
+ #[cfg(feature = "dyn_cmp_dict")]
+ fn test_cmp_dict_non_dict_decimal128() {
+ let array1: Decimal128Array =
+ Decimal128Array::from_iter_values([1, 2, 5, 4, 3, 0]);
+
+ let values = Decimal128Array::from_iter_values([7, -3, 4, 3, 5]);
+ let keys = Int8Array::from_iter_values([0_i8, 0, 1, 2, 3, 4]);
+ let array2 = DictionaryArray::try_new(&keys, &values).unwrap();
+
+ let expected = BooleanArray::from(
+ vec![Some(false), Some(false), Some(false), Some(true), Some(true), Some(false)],
+ );
+ assert_eq!(eq_dyn(&array1, &array2).unwrap(), expected);
+
+ let expected = BooleanArray::from(
+ vec![Some(true), Some(true), Some(false), Some(false), Some(false), Some(true)],
+ );
+ assert_eq!(lt_dyn(&array1, &array2).unwrap(), expected);
+
+ let expected = BooleanArray::from(
+ vec![Some(true), Some(true), Some(false), Some(true), Some(true), Some(true)],
+ );
+ assert_eq!(lt_eq_dyn(&array1, &array2).unwrap(), expected);
+
+ let expected = BooleanArray::from(
+ vec![Some(false), Some(false), Some(true), Some(false), Some(false), Some(false)],
+ );
+ assert_eq!(gt_dyn(&array1, &array2).unwrap(), expected);
+
+ let expected = BooleanArray::from(
+ vec![Some(false), Some(false), Some(true), Some(true), Some(true), Some(false)],
+ );
+ assert_eq!(gt_eq_dyn(&array1, &array2).unwrap(), expected);
+ }
+
+ #[test]
+ #[cfg(feature = "dyn_cmp_dict")]
+ fn test_cmp_dict_non_dict_decimal256() {
+ let array1: Decimal256Array = Decimal256Array::from_iter_values(
+ [1, 2, 5, 4, 3, 0].into_iter().map(i256::from_i128),
+ );
+
+ let values = Decimal256Array::from_iter_values(
+ [7, -3, 4, 3, 5].into_iter().map(i256::from_i128),
+ );
+ let keys = Int8Array::from_iter_values([0_i8, 0, 1, 2, 3, 4]);
+ let array2 = DictionaryArray::try_new(&keys, &values).unwrap();
+
+ let expected = BooleanArray::from(
+ vec![Some(false), Some(false), Some(false), Some(true), Some(true), Some(false)],
+ );
+ assert_eq!(eq_dyn(&array1, &array2).unwrap(), expected);
+
+ let expected = BooleanArray::from(
+ vec![Some(true), Some(true), Some(false), Some(false), Some(false), Some(true)],
+ );
+ assert_eq!(lt_dyn(&array1, &array2).unwrap(), expected);
+
+ let expected = BooleanArray::from(
+ vec![Some(true), Some(true), Some(false), Some(true), Some(true), Some(true)],
+ );
+ assert_eq!(lt_eq_dyn(&array1, &array2).unwrap(), expected);
+
+ let expected = BooleanArray::from(
+ vec![Some(false), Some(false), Some(true), Some(false), Some(false), Some(false)],
+ );
+ assert_eq!(gt_dyn(&array1, &array2).unwrap(), expected);
+
+ let expected = BooleanArray::from(
+ vec![Some(false), Some(false), Some(true), Some(true), Some(true), Some(false)],
+ );
+ assert_eq!(gt_eq_dyn(&array1, &array2).unwrap(), expected);
+ }
+
#[test]
fn test_decimal128() {
let a = Decimal128Array::from_iter_values([1, 2, 4, 5]);