|
23 | 23 | #include "arrow/array/array_nested.h" |
24 | 24 | #include "arrow/ipc/json_simple.h" |
25 | 25 | #include "gtest/gtest.h" |
| 26 | +#include "paimon/common/table/special_fields.h" |
26 | 27 | #include "paimon/common/types/data_field.h" |
27 | 28 | #include "paimon/common/utils/fields_comparator.h" |
28 | 29 | #include "paimon/core/mergetree/compact/deduplicate_merge_function.h" |
@@ -55,14 +56,11 @@ TEST_F(MergedKeyValueRecordReaderTest, TestMergeAcrossUnderlyingBatches) { |
55 | 56 | DataField(3, arrow::field("v1", arrow::int32())), |
56 | 57 | DataField(4, arrow::field("v2", arrow::int32()))}; |
57 | 58 |
|
58 | | - auto key_schema = arrow::schema({fields[0].ArrowField(), fields[1].ArrowField()}); |
59 | | - auto value_schema = |
60 | | - arrow::schema({fields[0].ArrowField(), fields[1].ArrowField(), fields[2].ArrowField(), |
61 | | - fields[3].ArrowField(), fields[4].ArrowField()}); |
62 | | - std::shared_ptr<arrow::DataType> src_type = arrow::struct_( |
63 | | - {arrow::field("_SEQUENCE_NUMBER", arrow::int64()), |
64 | | - arrow::field("_VALUE_KIND", arrow::int8()), fields[0].ArrowField(), fields[1].ArrowField(), |
65 | | - fields[2].ArrowField(), fields[3].ArrowField(), fields[4].ArrowField()}); |
| 59 | + auto value_schema = DataField::ConvertDataFieldsToArrowSchema(fields); |
| 60 | + auto arrow_fields = value_schema->fields(); |
| 61 | + auto key_schema = arrow::schema({arrow_fields[0], arrow_fields[1]}); |
| 62 | + std::shared_ptr<arrow::DataType> src_type = |
| 63 | + arrow::struct_(SpecialFields::CompleteSequenceAndValueKindField(value_schema)->fields()); |
66 | 64 |
|
67 | 65 | auto src_array = std::dynamic_pointer_cast<arrow::StructArray>( |
68 | 66 | arrow::ipc::internal::json::ArrayFromJSON(src_type, R"([ |
@@ -97,4 +95,50 @@ TEST_F(MergedKeyValueRecordReaderTest, TestMergeAcrossUnderlyingBatches) { |
97 | 95 | } |
98 | 96 | } |
99 | 97 |
|
| 98 | +TEST_F(MergedKeyValueRecordReaderTest, TestSkipMergedNulloptResultInHasNext) { |
| 99 | + auto mfunc = std::make_unique<DeduplicateMergeFunction>(/*ignore_delete=*/true); |
| 100 | + auto merge_function_wrapper = std::make_shared<ReducerMergeFunctionWrapper>(std::move(mfunc)); |
| 101 | + |
| 102 | + std::vector<DataField> fields = {DataField(0, arrow::field("k0", arrow::int32())), |
| 103 | + DataField(1, arrow::field("v0", arrow::int32()))}; |
| 104 | + |
| 105 | + auto value_schema = DataField::ConvertDataFieldsToArrowSchema(fields); |
| 106 | + auto arrow_fields = value_schema->fields(); |
| 107 | + auto key_schema = arrow::schema({arrow_fields[0]}); |
| 108 | + std::shared_ptr<arrow::DataType> src_type = |
| 109 | + arrow::struct_(SpecialFields::CompleteSequenceAndValueKindField(value_schema)->fields()); |
| 110 | + |
| 111 | + auto src_array = std::dynamic_pointer_cast<arrow::StructArray>( |
| 112 | + arrow::ipc::internal::json::ArrayFromJSON(src_type, R"([ |
| 113 | + [0, 3, 1, 10], |
| 114 | + [3, 3, 1, 11], |
| 115 | + [2, 3, 2, 200], |
| 116 | + [4, 3, 2, 240], |
| 117 | + [1, 0, 3, 300], |
| 118 | + [5, 3, 3, 30] |
| 119 | + ])") |
| 120 | + .ValueOrDie()); |
| 121 | + |
| 122 | + ASSERT_OK_AND_ASSIGN(std::shared_ptr<FieldsComparator> key_comparator, |
| 123 | + FieldsComparator::Create({fields[0]}, /*is_ascending_order=*/true)); |
| 124 | + |
| 125 | + auto expected = KeyValueChecker::GenerateKeyValues( |
| 126 | + /*seq_vec=*/{1}, /*key_vec=*/{{3}}, /*value_vec=*/{{3, 300}}, pool_); |
| 127 | + |
| 128 | + for (auto batch_size : {1, 2, 3}) { |
| 129 | + auto file_batch_reader = |
| 130 | + std::make_unique<MockFileBatchReader>(src_array, src_type, /*batch_size=*/batch_size); |
| 131 | + auto raw_reader = std::make_unique<MockKeyValueDataFileRecordReader>( |
| 132 | + std::move(file_batch_reader), key_schema, value_schema, /*level=*/0, pool_); |
| 133 | + auto merged_reader = std::make_unique<MergedKeyValueRecordReader>( |
| 134 | + std::move(raw_reader), key_comparator, merge_function_wrapper); |
| 135 | + |
| 136 | + ASSERT_OK_AND_ASSIGN( |
| 137 | + auto results, |
| 138 | + (ReadResultCollector::CollectKeyValueResult< |
| 139 | + MergedKeyValueRecordReader, KeyValueRecordReader::Iterator>(merged_reader.get()))); |
| 140 | + KeyValueChecker::CheckResult(expected, results, /*key_arity=*/1, /*value_arity=*/2); |
| 141 | + } |
| 142 | +} |
| 143 | + |
100 | 144 | } // namespace paimon::test |
0 commit comments