summaryrefslogtreecommitdiffstats
path: root/config-model
diff options
context:
space:
mode:
Diffstat (limited to 'config-model')
-rw-r--r--config-model/src/main/java/com/yahoo/searchdefinition/parser/ParsedField.java6
-rw-r--r--config-model/src/main/java/com/yahoo/searchdefinition/parser/ParsedRankProfile.java7
-rw-r--r--config-model/src/main/javacc/IntermediateParser.jj12
-rw-r--r--config-model/src/test/java/com/yahoo/searchdefinition/RankingExpressionInliningTestCase.java15
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" +