summaryrefslogtreecommitdiffstats
path: root/config-model
diff options
context:
space:
mode:
authorTor Egge <Tor.Egge@broadpark.no>2018-11-29 11:57:38 +0100
committerTor Egge <Tor.Egge@broadpark.no>2018-11-29 12:31:44 +0100
commit8a0097a98961962e15ea45790e9d60f4729f76d9 (patch)
tree7e8e11be5abebd0d6de71006b1132d20309bf1a9 /config-model
parentaabdc58047ccb7597ccbe54ee35858792116197f (diff)
Fail duplicate import of field.
Diffstat (limited to 'config-model')
-rw-r--r--config-model/src/main/java/com/yahoo/searchdefinition/document/TemporaryImportedFields.java2
-rw-r--r--config-model/src/main/javacc/SDParser.jj6
-rw-r--r--config-model/src/test/java/com/yahoo/searchdefinition/processing/ImportedFieldsTestCase.java14
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 {",