@@ -379,6 +379,54 @@ TEST(ArrowUtilsTest, TestRemoveFieldFromStructArraySuccess) {
379379 ASSERT_TRUE (result->Equals (expected_struct_array));
380380}
381381
382+ TEST (ArrowUtilsTest, TestNormalizeRecordBatchOffsets) {
383+ auto value_field = arrow::field (" value" , arrow::int32 ());
384+ auto nested_field = arrow::field (" nested" , arrow::struct_ ({value_field}));
385+ auto text_field = arrow::field (" text" , arrow::utf8 ());
386+ auto clean_field = arrow::field (" clean" , arrow::boolean ());
387+ auto schema = arrow::schema ({nested_field, text_field, clean_field});
388+
389+ std::shared_ptr<arrow::Array> values =
390+ arrow::ipc::internal::json::ArrayFromJSON (arrow::int32 (), " [0, 1, 2, 3, 4]" ).ValueOrDie ();
391+ std::shared_ptr<arrow::Array> sliced_values = values->Slice (1 , 3 );
392+ std::shared_ptr<arrow::StructArray> nested_column =
393+ arrow::StructArray::Make ({sliced_values}, {value_field->name ()}).ValueOrDie ();
394+ std::shared_ptr<arrow::Array> text =
395+ arrow::ipc::internal::json::ArrayFromJSON (arrow::utf8 (), R"( ["a", "b", "c", "d", "e"])" )
396+ .ValueOrDie ();
397+ std::shared_ptr<arrow::Array> sliced_text = text->Slice (1 , 3 );
398+ std::shared_ptr<arrow::Array> clean_column =
399+ arrow::ipc::internal::json::ArrayFromJSON (arrow::boolean (), " [true, false, true]" )
400+ .ValueOrDie ();
401+ std::shared_ptr<arrow::RecordBatch> record_batch = arrow::RecordBatch::Make (
402+ schema, /* num_rows=*/ 3 , {nested_column, sliced_text, clean_column});
403+
404+ ASSERT_EQ (nested_column->offset (), 0 );
405+ ASSERT_EQ (nested_column->field (0 )->offset (), 1 );
406+ ASSERT_EQ (sliced_text->offset (), 1 );
407+ ASSERT_EQ (clean_column->offset (), 0 );
408+
409+ ASSERT_OK_AND_ASSIGN (
410+ std::shared_ptr<arrow::RecordBatch> normalized_batch,
411+ ArrowUtils::NormalizeRecordBatchOffsets (record_batch, arrow::default_memory_pool ()));
412+ ASSERT_NE (normalized_batch.get (), record_batch.get ());
413+ ASSERT_TRUE (normalized_batch->Equals (*record_batch));
414+ std::shared_ptr<arrow::StructArray> normalized_nested =
415+ std::static_pointer_cast<arrow::StructArray>(normalized_batch->column (0 ));
416+ ASSERT_EQ (normalized_nested->offset (), 0 );
417+ ASSERT_EQ (normalized_nested->field (0 )->offset (), 0 );
418+ ASSERT_EQ (normalized_batch->column (1 )->offset (), 0 );
419+ ASSERT_EQ (normalized_batch->column (2 )->offset (), 0 );
420+ ASSERT_NE (normalized_batch->column_data (0 ).get (), record_batch->column_data (0 ).get ());
421+ ASSERT_NE (normalized_batch->column_data (1 ).get (), record_batch->column_data (1 ).get ());
422+ ASSERT_EQ (normalized_batch->column_data (2 ).get (), record_batch->column_data (2 ).get ());
423+
424+ ASSERT_OK_AND_ASSIGN (
425+ std::shared_ptr<arrow::RecordBatch> unchanged_batch,
426+ ArrowUtils::NormalizeRecordBatchOffsets (normalized_batch, arrow::default_memory_pool ()));
427+ ASSERT_EQ (unchanged_batch.get (), normalized_batch.get ());
428+ }
429+
382430TEST (ArrowUtilsTest, TestEqualsIgnoreNullable) {
383431 {
384432 // test simple
@@ -481,6 +529,7 @@ TEST(ArrowUtilsTest, TestGetCompressionType) {
481529 ASSERT_EQ (type, arrow::Compression::GZIP );
482530 }
483531 {
532+ // test invalid codec
484533 ASSERT_NOK (ArrowUtils::GetCompressionType (" invalid_codec" ));
485534 }
486535}
0 commit comments