This is an automated email from the ASF dual-hosted git repository.

alamb 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 00accc7  Support sort for decimal data type (#1487)
00accc7 is described below

commit 00accc7ad79f4c2fbdc3f471e20c04f477c64807
Author: Yijie Shen <[email protected]>
AuthorDate: Tue Mar 29 04:38:58 2022 +0800

    Support sort for decimal data type (#1487)
---
 arrow/src/array/ord.rs | 19 +++++++++++++++++++
 1 file changed, 19 insertions(+)

diff --git a/arrow/src/array/ord.rs b/arrow/src/array/ord.rs
index 37bd009..c4ddc69 100644
--- a/arrow/src/array/ord.rs
+++ b/arrow/src/array/ord.rs
@@ -225,6 +225,11 @@ pub fn build_compare(left: &dyn Array, right: &dyn Array) 
-> Result<DynComparato
                 }
             }
         }
+        (Decimal(_, _), Decimal(_, _)) => {
+            let left: DecimalArray = DecimalArray::from(left.data().clone());
+            let right: DecimalArray = DecimalArray::from(right.data().clone());
+            Box::new(move |i, j| left.value(i).cmp(&right.value(j)))
+        }
         (lhs, _) => {
             return Err(ArrowError::InvalidArgumentError(format!(
                 "The data type type {:?} has no natural order",
@@ -294,6 +299,20 @@ pub mod tests {
     }
 
     #[test]
+    fn test_decimal() -> Result<()> {
+        let array = vec![Some(5), Some(2), Some(3)]
+            .iter()
+            .collect::<DecimalArray>()
+            .with_precision_and_scale(23, 6)
+            .unwrap();
+
+        let cmp = build_compare(&array, &array)?;
+        assert_eq!(Ordering::Less, (cmp)(1, 0));
+        assert_eq!(Ordering::Greater, (cmp)(0, 2));
+        Ok(())
+    }
+
+    #[test]
     fn test_dict() -> Result<()> {
         let data = vec!["a", "b", "c", "a", "a", "c", "c"];
         let array = data.into_iter().collect::<DictionaryArray<Int16Type>>();

Reply via email to