You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@arrow.apache.org by pa...@apache.org on 2023/05/20 01:22:53 UTC
[arrow-nanoarrow] branch main updated: feat: Implement ListChildOffset function (#197)
This is an automated email from the ASF dual-hosted git repository.
paleolimbot pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/arrow-nanoarrow.git
The following commit(s) were added to refs/heads/main by this push:
new 2a11bdb feat: Implement ListChildOffset function (#197)
2a11bdb is described below
commit 2a11bdb87e7ae30bd2670082f80813f41745d517
Author: William Ayd <wi...@icloud.com>
AuthorDate: Fri May 19 18:22:48 2023 -0700
feat: Implement ListChildOffset function (#197)
Similar to what exists for Dense/Sparse Union. This would at least be
useful in the ADBC library, which currently provides its own
implementation
https://github.com/apache/arrow-adbc/pull/679#discussion_r1195786712
---
src/nanoarrow/array_inline.h | 12 +++++++++
src/nanoarrow/array_test.cc | 64 ++++++++++++++++++++++++++++++++++++++++++++
2 files changed, 76 insertions(+)
diff --git a/src/nanoarrow/array_inline.h b/src/nanoarrow/array_inline.h
index 27bd738..98b4f3e 100644
--- a/src/nanoarrow/array_inline.h
+++ b/src/nanoarrow/array_inline.h
@@ -700,6 +700,18 @@ static inline int64_t ArrowArrayViewUnionChildOffset(struct ArrowArrayView* arra
}
}
+static inline int64_t ArrowArrayViewListChildOffset(struct ArrowArrayView* array_view,
+ int64_t i) {
+ switch (array_view->storage_type) {
+ case NANOARROW_TYPE_LIST:
+ return array_view->buffer_views[1].data.as_int32[i];
+ case NANOARROW_TYPE_LARGE_LIST:
+ return array_view->buffer_views[1].data.as_int64[i];
+ default:
+ return -1;
+ }
+}
+
static inline int64_t ArrowArrayViewGetIntUnsafe(struct ArrowArrayView* array_view,
int64_t i) {
struct ArrowBufferView* data_view = &array_view->buffer_views[1];
diff --git a/src/nanoarrow/array_test.cc b/src/nanoarrow/array_test.cc
index 149a9e3..5dbac0d 100644
--- a/src/nanoarrow/array_test.cc
+++ b/src/nanoarrow/array_test.cc
@@ -1704,6 +1704,70 @@ TEST(ArrayTest, ArrayViewTestList) {
ArrowArrayViewReset(&array_view);
}
+TEST(ArrayTest, ArrayViewTestListGet) {
+ struct ArrowArrayView array_view;
+ ArrowArrayViewInitFromType(&array_view, NANOARROW_TYPE_LIST);
+ EXPECT_EQ(ArrowArrayViewAllocateChildren(&array_view, 1), NANOARROW_OK);
+ ArrowArrayViewInitFromType(array_view.children[0], NANOARROW_TYPE_INT32);
+
+ // Build a valid array
+ struct ArrowArray array;
+ ASSERT_EQ(ArrowArrayInitFromType(&array, NANOARROW_TYPE_LIST), NANOARROW_OK);
+ ASSERT_EQ(ArrowArrayAllocateChildren(&array, 1), NANOARROW_OK);
+ ASSERT_EQ(ArrowArrayInitFromType(array.children[0], NANOARROW_TYPE_INT32),
+ NANOARROW_OK);
+ ASSERT_EQ(ArrowArrayStartAppending(&array), NANOARROW_OK);
+ ASSERT_EQ(ArrowArrayAppendInt(array.children[0], 1234), NANOARROW_OK);
+ ASSERT_EQ(ArrowArrayFinishElement(&array), NANOARROW_OK);
+ ASSERT_EQ(ArrowArrayAppendNull(&array, 1), NANOARROW_OK);
+ ASSERT_EQ(ArrowArrayAppendInt(array.children[0], 42), NANOARROW_OK);
+ ASSERT_EQ(ArrowArrayFinishElement(&array), NANOARROW_OK);
+ ASSERT_EQ(ArrowArrayFinishBuildingDefault(&array, nullptr), NANOARROW_OK);
+
+ EXPECT_EQ(ArrowArrayViewSetArray(&array_view, &array, nullptr), NANOARROW_OK);
+ EXPECT_EQ(ArrowArrayViewValidateFull(&array_view, nullptr), NANOARROW_OK);
+
+ EXPECT_EQ(ArrowArrayViewListChildOffset(&array_view, 0), 0);
+ EXPECT_EQ(ArrowArrayViewListChildOffset(&array_view, 1), 1);
+ EXPECT_EQ(ArrowArrayViewListChildOffset(&array_view, 2), 1);
+ EXPECT_EQ(ArrowArrayViewListChildOffset(&array_view, 3), 2);
+
+ array.release(&array);
+ ArrowArrayViewReset(&array_view);
+}
+
+TEST(ArrayTest, ArrayViewTestLargeListGet) {
+ struct ArrowArrayView array_view;
+ ArrowArrayViewInitFromType(&array_view, NANOARROW_TYPE_LARGE_LIST);
+ EXPECT_EQ(ArrowArrayViewAllocateChildren(&array_view, 1), NANOARROW_OK);
+ ArrowArrayViewInitFromType(array_view.children[0], NANOARROW_TYPE_INT32);
+
+ // Build a valid array
+ struct ArrowArray array;
+ ASSERT_EQ(ArrowArrayInitFromType(&array, NANOARROW_TYPE_LARGE_LIST), NANOARROW_OK);
+ ASSERT_EQ(ArrowArrayAllocateChildren(&array, 1), NANOARROW_OK);
+ ASSERT_EQ(ArrowArrayInitFromType(array.children[0], NANOARROW_TYPE_INT32),
+ NANOARROW_OK);
+ ASSERT_EQ(ArrowArrayStartAppending(&array), NANOARROW_OK);
+ ASSERT_EQ(ArrowArrayAppendInt(array.children[0], 1234), NANOARROW_OK);
+ ASSERT_EQ(ArrowArrayFinishElement(&array), NANOARROW_OK);
+ ASSERT_EQ(ArrowArrayAppendNull(&array, 1), NANOARROW_OK);
+ ASSERT_EQ(ArrowArrayAppendInt(array.children[0], 42), NANOARROW_OK);
+ ASSERT_EQ(ArrowArrayFinishElement(&array), NANOARROW_OK);
+ ASSERT_EQ(ArrowArrayFinishBuildingDefault(&array, nullptr), NANOARROW_OK);
+
+ EXPECT_EQ(ArrowArrayViewSetArray(&array_view, &array, nullptr), NANOARROW_OK);
+ EXPECT_EQ(ArrowArrayViewValidateFull(&array_view, nullptr), NANOARROW_OK);
+
+ EXPECT_EQ(ArrowArrayViewListChildOffset(&array_view, 0), 0);
+ EXPECT_EQ(ArrowArrayViewListChildOffset(&array_view, 1), 1);
+ EXPECT_EQ(ArrowArrayViewListChildOffset(&array_view, 2), 1);
+ EXPECT_EQ(ArrowArrayViewListChildOffset(&array_view, 3), 2);
+
+ array.release(&array);
+ ArrowArrayViewReset(&array_view);
+}
+
TEST(ArrayTest, ArrayViewTestLargeList) {
struct ArrowArrayView array_view;
ArrowArrayViewInitFromType(&array_view, NANOARROW_TYPE_LARGE_LIST);