From 9e3d004420b8b03255fe03a79b7be766183fb7c0 Mon Sep 17 00:00:00 2001 From: Will Ayd Date: Wed, 29 Jan 2025 16:25:50 -0500 Subject: [PATCH] feat(cpp): Implement ViewBinaryViewArrayAsBytes (#633) --- src/nanoarrow/hpp/view.hpp | 3 ++- src/nanoarrow/hpp/view_test.cc | 34 ++++++++++++++++++++++------------ 2 files changed, 24 insertions(+), 13 deletions(-) diff --git a/src/nanoarrow/hpp/view.hpp b/src/nanoarrow/hpp/view.hpp index 952a45c6b..a7ba0c616 100644 --- a/src/nanoarrow/hpp/view.hpp +++ b/src/nanoarrow/hpp/view.hpp @@ -251,7 +251,8 @@ class ViewBinaryViewArrayAsBytes { } return ArrowStringView{ - reinterpret_cast(variadic_buffers[bv.ref.buffer_index]), + reinterpret_cast(variadic_buffers[bv.ref.buffer_index]) + + bv.ref.offset, bv.inlined.size}; } return NA; diff --git a/src/nanoarrow/hpp/view_test.cc b/src/nanoarrow/hpp/view_test.cc index 803df889d..9df581acc 100644 --- a/src/nanoarrow/hpp/view_test.cc +++ b/src/nanoarrow/hpp/view_test.cc @@ -82,27 +82,33 @@ TEST(NanoarrowHppTest, NanoarrowHppViewArrayAsBytesTest) { } } -TEST(NanoarrowHppTest, NanoarrowHppViewBinaryViewArrayAsBytesTest) { +class BinaryViewTypeTestFixture : public ::testing::TestWithParam { + protected: + enum ArrowType data_type; +}; + +TEST_P(BinaryViewTypeTestFixture, NanoarrowHppViewBinaryViewArrayAsBytesTest) { using namespace nanoarrow::literals; nanoarrow::UniqueArray array{}; - NANOARROW_THROW_NOT_OK(ArrowArrayInitFromType(array.get(), NANOARROW_TYPE_BINARY_VIEW)); - NANOARROW_THROW_NOT_OK(ArrowArrayStartAppending(array.get())); + ASSERT_EQ(ArrowArrayInitFromType(array.get(), GetParam()), NANOARROW_OK); + ASSERT_EQ(ArrowArrayStartAppending(array.get()), NANOARROW_OK); - NANOARROW_THROW_NOT_OK(ArrowArrayAppendString(array.get(), "foo"_asv)); - NANOARROW_THROW_NOT_OK(ArrowArrayAppendNull(array.get(), 1)); - NANOARROW_THROW_NOT_OK( - ArrowArrayAppendString(array.get(), "this_string_is_longer_than_inline"_asv)); - NANOARROW_THROW_NOT_OK(ArrowArrayAppendNull(array.get(), 1)); - NANOARROW_THROW_NOT_OK(ArrowArrayFinishBuildingDefault(array.get(), nullptr)); + ASSERT_EQ(ArrowArrayAppendString(array.get(), "foo"_asv), NANOARROW_OK); + ASSERT_EQ(ArrowArrayAppendNull(array.get(), 1), NANOARROW_OK); + ASSERT_EQ(ArrowArrayAppendString(array.get(), "this_string_is_longer_than_inline"_asv), + NANOARROW_OK); + ASSERT_EQ(ArrowArrayAppendNull(array.get(), 1), NANOARROW_OK); + ASSERT_EQ(ArrowArrayFinishBuildingDefault(array.get(), nullptr), NANOARROW_OK); int i = 0; ArrowStringView expected[] = {"foo"_asv, ""_asv, - "this_string_is_longer_than_inline"_asv, ""_asv}; + "this_string_is_longer_than_inline"_asv, ""_asv, + "here_is_another_string"_asv}; nanoarrow::UniqueArrayView array_view{}; - ArrowArrayViewInitFromType(array_view.get(), NANOARROW_TYPE_BINARY_VIEW); - NANOARROW_THROW_NOT_OK(ArrowArrayViewSetArray(array_view.get(), array.get(), nullptr)); + ArrowArrayViewInitFromType(array_view.get(), GetParam()); + ASSERT_EQ(ArrowArrayViewSetArray(array_view.get(), array.get(), nullptr), NANOARROW_OK); for (auto slot : nanoarrow::ViewBinaryViewArrayAsBytes(array_view.get())) { if (i == 1 || i == 3) { @@ -114,6 +120,10 @@ TEST(NanoarrowHppTest, NanoarrowHppViewBinaryViewArrayAsBytesTest) { } } +INSTANTIATE_TEST_SUITE_P(NanoarrowHppTest, BinaryViewTypeTestFixture, + ::testing::Values(NANOARROW_TYPE_BINARY_VIEW, + NANOARROW_TYPE_STRING_VIEW)); + TEST(NanoarrowHppTest, NanoarrowHppViewArrayAsFixedSizeBytesTest) { using namespace nanoarrow::literals;