@@ -66,7 +66,11 @@ TEST(MapSharedShreddingSchemaUtilsTest, AttachMetadataToSchemaBasic) {
6666 ASSERT_EQ (deserialized, tags_meta);
6767}
6868
69- TEST (MapSharedShreddingSchemaUtilsTest, AttachMetadataToSchemaMissingField) {
69+ TEST (MapSharedShreddingSchemaUtilsTest, AttachMetadataToSchemaInvalidInput) {
70+ ASSERT_NOK_WITH_MSG (MapSharedShreddingSchemaUtils::AttachMetadataToSchema (
71+ std::unique_ptr<::ArrowSchema>(), {}, " none" ),
72+ " physical schema is null" );
73+
7074 MapSharedShreddingFieldMeta tags_meta;
7175 tags_meta.name_to_id = {{" host" , 0 }};
7276 tags_meta.field_to_columns = {{0 , {0 }}};
@@ -114,6 +118,51 @@ TEST(MapSharedShreddingSchemaUtilsTest, AttachMetadataToSchemaPreservesExistingF
114118 ASSERT_TRUE (MapSharedShreddingUtils::HasShreddingMetadata (updated_metadata));
115119}
116120
121+ TEST (MapSharedShreddingSchemaUtilsTest, AttachMetadataToSchemaOverwritesExistingShreddingMetadata) {
122+ MapSharedShreddingFieldMeta old_meta;
123+ old_meta.name_to_id = {{" old" , 0 }};
124+ old_meta.field_to_columns = {{0 , {0 }}};
125+ old_meta.num_columns = 1 ;
126+ old_meta.max_row_width = 1 ;
127+
128+ MapSharedShreddingFieldMeta tags_meta;
129+ tags_meta.name_to_id = {{" host" , 0 }, {" region" , 1 }};
130+ tags_meta.field_to_columns = {{0 , {0 }}, {1 , {1 }}};
131+ tags_meta.overflow_field_set = {1 };
132+ tags_meta.num_columns = 2 ;
133+ tags_meta.max_row_width = 2 ;
134+
135+ auto tags_metadata = std::make_shared<arrow::KeyValueMetadata>();
136+ tags_metadata->Append (" paimon.field.id" , " 7" );
137+ ASSERT_OK (MapSharedShreddingUtils::SerializeMetadata (old_meta, " none" , tags_metadata.get ()));
138+ auto schema = arrow::schema ({arrow::field (
139+ " tags" ,
140+ arrow::struct_ ({arrow::field (" __field_mapping" , arrow::list (arrow::int32 ()), true ),
141+ arrow::field (" __col_0" , arrow::utf8 (), true ),
142+ arrow::field (" __col_1" , arrow::utf8 (), true )}),
143+ true , tags_metadata)});
144+
145+ auto c_schema = std::make_unique<::ArrowSchema>();
146+ ASSERT_TRUE (arrow::ExportSchema (*schema, c_schema.get ()).ok ());
147+ ASSERT_OK_AND_ASSIGN (auto c_updated_schema,
148+ MapSharedShreddingSchemaUtils::AttachMetadataToSchema (
149+ std::move (c_schema), {{" tags" , tags_meta}}, " none" ));
150+ auto updated_schema = arrow::ImportSchema (c_updated_schema.get ()).ValueOrDie ();
151+ auto updated_metadata = updated_schema->field (0 )->metadata ()->Copy ();
152+
153+ ASSERT_EQ (updated_metadata->value (updated_metadata->FindKey (" paimon.field.id" )), " 7" );
154+ int32_t storage_layout_key_count = 0 ;
155+ for (const auto & key : updated_metadata->keys ()) {
156+ if (key == MapShreddingDefine::kStorageLayout ) {
157+ ++storage_layout_key_count;
158+ }
159+ }
160+ ASSERT_EQ (storage_layout_key_count, 1 );
161+ ASSERT_OK_AND_ASSIGN (auto deserialized,
162+ MapSharedShreddingUtils::DeserializeMetadata (updated_metadata, " none" ));
163+ ASSERT_EQ (deserialized, tags_meta);
164+ }
165+
117166TEST (MapSharedShreddingSchemaUtilsTest, ExtractMetadataFromField) {
118167 MapSharedShreddingFieldMeta tags_meta;
119168 tags_meta.name_to_id = {{" host" , 0 }, {" region" , 1 }};
@@ -150,10 +199,30 @@ TEST(MapSharedShreddingSchemaUtilsTest, ExtractMetadataFromFieldNoShreddingMetad
150199 " metadata is null or storage layout is not shared-shredding" );
151200}
152201
153- TEST (MapSharedShreddingSchemaUtilsTest, LogicalToPhysicalSchemaNonMapField) {
202+ TEST (MapSharedShreddingSchemaUtilsTest, ExtractMetadataFromFieldInvalidInput) {
203+ ASSERT_NOK_WITH_MSG (MapSharedShreddingSchemaUtils::ExtractMetadataFromField (
204+ std::unique_ptr<::ArrowSchema>(), " tags" , " none" ),
205+ " physical schema is null" );
206+
207+ auto schema = arrow::schema ({arrow::field (" id" , arrow::int32 ())});
208+
209+ auto c_schema = std::make_unique<::ArrowSchema>();
210+ ASSERT_TRUE (arrow::ExportSchema (*schema, c_schema.get ()).ok ());
211+
212+ ASSERT_NOK_WITH_MSG (MapSharedShreddingSchemaUtils::ExtractMetadataFromField (std::move (c_schema),
213+ " tags" , " none" ),
214+ " Shared-shredding field 'tags' not found in physical schema." );
215+ }
216+
217+ TEST (MapSharedShreddingSchemaUtilsTest, LogicalToPhysicalSchemaInvalidInput) {
218+ std::map<std::string, int32_t > field_to_num_columns = {{" tags" , 2 }};
219+
220+ ASSERT_NOK_WITH_MSG (MapSharedShreddingSchemaUtils::LogicalToPhysicalSchema (
221+ std::unique_ptr<::ArrowSchema>(), field_to_num_columns),
222+ " logical schema is null" );
223+
154224 auto schema =
155225 arrow::schema ({arrow::field (" ts" , arrow::int64 ()), arrow::field (" tags" , arrow::int32 ())});
156- std::map<std::string, int32_t > field_to_num_columns = {{" tags" , 2 }};
157226
158227 auto c_schema = std::make_unique<::ArrowSchema>();
159228 ASSERT_TRUE (arrow::ExportSchema (*schema, c_schema.get ()).ok ());
0 commit comments