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