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

shiro pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/arrow.git


The following commit(s) were added to refs/heads/master by this push:
     new 803c818  ARROW-6197: [GLib] Add garrow_decimal128_rescale()
803c818 is described below

commit 803c818e1f50161c2e0962ac5437d2b29125edc7
Author: Sutou Kouhei <k...@clear-code.com>
AuthorDate: Mon Aug 12 06:59:53 2019 +0900

    ARROW-6197: [GLib] Add garrow_decimal128_rescale()
    
    Closes #5057 from kou/glib-decimal128-rescale and squashes the following 
commits:
    
    487b167a4 <Sutou Kouhei>  Add garrow_decimal128_rescale()
    
    Authored-by: Sutou Kouhei <k...@clear-code.com>
    Signed-off-by: Yosuke Shiro <yosuke.shiro...@gmail.com>
---
 c_glib/arrow-glib/decimal128.cpp | 33 ++++++++++++++++++++++++++++++++-
 c_glib/arrow-glib/decimal128.h   |  6 ++++++
 c_glib/test/test-decimal128.rb   | 18 +++++++++++++++++-
 3 files changed, 55 insertions(+), 2 deletions(-)

diff --git a/c_glib/arrow-glib/decimal128.cpp b/c_glib/arrow-glib/decimal128.cpp
index 32bdf5f..92d5ebd 100644
--- a/c_glib/arrow-glib/decimal128.cpp
+++ b/c_glib/arrow-glib/decimal128.cpp
@@ -420,7 +420,7 @@ garrow_decimal128_divide(GArrowDecimal128 *left,
     arrow_decimal_left->Divide(*arrow_decimal_right,
                                &arrow_result_raw,
                                &arrow_remainder_raw);
-  if (garrow_error_check(error, status, "[decimal][divide]")) {
+  if (garrow_error_check(error, status, "[decimal128][divide]")) {
     if (remainder) {
       auto arrow_remainder =
         std::make_shared<arrow::Decimal128>(arrow_remainder_raw);
@@ -436,6 +436,37 @@ garrow_decimal128_divide(GArrowDecimal128 *left,
   }
 }
 
+/**
+ * garrow_decimal128_rescale:
+ * @decimal: A #GArrowDecimal128.
+ * @original_scale: A scale to be converted from.
+ * @new_scale: A scale to be converted to.
+ * @error: (nullable): Return location for a #GError or %NULL.
+ *
+ * Returns: (nullable) (transfer full): The rescaled decimal or %NULL on error.
+ *
+ * Since: 0.15.0
+ */
+GArrowDecimal128 *
+garrow_decimal128_rescale(GArrowDecimal128 *decimal,
+                          gint32 original_scale,
+                          gint32 new_scale,
+                          GError **error)
+{
+  auto arrow_decimal = garrow_decimal128_get_raw(decimal);
+  arrow::Decimal128 arrow_rescaled_decimal_raw;
+  auto status = arrow_decimal->Rescale(original_scale,
+                                       new_scale,
+                                       &arrow_rescaled_decimal_raw);
+  if (garrow_error_check(error, status, "[decimal128][rescale]")) {
+    auto arrow_rescaled_decimal =
+      std::make_shared<arrow::Decimal128>(arrow_rescaled_decimal_raw);
+    return garrow_decimal128_new_raw(&arrow_rescaled_decimal);
+  } else {
+    return NULL;
+  }
+}
+
 G_END_DECLS
 
 GArrowDecimal128 *
diff --git a/c_glib/arrow-glib/decimal128.h b/c_glib/arrow-glib/decimal128.h
index e7601a4..7079737 100644
--- a/c_glib/arrow-glib/decimal128.h
+++ b/c_glib/arrow-glib/decimal128.h
@@ -72,5 +72,11 @@ GArrowDecimal128 *garrow_decimal128_divide(GArrowDecimal128 
*left,
                                            GArrowDecimal128 *right,
                                            GArrowDecimal128 **remainder,
                                            GError **error);
+GARROW_AVAILABLE_IN_0_15
+GArrowDecimal128 *
+garrow_decimal128_rescale(GArrowDecimal128 *decimal,
+                          gint32 original_scale,
+                          gint32 new_scale,
+                          GError **error);
 
 G_END_DECLS
diff --git a/c_glib/test/test-decimal128.rb b/c_glib/test/test-decimal128.rb
index de9453c..0e4bc82 100644
--- a/c_glib/test/test-decimal128.rb
+++ b/c_glib/test/test-decimal128.rb
@@ -101,7 +101,7 @@ class TestDecimal128 < Test::Unit::TestCase
     decimal1 = Arrow::Decimal128.new(23423445)
     decimal2 = Arrow::Decimal128.new(0)
     message =
-      "[decimal][divide]: Invalid: Division by 0 in Decimal128"
+      "[decimal128][divide]: Invalid: Division by 0 in Decimal128"
     assert_raise(Arrow::Error::Invalid.new(message)) do
       decimal1.divide(decimal2)
     end
@@ -203,4 +203,20 @@ class TestDecimal128 < Test::Unit::TestCase
                    decimal >= decimal
                  ])
   end
+
+  def test_rescale
+    decimal = Arrow::Decimal128.new(10)
+    assert_equal(Arrow::Decimal128.new(1000),
+                 decimal.rescale(1, 3))
+  end
+
+  def test_rescale_fail
+    decimal = Arrow::Decimal128.new(10)
+    message =
+      "[decimal128][rescale]: Invalid: " +
+      "Rescaling decimal value would cause data loss"
+    assert_raise(Arrow::Error::Invalid.new(message)) do
+      decimal.rescale(1, -1)
+    end
+  end
 end

Reply via email to