diff options
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.java | 21 |
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); |