diff options
author | Tor Egge <Tor.Egge@broadpark.no> | 2018-11-29 11:57:38 +0100 |
---|---|---|
committer | Tor Egge <Tor.Egge@broadpark.no> | 2018-11-29 12:31:44 +0100 |
commit | 8a0097a98961962e15ea45790e9d60f4729f76d9 (patch) | |
tree | 7e8e11be5abebd0d6de71006b1132d20309bf1a9 /config-model | |
parent | aabdc58047ccb7597ccbe54ee35858792116197f (diff) |
Fail duplicate import of field.
Diffstat (limited to 'config-model')
3 files changed, 21 insertions, 1 deletions
diff --git a/config-model/src/main/java/com/yahoo/searchdefinition/document/TemporaryImportedFields.java b/config-model/src/main/java/com/yahoo/searchdefinition/document/TemporaryImportedFields.java index 11265fe70e8..a53c1b2c5ec 100644 --- a/config-model/src/main/java/com/yahoo/searchdefinition/document/TemporaryImportedFields.java +++ b/config-model/src/main/java/com/yahoo/searchdefinition/document/TemporaryImportedFields.java @@ -20,6 +20,8 @@ public class TemporaryImportedFields { fields.put(importedField.fieldName(), importedField); } + public boolean hasField(String fieldName) { return fields.get(fieldName) != null; } + public Map<String, TemporaryImportedField> fields() { return Collections.unmodifiableMap(fields); } diff --git a/config-model/src/main/javacc/SDParser.jj b/config-model/src/main/javacc/SDParser.jj index a6fa472d5c4..31f81b76ea4 100644 --- a/config-model/src/main/javacc/SDParser.jj +++ b/config-model/src/main/javacc/SDParser.jj @@ -2453,7 +2453,11 @@ void importField(Search search) : int indexOfDot = fieldRefSpec.indexOf('.'); String documentReferenceFieldName = fieldRefSpec.substring(0, indexOfDot); String foreignFieldName = fieldRefSpec.substring(indexOfDot + 1); - search.temporaryImportedFields().get().add(new TemporaryImportedField(aliasFieldName, documentReferenceFieldName, foreignFieldName)); + TemporaryImportedFields importedFields = search.temporaryImportedFields().get(); + if (importedFields.hasField(aliasFieldName)) { + throw new IllegalArgumentException("For search '" + search.getName() + "', import field as '" + aliasFieldName + "': Field already imported"); + } + importedFields.add(new TemporaryImportedField(aliasFieldName, documentReferenceFieldName, foreignFieldName)); } } diff --git a/config-model/src/test/java/com/yahoo/searchdefinition/processing/ImportedFieldsTestCase.java b/config-model/src/test/java/com/yahoo/searchdefinition/processing/ImportedFieldsTestCase.java index 4167e534653..536a52dd1b6 100644 --- a/config-model/src/test/java/com/yahoo/searchdefinition/processing/ImportedFieldsTestCase.java +++ b/config-model/src/test/java/com/yahoo/searchdefinition/processing/ImportedFieldsTestCase.java @@ -49,6 +49,20 @@ public class ImportedFieldsTestCase { "}")); } + @Test + public void fail_duplicate_import() throws ParseException { + exception.expect(IllegalArgumentException.class); + exception.expectMessage("For search 'ad', import field as 'my_budget': Field already imported"); + Search search = buildAdSearch(joinLines( + "search ad {", + " document ad {", + " field campaign_ref type reference<campaign> { indexing: attribute }", + " }", + " import field campaign_ref.budget as my_budget {}", + " import field campaign_ref.budget as my_budget {}", + "}")); + } + private static Search buildAdSearch(String sdContent) throws ParseException { SearchBuilder builder = new SearchBuilder(); builder.importString(joinLines("search campaign {", |