summaryrefslogtreecommitdiffstats
path: root/document
diff options
context:
space:
mode:
authorHenning Baldersheim <balder@yahoo-inc.com>2019-07-22 18:23:43 +0200
committerHenning Baldersheim <balder@yahoo-inc.com>2019-07-22 18:23:43 +0200
commit5101228f266e6cc327be9ef067c4954aa3205016 (patch)
tree7dab1faa5e86a9f5aeb0a6d0e464af961e361cfd /document
parent512c44b5d679c00cd5532b39f6ba368c241ebcd2 (diff)
Add test for failing short circuit of and.
Diffstat (limited to 'document')
-rw-r--r--document/src/main/java/com/yahoo/document/select/Context.java2
-rw-r--r--document/src/main/java/com/yahoo/document/select/rule/LogicNode.java3
-rw-r--r--document/src/test/java/com/yahoo/document/select/LogicalNodeTestCase.java67
3 files changed, 70 insertions, 2 deletions
diff --git a/document/src/main/java/com/yahoo/document/select/Context.java b/document/src/main/java/com/yahoo/document/select/Context.java
index ac2bb6b9f0d..a401621b585 100644
--- a/document/src/main/java/com/yahoo/document/select/Context.java
+++ b/document/src/main/java/com/yahoo/document/select/Context.java
@@ -29,6 +29,6 @@ public class Context {
this.variables = variables;
}
- private Map<String, Object> variables = new HashMap<String, Object>();
+ private Map<String, Object> variables = new HashMap<>();
}
diff --git a/document/src/main/java/com/yahoo/document/select/rule/LogicNode.java b/document/src/main/java/com/yahoo/document/select/rule/LogicNode.java
index 17f3106d2a4..308f84ff789 100644
--- a/document/src/main/java/com/yahoo/document/select/rule/LogicNode.java
+++ b/document/src/main/java/com/yahoo/document/select/rule/LogicNode.java
@@ -55,7 +55,7 @@ public class LogicNode implements ExpressionNode {
return this;
}
- // Inherit doc from ExpressionNode.
+ @Override
public BucketSet getBucketSet(BucketIdFactory factory) {
Stack<BucketItem> buf = new Stack<>();
for (NodeItem item : items) {
@@ -72,6 +72,7 @@ public class LogicNode implements ExpressionNode {
return buf.pop().buckets;
}
+ @Override
public OrderingSpecification getOrdering(int order) {
Stack<OrderingItem> buf = new Stack<>();
for (NodeItem item : items) {
diff --git a/document/src/test/java/com/yahoo/document/select/LogicalNodeTestCase.java b/document/src/test/java/com/yahoo/document/select/LogicalNodeTestCase.java
new file mode 100644
index 00000000000..fbf307667d8
--- /dev/null
+++ b/document/src/test/java/com/yahoo/document/select/LogicalNodeTestCase.java
@@ -0,0 +1,67 @@
+package com.yahoo.document.select;
+
+import com.yahoo.document.BucketIdFactory;
+import com.yahoo.document.select.rule.ExpressionNode;
+import com.yahoo.document.select.rule.LiteralNode;
+import com.yahoo.document.select.rule.LogicNode;
+import org.junit.Test;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+
+public class LogicalNodeTestCase {
+ private static class TracedNode implements ExpressionNode {
+
+ private final ExpressionNode node;
+ private boolean evaluated = false;
+
+ TracedNode(ExpressionNode node) {
+ this.node = node;
+ }
+ @Override
+ public Object evaluate(Context doc) {
+ evaluated = true;
+ return node.evaluate(doc);
+ }
+
+ @Override
+ public BucketSet getBucketSet(BucketIdFactory factory) {
+ return node.getBucketSet(factory);
+ }
+
+ @Override
+ public OrderingSpecification getOrdering(int order) {
+ return node.getOrdering(order);
+ }
+
+ @Override
+ public void accept(Visitor visitor) {
+ node.accept(visitor);
+ }
+ boolean isEvaluated() { return evaluated; }
+ }
+ private static Result evaluate(ExpressionNode node) {
+ return ((ResultList)node.evaluate(new Context(null))).toResult();
+ }
+ @Test
+ public void testFullyExhaustedAnd() {
+ TracedNode second = new TracedNode(new LiteralNode(true));
+ assertFalse(second.isEvaluated());
+ ExpressionNode logical = new LogicNode()
+ .add(null, new LiteralNode(true))
+ .add("and", second);
+ assertEquals(Result.TRUE, evaluate(logical));
+ assertTrue(second.isEvaluated());
+ }
+ @Test
+ public void testShortCircuitAnd() {
+ TracedNode second = new TracedNode(new LiteralNode(true));
+ assertFalse(second.isEvaluated());
+ ExpressionNode logical = new LogicNode()
+ .add(null, new LiteralNode(false))
+ .add("and", second);
+ assertEquals(Result.FALSE, evaluate(logical));
+ assertFalse(second.isEvaluated());
+ }
+}