You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@arrow.apache.org by ko...@apache.org on 2019/03/16 22:09:17 UTC
[arrow] branch master updated: ARROW-4882: [GLib] Add sum functions
This is an automated email from the ASF dual-hosted git repository.
kou 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 2d188b5 ARROW-4882: [GLib] Add sum functions
2d188b5 is described below
commit 2d188b5977a0742adcdfe2cf4bb522ffa4353d6c
Author: Yosuke Shiro <yo...@gmail.com>
AuthorDate: Sun Mar 17 07:09:06 2019 +0900
ARROW-4882: [GLib] Add sum functions
Author: Yosuke Shiro <yo...@gmail.com>
Author: Kouhei Sutou <ko...@clear-code.com>
Closes #3933 from shiro615/glib-sum and squashes the following commits:
1fe8805c <Kouhei Sutou> Add test for empty case
4393487b <Kouhei Sutou> Add NULL check
adbebca5 <Yosuke Shiro> Fix typos
6ebe5a02 <Yosuke Shiro> Align
c1361034 <Yosuke Shiro> Fix documents
3a079dfc <Yosuke Shiro> Implement a template function that can be used by all sum functions
316d3cae <Yosuke Shiro> Add sum functions
---
c_glib/arrow-glib/basic-array.cpp | 239 +++++++++++++++++++++++++++++++++++++-
c_glib/arrow-glib/basic-array.h | 30 +++++
c_glib/test/test-double-array.rb | 5 +
c_glib/test/test-float-array.rb | 12 ++
c_glib/test/test-int16-array.rb | 5 +
c_glib/test/test-int32-array.rb | 5 +
c_glib/test/test-int64-array.rb | 5 +
c_glib/test/test-int8-array.rb | 12 ++
c_glib/test/test-uint16-array.rb | 5 +
c_glib/test/test-uint32-array.rb | 5 +
c_glib/test/test-uint64-array.rb | 5 +
c_glib/test/test-uint8-array.rb | 5 +
cpp/src/arrow/compute/api.h | 1 +
13 files changed, 331 insertions(+), 3 deletions(-)
diff --git a/c_glib/arrow-glib/basic-array.cpp b/c_glib/arrow-glib/basic-array.cpp
index 79ba1ab..8f27e26 100644
--- a/c_glib/arrow-glib/basic-array.cpp
+++ b/c_glib/arrow-glib/basic-array.cpp
@@ -83,6 +83,34 @@ garrow_primitive_array_new(GArrowDataType *data_type,
return garrow_array_new_raw(&arrow_array);
};
+template <typename ArrowType, typename GArrowArrayType>
+typename ArrowType::c_type
+garrow_numeric_array_sum(GArrowArrayType array,
+ GError **error,
+ const gchar *tag,
+ typename ArrowType::c_type default_value)
+{
+ auto arrow_array = garrow_array_get_raw(GARROW_ARRAY(array));
+ auto memory_pool = arrow::default_memory_pool();
+ arrow::compute::FunctionContext context(memory_pool);
+ arrow::compute::Datum sum_datum;
+ auto status = arrow::compute::Sum(&context,
+ arrow_array,
+ &sum_datum);
+ if (garrow_error_check(error, status, tag)) {
+ using ScalarType = typename arrow::TypeTraits<ArrowType>::ScalarType;
+ auto arrow_numeric_scalar =
+ std::dynamic_pointer_cast<ScalarType>(sum_datum.scalar());
+ if (arrow_numeric_scalar->is_valid) {
+ return arrow_numeric_scalar->value;
+ } else {
+ return default_value;
+ }
+ } else {
+ return default_value;
+ }
+}
+
G_BEGIN_DECLS
/**
@@ -106,7 +134,7 @@ G_BEGIN_DECLS
* more null values. You need to specify an array length to create a
* new array.
*
- * #GArrowBooleanArray is a class for binary array. It can store zero
+ * #GArrowBooleanArray is a class for boolean array. It can store zero
* or more boolean data. If you don't have Arrow format data, you need
* to use #GArrowBooleanArrayBuilder to create a new array.
*
@@ -1004,8 +1032,13 @@ garrow_numeric_array_mean(GArrowNumericArray *array,
auto status = arrow::compute::Mean(&context, arrow_array, &mean_datum);
if (garrow_error_check(error, status, "[numeric-array][mean]")) {
using ScalarType = typename arrow::TypeTraits<arrow::DoubleType>::ScalarType;
- auto arrow_numeric_scalar = std::dynamic_pointer_cast<ScalarType>(mean_datum.scalar());
- return arrow_numeric_scalar->value;
+ auto arrow_numeric_scalar =
+ std::dynamic_pointer_cast<ScalarType>(mean_datum.scalar());
+ if (arrow_numeric_scalar->is_valid) {
+ return arrow_numeric_scalar->value;
+ } else {
+ return 0.0;
+ }
} else {
return 0.0;
}
@@ -1084,6 +1117,26 @@ garrow_int8_array_get_values(GArrowInt8Array *array,
return garrow_array_get_values_raw<arrow::Int8Type>(arrow_array, length);
}
+/**
+ * garrow_int8_array_sum:
+ * @array: A #GArrowInt8Array.
+ * @error: (nullable): Return location for a #GError or %NULL.
+ *
+ * Returns: The value of the computed sum on success,
+ * If an error is occurred, the returned value is untrustful value.
+ *
+ * Since: 0.13.0
+ */
+gint64
+garrow_int8_array_sum(GArrowInt8Array *array,
+ GError **error)
+{
+ return garrow_numeric_array_sum<arrow::Int64Type>(array,
+ error,
+ "[int8-array][sum]",
+ 0);
+}
+
G_DEFINE_TYPE(GArrowUInt8Array,
garrow_uint8_array,
@@ -1157,6 +1210,26 @@ garrow_uint8_array_get_values(GArrowUInt8Array *array,
return garrow_array_get_values_raw<arrow::UInt8Type>(arrow_array, length);
}
+/**
+ * garrow_uint8_array_sum:
+ * @array: A #GArrowUInt8Array.
+ * @error: (nullable): Return location for a #GError or %NULL.
+ *
+ * Returns: The value of the computed sum on success,
+ * If an error is occurred, the returned value is untrustful value.
+ *
+ * Since: 0.13.0
+ */
+guint64
+garrow_uint8_array_sum(GArrowUInt8Array *array,
+ GError **error)
+{
+ return garrow_numeric_array_sum<arrow::UInt64Type>(array,
+ error,
+ "[uint8-array][sum]",
+ 0);
+}
+
G_DEFINE_TYPE(GArrowInt16Array,
garrow_int16_array,
@@ -1230,6 +1303,26 @@ garrow_int16_array_get_values(GArrowInt16Array *array,
return garrow_array_get_values_raw<arrow::Int16Type>(arrow_array, length);
}
+/**
+ * garrow_int16_array_sum:
+ * @array: A #GArrowInt16Array.
+ * @error: (nullable): Return location for a #GError or %NULL.
+ *
+ * Returns: The value of the computed sum on success,
+ * If an error is occurred, the returned value is untrustful value.
+ *
+ * Since: 0.13.0
+ */
+gint64
+garrow_int16_array_sum(GArrowInt16Array *array,
+ GError **error)
+{
+ return garrow_numeric_array_sum<arrow::Int64Type>(array,
+ error,
+ "[int16-array][sum]",
+ 0);
+}
+
G_DEFINE_TYPE(GArrowUInt16Array,
garrow_uint16_array,
@@ -1303,6 +1396,26 @@ garrow_uint16_array_get_values(GArrowUInt16Array *array,
return garrow_array_get_values_raw<arrow::UInt16Type>(arrow_array, length);
}
+/**
+ * garrow_uint16_array_sum:
+ * @array: A #GArrowUInt16Array.
+ * @error: (nullable): Return location for a #GError or %NULL.
+ *
+ * Returns: The value of the computed sum on success,
+ * If an error is occurred, the returned value is untrustful value.
+ *
+ * Since: 0.13.0
+ */
+guint64
+garrow_uint16_array_sum(GArrowUInt16Array *array,
+ GError **error)
+{
+ return garrow_numeric_array_sum<arrow::UInt64Type>(array,
+ error,
+ "[uint16-array][sum]",
+ 0);
+}
+
G_DEFINE_TYPE(GArrowInt32Array,
garrow_int32_array,
@@ -1376,6 +1489,26 @@ garrow_int32_array_get_values(GArrowInt32Array *array,
return garrow_array_get_values_raw<arrow::Int32Type>(arrow_array, length);
}
+/**
+ * garrow_int32_array_sum:
+ * @array: A #GArrowInt32Array.
+ * @error: (nullable): Return location for a #GError or %NULL.
+ *
+ * Returns: The value of the computed sum on success,
+ * If an error is occurred, the returned value is untrustful value.
+ *
+ * Since: 0.13.0
+ */
+gint64
+garrow_int32_array_sum(GArrowInt32Array *array,
+ GError **error)
+{
+ return garrow_numeric_array_sum<arrow::Int64Type>(array,
+ error,
+ "[int32-array][sum]",
+ 0);
+}
+
G_DEFINE_TYPE(GArrowUInt32Array,
garrow_uint32_array,
@@ -1449,6 +1582,26 @@ garrow_uint32_array_get_values(GArrowUInt32Array *array,
return garrow_array_get_values_raw<arrow::UInt32Type>(arrow_array, length);
}
+/**
+ * garrow_uint32_array_sum:
+ * @array: A #GArrowUInt32Array.
+ * @error: (nullable): Return location for a #GError or %NULL.
+ *
+ * Returns: The value of the computed sum on success,
+ * If an error is occurred, the returned value is untrustful value.
+ *
+ * Since: 0.13.0
+ */
+guint64
+garrow_uint32_array_sum(GArrowUInt32Array *array,
+ GError **error)
+{
+ return garrow_numeric_array_sum<arrow::UInt64Type>(array,
+ error,
+ "[uint32-array][sum]",
+ 0);
+}
+
G_DEFINE_TYPE(GArrowInt64Array,
garrow_int64_array,
@@ -1524,6 +1677,26 @@ garrow_int64_array_get_values(GArrowInt64Array *array,
return reinterpret_cast<const gint64 *>(values);
}
+/**
+ * garrow_int64_array_sum:
+ * @array: A #GArrowInt64Array.
+ * @error: (nullable): Return location for a #GError or %NULL.
+ *
+ * Returns: The value of the computed sum on success,
+ * If an error is occurred, the returned value is untrustful value.
+ *
+ * Since: 0.13.0
+ */
+gint64
+garrow_int64_array_sum(GArrowInt64Array *array,
+ GError **error)
+{
+ return garrow_numeric_array_sum<arrow::Int64Type>(array,
+ error,
+ "[int64-array][sum]",
+ 0);
+}
+
G_DEFINE_TYPE(GArrowUInt64Array,
garrow_uint64_array,
@@ -1599,6 +1772,26 @@ garrow_uint64_array_get_values(GArrowUInt64Array *array,
return reinterpret_cast<const guint64 *>(values);
}
+/**
+ * garrow_uint64_array_sum:
+ * @array: A #GArrowUInt64Array.
+ * @error: (nullable): Return location for a #GError or %NULL.
+ *
+ * Returns: The value of the computed sum on success,
+ * If an error is occurred, the returned value is untrustful value.
+ *
+ * Since: 0.13.0
+ */
+guint64
+garrow_uint64_array_sum(GArrowUInt64Array *array,
+ GError **error)
+{
+ return garrow_numeric_array_sum<arrow::UInt64Type>(array,
+ error,
+ "[uint64-array][sum]",
+ 0);
+}
+
G_DEFINE_TYPE(GArrowFloatArray,
garrow_float_array,
@@ -1672,6 +1865,26 @@ garrow_float_array_get_values(GArrowFloatArray *array,
return garrow_array_get_values_raw<arrow::FloatType>(arrow_array, length);
}
+/**
+ * garrow_float_array_sum:
+ * @array: A #GArrowFloatArray.
+ * @error: (nullable): Return location for a #GError or %NULL.
+ *
+ * Returns: The value of the computed sum on success,
+ * If an error is occurred, the returned value is untrustful value.
+ *
+ * Since: 0.13.0
+ */
+gdouble
+garrow_float_array_sum(GArrowFloatArray *array,
+ GError **error)
+{
+ return garrow_numeric_array_sum<arrow::DoubleType>(array,
+ error,
+ "[float-array][sum]",
+ 0);
+}
+
G_DEFINE_TYPE(GArrowDoubleArray,
garrow_double_array,
@@ -1745,6 +1958,26 @@ garrow_double_array_get_values(GArrowDoubleArray *array,
return garrow_array_get_values_raw<arrow::DoubleType>(arrow_array, length);
}
+/**
+ * garrow_double_array_sum:
+ * @array: A #GArrowDoubleArray.
+ * @error: (nullable): Return location for a #GError or %NULL.
+ *
+ * Returns: The value of the computed sum on success,
+ * If an error is occurred, the returned value is untrustful value.
+ *
+ * Since: 0.13.0
+ */
+gdouble
+garrow_double_array_sum(GArrowDoubleArray *array,
+ GError **error)
+{
+ return garrow_numeric_array_sum<arrow::DoubleType>(array,
+ error,
+ "[double-array][sum]",
+ 0);
+}
+
G_DEFINE_TYPE(GArrowBinaryArray,
garrow_binary_array,
diff --git a/c_glib/arrow-glib/basic-array.h b/c_glib/arrow-glib/basic-array.h
index c91de5a..00ec773 100644
--- a/c_glib/arrow-glib/basic-array.h
+++ b/c_glib/arrow-glib/basic-array.h
@@ -241,6 +241,9 @@ gint8 garrow_int8_array_get_value(GArrowInt8Array *array,
gint64 i);
const gint8 *garrow_int8_array_get_values(GArrowInt8Array *array,
gint64 *length);
+GARROW_AVAILABLE_IN_0_13
+gint64 garrow_int8_array_sum(GArrowInt8Array *array,
+ GError **error);
#define GARROW_TYPE_UINT8_ARRAY (garrow_uint8_array_get_type())
@@ -263,6 +266,9 @@ guint8 garrow_uint8_array_get_value(GArrowUInt8Array *array,
gint64 i);
const guint8 *garrow_uint8_array_get_values(GArrowUInt8Array *array,
gint64 *length);
+GARROW_AVAILABLE_IN_0_13
+guint64 garrow_uint8_array_sum(GArrowUInt8Array *array,
+ GError **error);
#define GARROW_TYPE_INT16_ARRAY (garrow_int16_array_get_type())
@@ -285,6 +291,9 @@ gint16 garrow_int16_array_get_value(GArrowInt16Array *array,
gint64 i);
const gint16 *garrow_int16_array_get_values(GArrowInt16Array *array,
gint64 *length);
+GARROW_AVAILABLE_IN_0_13
+gint64 garrow_int16_array_sum(GArrowInt16Array *array,
+ GError **error);
#define GARROW_TYPE_UINT16_ARRAY (garrow_uint16_array_get_type())
@@ -307,6 +316,9 @@ guint16 garrow_uint16_array_get_value(GArrowUInt16Array *array,
gint64 i);
const guint16 *garrow_uint16_array_get_values(GArrowUInt16Array *array,
gint64 *length);
+GARROW_AVAILABLE_IN_0_13
+guint64 garrow_uint16_array_sum(GArrowUInt16Array *array,
+ GError **error);
#define GARROW_TYPE_INT32_ARRAY (garrow_int32_array_get_type())
@@ -329,6 +341,9 @@ gint32 garrow_int32_array_get_value(GArrowInt32Array *array,
gint64 i);
const gint32 *garrow_int32_array_get_values(GArrowInt32Array *array,
gint64 *length);
+GARROW_AVAILABLE_IN_0_13
+gint64 garrow_int32_array_sum(GArrowInt32Array *array,
+ GError **error);
#define GARROW_TYPE_UINT32_ARRAY (garrow_uint32_array_get_type())
@@ -351,6 +366,9 @@ guint32 garrow_uint32_array_get_value(GArrowUInt32Array *array,
gint64 i);
const guint32 *garrow_uint32_array_get_values(GArrowUInt32Array *array,
gint64 *length);
+GARROW_AVAILABLE_IN_0_13
+guint64 garrow_uint32_array_sum(GArrowUInt32Array *array,
+ GError **error);
#define GARROW_TYPE_INT64_ARRAY (garrow_int64_array_get_type())
@@ -373,6 +391,9 @@ gint64 garrow_int64_array_get_value(GArrowInt64Array *array,
gint64 i);
const gint64 *garrow_int64_array_get_values(GArrowInt64Array *array,
gint64 *length);
+GARROW_AVAILABLE_IN_0_13
+gint64 garrow_int64_array_sum(GArrowInt64Array *array,
+ GError **error);
#define GARROW_TYPE_UINT64_ARRAY (garrow_uint64_array_get_type())
@@ -395,6 +416,9 @@ guint64 garrow_uint64_array_get_value(GArrowUInt64Array *array,
gint64 i);
const guint64 *garrow_uint64_array_get_values(GArrowUInt64Array *array,
gint64 *length);
+GARROW_AVAILABLE_IN_0_13
+guint64 garrow_uint64_array_sum(GArrowUInt64Array *array,
+ GError **error);
#define GARROW_TYPE_FLOAT_ARRAY (garrow_float_array_get_type())
@@ -417,6 +441,9 @@ gfloat garrow_float_array_get_value(GArrowFloatArray *array,
gint64 i);
const gfloat *garrow_float_array_get_values(GArrowFloatArray *array,
gint64 *length);
+GARROW_AVAILABLE_IN_0_13
+gdouble garrow_float_array_sum(GArrowFloatArray *array,
+ GError **error);
#define GARROW_TYPE_DOUBLE_ARRAY (garrow_double_array_get_type())
@@ -439,6 +466,9 @@ gdouble garrow_double_array_get_value(GArrowDoubleArray *array,
gint64 i);
const gdouble *garrow_double_array_get_values(GArrowDoubleArray *array,
gint64 *length);
+GARROW_AVAILABLE_IN_0_13
+gdouble garrow_double_array_sum(GArrowDoubleArray *array,
+ GError **error);
#define GARROW_TYPE_BINARY_ARRAY \
diff --git a/c_glib/test/test-double-array.rb b/c_glib/test/test-double-array.rb
index 020ed8f..4f30b59 100644
--- a/c_glib/test/test-double-array.rb
+++ b/c_glib/test/test-double-array.rb
@@ -52,4 +52,9 @@ class TestDoubleArray < Test::Unit::TestCase
array = builder.finish
assert_equal([1.5, 3.0, 4.5], array.values)
end
+
+ def test_sum
+ array = build_float_array([1.5, 3.0, nil])
+ assert_in_delta(4.5, array.sum)
+ end
end
diff --git a/c_glib/test/test-float-array.rb b/c_glib/test/test-float-array.rb
index c2a71a0..a3e7743 100644
--- a/c_glib/test/test-float-array.rb
+++ b/c_glib/test/test-float-array.rb
@@ -52,4 +52,16 @@ class TestFloatArray < Test::Unit::TestCase
array = builder.finish
assert_equal([1.5, 3.0, 4.5], array.values)
end
+
+ sub_test_case("#sum") do
+ def test_with_nil
+ array = build_float_array([1.5, 3.0, nil])
+ assert_in_delta(4.5, array.sum)
+ end
+
+ def test_empty
+ array = build_float_array([])
+ assert_in_delta(0.0, array.sum)
+ end
+ end
end
diff --git a/c_glib/test/test-int16-array.rb b/c_glib/test/test-int16-array.rb
index e0efb68..8c159e9 100644
--- a/c_glib/test/test-int16-array.rb
+++ b/c_glib/test/test-int16-array.rb
@@ -52,4 +52,9 @@ class TestInt16Array < Test::Unit::TestCase
array = builder.finish
assert_equal([-1, 2, -4], array.values)
end
+
+ def test_sum
+ array = build_int16_array([2, -4, nil])
+ assert_equal(-2, array.sum)
+ end
end
diff --git a/c_glib/test/test-int32-array.rb b/c_glib/test/test-int32-array.rb
index 9827e53..9dff0e9 100644
--- a/c_glib/test/test-int32-array.rb
+++ b/c_glib/test/test-int32-array.rb
@@ -50,4 +50,9 @@ class TestInt32Array < Test::Unit::TestCase
array = builder.finish
assert_equal([-1, 2, -4], array.values)
end
+
+ def test_sum
+ array = build_int32_array([2, -4, nil])
+ assert_equal(-2, array.sum)
+ end
end
diff --git a/c_glib/test/test-int64-array.rb b/c_glib/test/test-int64-array.rb
index 39a74d3..f6327c7 100644
--- a/c_glib/test/test-int64-array.rb
+++ b/c_glib/test/test-int64-array.rb
@@ -50,4 +50,9 @@ class TestInt64Array < Test::Unit::TestCase
array = builder.finish
assert_equal([-1, 2, -4], array.values)
end
+
+ def test_sum
+ array = build_int64_array([2, -4, nil])
+ assert_equal(-2, array.sum)
+ end
end
diff --git a/c_glib/test/test-int8-array.rb b/c_glib/test/test-int8-array.rb
index 46fe591..2174030 100644
--- a/c_glib/test/test-int8-array.rb
+++ b/c_glib/test/test-int8-array.rb
@@ -50,4 +50,16 @@ class TestInt8Array < Test::Unit::TestCase
array = builder.finish
assert_equal([-1, 2, -4], array.values)
end
+
+ sub_test_case("#sum") do
+ def test_with_null
+ array = build_int8_array([2, -4, nil])
+ assert_equal(-2, array.sum)
+ end
+
+ def test_empty
+ array = build_int8_array([])
+ assert_equal(0, array.sum)
+ end
+ end
end
diff --git a/c_glib/test/test-uint16-array.rb b/c_glib/test/test-uint16-array.rb
index baa6934..a02f833 100644
--- a/c_glib/test/test-uint16-array.rb
+++ b/c_glib/test/test-uint16-array.rb
@@ -52,4 +52,9 @@ class TestUInt16Array < Test::Unit::TestCase
array = builder.finish
assert_equal([1, 2, 4], array.values)
end
+
+ def test_sum
+ array = build_uint8_array([2, 4, nil])
+ assert_equal(6, array.sum)
+ end
end
diff --git a/c_glib/test/test-uint32-array.rb b/c_glib/test/test-uint32-array.rb
index b9efb4c..04eb60b 100644
--- a/c_glib/test/test-uint32-array.rb
+++ b/c_glib/test/test-uint32-array.rb
@@ -52,4 +52,9 @@ class TestUInt32Array < Test::Unit::TestCase
array = builder.finish
assert_equal([1, 2, 4], array.values)
end
+
+ def test_sum
+ array = build_uint32_array([2, 4, nil])
+ assert_equal(6, array.sum)
+ end
end
diff --git a/c_glib/test/test-uint64-array.rb b/c_glib/test/test-uint64-array.rb
index b4275ce..f34e681 100644
--- a/c_glib/test/test-uint64-array.rb
+++ b/c_glib/test/test-uint64-array.rb
@@ -52,4 +52,9 @@ class TestUInt64Array < Test::Unit::TestCase
array = builder.finish
assert_equal([1, 2, 4], array.values)
end
+
+ def test_sum
+ array = build_uint64_array([2, 4, nil])
+ assert_equal(6, array.sum)
+ end
end
diff --git a/c_glib/test/test-uint8-array.rb b/c_glib/test/test-uint8-array.rb
index 08dfb30..e22b1b1 100644
--- a/c_glib/test/test-uint8-array.rb
+++ b/c_glib/test/test-uint8-array.rb
@@ -50,4 +50,9 @@ class TestUInt8Array < Test::Unit::TestCase
array = builder.finish
assert_equal([1, 2, 4], array.values)
end
+
+ def test_sum
+ array = build_uint8_array([2, 4, nil])
+ assert_equal(6, array.sum)
+ end
end
diff --git a/cpp/src/arrow/compute/api.h b/cpp/src/arrow/compute/api.h
index fb2b3c9..b6e609a 100644
--- a/cpp/src/arrow/compute/api.h
+++ b/cpp/src/arrow/compute/api.h
@@ -26,5 +26,6 @@
#include "arrow/compute/kernels/count.h" // IWYU pragma: export
#include "arrow/compute/kernels/hash.h" // IWYU pragma: export
#include "arrow/compute/kernels/mean.h" // IWYU pragma: export
+#include "arrow/compute/kernels/sum.h" // IWYU pragma: export
#endif // ARROW_COMPUTE_API_H