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