rdblue commented on a change in pull request #357: Add in and not in predicates
URL: https://github.com/apache/incubator-iceberg/pull/357#discussion_r317373703
 
 

 ##########
 File path: api/src/test/java/org/apache/iceberg/expressions/TestEvaluator.java
 ##########
 @@ -362,4 +368,197 @@ 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 longEvaluator = new Evaluator(STRUCT,
+        in("x", Long.MAX_VALUE, Integer.MAX_VALUE, Long.MIN_VALUE));
+    Assert.assertTrue("Integer.MAX_VALUE in [Integer.MAX_VALUE] => true",
+        longEvaluator.eval(TestHelpers.Row.of(Integer.MAX_VALUE, 7.0, null)));
+    Assert.assertFalse("6 in [Integer.MAX_VALUE]  => false",
+        longEvaluator.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(7, 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]  => 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 literals() for EQ predicate",
+        IllegalArgumentException.class,
+        "EQ predicate cannot return a list of literals",
+        () -> equal("x", 5).literals());
 
 Review comment:
   I don't think this is necessary. This should return `ImmutableList.of(5)`.

----------------------------------------------------------------
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:
us...@infra.apache.org


With regards,
Apache Git Services

---------------------------------------------------------------------
To unsubscribe, e-mail: issues-unsubscr...@iceberg.apache.org
For additional commands, e-mail: issues-h...@iceberg.apache.org

Reply via email to