@@ -91,18 +91,6 @@ TEST_F(BlobFileContextTest, MixedInlineAndBlobFile) {
9191 // blob file fields = non-inline blob fields
9292 ASSERT_EQ (context->GetBlobFileFields (), std::set<std::string>({" video" , " audio" }));
9393
94- // Query methods
95- ASSERT_TRUE (context->IsInlineField (" image" ));
96- ASSERT_TRUE (context->IsDescriptorField (" image" ));
97- ASSERT_FALSE (context->IsViewField (" image" ));
98- ASSERT_FALSE (context->IsBlobFileField (" image" ));
99-
100- ASSERT_FALSE (context->IsInlineField (" video" ));
101- ASSERT_TRUE (context->IsBlobFileField (" video" ));
102-
103- ASSERT_FALSE (context->IsInlineField (" audio" ));
104- ASSERT_TRUE (context->IsBlobFileField (" audio" ));
105-
10694 // Requires blob file writer for video and audio
10795 ASSERT_TRUE (context->RequireBlobFileWriter ());
10896 ASSERT_FALSE (context->RequireExternalStorageWriter ());
@@ -126,9 +114,6 @@ TEST_F(BlobFileContextTest, ExternalStorageFields) {
126114 ASSERT_EQ (context->GetExternalStoragePath (), " oss://bucket/blob/" );
127115 ASSERT_TRUE (context->GetBlobFileFields ().empty ());
128116
129- ASSERT_TRUE (context->IsExternalStorageField (" image" ));
130- ASSERT_FALSE (context->IsExternalStorageField (" video" ));
131-
132117 ASSERT_FALSE (context->RequireBlobFileWriter ());
133118 ASSERT_TRUE (context->RequireExternalStorageWriter ());
134119}
@@ -148,10 +133,6 @@ TEST_F(BlobFileContextTest, ViewFields) {
148133 ASSERT_EQ (context->GetInlineFields (), std::set<std::string>({" ref_image" }));
149134 ASSERT_EQ (context->GetBlobFileFields (), std::set<std::string>({" raw_blob" }));
150135
151- ASSERT_TRUE (context->IsInlineField (" ref_image" ));
152- ASSERT_TRUE (context->IsViewField (" ref_image" ));
153- ASSERT_FALSE (context->IsDescriptorField (" ref_image" ));
154-
155136 ASSERT_TRUE (context->RequireBlobFileWriter ());
156137 ASSERT_FALSE (context->RequireExternalStorageWriter ());
157138}
@@ -176,24 +157,53 @@ TEST_F(BlobFileContextTest, DescriptorAndViewTogether) {
176157 ASSERT_EQ (context->GetExternalStoragePath (), " /tmp/ext/" );
177158 ASSERT_EQ (context->GetBlobFileFields (), std::set<std::string>({" normal_blob" }));
178159
179- ASSERT_TRUE (context->IsDescriptorField (" desc_blob" ));
180- ASSERT_TRUE (context->IsExternalStorageField (" desc_blob" ));
181- ASSERT_TRUE (context->IsInlineField (" desc_blob" ));
182- ASSERT_FALSE (context->IsBlobFileField (" desc_blob" ));
160+ ASSERT_TRUE (context->RequireBlobFileWriter ());
161+ ASSERT_TRUE (context->RequireExternalStorageWriter ());
162+ }
183163
184- ASSERT_TRUE (context->IsViewField (" view_blob" ));
185- ASSERT_TRUE (context->IsInlineField (" view_blob" ));
186- ASSERT_FALSE (context->IsDescriptorField (" view_blob" ));
164+ TEST_F (BlobFileContextTest, PartialSchemaIgnoresAbsentFields) {
165+ // Schema only carries "image"; "video" and "audio" are not part of this write schema.
166+ auto schema = MakeSchema ({" id" }, {" image" });
167+ std::map<std::string, std::string> opts_map = {
168+ {Options::BLOB_DESCRIPTOR_FIELD , " image,audio" },
169+ {Options::BLOB_VIEW_FIELD , " video" },
170+ {Options::BLOB_EXTERNAL_STORAGE_FIELD , " image,video" },
171+ {Options::BLOB_EXTERNAL_STORAGE_PATH , " oss://bucket/blob/" },
172+ };
173+ ASSERT_OK_AND_ASSIGN (auto options, CoreOptions::FromMap (opts_map));
174+ auto context = BlobFileContext::Create (schema, options);
175+ ASSERT_TRUE (context);
187176
188- ASSERT_FALSE (context->IsInlineField (" normal_blob" ));
189- ASSERT_TRUE (context->IsBlobFileField (" normal_blob" ));
177+ // Only "image" survives filtering; "audio" / "video" are not in the schema.
178+ ASSERT_EQ (context->GetDescriptorFields (), std::set<std::string>({" image" }));
179+ ASSERT_TRUE (context->GetViewFields ().empty ());
180+ ASSERT_EQ (context->GetInlineFields (), std::set<std::string>({" image" }));
181+ ASSERT_EQ (context->GetExternalStorageFields (), std::set<std::string>({" image" }));
190182
191- // Non-existent field
192- ASSERT_FALSE (context->IsInlineField (" not_exist" ));
193- ASSERT_FALSE (context->IsBlobFileField (" not_exist" ));
183+ // No non-inline blob field remains in the schema.
184+ ASSERT_TRUE (context->GetBlobFileFields ().empty ());
194185
195- ASSERT_TRUE (context->RequireBlobFileWriter ());
186+ ASSERT_FALSE (context->RequireBlobFileWriter ());
196187 ASSERT_TRUE (context->RequireExternalStorageWriter ());
197188}
198189
190+ TEST_F (BlobFileContextTest, PartialSchemaWithOnlyBlobFileField) {
191+ auto schema = MakeSchema ({" id" }, {" audio" });
192+ std::map<std::string, std::string> opts_map = {
193+ {Options::BLOB_DESCRIPTOR_FIELD , " image" }, {Options::BLOB_VIEW_FIELD , " video" },
194+ // "audio" is not configured as inline -> goes to .blob file
195+ };
196+ ASSERT_OK_AND_ASSIGN (auto options, CoreOptions::FromMap (opts_map));
197+ auto context = BlobFileContext::Create (schema, options);
198+ ASSERT_TRUE (context);
199+
200+ ASSERT_TRUE (context->GetDescriptorFields ().empty ());
201+ ASSERT_TRUE (context->GetViewFields ().empty ());
202+ ASSERT_TRUE (context->GetInlineFields ().empty ());
203+ ASSERT_EQ (context->GetBlobFileFields (), std::set<std::string>({" audio" }));
204+
205+ ASSERT_TRUE (context->RequireBlobFileWriter ());
206+ ASSERT_FALSE (context->RequireExternalStorageWriter ());
207+ }
208+
199209} // namespace paimon
0 commit comments