@@ -895,9 +895,48 @@ TEST(ArrayTest, ArrayTestAppendToLargeStringArray) {
895
895
ArrowArrayRelease (&array);
896
896
}
897
897
898
- template <enum ArrowType ArrowT, typename ValueT,
899
- ArrowErrorCode (*AppendFunc)(struct ArrowArray *, ValueT)>
900
- void TestAppendToDataViewArray() {
898
+ template <enum ArrowType ArrowT, typename ValueT>
899
+ void TestAppendToInlinedDataViewArray (
900
+ std::function<ArrowErrorCode(struct ArrowArray *, ValueT)> AppendFunc) {
901
+ struct ArrowArray array;
902
+
903
+ ASSERT_EQ (ArrowArrayInitFromType (&array, ArrowT), NANOARROW_OK);
904
+ EXPECT_EQ (ArrowArrayStartAppending (&array), NANOARROW_OK);
905
+
906
+ // Check that we can reserve
907
+ ASSERT_EQ (ArrowArrayReserve (&array, 5 ), NANOARROW_OK);
908
+ EXPECT_EQ (ArrowArrayBuffer (&array, 1 )->capacity_bytes ,
909
+ 5 * sizeof (union ArrowBinaryView));
910
+
911
+ EXPECT_EQ (AppendFunc (&array, ValueT{{" inlinestring" }, 12 }), NANOARROW_OK);
912
+ EXPECT_EQ (ArrowArrayAppendNull (&array, 2 ), NANOARROW_OK);
913
+ EXPECT_EQ (ArrowArrayAppendEmpty (&array, 1 ), NANOARROW_OK);
914
+ EXPECT_EQ (ArrowArrayFinishBuildingDefault (&array, nullptr ), NANOARROW_OK);
915
+
916
+ EXPECT_EQ (array.length , 4 );
917
+ EXPECT_EQ (array.null_count , 2 );
918
+ EXPECT_EQ (array.n_buffers , 3 );
919
+ auto validity_buffer = reinterpret_cast <const uint8_t *>(array.buffers [0 ]);
920
+ auto inline_buffer = reinterpret_cast <const union ArrowBinaryView*>(array.buffers [1 ]);
921
+ auto sizes_buffer = reinterpret_cast <const int64_t *>(array.buffers [2 ]);
922
+
923
+ EXPECT_EQ (validity_buffer[0 ], 0b00001001 );
924
+ EXPECT_EQ (memcmp (inline_buffer[0 ].inlined .data , " inlinestring" , 12 ), 0 );
925
+ EXPECT_EQ (inline_buffer[0 ].inlined .size , 12 );
926
+
927
+ EXPECT_EQ (sizes_buffer, nullptr );
928
+
929
+ // TODO: issue #633
930
+ /*
931
+ EXPECT_THAT(nanoarrow::ViewArrayAsBytes<64>(&array),
932
+ ElementsAre("1234"_asv, NA, NA, "56789"_asv, ""_asv));
933
+ */
934
+ ArrowArrayRelease (&array);
935
+ };
936
+
937
+ template <enum ArrowType ArrowT, typename ValueT>
938
+ void TestAppendToDataViewArray (
939
+ std::function<ArrowErrorCode(struct ArrowArray *, ValueT)> AppendFunc) {
901
940
struct ArrowArray array;
902
941
903
942
ASSERT_EQ (ArrowArrayInitFromType (&array, ArrowT), NANOARROW_OK);
@@ -925,6 +964,7 @@ void TestAppendToDataViewArray() {
925
964
926
965
EXPECT_EQ (array.length , 7 );
927
966
EXPECT_EQ (array.null_count , 2 );
967
+ EXPECT_EQ (array.n_buffers , 5 );
928
968
auto validity_buffer = reinterpret_cast <const uint8_t *>(array.buffers [0 ]);
929
969
auto inline_buffer = reinterpret_cast <const union ArrowBinaryView*>(array.buffers [1 ]);
930
970
auto vbuf1 = reinterpret_cast <const char *>(array.buffers [2 ]);
@@ -964,13 +1004,17 @@ void TestAppendToDataViewArray() {
964
1004
};
965
1005
966
1006
TEST (ArrayTest, ArrayTestAppendToBinaryViewArray) {
967
- TestAppendToDataViewArray<NANOARROW_TYPE_STRING_VIEW, struct ArrowStringView ,
968
- ArrowArrayAppendString>();
1007
+ TestAppendToInlinedDataViewArray<NANOARROW_TYPE_STRING_VIEW, struct ArrowStringView >(
1008
+ ArrowArrayAppendString);
1009
+ TestAppendToDataViewArray<NANOARROW_TYPE_STRING_VIEW, struct ArrowStringView >(
1010
+ ArrowArrayAppendString);
969
1011
};
970
1012
971
1013
TEST (ArrayTest, ArrayTestAppendToStringViewArray) {
972
- TestAppendToDataViewArray<NANOARROW_TYPE_BINARY_VIEW, struct ArrowBufferView ,
973
- ArrowArrayAppendBytes>();
1014
+ TestAppendToInlinedDataViewArray<NANOARROW_TYPE_BINARY_VIEW, struct ArrowBufferView >(
1015
+ ArrowArrayAppendBytes);
1016
+ TestAppendToDataViewArray<NANOARROW_TYPE_BINARY_VIEW, struct ArrowBufferView >(
1017
+ ArrowArrayAppendBytes);
974
1018
};
975
1019
976
1020
TEST (ArrayTest, ArrayTestAppendToFixedSizeBinaryArray) {
@@ -3343,8 +3387,49 @@ TEST(ArrayViewTest, ArrayViewTestGetString) {
3343
3387
TestGetFromBinary<FixedSizeBinaryBuilder>(fixed_size_builder);
3344
3388
}
3345
3389
3346
- template <typename BuilderClass>
3347
- void TestGetFromBinaryView (BuilderClass& builder) {
3390
+ template <typename BuilderClass, typename ValueT>
3391
+ void TestGetFromInlinedBinaryView (
3392
+ BuilderClass& builder,
3393
+ std::function<ValueT(const struct ArrowArrayView *, int64_t )> GetValueFunc,
3394
+ std::function<const void*(const ValueT*)> GetValueDataFunc) {
3395
+ struct ArrowArray array;
3396
+ struct ArrowSchema schema;
3397
+ struct ArrowArrayView array_view;
3398
+ struct ArrowError error;
3399
+
3400
+ auto type = builder.type ();
3401
+ ARROW_EXPECT_OK (builder.Append (" 1234" ));
3402
+ ARROW_EXPECT_OK (builder.AppendNulls (2 ));
3403
+ ARROW_EXPECT_OK (builder.Append (" four" ));
3404
+
3405
+ auto maybe_arrow_array = builder.Finish ();
3406
+ ARROW_EXPECT_OK (maybe_arrow_array);
3407
+ auto arrow_array = maybe_arrow_array.ValueUnsafe ();
3408
+
3409
+ ARROW_EXPECT_OK (ExportArray (*arrow_array, &array, &schema));
3410
+ ASSERT_EQ (ArrowArrayViewInitFromSchema (&array_view, &schema, &error), NANOARROW_OK);
3411
+ ASSERT_EQ (ArrowArrayViewSetArray (&array_view, &array, &error), NANOARROW_OK);
3412
+ EXPECT_EQ (ArrowArrayViewValidate (&array_view, NANOARROW_VALIDATION_LEVEL_FULL, &error),
3413
+ NANOARROW_OK);
3414
+
3415
+ EXPECT_EQ (array_view.n_variadic_buffers , 0 );
3416
+ EXPECT_EQ (ArrowArrayViewIsNull (&array_view, 2 ), 1 );
3417
+ EXPECT_EQ (ArrowArrayViewIsNull (&array_view, 3 ), 0 );
3418
+
3419
+ const auto value = GetValueFunc (&array_view, 3 );
3420
+ EXPECT_EQ (value.size_bytes , strlen (" four" ));
3421
+ EXPECT_EQ (memcmp (GetValueDataFunc (&value), " four" , value.size_bytes ), 0 );
3422
+
3423
+ ArrowArrayViewReset (&array_view);
3424
+ ArrowArrayRelease (&array);
3425
+ ArrowSchemaRelease (&schema);
3426
+ }
3427
+
3428
+ template <typename BuilderClass, typename ValueT>
3429
+ void TestGetFromBinaryView (
3430
+ BuilderClass& builder,
3431
+ std::function<ValueT(const struct ArrowArrayView *, int64_t )> GetValueFunc,
3432
+ std::function<const void*(const ValueT*)> GetValueDataFunc) {
3348
3433
struct ArrowArray array;
3349
3434
struct ArrowSchema schema;
3350
3435
struct ArrowArrayView array_view;
@@ -3380,29 +3465,17 @@ void TestGetFromBinaryView(BuilderClass& builder) {
3380
3465
EXPECT_EQ (ArrowArrayViewIsNull (&array_view, 2 ), 1 );
3381
3466
EXPECT_EQ (ArrowArrayViewIsNull (&array_view, 3 ), 0 );
3382
3467
3383
- auto string_view = ArrowArrayViewGetStringUnsafe (&array_view, 3 );
3384
- EXPECT_EQ (string_view.size_bytes , strlen (" four" ));
3385
- EXPECT_EQ (memcmp (string_view.data , " four" , string_view.size_bytes ), 0 );
3386
-
3387
- auto buffer_view = ArrowArrayViewGetBytesUnsafe (&array_view, 3 );
3388
- EXPECT_EQ (buffer_view.size_bytes , strlen (" four" ));
3389
- EXPECT_EQ (memcmp (buffer_view.data .as_char , " four" , buffer_view.size_bytes ), 0 );
3390
-
3391
- string_view = ArrowArrayViewGetStringUnsafe (&array_view, 4 );
3392
- EXPECT_EQ (string_view.size_bytes , str1.size ());
3393
- EXPECT_EQ (memcmp (string_view.data , str1.c_str (), string_view.size_bytes ), 0 );
3468
+ const auto value1 = GetValueFunc (&array_view, 3 );
3469
+ EXPECT_EQ (value1.size_bytes , strlen (" four" ));
3470
+ EXPECT_EQ (memcmp (GetValueDataFunc (&value1), " four" , value1.size_bytes ), 0 );
3394
3471
3395
- string_view = ArrowArrayViewGetStringUnsafe (&array_view, 6 );
3396
- EXPECT_EQ (string_view .size_bytes , str2 .size ());
3397
- EXPECT_EQ (memcmp (string_view. data , str2 .c_str (), string_view .size_bytes ), 0 );
3472
+ const auto value2 = GetValueFunc (&array_view, 4 );
3473
+ EXPECT_EQ (value2 .size_bytes , str1 .size ());
3474
+ EXPECT_EQ (memcmp (GetValueDataFunc (&value2), str1 .c_str (), value2 .size_bytes ), 0 );
3398
3475
3399
- buffer_view = ArrowArrayViewGetBytesUnsafe (&array_view, 4 );
3400
- EXPECT_EQ (buffer_view.size_bytes , str1.size ());
3401
- EXPECT_EQ (memcmp (buffer_view.data .as_char , str1.c_str (), buffer_view.size_bytes ), 0 );
3402
-
3403
- buffer_view = ArrowArrayViewGetBytesUnsafe (&array_view, 6 );
3404
- EXPECT_EQ (buffer_view.size_bytes , str2.size ());
3405
- EXPECT_EQ (memcmp (buffer_view.data .as_char , str2.c_str (), buffer_view.size_bytes ), 0 );
3476
+ const auto value3 = GetValueFunc (&array_view, 6 );
3477
+ EXPECT_EQ (value3.size_bytes , str2.size ());
3478
+ EXPECT_EQ (memcmp (GetValueDataFunc (&value3), str2.c_str (), value3.size_bytes ), 0 );
3406
3479
3407
3480
ArrowArrayViewReset (&array_view);
3408
3481
ArrowArrayRelease (&array);
@@ -3411,10 +3484,22 @@ void TestGetFromBinaryView(BuilderClass& builder) {
3411
3484
3412
3485
TEST (ArrayViewTest, ArrayViewTestGetStringView) {
3413
3486
auto string_view_builder = StringViewBuilder ();
3414
- TestGetFromBinaryView<StringViewBuilder>(string_view_builder);
3487
+ const auto get_string_view = [](const struct ArrowStringView * sv) { return sv->data ; };
3488
+ TestGetFromInlinedBinaryView<StringViewBuilder, struct ArrowStringView >(
3489
+ string_view_builder, ArrowArrayViewGetStringUnsafe, get_string_view);
3490
+ TestGetFromBinaryView<StringViewBuilder, struct ArrowStringView >(
3491
+ string_view_builder, ArrowArrayViewGetStringUnsafe, get_string_view);
3492
+ }
3415
3493
3494
+ TEST (ArrayViewTest, ArrayViewTestGetBinaryView) {
3416
3495
auto binary_view_builder = BinaryViewBuilder ();
3417
- TestGetFromBinaryView<BinaryViewBuilder>(binary_view_builder);
3496
+ const auto get_buffer_view = [](const struct ArrowBufferView * bv) {
3497
+ return bv->data .data ;
3498
+ };
3499
+ TestGetFromInlinedBinaryView<BinaryViewBuilder, struct ArrowBufferView >(
3500
+ binary_view_builder, ArrowArrayViewGetBytesUnsafe, get_buffer_view);
3501
+ TestGetFromBinaryView<BinaryViewBuilder, struct ArrowBufferView >(
3502
+ binary_view_builder, ArrowArrayViewGetBytesUnsafe, get_buffer_view);
3418
3503
}
3419
3504
3420
3505
TEST (ArrayViewTest, ArrayViewTestGetIntervalYearMonth) {
0 commit comments