This is an automated email from the ASF dual-hosted git repository. kou pushed a commit to branch main in repository https://gitbox.apache.org/repos/asf/arrow.git
The following commit(s) were added to refs/heads/main by this push: new 118ca35440 GH-45713: [GLib] Add garrow_chunked_array_(import|export)() (#46876) 118ca35440 is described below commit 118ca35440345ebf2dfa4bf40721d8a58c9fb5b8 Author: takuya kodama <a.s.takuya1...@gmail.com> AuthorDate: Sun Jun 22 20:21:23 2025 +0900 GH-45713: [GLib] Add garrow_chunked_array_(import|export)() (#46876) ### Rationale for this change The GLib bindings were missing C data interface functions for ChunkedArray import|export operations. ### What changes are included in this PR? This PR added the follwoings. - Add garrow_chunked_array_import() - Add garrow_chunked_array_export() - Add round-trip test with boolean chunked array data ### Are these changes tested? Yes. ### Are there any user-facing changes? No. * GitHub Issue: #45713 Authored-by: otegami <a.s.takuya1...@gmail.com> Signed-off-by: Sutou Kouhei <k...@clear-code.com> --- c_glib/arrow-glib/chunked-array.cpp | 52 +++++++++++++++++++++++++++++++++++++ c_glib/arrow-glib/chunked-array.h | 8 ++++++ c_glib/test/test-chunked-array.rb | 11 ++++++++ 3 files changed, 71 insertions(+) diff --git a/c_glib/arrow-glib/chunked-array.cpp b/c_glib/arrow-glib/chunked-array.cpp index 39c8faad6c..8870e71894 100644 --- a/c_glib/arrow-glib/chunked-array.cpp +++ b/c_glib/arrow-glib/chunked-array.cpp @@ -23,6 +23,8 @@ #include <arrow-glib/type.hpp> #include <arrow-glib/error.hpp> +#include <arrow/c/bridge.h> + #include <sstream> G_BEGIN_DECLS @@ -406,6 +408,56 @@ garrow_chunked_array_combine(GArrowChunkedArray *chunked_array, GError **error) } } +/** + * garrow_chunked_array_import: + * @c_abi_array_stream: (not nullable): A `struct ArrowArrayStream *`. + * @error: (nullable): Return location for a #GError or %NULL. + * + * Returns: (transfer full) (nullable): An imported chunked array on success, + * %NULL on error. + * + * Since: 21.0.0 + */ +GArrowChunkedArray * +garrow_chunked_array_import(gpointer c_abi_array_stream, GError **error) +{ + auto arrow_chunked_array_result = + arrow::ImportChunkedArray(static_cast<struct ArrowArrayStream *>(c_abi_array_stream)); + if (garrow::check(error, arrow_chunked_array_result, "[chunked-array][import]")) { + return garrow_chunked_array_new_raw(&(*arrow_chunked_array_result)); + } else { + return NULL; + } +} + +/** + * garrow_chunked_array_export: + * @chunked_array: A #GArrowChunkedArray to be exported. + * @error: (nullable): Return location for a #GError or %NULL. + * + * Returns: (transfer full) (nullable): An exported chunked array as + * `struct ArrowArrayStream *` on success, %NULL on error. + * It should be freed with the `ArrowArrayStream::release` callback then + * g_free() when no longer needed. + * + * Since: 21.0.0 + */ +gpointer +garrow_chunked_array_export(GArrowChunkedArray *chunked_array, GError **error) +{ + const auto arrow_chunked_array = garrow_chunked_array_get_raw(chunked_array); + auto c_abi_array_stream = g_new(struct ArrowArrayStream, 1); + auto status = + arrow::ExportChunkedArray(arrow_chunked_array, + static_cast<struct ArrowArrayStream *>(c_abi_array_stream)); + if (garrow::check(error, status, "[chunked-array][export]")) { + return c_abi_array_stream; + } else { + g_free(c_abi_array_stream); + return NULL; + } +} + G_END_DECLS GArrowChunkedArray * diff --git a/c_glib/arrow-glib/chunked-array.h b/c_glib/arrow-glib/chunked-array.h index 712d16504f..27fedb6a4f 100644 --- a/c_glib/arrow-glib/chunked-array.h +++ b/c_glib/arrow-glib/chunked-array.h @@ -83,4 +83,12 @@ GARROW_AVAILABLE_IN_4_0 GArrowArray * garrow_chunked_array_combine(GArrowChunkedArray *chunked_array, GError **error); +GARROW_AVAILABLE_IN_21_0 +GArrowChunkedArray * +garrow_chunked_array_import(gpointer c_abi_array_stream, GError **error); + +GARROW_AVAILABLE_IN_21_0 +gpointer +garrow_chunked_array_export(GArrowChunkedArray *chunked_array, GError **error); + G_END_DECLS diff --git a/c_glib/test/test-chunked-array.rb b/c_glib/test/test-chunked-array.rb index 86bd23af6f..2d5dd5cd64 100644 --- a/c_glib/test/test-chunked-array.rb +++ b/c_glib/test/test-chunked-array.rb @@ -144,4 +144,15 @@ class TestChunkedArray < Test::Unit::TestCase assert_equal(build_boolean_array([true, false, nil]), chunked_array.combine) end + + def test_export_import + chunks = [ + build_boolean_array([true, false, true]), + build_boolean_array([false, nil]), + ] + original_chunked_array = Arrow::ChunkedArray.new(chunks) + c_abi_array_stream = original_chunked_array.export + assert_equal(original_chunked_array, + Arrow::ChunkedArray.import(c_abi_array_stream)) + end end