aboutsummaryrefslogtreecommitdiffstats
path: root/searchlib
diff options
context:
space:
mode:
authorLester Solbakken <lesters@oath.com>2021-01-12 16:23:48 +0100
committerLester Solbakken <lesters@oath.com>2021-01-12 16:23:48 +0100
commit9ed2a987c41abb4177b99b9730dc552bfee40f21 (patch)
treec0ef0139bbf3bef13874e9f923f37bea53d1cea5 /searchlib
parentf4252b2f8f9f4c8e970607155d32e742f7a8536c (diff)
Allow expressions as arguments to functions
Diffstat (limited to 'searchlib')
-rwxr-xr-xsearchlib/src/main/java/com/yahoo/searchlib/rankingexpression/ExpressionFunction.java16
1 files changed, 13 insertions, 3 deletions
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 b97c8316c9b..3974ca7ed0d 100755
--- a/searchlib/src/main/java/com/yahoo/searchlib/rankingexpression/ExpressionFunction.java
+++ b/searchlib/src/main/java/com/yahoo/searchlib/rankingexpression/ExpressionFunction.java
@@ -6,6 +6,8 @@ import com.google.common.collect.ImmutableMap;
import com.yahoo.searchlib.rankingexpression.rule.ConstantNode;
import com.yahoo.searchlib.rankingexpression.rule.ExpressionNode;
import com.yahoo.searchlib.rankingexpression.rule.FunctionNode;
+import com.yahoo.searchlib.rankingexpression.rule.NameNode;
+import com.yahoo.searchlib.rankingexpression.rule.NegativeNode;
import com.yahoo.searchlib.rankingexpression.rule.ReferenceNode;
import com.yahoo.searchlib.rankingexpression.rule.SerializationContext;
import com.yahoo.tensor.TensorType;
@@ -138,10 +140,10 @@ public class ExpressionFunction {
ExpressionNode expr = argumentValues.get(i);
String binding = expr.toString(new StringBuilder(), context, path, null).toString();
- if ( ! (expr instanceof ReferenceNode) && ! (expr instanceof ConstantNode) && ! (expr instanceof FunctionNode) ) {
+ if (shouldGenerateFeature(expr)) {
String funcName = "autogenerated_ranking_feature@" + Long.toHexString(symbolCode(key + "=" + binding));
context.addFunctionSerialization(RankingExpression.propertyName(funcName), binding);
- binding = funcName;
+ binding = "rankingExpression(" + funcName + ")";
}
argumentBindings.put(key, binding);
}
@@ -151,6 +153,15 @@ public class ExpressionFunction {
return new Instance(symbol, expressionString);
}
+ private boolean shouldGenerateFeature(ExpressionNode expr) {
+ if (expr instanceof ConstantNode) return false;
+ if (expr instanceof ReferenceNode) return false;
+ if (expr instanceof NameNode) return false;
+ if (expr instanceof FunctionNode) return false;
+ if (expr instanceof NegativeNode && ((NegativeNode) expr).getValue() instanceof ConstantNode) return false;
+ return true;
+ }
+
/**
* Returns a symbolic string that represents this function with a given
* list of arguments. The arguments are mangled by hashing the string
@@ -173,7 +184,6 @@ public class ExpressionFunction {
return ret.toString();
}
-
/**
* Returns a more unique hash code than what Java's own {@link
* String#hashCode()} method would produce.