aboutsummaryrefslogtreecommitdiffstats
path: root/searchlib
diff options
context:
space:
mode:
authorJon Bratseth <bratseth@gmail.com>2022-03-02 16:25:42 +0100
committerJon Bratseth <bratseth@gmail.com>2022-03-02 16:25:42 +0100
commit8e5e812b58aba7f7b0c08bdd916e7a9fe81d0b54 (patch)
tree2fcd51b6640d333d65a2202950020d738e1916fe /searchlib
parente0ee5c167e02906add23406a6e9fbf967dd4ae16 (diff)
'true' and 'false' literals in ranking expressions
Diffstat (limited to 'searchlib')
-rw-r--r--searchlib/abi-spec.json3
-rw-r--r--searchlib/src/main/java/com/yahoo/searchlib/rankingexpression/evaluation/BooleanValue.java2
-rwxr-xr-xsearchlib/src/main/java/com/yahoo/searchlib/rankingexpression/rule/ConstantNode.java3
-rwxr-xr-xsearchlib/src/main/javacc/RankingExpressionParser.jj21
-rw-r--r--searchlib/src/test/java/com/yahoo/searchlib/rankingexpression/evaluation/EvaluationTestCase.java4
5 files changed, 17 insertions, 16 deletions
diff --git a/searchlib/abi-spec.json b/searchlib/abi-spec.json
index ced2517ff9f..5a534562d32 100644
--- a/searchlib/abi-spec.json
+++ b/searchlib/abi-spec.json
@@ -943,7 +943,6 @@
"public final java.lang.String tag()",
"public final java.util.List tagCommaLeadingList()",
"public final com.yahoo.searchlib.rankingexpression.rule.ExpressionNode constantPrimitive(boolean)",
- "public final com.yahoo.searchlib.rankingexpression.evaluation.Value primitiveValue()",
"public final com.yahoo.searchlib.rankingexpression.rule.TensorFunctionNode tensorValueBody(com.yahoo.tensor.TensorType, java.util.List)",
"public final com.yahoo.tensor.functions.DynamicTensor mappedTensorValueBody(com.yahoo.tensor.TensorType)",
"public final com.yahoo.tensor.functions.DynamicTensor mixedTensorValueBody(com.yahoo.tensor.TensorType, java.util.List)",
@@ -1086,6 +1085,8 @@
"public static final int MIN",
"public static final int PROD",
"public static final int SUM",
+ "public static final int TRUE",
+ "public static final int FALSE",
"public static final int IDENTIFIER",
"public static final int SINGLE_LINE_COMMENT",
"public static final int DEFAULT",
diff --git a/searchlib/src/main/java/com/yahoo/searchlib/rankingexpression/evaluation/BooleanValue.java b/searchlib/src/main/java/com/yahoo/searchlib/rankingexpression/evaluation/BooleanValue.java
index 07710797ee2..eeeb26bc78f 100644
--- a/searchlib/src/main/java/com/yahoo/searchlib/rankingexpression/evaluation/BooleanValue.java
+++ b/searchlib/src/main/java/com/yahoo/searchlib/rankingexpression/evaluation/BooleanValue.java
@@ -16,7 +16,7 @@ public class BooleanValue extends DoubleCompatibleValue {
* Create a boolean value which is frozen at the outset.
*/
public static BooleanValue frozen(boolean value) {
- BooleanValue booleanValue=new BooleanValue(value);
+ BooleanValue booleanValue = new BooleanValue(value);
booleanValue.freeze();
return booleanValue;
}
diff --git a/searchlib/src/main/java/com/yahoo/searchlib/rankingexpression/rule/ConstantNode.java b/searchlib/src/main/java/com/yahoo/searchlib/rankingexpression/rule/ConstantNode.java
index 46e833197f9..2cfe20d8131 100755
--- a/searchlib/src/main/java/com/yahoo/searchlib/rankingexpression/rule/ConstantNode.java
+++ b/searchlib/src/main/java/com/yahoo/searchlib/rankingexpression/rule/ConstantNode.java
@@ -2,6 +2,7 @@
package com.yahoo.searchlib.rankingexpression.rule;
import com.yahoo.searchlib.rankingexpression.Reference;
+import com.yahoo.searchlib.rankingexpression.evaluation.BooleanValue;
import com.yahoo.searchlib.rankingexpression.evaluation.Context;
import com.yahoo.searchlib.rankingexpression.evaluation.Value;
import com.yahoo.tensor.TensorType;
@@ -39,6 +40,8 @@ public final class ConstantNode extends ExpressionNode {
@Override
public StringBuilder toString(StringBuilder string, SerializationContext context, Deque<String> path, CompositeNode parent) {
+ if (value instanceof BooleanValue) // Convert booleans to floats
+ return string.append(value.asBoolean() ? "1.0" : "0.0");
return string.append(value.toString());
}
diff --git a/searchlib/src/main/javacc/RankingExpressionParser.jj b/searchlib/src/main/javacc/RankingExpressionParser.jj
index 865820320d8..ebe1e048247 100755
--- a/searchlib/src/main/javacc/RankingExpressionParser.jj
+++ b/searchlib/src/main/javacc/RankingExpressionParser.jj
@@ -153,6 +153,8 @@ TOKEN :
<MIN: "min"> |
<PROD: "prod"> |
<SUM: "sum"> |
+ <TRUE: "true"> |
+ <FALSE: "false"> |
<IDENTIFIER: (["A"-"Z","a"-"z","0"-"9","_","@"](["A"-"Z","a"-"z","0"-"9","_","@","$"])*)>
}
@@ -797,7 +799,9 @@ String identifier() :
func = binaryFunctionName() { return func.toString(); } |
<IF> { return token.image; } |
<IN> { return token.image; } |
- <IDENTIFIER> { return token.image; }
+ <IDENTIFIER> { return token.image; } |
+ <TRUE> { return token.image; } |
+ <FALSE> { return token.image; }
}
List<String> identifierList() :
@@ -854,25 +858,14 @@ ExpressionNode constantPrimitive(boolean negate) :
( <INTEGER> { value = token.image; } |
<FLOAT> { value = token.image; }
) { node = new ConstantNode(Value.parse(negate ? ("-" + value) : value)); } |
- <STRING> {
- value = token.image;
- node = new ConstantNode(Value.parse(value));
+ ( <STRING> | <TRUE> | <FALSE> ) {
+ node = new ConstantNode(Value.parse(token.image));
if (negate) node = new NegativeNode(node);
}
)
{ return node; }
}
-Value primitiveValue() :
-{
- String sign = "";
-}
-{
- ( <SUB> { sign = "-";} ) ?
- ( <INTEGER> | <FLOAT> | <STRING> )
- { return Value.parse(sign + token.image); }
-}
-
TensorFunctionNode tensorValueBody(TensorType type, List dimensionOrder) :
{
DynamicTensor dynamicTensor;
diff --git a/searchlib/src/test/java/com/yahoo/searchlib/rankingexpression/evaluation/EvaluationTestCase.java b/searchlib/src/test/java/com/yahoo/searchlib/rankingexpression/evaluation/EvaluationTestCase.java
index efa98fba2eb..19e32c23234 100644
--- a/searchlib/src/test/java/com/yahoo/searchlib/rankingexpression/evaluation/EvaluationTestCase.java
+++ b/searchlib/src/test/java/com/yahoo/searchlib/rankingexpression/evaluation/EvaluationTestCase.java
@@ -133,6 +133,10 @@ public class EvaluationTestCase {
public void testBooleanEvaluation() {
EvaluationTester tester = new EvaluationTester();
+ // literals
+ tester.assertEvaluates(false, "false");
+ tester.assertEvaluates(true, "true");
+
// and
tester.assertEvaluates(false, "0 && 0");
tester.assertEvaluates(false, "0 && 1");