diff options
author | Jon Bratseth <bratseth@gmail.com> | 2021-04-30 11:40:49 +0200 |
---|---|---|
committer | Jon Bratseth <bratseth@gmail.com> | 2021-04-30 11:40:49 +0200 |
commit | 1f592d7f705208cdb9b03066c02411dc5afc2649 (patch) | |
tree | dc9fee22a5ea41fba3170b62882bb9191416e334 | |
parent | 724ae768c90eefd08ffab79d6dafc520abeacc04 (diff) |
Support to_bool
7 files changed, 152 insertions, 2 deletions
diff --git a/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/Expression.java b/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/Expression.java index 50dd7611bb0..b23fe4d0ebd 100644 --- a/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/Expression.java +++ b/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/Expression.java @@ -177,7 +177,6 @@ public abstract class Expression extends Selectable { public abstract DataType createdOutputType(); /** Creates an expression with simple lingustics for testing */ - @SuppressWarnings("deprecation") public static Expression fromString(String expression) throws ParseException { return fromString(expression, new SimpleLinguistics()); } @@ -210,9 +209,11 @@ public abstract class Expression extends Selectable { public static Document execute(Expression expression, Document doc) { return expression.execute(new SimpleAdapterFactory(), doc); } - public static final DocumentUpdate execute(Expression expression, DocumentUpdate update) { + + public static DocumentUpdate execute(Expression expression, DocumentUpdate update) { return execute(expression, new SimpleAdapterFactory(), update); } + public final FieldValue execute() { return execute(new ExecutionContext()); } diff --git a/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/ToBoolExpression.java b/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/ToBoolExpression.java new file mode 100644 index 00000000000..d6d8ed54d26 --- /dev/null +++ b/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/ToBoolExpression.java @@ -0,0 +1,59 @@ +// 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.NumericDataType; +import com.yahoo.document.datatypes.BoolFieldValue; +import com.yahoo.document.datatypes.FieldValue; +import com.yahoo.document.datatypes.LongFieldValue; +import com.yahoo.document.datatypes.NumericFieldValue; +import com.yahoo.document.datatypes.StringFieldValue; + +/** + * @author bratseth + */ +public final class ToBoolExpression extends Expression { + + public ToBoolExpression() { + super(UnresolvedDataType.INSTANCE); + } + + @Override + protected void doExecute(ExecutionContext context) { + context.setValue(new BoolFieldValue(toBooleanValue(context.getValue()))); + } + + private boolean toBooleanValue(FieldValue value) { + if (value instanceof NumericFieldValue) + return ((NumericFieldValue)value).getNumber().intValue() != 0; + if (value instanceof StringFieldValue) + return ! ((StringFieldValue)value).getString().isEmpty(); + return false; + } + + @Override + protected void doVerify(VerificationContext context) { + context.setValue(createdOutputType()); + } + + @Override + public DataType createdOutputType() { + return DataType.BOOL; + } + + @Override + public String toString() { + return "to_bool"; + } + + @Override + public boolean equals(Object obj) { + return obj instanceof ToBoolExpression; + } + + @Override + public int hashCode() { + return getClass().hashCode(); + } + +} diff --git a/indexinglanguage/src/main/javacc/IndexingParser.jj b/indexinglanguage/src/main/javacc/IndexingParser.jj index 3afb52a8039..d73d516de90 100644 --- a/indexinglanguage/src/main/javacc/IndexingParser.jj +++ b/indexinglanguage/src/main/javacc/IndexingParser.jj @@ -191,6 +191,7 @@ TOKEN : <TO_POS: "to_pos"> | <TO_STRING: "to_string"> | <TO_WSET: "to_wset"> | + <TO_BOOL: "to_bool"> | <TRIM: "trim"> | <ZCURVE: "zcurve"> | <IDENTIFIER: ["a"-"z","A"-"Z", "_"] (["a"-"z","A"-"Z","0"-"9","_","-"])*> @@ -312,6 +313,7 @@ Expression value() : val = toPosExp() | val = toStringExp() | val = toWsetExp() | + val = toBoolExp() | val = trimExp() | val = zcurveExp() | ( <LPAREN> val = statement() <RPAREN> { val = new ParenthesisExpression(val); } ) ) @@ -684,6 +686,12 @@ Expression toWsetExp() : { return new ToWsetExpression(createIfNonExistent, removeIfZero); } } +Expression toBoolExp() : { } +{ + ( <TO_BOOL> ) + { return new ToBoolExpression(); } +} + Expression trimExp() : { } { ( <TRIM> ) @@ -751,6 +759,7 @@ String identifier() : <TO_POS> | <TO_STRING> | <TO_WSET> | + <TO_BOOL> | <TOKENIZE> | <TRIM> | <ZCURVE> ) { val = token.image; } ) 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 0edf0f645a7..49cbc08ae74 100644 --- a/indexinglanguage/src/test/java/com/yahoo/vespa/indexinglanguage/ScriptTestCase.java +++ b/indexinglanguage/src/test/java/com/yahoo/vespa/indexinglanguage/ScriptTestCase.java @@ -4,6 +4,7 @@ package com.yahoo.vespa.indexinglanguage; import com.yahoo.document.DataType; import com.yahoo.document.Document; import com.yahoo.document.DocumentType; +import com.yahoo.document.datatypes.BoolFieldValue; import com.yahoo.document.datatypes.StringFieldValue; import com.yahoo.vespa.indexinglanguage.expressions.*; import com.yahoo.vespa.indexinglanguage.parser.ParseException; @@ -24,6 +25,7 @@ public class ScriptTestCase { type.addField("in-2", DataType.STRING); type.addField("out-1", DataType.STRING); type.addField("out-2", DataType.STRING); + type.addField("mybool", DataType.BOOL); } @Test @@ -76,4 +78,5 @@ public class ScriptTestCase { assertNotNull(output); assertEquals(new StringFieldValue("foo"), output.getFieldValue("out-1")); } + } diff --git a/indexinglanguage/src/test/java/com/yahoo/vespa/indexinglanguage/expressions/ToBoolTestCase.java b/indexinglanguage/src/test/java/com/yahoo/vespa/indexinglanguage/expressions/ToBoolTestCase.java new file mode 100644 index 00000000000..5067f0c4c67 --- /dev/null +++ b/indexinglanguage/src/test/java/com/yahoo/vespa/indexinglanguage/expressions/ToBoolTestCase.java @@ -0,0 +1,76 @@ +// 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.document.datatypes.IntegerFieldValue; +import com.yahoo.document.datatypes.LongFieldValue; +import com.yahoo.document.datatypes.StringFieldValue; +import com.yahoo.vespa.indexinglanguage.SimpleTestAdapter; +import org.junit.Test; + +import static com.yahoo.vespa.indexinglanguage.expressions.ExpressionAssert.assertVerify; +import static com.yahoo.vespa.indexinglanguage.expressions.ExpressionAssert.assertVerifyThrows; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertTrue; + +/** + * @author bratseth + */ +public class ToBoolTestCase { + + @Test + public void requireThatHashCodeAndEqualsAreImplemented() { + Expression exp = new ToBoolExpression(); + assertFalse(exp.equals(new Object())); + assertEquals(exp, new ToBoolExpression()); + assertEquals(exp.hashCode(), new ToBoolExpression().hashCode()); + } + + @Test + public void requireThatExpressionCanBeVerified() { + Expression exp = new ToBoolExpression(); + assertVerify(DataType.INT, exp, DataType.BOOL); + assertVerify(DataType.STRING, exp, DataType.BOOL); + assertVerifyThrows(null, exp, "Expected any input, got null."); + } + + @Test + public void requireThatNonEmptyStringBecomesTrue() { + ExecutionContext context = new ExecutionContext(new SimpleTestAdapter()); + context.setValue(new StringFieldValue("false")).execute(new ToBoolExpression()); + FieldValue value = context.getValue(); + assertTrue(value instanceof BoolFieldValue); + assertTrue(((BoolFieldValue)value).getBoolean()); + } + + @Test + public void requireThatEmptyStringBecomesFalse() { + ExecutionContext context = new ExecutionContext(new SimpleTestAdapter()); + context.setValue(new StringFieldValue("")).execute(new ToBoolExpression()); + FieldValue value = context.getValue(); + assertTrue(value instanceof BoolFieldValue); + assertFalse(((BoolFieldValue)value).getBoolean()); + } + + @Test + public void requireThatNonZeroBecomesTrue() { + ExecutionContext context = new ExecutionContext(new SimpleTestAdapter()); + context.setValue(new IntegerFieldValue(37)).execute(new ToBoolExpression()); + FieldValue value = context.getValue(); + assertTrue(value instanceof BoolFieldValue); + assertTrue(((BoolFieldValue)value).getBoolean()); + } + + @Test + public void requireThatZeroBecomesFalse() { + ExecutionContext context = new ExecutionContext(new SimpleTestAdapter()); + context.setValue(new IntegerFieldValue(0)).execute(new ToBoolExpression()); + FieldValue value = context.getValue(); + assertTrue(value instanceof BoolFieldValue); + assertFalse(((BoolFieldValue)value).getBoolean()); + } + +} diff --git a/indexinglanguage/src/test/java/com/yahoo/vespa/indexinglanguage/parser/ExpressionTestCase.java b/indexinglanguage/src/test/java/com/yahoo/vespa/indexinglanguage/parser/ExpressionTestCase.java index 095842544a6..e9a0d0253e1 100644 --- a/indexinglanguage/src/test/java/com/yahoo/vespa/indexinglanguage/parser/ExpressionTestCase.java +++ b/indexinglanguage/src/test/java/com/yahoo/vespa/indexinglanguage/parser/ExpressionTestCase.java @@ -73,6 +73,7 @@ public class ExpressionTestCase { assertExpression(ToPositionExpression.class, "to_pos"); assertExpression(ToStringExpression.class, "to_string"); assertExpression(ToWsetExpression.class, "to_wset"); + assertExpression(ToBoolExpression.class, "to_bool"); assertExpression(ToWsetExpression.class, "to_wset create_if_non_existent"); assertExpression(ToWsetExpression.class, "to_wset remove_if_zero"); assertExpression(ToWsetExpression.class, "to_wset create_if_non_existent remove_if_zero"); 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 d7f1582fd50..f087f3f315c 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 @@ -63,6 +63,7 @@ public class IdentifierTestCase { "to_pos", "to_string", "to_wset", + "to_bool", "trim", "zcurve"); for (String str : tokens) { |