A string* field must be treated as optional by default.

This commit is contained in:
Kishore Nallan 2021-04-28 08:12:54 +05:30
parent b5300fa599
commit 5f2254d22a
2 changed files with 33 additions and 3 deletions

View File

@ -119,7 +119,11 @@ struct field {
}
bool is_dynamic() const {
return type == "string*" || (name != ".*" && name.find(".*") != std::string::npos);
return is_dynamic(name, type);
}
static bool is_dynamic(const std::string& name, const std::string& type) {
return type == "string*" || (name != ".*" && name.find(".*") != std::string::npos);
}
bool has_numerical_index() const {
@ -231,6 +235,10 @@ struct field {
}
if(field.is_dynamic() && !field.optional) {
if(field_types::is_string_or_array(field.type)) {
return Option<bool>(400, "Field `" + field.name + "` must be an optional field.");
}
return Option<bool>(400, "Field `" + field.name + "` with wildcard name must be an optional field.");
}
@ -368,10 +376,9 @@ struct field {
field_json[fields::locale] = "";
}
bool is_dynamic = field_json[fields::name].get<std::string>().find(".*") != std::string::npos;
if(field_json.count(fields::optional) == 0) {
// dynamic fields are always optional
bool is_dynamic = field::is_dynamic(field_json[fields::name], field_json[fields::type]);
field_json[fields::optional] = is_dynamic;
}

View File

@ -552,6 +552,21 @@ TEST_F(CollectionAllFieldsTest, JsonFieldsToFieldsConversion) {
ASSERT_EQ(".*", fields[0].name);
ASSERT_EQ("string*", fields[0].type);
// non-wildcard string* field should be treated as optional by default
fields_json = nlohmann::json::array();
nlohmann::json string_star_field;
string_star_field[fields::name] = "title";
string_star_field[fields::type] = "string*";
fields_json.emplace_back(string_star_field);
fields.clear();
parse_op = field::json_fields_to_fields(fields_json, fallback_field_type, fields);
ASSERT_TRUE(parse_op.ok());
ASSERT_EQ(true, fields[0].optional);
fields_json = nlohmann::json::array();
fields_json.emplace_back(all_field);
// reject when you try to set geo property on * field
fields_json[0][fields::geo_resolution] = 10;
parse_op = field::json_fields_to_fields(fields_json, fallback_field_type, fields);
@ -782,6 +797,14 @@ TEST_F(CollectionAllFieldsTest, DynamicFieldsMustOnlyBeOptional) {
ASSERT_FALSE(op.ok());
ASSERT_EQ("Field `.*_name` with wildcard name must be an optional field.", op.error());
// string* fields should only be optional
std::vector<field> bad_fields2 = {field("title", field_types::STRING, true),
field("name", "string*", true, false),};
op = collectionManager.create_collection("coll1", 1, bad_fields2, "", 0);
ASSERT_FALSE(op.ok());
ASSERT_EQ("Field `name` must be an optional field.", op.error());
std::vector<field> fields = {field("title", field_types::STRING, true),
field(".*_name", field_types::STRING, true, true),};