This is an automated email from the ASF dual-hosted git repository.
alexey pushed a commit to branch branch-1.12.x
in repository https://gitbox.apache.org/repos/asf/kudu.git
The following commit(s) were added to refs/heads/branch-1.12.x by this push:
new e56374a [client] KUDU-3152 fix predicates on DATE column
e56374a is described below
commit e56374a2b0f12621482d540eef031b2864fc6095
Author: Greg Solovyev <[email protected]>
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 <[email protected]>
Reviewed-by: Alexey Serbin <[email protected]>
Reviewed-by: Grant Henke <[email protected]>
(cherry picked from commit 594cf2662a98192d099d271bd744019c659bd5a9)
Reviewed-on: http://gerrit.cloudera.org:8080/16109
---
.../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