diff options
Diffstat (limited to 'config-model')
4 files changed, 23 insertions, 17 deletions
diff --git a/config-model/src/main/java/com/yahoo/searchdefinition/parser/ParsedField.java b/config-model/src/main/java/com/yahoo/searchdefinition/parser/ParsedField.java index 5ee73abc28d..5bcfa841bae 100644 --- a/config-model/src/main/java/com/yahoo/searchdefinition/parser/ParsedField.java +++ b/config-model/src/main/java/com/yahoo/searchdefinition/parser/ParsedField.java @@ -121,10 +121,8 @@ class ParsedField extends ParsedBlock { void setStemming(Stemming stemming) { this.stemming = stemming; } void setWeight(int weight) { this.weight = weight; } - void addAttribute(ParsedAttribute attribute) { - String attrName = attribute.name(); - verifyThat(! attributes.containsKey(attrName), "already has attribute", attrName); - attributes.put(attrName, attribute); + ParsedAttribute attributeFor(String attrName) { + return attributes.computeIfAbsent(attrName, n -> new ParsedAttribute(n)); } void setIndexingOperation(ParsedIndexingOp idxOp) { diff --git a/config-model/src/main/java/com/yahoo/searchdefinition/parser/ParsedRankProfile.java b/config-model/src/main/java/com/yahoo/searchdefinition/parser/ParsedRankProfile.java index 0801b613530..f028685b71a 100644 --- a/config-model/src/main/java/com/yahoo/searchdefinition/parser/ParsedRankProfile.java +++ b/config-model/src/main/java/com/yahoo/searchdefinition/parser/ParsedRankProfile.java @@ -113,9 +113,10 @@ class ParsedRankProfile extends ParsedBlock { fieldsRankWeight.put(field, weight); } - void addFunction(ParsedRankFunction func) { - verifyThat(! functions.containsKey(func.name()), "already has function", func.name()); - functions.put(func.name(), func); + ParsedRankFunction addOrReplaceFunction(ParsedRankFunction func) { + // allowed with warning + // verifyThat(! functions.containsKey(func.name()), "already has function", func.name()); + return functions.put(func.name(), func); } void addMutateOperation(MutateOperation.Phase phase, String attrName, String operation) { diff --git a/config-model/src/main/javacc/IntermediateParser.jj b/config-model/src/main/javacc/IntermediateParser.jj index 90260cb9895..3f95bd02bce 100644 --- a/config-model/src/main/javacc/IntermediateParser.jj +++ b/config-model/src/main/javacc/IntermediateParser.jj @@ -1050,13 +1050,10 @@ void attribute(ParsedField field) : { <ATTRIBUTE> [name = identifier()] { - ParsedAttribute attr = new ParsedAttribute(name); + ParsedAttribute attr = field.attributeFor(name); } ( (<COLON> attributeSetting(attr)) | (lbrace() (attributeSetting(attr) (<NL>)*)* <RBRACE>) ) - { - field.addAttribute(attr); - } } /* pick up sorting in field block */ @@ -1910,7 +1907,12 @@ void function(ParsedRankProfile profile) : { func.setExpression(expression); func.setInline(inline); - profile.addFunction(func); + var old = profile.addOrReplaceFunction(func); + if (old != null) { + deployLogger.logApplicationPackage(Level.WARNING, "Function '" + func.name() + + "' replaces a previous function with the same name in rank profile '" + + profile.name() + "'"); + } } } diff --git a/config-model/src/test/java/com/yahoo/searchdefinition/RankingExpressionInliningTestCase.java b/config-model/src/test/java/com/yahoo/searchdefinition/RankingExpressionInliningTestCase.java index 94d25deb16a..b671dc515c1 100644 --- a/config-model/src/test/java/com/yahoo/searchdefinition/RankingExpressionInliningTestCase.java +++ b/config-model/src/test/java/com/yahoo/searchdefinition/RankingExpressionInliningTestCase.java @@ -192,14 +192,19 @@ public class RankingExpressionInliningTestCase extends AbstractSchemaTestCase { @Test public void testFunctionInliningWithReplacement() throws ParseException { + checkFunctionReplacement(false); + checkFunctionReplacement(true); + } + + public void checkFunctionReplacement(boolean useXPP) throws ParseException { RankProfileRegistry rankProfileRegistry = new RankProfileRegistry(); MockDeployLogger deployLogger = new MockDeployLogger(); ApplicationBuilder builder = new ApplicationBuilder(MockApplicationPackage.createEmpty(), - new MockFileRegistry(), - deployLogger, - new TestProperties(), - rankProfileRegistry, - new QueryProfileRegistry()); + new MockFileRegistry(), + deployLogger, + new TestProperties().setExperimentalSdParsing(useXPP), + rankProfileRegistry, + new QueryProfileRegistry()); builder.addSchema( "search test {\n" + " document test { }\n" + |