aboutsummaryrefslogtreecommitdiffstats
path: root/indexinglanguage
diff options
context:
space:
mode:
authorJon Bratseth <bratseth@gmail.com>2021-04-30 12:35:59 +0200
committerJon Bratseth <bratseth@gmail.com>2021-04-30 12:35:59 +0200
commit1966c12228034c63175adb30d89711b4cf98ca87 (patch)
tree31c7542a487b0a5d70952f5c586f596d59116fee /indexinglanguage
parent1f592d7f705208cdb9b03066c02411dc5afc2649 (diff)
Support literal 'true' and 'false'
Diffstat (limited to 'indexinglanguage')
-rw-r--r--indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/InputExpression.java2
-rw-r--r--indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/LiteralBoolExpression.java53
-rw-r--r--indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/NowExpression.java6
-rw-r--r--indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/SplitExpression.java1
-rw-r--r--indexinglanguage/src/main/javacc/IndexingParser.jj11
-rw-r--r--indexinglanguage/src/test/java/com/yahoo/vespa/indexinglanguage/ScriptTestCase.java11
-rw-r--r--indexinglanguage/src/test/java/com/yahoo/vespa/indexinglanguage/expressions/HostNameTestCase.java1
-rw-r--r--indexinglanguage/src/test/java/com/yahoo/vespa/indexinglanguage/expressions/LiteralBoolExpressionTestCase.java63
-rw-r--r--indexinglanguage/src/test/java/com/yahoo/vespa/indexinglanguage/parser/IdentifierTestCase.java2
9 files changed, 147 insertions, 3 deletions
diff --git a/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/InputExpression.java b/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/InputExpression.java
index f6196cfa158..d707a50fbd8 100644
--- a/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/InputExpression.java
+++ b/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/InputExpression.java
@@ -96,7 +96,7 @@ public final class InputExpression extends Expression {
public static class InputFieldNameExtractor implements ObjectOperation, ObjectPredicate {
- private List<String> inputFieldNames = new ArrayList<>(1);
+ private final List<String> inputFieldNames = new ArrayList<>(1);
public List<String> getInputFieldNames() { return inputFieldNames; }
diff --git a/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/LiteralBoolExpression.java b/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/LiteralBoolExpression.java
new file mode 100644
index 00000000000..a989f1a57d2
--- /dev/null
+++ b/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/LiteralBoolExpression.java
@@ -0,0 +1,53 @@
+// Copyright Verizon Media. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+package com.yahoo.vespa.indexinglanguage.expressions;
+
+import com.yahoo.document.DataType;
+import com.yahoo.document.datatypes.BoolFieldValue;
+
+/**
+ * 'true' or 'false
+ *
+ * @author bratseth
+ */
+public class LiteralBoolExpression extends Expression {
+
+ private final boolean value;
+
+ public LiteralBoolExpression(boolean value) {
+ super(null);
+ this.value = value;
+ }
+
+ @Override
+ protected void doExecute(ExecutionContext context) {
+ context.setValue(new BoolFieldValue(value));
+ }
+
+ @Override
+ protected void doVerify(VerificationContext context) {
+ context.setValue(createdOutputType());
+ }
+
+ @Override
+ public DataType createdOutputType() {
+ return DataType.BOOL;
+ }
+
+ @Override
+ public String toString() {
+ return String.valueOf(value);
+ }
+
+ @Override
+ public boolean equals(Object other) {
+ if (other == this) return true;
+ if ( ! (other instanceof LiteralBoolExpression)) return false;
+ return ((LiteralBoolExpression)other).value == this.value;
+ }
+
+ @Override
+ public int hashCode() {
+ return value ? 1 : 0;
+ }
+
+}
diff --git a/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/NowExpression.java b/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/NowExpression.java
index 6a155d30814..c8df0c0d667 100644
--- a/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/NowExpression.java
+++ b/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/NowExpression.java
@@ -61,9 +61,10 @@ public final class NowExpression extends Expression {
return getClass().hashCode() + timer.hashCode();
}
- public static interface Timer {
+ public interface Timer {
+
+ long currentTimeSeconds();
- public long currentTimeSeconds();
}
private static class SystemTimer implements Timer {
@@ -75,4 +76,5 @@ public final class NowExpression extends Expression {
return System.currentTimeMillis() / 1000;
}
}
+
}
diff --git a/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/SplitExpression.java b/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/SplitExpression.java
index 1ed862f4798..b436775b151 100644
--- a/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/SplitExpression.java
+++ b/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/SplitExpression.java
@@ -68,4 +68,5 @@ public final class SplitExpression extends Expression {
public int hashCode() {
return getClass().hashCode() + splitPattern.toString().hashCode();
}
+
}
diff --git a/indexinglanguage/src/main/javacc/IndexingParser.jj b/indexinglanguage/src/main/javacc/IndexingParser.jj
index d73d516de90..632a19a2c6c 100644
--- a/indexinglanguage/src/main/javacc/IndexingParser.jj
+++ b/indexinglanguage/src/main/javacc/IndexingParser.jj
@@ -194,6 +194,8 @@ TOKEN :
<TO_BOOL: "to_bool"> |
<TRIM: "trim"> |
<ZCURVE: "zcurve"> |
+ <TRUE: "true" > |
+ <FALSE: "false" > |
<IDENTIFIER: ["a"-"z","A"-"Z", "_"] (["a"-"z","A"-"Z","0"-"9","_","-"])*>
}
@@ -315,6 +317,7 @@ Expression value() :
val = toWsetExp() |
val = toBoolExp() |
val = trimExp() |
+ val = literalBoolExp() |
val = zcurveExp() |
( <LPAREN> val = statement() <RPAREN> { val = new ParenthesisExpression(val); } ) )
{ return val; }
@@ -698,6 +701,12 @@ Expression trimExp() : { }
{ return new TrimExpression(); }
}
+Expression literalBoolExp() : { }
+{
+ ( <TRUE> | <FALSE> )
+ { return new LiteralBoolExpression(Boolean.parseBoolean(token.image)); }
+}
+
Expression zcurveExp() : { }
{
( <ZCURVE> )
@@ -762,6 +771,8 @@ String identifier() :
<TO_BOOL> |
<TOKENIZE> |
<TRIM> |
+ <TRUE> |
+ <FALSE> |
<ZCURVE> ) { val = token.image; } )
{ return val; }
}
diff --git a/indexinglanguage/src/test/java/com/yahoo/vespa/indexinglanguage/ScriptTestCase.java b/indexinglanguage/src/test/java/com/yahoo/vespa/indexinglanguage/ScriptTestCase.java
index 49cbc08ae74..14a8f40c46c 100644
--- a/indexinglanguage/src/test/java/com/yahoo/vespa/indexinglanguage/ScriptTestCase.java
+++ b/indexinglanguage/src/test/java/com/yahoo/vespa/indexinglanguage/ScriptTestCase.java
@@ -79,4 +79,15 @@ public class ScriptTestCase {
assertEquals(new StringFieldValue("foo"), output.getFieldValue("out-1"));
}
+ @Test
+ public void testLiteralBoolean() throws ParseException {
+ Document input = new Document(type, "id:scheme:mytype::");
+ input.setFieldValue("in-1", new StringFieldValue("foo"));
+ var expression = Expression.fromString("if (input 'in-1' == \"foo\") { true | summary 'mybool' | attribute 'mybool' }");
+ System.out.println(expression);
+ Document output = Expression.execute(expression, input);
+ assertNotNull(output);
+ assertEquals(new BoolFieldValue(true), output.getFieldValue("mybool"));
+ }
+
}
diff --git a/indexinglanguage/src/test/java/com/yahoo/vespa/indexinglanguage/expressions/HostNameTestCase.java b/indexinglanguage/src/test/java/com/yahoo/vespa/indexinglanguage/expressions/HostNameTestCase.java
index 3d5792b5c1b..157d06106d0 100644
--- a/indexinglanguage/src/test/java/com/yahoo/vespa/indexinglanguage/expressions/HostNameTestCase.java
+++ b/indexinglanguage/src/test/java/com/yahoo/vespa/indexinglanguage/expressions/HostNameTestCase.java
@@ -43,4 +43,5 @@ public class HostNameTestCase {
assertEquals(HostNameExpression.normalizeHostName(getDefaults().vespaHostname()),
((StringFieldValue)val).getString());
}
+
}
diff --git a/indexinglanguage/src/test/java/com/yahoo/vespa/indexinglanguage/expressions/LiteralBoolExpressionTestCase.java b/indexinglanguage/src/test/java/com/yahoo/vespa/indexinglanguage/expressions/LiteralBoolExpressionTestCase.java
new file mode 100644
index 00000000000..1b3beaf10ee
--- /dev/null
+++ b/indexinglanguage/src/test/java/com/yahoo/vespa/indexinglanguage/expressions/LiteralBoolExpressionTestCase.java
@@ -0,0 +1,63 @@
+// Copyright Verizon Media. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+package com.yahoo.vespa.indexinglanguage.expressions;
+
+import com.yahoo.document.DataType;
+import com.yahoo.document.datatypes.BoolFieldValue;
+import com.yahoo.document.datatypes.FieldValue;
+import com.yahoo.vespa.indexinglanguage.SimpleTestAdapter;
+import org.junit.Test;
+
+import static com.yahoo.vespa.indexinglanguage.expressions.ExpressionAssert.assertVerify;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNotEquals;
+import static org.junit.Assert.assertTrue;
+
+/**
+ * @author bratseth
+ */
+public class LiteralBoolExpressionTestCase {
+
+ @Test
+ public void requireThatHashCodeAndEqualsAreImplemented() {
+ assertFalse(new LiteralBoolExpression(true).equals(new Object()));
+ assertEquals(new LiteralBoolExpression(true), new LiteralBoolExpression(true));
+ assertEquals(new LiteralBoolExpression(false), new LiteralBoolExpression(false));
+ assertNotEquals(new LiteralBoolExpression(true), new LiteralBoolExpression(false));
+ assertEquals(new LiteralBoolExpression(false).hashCode(), new LiteralBoolExpression(false).hashCode());
+ assertEquals(new LiteralBoolExpression(true).hashCode(), new LiteralBoolExpression(true).hashCode());
+ assertNotEquals(new LiteralBoolExpression(true).hashCode(), new LiteralBoolExpression(false).hashCode());
+ }
+
+ @Test
+ public void requireThatExpressionCanBeVerified() {
+ Expression exp = new LiteralBoolExpression(true);
+ assertVerify(DataType.INT, exp, DataType.BOOL);
+ assertVerify(DataType.STRING, exp, DataType.BOOL);
+ }
+
+ @Test
+ public void testToString() {
+ assertEquals("false", new LiteralBoolExpression(false).toString());
+ assertEquals("true", new LiteralBoolExpression(true).toString());
+ }
+
+ @Test
+ public void requireThatTrueBecomesTrue() {
+ ExecutionContext context = new ExecutionContext(new SimpleTestAdapter());
+ context.execute(new LiteralBoolExpression(true));
+ FieldValue value = context.getValue();
+ assertTrue(value instanceof BoolFieldValue);
+ assertTrue(((BoolFieldValue)value).getBoolean());
+ }
+
+ @Test
+ public void requireThatFalseBecomesFalse() {
+ ExecutionContext context = new ExecutionContext(new SimpleTestAdapter());
+ context.execute(new LiteralBoolExpression(false));
+ FieldValue value = context.getValue();
+ assertTrue(value instanceof BoolFieldValue);
+ assertFalse(((BoolFieldValue)value).getBoolean());
+ }
+
+}
diff --git a/indexinglanguage/src/test/java/com/yahoo/vespa/indexinglanguage/parser/IdentifierTestCase.java b/indexinglanguage/src/test/java/com/yahoo/vespa/indexinglanguage/parser/IdentifierTestCase.java
index f087f3f315c..1dc8c4a607c 100644
--- a/indexinglanguage/src/test/java/com/yahoo/vespa/indexinglanguage/parser/IdentifierTestCase.java
+++ b/indexinglanguage/src/test/java/com/yahoo/vespa/indexinglanguage/parser/IdentifierTestCase.java
@@ -65,6 +65,8 @@ public class IdentifierTestCase {
"to_wset",
"to_bool",
"trim",
+ "true",
+ "false",
"zcurve");
for (String str : tokens) {
IndexingParser parser = new IndexingParser(new IndexingInput(str));