summaryrefslogtreecommitdiffstats
path: root/document
diff options
context:
space:
mode:
authorTor Brede Vekterli <vekterli@yahooinc.com>2022-04-20 14:21:29 +0200
committerTor Brede Vekterli <vekterli@yahooinc.com>2022-04-20 14:21:29 +0200
commit7cec39e1925374594d5ebced63861403ea228d49 (patch)
tree96543ea038cdd5efb621f363094fe6ecc2d8513a /document
parent251464f041144bb6bb460e6a92e0de5cc13bfc1f (diff)
Implicitly convert boolean literal to number value when evaluating Java doc selection
Diffstat (limited to 'document')
-rw-r--r--document/src/main/java/com/yahoo/document/select/rule/ComparisonNode.java2
-rw-r--r--document/src/test/java/com/yahoo/document/select/DocumentSelectorTestCase.java25
2 files changed, 23 insertions, 4 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 cf7e3851d55..d6166f8fcbe 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
@@ -282,6 +282,8 @@ public class ComparisonNode implements ExpressionNode {
return getAsNumber(((NumericFieldValue)value).getNumber());
} else if (value instanceof BoolFieldValue) {
return ((BoolFieldValue)value).getBoolean() ? 1 : 0;
+ } else if (value instanceof Boolean) {
+ return (Boolean)value ? 1 : 0;
} else {
return Double.NaN; //new IllegalStateException("Term '" + value + "' (" + value.getClass() + ") does not evaluate to a number.");
}
diff --git a/document/src/test/java/com/yahoo/document/select/DocumentSelectorTestCase.java b/document/src/test/java/com/yahoo/document/select/DocumentSelectorTestCase.java
index bf8cf07a097..38fdadb18e4 100644
--- a/document/src/test/java/com/yahoo/document/select/DocumentSelectorTestCase.java
+++ b/document/src/test/java/com/yahoo/document/select/DocumentSelectorTestCase.java
@@ -507,6 +507,16 @@ public class DocumentSelectorTestCase {
assertEquals(Result.FALSE, evaluate("14.3 == null", documents.get(0)));
assertEquals(Result.FALSE, evaluate("null = 0", documents.get(0)));
+ // Boolean literals in comparisons
+ assertEquals(Result.TRUE, evaluate("true = true", documents.get(0)));
+ assertEquals(Result.TRUE, evaluate("true == true", documents.get(0)));
+ assertEquals(Result.FALSE, evaluate("true == false", documents.get(0)));
+ assertEquals(Result.TRUE, evaluate("false == false", documents.get(0)));
+ assertEquals(Result.TRUE, evaluate("true == 1", documents.get(0)));
+ assertEquals(Result.FALSE, evaluate("true == 0", documents.get(0)));
+ assertEquals(Result.FALSE, evaluate("false == 1", documents.get(0)));
+ assertEquals(Result.TRUE, evaluate("false == 0", documents.get(0)));
+
// Field values
assertEquals(Result.TRUE, evaluate("test.hint = 24", documents.get(0)));
assertEquals(Result.FALSE, evaluate("test.hint = 24", documents.get(1)));
@@ -748,12 +758,19 @@ public class DocumentSelectorTestCase {
@Test
public void boolean_fields_can_be_used_for_equality_comparisons() throws ParseException {
var documents = createDocs();
- assertEquals(Result.TRUE, evaluate("test.truth == 1", documents.get(8))); // has explicit field set to true
- assertEquals(Result.FALSE, evaluate("test.truth == 1", documents.get(9))); // has explicit field set to false
+ // Doc 8 has bool field set explicitly to true, doc 9 has field explicitly set to false
+ assertEquals(Result.TRUE, evaluate("test.truth == 1", documents.get(8)));
+ assertEquals(Result.TRUE, evaluate("test.truth == true", documents.get(8)));
+ assertEquals(Result.FALSE, evaluate("test.truth == 1", documents.get(9)));
+ assertEquals(Result.FALSE, evaluate("test.truth == true", documents.get(9)));
assertEquals(Result.TRUE, evaluate("test.truth == 0", documents.get(9)));
+ assertEquals(Result.TRUE, evaluate("test.truth == false", documents.get(9)));
// FIXME very un-intuitive behavior when nulls are implicitly returned:
- assertEquals(Result.FALSE, evaluate("test.truth == 1", documents.get(0))); // Does not have field set in document
- assertEquals(Result.FALSE, evaluate("test.truth == 0", documents.get(0))); // Does not have field set in document
+ // Doc 1 does not have the bool field set, but the implicit null value is neither true nor false
+ assertEquals(Result.FALSE, evaluate("test.truth == 1", documents.get(0)));
+ assertEquals(Result.FALSE, evaluate("test.truth == true", documents.get(0)));
+ assertEquals(Result.FALSE, evaluate("test.truth == 0", documents.get(0)));
+ assertEquals(Result.FALSE, evaluate("test.truth == false", documents.get(0)));
}
@Test