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