aboutsummaryrefslogtreecommitdiffstats
path: root/indexinglanguage
diff options
context:
space:
mode:
authorJon Bratseth <bratseth@gmail.com>2021-04-30 11:40:49 +0200
committerJon Bratseth <bratseth@gmail.com>2021-04-30 11:40:49 +0200
commit1f592d7f705208cdb9b03066c02411dc5afc2649 (patch)
treedc9fee22a5ea41fba3170b62882bb9191416e334 /indexinglanguage
parent724ae768c90eefd08ffab79d6dafc520abeacc04 (diff)
Support to_bool
Diffstat (limited to 'indexinglanguage')
-rw-r--r--indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/Expression.java5
-rw-r--r--indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/ToBoolExpression.java59
-rw-r--r--indexinglanguage/src/main/javacc/IndexingParser.jj9
-rw-r--r--indexinglanguage/src/test/java/com/yahoo/vespa/indexinglanguage/ScriptTestCase.java3
-rw-r--r--indexinglanguage/src/test/java/com/yahoo/vespa/indexinglanguage/expressions/ToBoolTestCase.java76
-rw-r--r--indexinglanguage/src/test/java/com/yahoo/vespa/indexinglanguage/parser/ExpressionTestCase.java1
-rw-r--r--indexinglanguage/src/test/java/com/yahoo/vespa/indexinglanguage/parser/IdentifierTestCase.java1
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) {