|
27 | 27 | #include "iceberg/json_internal.h" |
28 | 28 | #include "iceberg/schema.h" |
29 | 29 | #include "iceberg/schema_field.h" |
| 30 | +#include "iceberg/test/matchers.h" |
30 | 31 | #include "iceberg/type.h" |
31 | 32 |
|
32 | 33 | namespace iceberg { |
@@ -133,4 +134,52 @@ TEST(SchemaJsonTest, RoundTrip) { |
133 | 134 | ASSERT_EQ(dumped_json, json); |
134 | 135 | } |
135 | 136 |
|
| 137 | +TEST(SchemaJsonTest, IdentifierFieldIds) { |
| 138 | + // Test schema with identifier-field-ids |
| 139 | + constexpr std::string_view json_with_identifier_str = |
| 140 | + R"({"fields":[{"id":1,"name":"id","required":true,"type":"long"}, |
| 141 | + {"id":2,"name":"data","required":false,"type":"string"}], |
| 142 | + "identifier-field-ids":[1], |
| 143 | + "schema-id":1, |
| 144 | + "type":"struct"})"; |
| 145 | + |
| 146 | + auto json_with_identifiers = nlohmann::json::parse(json_with_identifier_str); |
| 147 | + ICEBERG_UNWRAP_OR_FAIL(auto schema_with_identifers, |
| 148 | + SchemaFromJson(json_with_identifiers)); |
| 149 | + ASSERT_EQ(schema_with_identifers->fields().size(), 2); |
| 150 | + ASSERT_EQ(schema_with_identifers->schema_id(), 1); |
| 151 | + ASSERT_EQ(schema_with_identifers->IdentifierFieldIds().size(), 1); |
| 152 | + ASSERT_EQ(schema_with_identifers->IdentifierFieldIds()[0], 1); |
| 153 | + ASSERT_EQ(ToJson(*schema_with_identifers), json_with_identifiers); |
| 154 | + |
| 155 | + // Test schema without identifier-field-ids |
| 156 | + constexpr std::string_view json_without_identifiers_str = |
| 157 | + R"({"fields":[{"id":1,"name":"id","required":true,"type":"int"}, |
| 158 | + {"id":2,"name":"name","required":false,"type":"string"}], |
| 159 | + "schema-id":1, |
| 160 | + "type":"struct"})"; |
| 161 | + |
| 162 | + auto json_without_identifiers = nlohmann::json::parse(json_without_identifiers_str); |
| 163 | + ICEBERG_UNWRAP_OR_FAIL(auto schema_without_identifiers, |
| 164 | + SchemaFromJson(json_without_identifiers)); |
| 165 | + ASSERT_TRUE(schema_without_identifiers->IdentifierFieldIds().empty()); |
| 166 | + ASSERT_EQ(ToJson(*schema_without_identifiers), json_without_identifiers); |
| 167 | + |
| 168 | + // Test schema with multiple identifier fields |
| 169 | + constexpr std::string_view json_multi_identifiers_str = |
| 170 | + R"({"fields":[{"id":1,"name":"user_id","required":true,"type":"long"}, |
| 171 | + {"id":2,"name":"org_id","required":true,"type":"long"}, |
| 172 | + {"id":3,"name":"data","required":false,"type":"string"}], |
| 173 | + "identifier-field-ids":[1,2], |
| 174 | + "schema-id":2, |
| 175 | + "type":"struct"})"; |
| 176 | + auto json_multi_identifiers = nlohmann::json::parse(json_multi_identifiers_str); |
| 177 | + ICEBERG_UNWRAP_OR_FAIL(auto schema_multi_identifiers, |
| 178 | + SchemaFromJson(json_multi_identifiers)); |
| 179 | + ASSERT_EQ(schema_multi_identifiers->IdentifierFieldIds().size(), 2); |
| 180 | + ASSERT_EQ(schema_multi_identifiers->IdentifierFieldIds()[0], 1); |
| 181 | + ASSERT_EQ(schema_multi_identifiers->IdentifierFieldIds()[1], 2); |
| 182 | + ASSERT_EQ(ToJson(*schema_multi_identifiers), json_multi_identifiers); |
| 183 | +} |
| 184 | + |
136 | 185 | } // namespace iceberg |
0 commit comments