Skip to content

Commit 40f5148

Browse files
authored
refactor: let CastNonPartitionArrayIfNeed only handle casting, leave name mapping to MappingFields in FieldMapping (alibaba#293)
1 parent e80cfaa commit 40f5148

3 files changed

Lines changed: 44 additions & 2 deletions

File tree

src/paimon/common/data/blob_defs.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ class BlobDefs {
3333
/// To create a Blob field:
3434
/// @code
3535
/// std::unordered_map<std::string, std::string> blob_metadata_map = {
36-
/// {Blob::EXTENSION_TYPE_KEY, Blob::EXTENSION_TYPE_VALUE}
36+
/// {Blob::kExtensionTypeKey, Blob::kExtensionTypeValue}
3737
/// };
3838
/// auto field = arrow::field("my_blob_field", arrow::large_binary(), false,
3939
/// std::make_shared<arrow::KeyValueMetadata>(blob_metadata_map));

src/paimon/core/io/field_mapping_reader.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -107,7 +107,7 @@ Result<std::shared_ptr<arrow::Array>> FieldMappingReader::CastNonPartitionArrayI
107107
single_column_array, non_partition_info_.non_partition_read_schema[i].Type(),
108108
arrow_pool_.get()));
109109
casted_array.push_back(casted);
110-
casted_field_names.push_back(non_partition_info_.non_partition_read_schema[i].Name());
110+
casted_field_names.push_back(non_partition_info_.non_partition_data_schema[i].Name());
111111
} else {
112112
// read and data type may both be string type, but after adapter transform, type may be
113113
// dictionary, need reconstruct struct type

src/paimon/core/io/field_mapping_reader_test.cpp

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -706,4 +706,46 @@ TEST_F(FieldMappingReaderTest, TestSchemaEvolutionWithDictType) {
706706
partition, expected_array);
707707
}
708708

709+
TEST_F(FieldMappingReaderTest, TestReadWithSchemaEvolutionRenameCombinedCast) {
710+
// Test all 4 combinations of rename × cast:
711+
// f0: no rename, no cast (utf8 → utf8, name unchanged)
712+
// f1: rename only (int32 → int32, f1 → new_f1)
713+
// f2: cast only (int32 → utf8, name unchanged)
714+
// f3: rename + cast (int32 → utf8, f3 → new_f2)
715+
std::vector<DataField> data_fields = {
716+
DataField(0, arrow::field("f0", arrow::utf8())),
717+
DataField(1, arrow::field("f1", arrow::int32())),
718+
DataField(2, arrow::field("f2", arrow::int32())),
719+
DataField(3, arrow::field("f3", arrow::int32())),
720+
};
721+
auto data_schema = DataField::ConvertDataFieldsToArrowSchema(data_fields);
722+
auto data_array = std::dynamic_pointer_cast<arrow::StructArray>(
723+
arrow::ipc::internal::json::ArrayFromJSON(arrow::struct_(data_schema->fields()),
724+
R"([
725+
["Bob", 100, 10, 1],
726+
["Emily", 200, 20, 2],
727+
["Alice", 300, 30, 3]
728+
])")
729+
.ValueOrDie());
730+
731+
std::vector<DataField> read_fields = {
732+
DataField(0, arrow::field("f0", arrow::utf8())),
733+
DataField(1, arrow::field("new_f1", arrow::int32())),
734+
DataField(2, arrow::field("f2", arrow::utf8())),
735+
DataField(3, arrow::field("new_f3", arrow::utf8())),
736+
};
737+
auto read_schema = DataField::ConvertDataFieldsToArrowSchema(read_fields);
738+
739+
auto expected = std::dynamic_pointer_cast<arrow::StructArray>(
740+
arrow::ipc::internal::json::ArrayFromJSON(arrow::struct_(read_schema->fields()),
741+
R"([
742+
["Bob", 100, "10", "1"],
743+
["Emily", 200, "20", "2"],
744+
["Alice", 300, "30", "3"]
745+
])")
746+
.ValueOrDie());
747+
748+
CheckResult(data_schema, data_array, read_schema, /*predicate=*/nullptr,
749+
/*partition_keys=*/{}, BinaryRow::EmptyRow(), expected);
750+
}
709751
} // namespace paimon::test

0 commit comments

Comments
 (0)