summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--config-model/src/main/java/com/yahoo/searchdefinition/RankProfile.java43
-rw-r--r--config-model/src/main/java/com/yahoo/searchdefinition/expressiontransforms/MacroShadower.java4
-rw-r--r--config-model/src/main/java/com/yahoo/vespa/model/VespaModel.java5
-rw-r--r--config-model/src/main/java/com/yahoo/vespa/model/ml/ConvertedModel.java3
-rw-r--r--config-model/src/test/java/com/yahoo/searchdefinition/RankProfileRegistryTest.java3
-rw-r--r--config-model/src/test/java/com/yahoo/searchdefinition/processing/RankingExpressionsTestCase.java8
-rwxr-xr-xsearchlib/src/main/java/com/yahoo/searchlib/rankingexpression/ExpressionFunction.java11
7 files changed, 35 insertions, 42 deletions
diff --git a/config-model/src/main/java/com/yahoo/searchdefinition/RankProfile.java b/config-model/src/main/java/com/yahoo/searchdefinition/RankProfile.java
index 98238d886db..200eac0cdad 100644
--- a/config-model/src/main/java/com/yahoo/searchdefinition/RankProfile.java
+++ b/config-model/src/main/java/com/yahoo/searchdefinition/RankProfile.java
@@ -549,14 +549,9 @@ public class RankProfile implements Serializable, Cloneable {
}
/** Adds a new macro and returns it */
- public Macro addMacro(String name, RankingExpression expression, boolean inline) {
- return addMacro(name, Collections.emptyList(), expression, inline);
- }
-
- /** Adds a new macro and returns it */
public Macro addMacro(String name, List<String> arguments, String expression, boolean inline) {
try {
- return addMacro(name, arguments, parseRankingExpression(name, expression), inline);
+ return addMacro(new ExpressionFunction(name, arguments, parseRankingExpression(name, expression)), inline);
}
catch (ParseException e) {
throw new IllegalArgumentException("Could not parse macro '" + name + "'", e);
@@ -564,9 +559,9 @@ public class RankProfile implements Serializable, Cloneable {
}
/** Adds a new macro and returns it */
- public Macro addMacro(String name, List<String> arguments, RankingExpression expression, boolean inline) {
- Macro macro = new Macro(name, arguments, expression, inline);
- macros.put(name, macro);
+ public Macro addMacro(ExpressionFunction function, boolean inline) {
+ Macro macro = new Macro(function, inline);
+ macros.put(function.getName(), macro);
return macro;
}
@@ -753,7 +748,7 @@ public class RankProfile implements Serializable, Cloneable {
for (Map.Entry<String, Macro> entry : macros.entrySet()) {
Macro macro = entry.getValue();
RankingExpression compiled = compile(macro.function().getBody(), queryProfiles, importedModels, getConstants(), inlineMacros, expressionTransforms);
- compiledMacros.put(entry.getKey(), macro.withExpression(compiled));
+ compiledMacros.put(entry.getKey(), macro.withBody(compiled));
}
return compiledMacros;
}
@@ -951,7 +946,7 @@ public class RankProfile implements Serializable, Cloneable {
}
/**
- * Represents a declared macro in the profile. It is, after parsing, transformed into ExpressionMacro
+ * A function in a rank profile
*/
public static class Macro {
@@ -960,38 +955,24 @@ public class RankProfile implements Serializable, Cloneable {
/** True if this should be inlined into calling expressions. Useful for very cheap macros. */
private final boolean inline;
- public Macro(String name, List<String> arguments, RankingExpression expression, boolean inline) {
- this.function = new ExpressionFunction(name, arguments, expression);
+ public Macro(ExpressionFunction function, boolean inline) {
+ this.function = function;
this.inline = inline;
}
- public List<String> getArguments() {
- return function.arguments();
- }
-
- public Macro withExpression(RankingExpression expression) {
- return new Macro(function.getName(), function.arguments(), expression, inline);
- }
-
- public RankingExpression getRankingExpression() {
- return function.getBody();
- }
-
- public String getName() {
- return function.getName();
- }
+ public ExpressionFunction function() { return function; }
public boolean inline() {
return inline && function.arguments().isEmpty(); // only inline no-arg macros;
}
- public ExpressionFunction function() {
- return function;
+ public Macro withBody(RankingExpression expression) {
+ return new Macro(function.withBody(expression), inline);
}
@Override
public String toString() {
- return "macro " + getName() + ": " + function().getBody();
+ return "function " + function;
}
}
diff --git a/config-model/src/main/java/com/yahoo/searchdefinition/expressiontransforms/MacroShadower.java b/config-model/src/main/java/com/yahoo/searchdefinition/expressiontransforms/MacroShadower.java
index a1d7f2ddd2a..13f31c0254e 100644
--- a/config-model/src/main/java/com/yahoo/searchdefinition/expressiontransforms/MacroShadower.java
+++ b/config-model/src/main/java/com/yahoo/searchdefinition/expressiontransforms/MacroShadower.java
@@ -49,10 +49,8 @@ public class MacroShadower extends ExpressionTransformer<RankProfileTransformCon
}
int functionArity = function.getFunction().arity();
- int macroArity = macro.getArguments() != null ? macro.getArguments().size() : 0;
- if (functionArity != macroArity) {
+ if (functionArity != macro.function().arguments().size())
return transformChildren(function, context);
- }
ReferenceNode node = new ReferenceNode(name, function.children(), null);
return transformChildren(node, context);
diff --git a/config-model/src/main/java/com/yahoo/vespa/model/VespaModel.java b/config-model/src/main/java/com/yahoo/vespa/model/VespaModel.java
index e2ad9c6a579..bc2b2f70eae 100644
--- a/config-model/src/main/java/com/yahoo/vespa/model/VespaModel.java
+++ b/config-model/src/main/java/com/yahoo/vespa/model/VespaModel.java
@@ -32,6 +32,7 @@ import com.yahoo.searchdefinition.RankProfileRegistry;
import com.yahoo.searchdefinition.RankingConstants;
import com.yahoo.searchdefinition.derived.AttributeFields;
import com.yahoo.searchdefinition.derived.RankProfileList;
+import com.yahoo.searchlib.rankingexpression.ExpressionFunction;
import com.yahoo.vespa.model.ml.ConvertedModel;
import com.yahoo.searchlib.rankingexpression.RankingExpression;
import com.yahoo.searchlib.rankingexpression.integration.ml.ImportedModel;
@@ -236,7 +237,7 @@ public final class VespaModel extends AbstractConfigProducerRoot implements Seri
ConvertedModel convertedModel = ConvertedModel.fromSource(new ModelName(model.name()),
model.name(), profile, queryProfiles, model);
for (Map.Entry<String, RankingExpression> entry : convertedModel.expressions().entrySet()) {
- profile.addMacro(entry.getKey(), entry.getValue(), false);
+ profile.addMacro(new ExpressionFunction(entry.getKey(), entry.getValue()), false);
}
}
}
@@ -248,7 +249,7 @@ public final class VespaModel extends AbstractConfigProducerRoot implements Seri
rankProfileRegistry.add(profile);
ConvertedModel convertedModel = ConvertedModel.fromStore(new ModelName(modelName), modelName, profile);
for (Map.Entry<String, RankingExpression> entry : convertedModel.expressions().entrySet()) {
- profile.addMacro(entry.getKey(), entry.getValue(), false);
+ profile.addMacro(new ExpressionFunction(entry.getKey(), entry.getValue()), false);
}
}
}
diff --git a/config-model/src/main/java/com/yahoo/vespa/model/ml/ConvertedModel.java b/config-model/src/main/java/com/yahoo/vespa/model/ml/ConvertedModel.java
index 390fd32f0ba..fb1ca9a0822 100644
--- a/config-model/src/main/java/com/yahoo/vespa/model/ml/ConvertedModel.java
+++ b/config-model/src/main/java/com/yahoo/vespa/model/ml/ConvertedModel.java
@@ -13,6 +13,7 @@ import com.yahoo.searchdefinition.FeatureNames;
import com.yahoo.searchdefinition.RankProfile;
import com.yahoo.searchdefinition.RankingConstant;
import com.yahoo.searchdefinition.expressiontransforms.RankProfileTransformContext;
+import com.yahoo.searchlib.rankingexpression.ExpressionFunction;
import com.yahoo.searchlib.rankingexpression.RankingExpression;
import com.yahoo.searchlib.rankingexpression.Reference;
import com.yahoo.searchlib.rankingexpression.evaluation.DoubleValue;
@@ -285,7 +286,7 @@ public class ConvertedModel {
"\nwant to add " + expression + "\n");
return;
}
- profile.addMacro(macroName, expression, false); // TODO: Inline if only used once
+ profile.addMacro(new ExpressionFunction(macroName, expression), false); // TODO: Inline if only used once
}
/**
diff --git a/config-model/src/test/java/com/yahoo/searchdefinition/RankProfileRegistryTest.java b/config-model/src/test/java/com/yahoo/searchdefinition/RankProfileRegistryTest.java
index e8bc4f44738..7b262bdc4d0 100644
--- a/config-model/src/test/java/com/yahoo/searchdefinition/RankProfileRegistryTest.java
+++ b/config-model/src/test/java/com/yahoo/searchdefinition/RankProfileRegistryTest.java
@@ -4,6 +4,7 @@ package com.yahoo.searchdefinition;
import com.yahoo.config.model.application.provider.FilesApplicationPackage;
import com.yahoo.config.model.test.TestDriver;
import com.yahoo.config.model.test.TestRoot;
+import com.yahoo.searchlib.rankingexpression.ExpressionFunction;
import com.yahoo.searchlib.rankingexpression.RankingExpression;
import com.yahoo.vespa.config.search.RankProfilesConfig;
import org.junit.Test;
@@ -46,7 +47,7 @@ public class RankProfileRegistryTest {
for (String rankProfileName : RankProfileRegistry.overridableRankProfileNames) {
assertNull(rankProfileRegistry.get(search, rankProfileName).getMacros().get("foo"));
RankProfile rankProfileWithAddedMacro = new RankProfile(rankProfileName, search, rankProfileRegistry);
- rankProfileWithAddedMacro.addMacro("foo", RankingExpression.from("1+2"), true);
+ rankProfileWithAddedMacro.addMacro(new ExpressionFunction("foo", RankingExpression.from("1+2")), true);
rankProfileRegistry.add(rankProfileWithAddedMacro);
assertNotNull(rankProfileRegistry.get(search, rankProfileName).getMacros().get("foo"));
}
diff --git a/config-model/src/test/java/com/yahoo/searchdefinition/processing/RankingExpressionsTestCase.java b/config-model/src/test/java/com/yahoo/searchdefinition/processing/RankingExpressionsTestCase.java
index 0f8e6072d53..132807bf8b8 100644
--- a/config-model/src/test/java/com/yahoo/searchdefinition/processing/RankingExpressionsTestCase.java
+++ b/config-model/src/test/java/com/yahoo/searchdefinition/processing/RankingExpressionsTestCase.java
@@ -28,13 +28,13 @@ public class RankingExpressionsTestCase extends SearchDefinitionTestCase {
final RankProfile macrosRankProfile = rankProfileRegistry.get(search, "macros");
macrosRankProfile.parseExpressions();
final Map<String, RankProfile.Macro> macros = macrosRankProfile.getMacros();
- assertEquals(2, macros.get("titlematch$").getArguments().size());
- assertEquals("var1", macros.get("titlematch$").getArguments().get(0));
- assertEquals("var2", macros.get("titlematch$").getArguments().get(1));
+ assertEquals(2, macros.get("titlematch$").function().arguments().size());
+ assertEquals("var1", macros.get("titlematch$").function().arguments().get(0));
+ assertEquals("var2", macros.get("titlematch$").function().arguments().get(1));
assertEquals("var1 * var2 + 890", macros.get("titlematch$").function().getBody().getRoot().toString());
assertEquals("0.8+0.2*titlematch$(4,5)+0.8*titlematch$(7,8)*closeness(distance)", macrosRankProfile.getFirstPhaseRankingString().trim());
assertEquals("78 + closeness(distance)", macros.get("artistmatch").function().getBody().getRoot().toString());
- assertEquals(0, macros.get("artistmatch").getArguments().size());
+ assertEquals(0, macros.get("artistmatch").function().arguments().size());
List<Pair<String, String>> rankProperties = new RawRankProfile(macrosRankProfile,
new QueryProfileRegistry(),
diff --git a/searchlib/src/main/java/com/yahoo/searchlib/rankingexpression/ExpressionFunction.java b/searchlib/src/main/java/com/yahoo/searchlib/rankingexpression/ExpressionFunction.java
index 432fab00b2b..da34ab8822d 100755
--- a/searchlib/src/main/java/com/yahoo/searchlib/rankingexpression/ExpressionFunction.java
+++ b/searchlib/src/main/java/com/yahoo/searchlib/rankingexpression/ExpressionFunction.java
@@ -8,6 +8,7 @@ import com.yahoo.text.Utf8;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
+import java.util.Collections;
import java.util.Deque;
import java.util.HashMap;
import java.util.List;
@@ -26,6 +27,16 @@ public class ExpressionFunction {
private final RankingExpression body;
/**
+ * Constructs a new function with no arguments
+ *
+ * @param name the name of this function
+ * @param body the ranking expression that defines this function
+ */
+ public ExpressionFunction(String name, RankingExpression body) {
+ this(name, Collections.emptyList(), body);
+ }
+
+ /**
* Constructs a new function
*
* @param name the name of this function