diff options
author | Lester Solbakken <lesters@oath.com> | 2021-01-12 16:23:48 +0100 |
---|---|---|
committer | Lester Solbakken <lesters@oath.com> | 2021-01-12 16:23:48 +0100 |
commit | 9ed2a987c41abb4177b99b9730dc552bfee40f21 (patch) | |
tree | c0ef0139bbf3bef13874e9f923f37bea53d1cea5 /searchlib | |
parent | f4252b2f8f9f4c8e970607155d32e742f7a8536c (diff) |
Allow expressions as arguments to functions
Diffstat (limited to 'searchlib')
-rwxr-xr-x | searchlib/src/main/java/com/yahoo/searchlib/rankingexpression/ExpressionFunction.java | 16 |
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. |