summaryrefslogtreecommitdiffstats
path: root/document/src/main/java/com/yahoo/document/select/rule/ComparisonNode.java
diff options
context:
space:
mode:
Diffstat (limited to 'document/src/main/java/com/yahoo/document/select/rule/ComparisonNode.java')
-rw-r--r--document/src/main/java/com/yahoo/document/select/rule/ComparisonNode.java21
1 files changed, 19 insertions, 2 deletions
diff --git a/document/src/main/java/com/yahoo/document/select/rule/ComparisonNode.java b/document/src/main/java/com/yahoo/document/select/rule/ComparisonNode.java
index a13641adadf..372b61bb493 100644
--- a/document/src/main/java/com/yahoo/document/select/rule/ComparisonNode.java
+++ b/document/src/main/java/com/yahoo/document/select/rule/ComparisonNode.java
@@ -215,8 +215,8 @@ public class ComparisonNode implements ExpressionNode {
public Object evaluate(Context context) {
Object oLeft = lhs.evaluate(context);
Object oRight = rhs.evaluate(context);
- if (oLeft == null && oRight == null) {
- return new ResultList(Result.TRUE);
+ if (oLeft == null || oRight == null) {
+ return evaluateWithAtLeastOneNullSide(oLeft, oRight);
}
if (oLeft == Result.INVALID || oRight == Result.INVALID) {
return new ResultList(Result.INVALID);
@@ -237,6 +237,23 @@ public class ComparisonNode implements ExpressionNode {
return new ResultList(evaluateBool(oLeft, oRight));
}
+ /**
+ * Evaluates a binary comparison where one or both operands are null.
+ * Boolean outcomes are only defined for (in)equality relations, all others
+ * return Result.INVALID.
+ *
+ * Precondition: lhs AND/OR rhs is null.
+ */
+ private ResultList evaluateWithAtLeastOneNullSide(Object lhs, Object rhs) {
+ if (operator.equals("==") || operator.equals("=")) { // Glob (=) operator falls back to equality for non-strings
+ return ResultList.fromBoolean(lhs == rhs);
+ } else if (operator.equals("!=")) {
+ return ResultList.fromBoolean(lhs != rhs);
+ } else {
+ return new ResultList(Result.INVALID);
+ }
+ }
+
public ResultList evaluateListsTrue(AttributeNode.VariableValueList lhs, AttributeNode.VariableValueList rhs) {
if (lhs.size() != rhs.size()) {
return new ResultList(Result.FALSE);