You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@kudu.apache.org by gr...@apache.org on 2020/06/24 22:11:13 UTC

[kudu] branch master updated: [client] KUDU-3152 fix predicates on DATE column

This is an automated email from the ASF dual-hosted git repository.

granthenke pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/kudu.git


The following commit(s) were added to refs/heads/master by this push:
     new 594cf26  [client] KUDU-3152 fix predicates on DATE column
594cf26 is described below

commit 594cf2662a98192d099d271bd744019c659bd5a9
Author: Greg Solovyev <gs...@cloudera.com>
AuthorDate: Mon Jun 22 15:35:25 2020 -0700

    [client] KUDU-3152 fix predicates on DATE column
    
    Add a missing 'if' statement to route calls
    to correct variant of newComparisonPredicate
    when value is Object.
    
    Add checks for min/max boundaries of integer
    representation of java.sql.Date to match
    MIN_DATE_VALUE and MAX_DATE_VALUE in DateUtil.
    
    Add Predicate tests for DATE column.
    
    Change-Id: I2759f1228852b78075bd5278f8f1efd19d0d029e
    Reviewed-on: http://gerrit.cloudera.org:8080/16101
    Tested-by: Alexey Serbin <as...@cloudera.com>
    Reviewed-by: Alexey Serbin <as...@cloudera.com>
    Reviewed-by: Grant Henke <gr...@apache.org>
---
 .../java/org/apache/kudu/client/KuduPredicate.java | 12 +++++
 .../org/apache/kudu/client/TestKuduPredicate.java  | 54 ++++++++++++++++++++--
 2 files changed, 63 insertions(+), 3 deletions(-)

