jun-he commented on a change in pull request #357: Add in and not in predicates
URL: https://github.com/apache/incubator-iceberg/pull/357#discussion_r340447454
##########
File path: api/src/test/java/org/apache/iceberg/expressions/TestEvaluator.java
##########
@@ -362,4 +372,198 @@ public void testCharSeqValue() {
Assert.assertFalse("string(abc) == utf8(abcd) => false",
evaluator.eval(TestHelpers.Row.of(new Utf8("abcd"))));
}
+
+ @Test
+ public void testIn() {
+ Assert.assertEquals(3, in("s", 7, 8, 9).literals().size());
+ Assert.assertEquals(3, in("s", 7, 8.1, Long.MAX_VALUE).literals().size());
+ Assert.assertEquals(2, in("s", "abc", "abd", "abc").literals().size());
+ Assert.assertEquals(0, in("s").literals().size());
+ Assert.assertEquals(1, in("s", 5).literals().size());
+ Assert.assertEquals(1, in("s", 5, 5).literals().size());
+ Assert.assertEquals(1, in("s", Arrays.asList(5, 5)).literals().size());
+ Assert.assertEquals(0, in("s", Collections.emptyList()).literals().size());
+
+ Evaluator evaluator = new Evaluator(STRUCT, in("x", 7, 8, Long.MAX_VALUE));
+ Assert.assertTrue("7 in [7, 8] => true",
evaluator.eval(TestHelpers.Row.of(7, 8, null)));
+ Assert.assertFalse("9 in [7, 8] => false",
evaluator.eval(TestHelpers.Row.of(9, 8, null)));
+
+ Evaluator intSetEvaluator = new Evaluator(STRUCT,
+ in("x", Long.MAX_VALUE, Integer.MAX_VALUE, Long.MIN_VALUE));
+ Assert.assertTrue("Integer.MAX_VALUE in [Integer.MAX_VALUE] => true",
+ intSetEvaluator.eval(TestHelpers.Row.of(Integer.MAX_VALUE, 7.0,
null)));
+ Assert.assertFalse("6 in [Integer.MAX_VALUE] => false",
+ intSetEvaluator.eval(TestHelpers.Row.of(6, 6.8, null)));
+
+ Evaluator integerEvaluator = new Evaluator(STRUCT, in("y", 7, 8, 9.1));
+ Assert.assertTrue("7.0 in [7, 8, 9.1] => true",
+ integerEvaluator.eval(TestHelpers.Row.of(0, 7.0, null)));
+ Assert.assertTrue("9.1 in [7, 8, 9.1] => true",
+ integerEvaluator.eval(TestHelpers.Row.of(7, 9.1, null)));
+ Assert.assertFalse("6.8 in [7, 8, 9.1] => false",
+ integerEvaluator.eval(TestHelpers.Row.of(6, 6.8, null)));
+
+ Evaluator structEvaluator = new Evaluator(STRUCT, in("s1.s2.s3.s4.i", 7,
8, 9));
+ Assert.assertTrue("7 in [7, 8, 9] => true",
+ structEvaluator.eval(TestHelpers.Row.of(7, 8, null,
+ TestHelpers.Row.of(
+ TestHelpers.Row.of(
+ TestHelpers.Row.of(
+ TestHelpers.Row.of(7)))))));
+ Assert.assertFalse("6 in [7, 8, 9] => false",
+ structEvaluator.eval(TestHelpers.Row.of(6, 8, null,
+ TestHelpers.Row.of(
+ TestHelpers.Row.of(
+ TestHelpers.Row.of(
+ TestHelpers.Row.of(6)))))));
+
+ StructType charSeqStruct = StructType.of(required(34, "s",
Types.StringType.get()));
+ Evaluator charSeqEvaluator = new Evaluator(charSeqStruct, in("s", "abc",
"abd", "abc"));
+ Assert.assertTrue("utf8(abc) in [string(abc), string(abd)] => true",
+ charSeqEvaluator.eval(TestHelpers.Row.of(new Utf8("abc"))));
+ Assert.assertFalse("utf8(abcd) in [string(abc), string(abd)] => false",
+ charSeqEvaluator.eval(TestHelpers.Row.of(new Utf8("abcd"))));
+ }
+
+ @Test
+ public void testInExceptions() {
+ TestHelpers.assertThrows(
+ "Throw exception if value is null",
+ NullPointerException.class,
+ "Cannot create expression literal from null",
+ () -> in("x", (Literal) null));
+
+ TestHelpers.assertThrows(
+ "Throw exception if value is null",
+ NullPointerException.class,
+ "Values cannot be null for IN predicate",
+ () -> in("x", (Collection<?>) null));
+
+ TestHelpers.assertThrows(
+ "Throw exception if calling literal() for IN predicate",
+ IllegalArgumentException.class,
+ "IN predicate cannot return a literal",
+ () -> in("x", 5, 6).literal());
+
+ TestHelpers.assertThrows(
+ "Throw exception if any value in the input is null",
+ NullPointerException.class,
+ "Cannot create expression literal from null",
+ () -> in("x", 1, 2, null));
Review comment:
Currently, `null` has to be handled separately using `isNull`.
If `null` support is needed, we might handle it by replacing it with a
special `NULL` value (e.g. enum `NULL`).
----------------------------------------------------------------
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
For queries about this service, please contact Infrastructure at:
[email protected]
With regards,
Apache Git Services
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]