diff options
author | Jon Bratseth <bratseth@gmail.com> | 2021-04-30 12:35:59 +0200 |
---|---|---|
committer | Jon Bratseth <bratseth@gmail.com> | 2021-04-30 12:35:59 +0200 |
commit | 1966c12228034c63175adb30d89711b4cf98ca87 (patch) | |
tree | 31c7542a487b0a5d70952f5c586f596d59116fee | |
parent | 1f592d7f705208cdb9b03066c02411dc5afc2649 (diff) |
Support literal 'true' and 'false'
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)); |