diff --git a/java/kudu-client/src/main/java/org/apache/kudu/client/KuduPredicate.java b/java/kudu-client/src/main/java/org/apache/kudu/client/KuduPredicate.java
index 49abfe8..f8dae24 100644
--- a/java/kudu-client/src/main/java/org/apache/kudu/client/KuduPredicate.java
+++ b/java/kudu-client/src/main/java/org/apache/kudu/client/KuduPredicate.java
@@ -517,6 +517,7 @@ public class KuduPredicate {
    *  Type.VARCHAR -> java.lang.String
    *  Type.BINARY -> byte[]
    *  Type.DECIMAL -> java.math.BigDecimal
+   *  Type.DATE -> java.sql.Date
    *
    * @param column column the column schema
    * @param op the comparison operation
@@ -547,6 +548,8 @@ public class KuduPredicate {
       return newComparisonPredicate(column, op, (String) value);
     } else if (value instanceof byte[]) {
       return newComparisonPredicate(column, op, (byte[]) value);
+    } else if (value instanceof Date) {
+      return newComparisonPredicate(column, op, (Date) value);
     } else {
       throw new IllegalArgumentException(String.format("illegal type for %s predicate: %s",
               op, value.getClass().getName()));
@@ -627,6 +630,11 @@ public class KuduPredicate {
       for (T value : values) {
         vals.add((byte[]) value);
       }
+    } else if (t instanceof Date) {
+      checkColumn(column, Type.DATE);
+      for (T value : values) {
+        vals.add(Bytes.fromInt(DateUtil.sqlDateToEpochDays((Date) value)));
+      }
     } else {
       throw new IllegalArgumentException(String.format("illegal type for IN list values: %s",
                                                        t.getClass().getName()));
@@ -1119,6 +1127,8 @@ public class KuduPredicate {
       case UNIXTIME_MICROS:
       case INT64:
         return Long.MAX_VALUE;
+      case DATE:
+        return DateUtil.MAX_DATE_VALUE;
       default:
         throw new IllegalArgumentException("type must be an integer type");
     }
@@ -1141,6 +1151,8 @@ public class KuduPredicate {
       case UNIXTIME_MICROS:
       case INT64:
         return Long.MIN_VALUE;
+      case DATE:
+        return DateUtil.MIN_DATE_VALUE;
       default:
         throw new IllegalArgumentException("type must be an integer type");
     }
diff --git a/java/kudu-client/src/test/java/org/apache/kudu/client/TestKuduPredicate.java b/java/kudu-client/src/test/java/org/apache/kudu/client/TestKuduPredicate.java
index 14d436c..989c863 100644
--- a/java/kudu-client/src/test/java/org/apache/kudu/client/TestKuduPredicate.java
+++ b/java/kudu-client/src/test/java/org/apache/kudu/client/TestKuduPredicate.java
@@ -26,7 +26,9 @@ import static org.apache.kudu.client.KuduPredicate.ComparisonOp.LESS_EQUAL;
 import static org.apache.kudu.client.KuduPredicate.PredicateType.RANGE;
 
 import java.math.BigDecimal;
+import java.sql.Date;
 import java.util.Arrays;
+import java.util.List;
 
 import com.google.common.base.Preconditions;
 import com.google.common.collect.ImmutableList;
@@ -38,6 +40,7 @@ import org.apache.kudu.ColumnSchema;
 import org.apache.kudu.Type;
 import org.apache.kudu.test.junit.RetryRule;
 import org.apache.kudu.util.CharUtil;
+import org.apache.kudu.util.DateUtil;
 import org.apache.kudu.util.DecimalUtil;
 
 public class TestKuduPredicate {
@@ -90,6 +93,11 @@ public class TestKuduPredicate {
           .nullable(true)
           .build();
 
+  private static final ColumnSchema dateCol =
+          new ColumnSchema.ColumnSchemaBuilder("date", Type.DATE)
+                  .nullable(true)
+                  .build();
+
   @Rule
   public RetryRule retryRule = new RetryRule();
 
@@ -1011,6 +1019,14 @@ public class TestKuduPredicate {
     Assert.assertEquals(
         KuduPredicate.newComparisonPredicate(doubleCol, LESS_EQUAL, Double.POSITIVE_INFINITY),
         KuduPredicate.newIsNotNullPredicate(doubleCol));
+    Assert.assertEquals(KuduPredicate.newComparisonPredicate(dateCol, LESS_EQUAL,
+            Date.valueOf("2020-06-01")),
+            KuduPredicate.newComparisonPredicate(dateCol, LESS, Date.valueOf("2020-06-02")));
+    Assert.assertEquals(KuduPredicate.newComparisonPredicate(dateCol, LESS_EQUAL,
+            DateUtil.epochDaysToSqlDate(DateUtil.MAX_DATE_VALUE)),
+            KuduPredicate.newIsNotNullPredicate(dateCol));
+    Assert.assertEquals(KuduPredicate.newComparisonPredicate(dateCol, LESS_EQUAL,
+            DateUtil.MAX_DATE_VALUE), KuduPredicate.newIsNotNullPredicate(dateCol));
   }
 
   @Test
@@ -1063,6 +1079,9 @@ public class TestKuduPredicate {
     Assert.assertEquals(
         KuduPredicate.none(doubleCol),
         KuduPredicate.newComparisonPredicate(doubleCol, GREATER, Double.POSITIVE_INFINITY));
+    Assert.assertEquals(KuduPredicate.newComparisonPredicate(dateCol, GREATER_EQUAL,
+            Date.valueOf("2020-06-15")),
+            KuduPredicate.newComparisonPredicate(dateCol, GREATER, Date.valueOf("2020-06-14")));
   }
 
   @Test
@@ -1096,6 +1115,8 @@ public class TestKuduPredicate {
                         KuduPredicate.none(binaryCol));
     Assert.assertEquals(KuduPredicate.newComparisonPredicate(varcharCol, LESS, ""),
                         KuduPredicate.none(varcharCol));
+    Assert.assertEquals(KuduPredicate.newComparisonPredicate(dateCol, LESS,
+            DateUtil.epochDaysToSqlDate(DateUtil.MIN_DATE_VALUE)), KuduPredicate.none(dateCol));
   }
 
   @Test
@@ -1153,6 +1174,13 @@ public class TestKuduPredicate {
     Assert.assertEquals(
         KuduPredicate.newComparisonPredicate(doubleCol, GREATER_EQUAL, Double.POSITIVE_INFINITY),
         KuduPredicate.newComparisonPredicate(doubleCol, EQUAL, Double.POSITIVE_INFINITY));
+    Assert.assertEquals(
+            KuduPredicate.newComparisonPredicate(dateCol, GREATER_EQUAL,
+            DateUtil.epochDaysToSqlDate(DateUtil.MIN_DATE_VALUE)),
+            KuduPredicate.newIsNotNullPredicate(dateCol));
+    Assert.assertEquals(
+            KuduPredicate.newComparisonPredicate(dateCol, GREATER_EQUAL, DateUtil.MIN_DATE_VALUE),
+            KuduPredicate.newIsNotNullPredicate(dateCol));
   }
 
   @Test
@@ -1186,9 +1214,12 @@ public class TestKuduPredicate {
     Assert.assertEquals(
         KuduPredicate.newComparisonPredicate(binaryCol, EQUAL, (Object) new byte[] { (byte) 10 }),
         KuduPredicate.newComparisonPredicate(binaryCol, EQUAL, new byte[] { (byte) 10 }));
-    Assert.assertEquals(
-        KuduPredicate.newComparisonPredicate(varcharCol, EQUAL, (Object) "a"),
-        KuduPredicate.newComparisonPredicate(varcharCol, EQUAL, "a"));
+    Assert.assertEquals(KuduPredicate.newComparisonPredicate(varcharCol, EQUAL, (Object) "a"),
+            KuduPredicate.newComparisonPredicate(varcharCol, EQUAL, "a"));
+    Assert.assertEquals(KuduPredicate
+                    .newComparisonPredicate(dateCol, EQUAL, (Object) Date.valueOf("2020-06-15")),
+            KuduPredicate
+                    .newComparisonPredicate(dateCol, EQUAL, Date.valueOf("2020-06-15")));
   }
 
   @Test
@@ -1259,6 +1290,23 @@ public class TestKuduPredicate {
     Assert.assertEquals("`binary` IN (0x00, 0xAB01CD)", KuduPredicate.newInListPredicate(
         binaryCol, ImmutableList.of(new byte[] { (byte) 0xAB, (byte) 0x01, (byte) 0xCD },
                                     new byte[] { (byte) 0x00 })).toString());
+    Assert.assertEquals("`date` IS NULL", KuduPredicate.newIsNullPredicate(dateCol).toString());
+    Assert.assertEquals("`date` IS NOT NULL",
+            KuduPredicate.newIsNotNullPredicate(dateCol).toString());
+
+    Assert.assertEquals("`date` = 2020-06-16",
+            KuduPredicate.newComparisonPredicate(dateCol, EQUAL, Date.valueOf("2020-06-16"))
+                    .toString());
+    List<Integer> intDates = ImmutableList
+            .of(DateUtil.sqlDateToEpochDays(Date.valueOf("2020-06-16")),
+                    DateUtil.sqlDateToEpochDays(Date.valueOf("2019-01-01")),
+                    DateUtil.sqlDateToEpochDays(Date.valueOf("2020-11-10")));
+    List<Date> sqlDates = ImmutableList
+            .of(Date.valueOf("2020-06-16"), Date.valueOf("2019-01-01"), Date.valueOf("2020-11-10"));
+    Assert.assertEquals("`date` IN (2019-01-01, 2020-06-16, 2020-11-10)",
+            KuduPredicate.newInListPredicate(dateCol, intDates).toString());
+    Assert.assertEquals("`date` IN (2019-01-01, 2020-06-16, 2020-11-10)",
+            KuduPredicate.newInListPredicate(dateCol, sqlDates).toString());
   }
 
   @Test