aboutsummaryrefslogtreecommitdiffstats
path: root/config-model
diff options
context:
space:
mode:
authorGeir Storli <geirstorli@yahoo.no>2018-11-29 16:12:08 +0100
committerGitHub <noreply@github.com>2018-11-29 16:12:08 +0100
commit71eccb08d9b88fb4b5485baed3fdc2cc17822a6f (patch)
tree71501d356b1c7e6cfb2d8384570544e8eca5bddc /config-model
parentfcd87bca84996778d3362106e79ce03156f94377 (diff)
parent8a0097a98961962e15ea45790e9d60f4729f76d9 (diff)
Merge pull request #7811 from vespa-engine/toregge/fail-duplicate-import
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 {",