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 2019/06/06 18:01:35 UTC
[kudu] 02/03: [java] Add newComparisonPredicate Object API
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
commit 6a14790405e8f550fbbd050ad2b61d7e11ae5024
Author: Grant Henke <gr...@apache.org>
AuthorDate: Wed Jun 5 21:38:23 2019 -0500
[java] Add newComparisonPredicate Object API
Adds a `newComparisonPredicate` API that takes an
Object in order to support creating comparison
predicates for Java objects generically.
Change-Id: If05b2d9f61990b86d92af4b89e21704d5188192e
Reviewed-on: http://gerrit.cloudera.org:8080/13527
Tested-by: Kudu Jenkins
Reviewed-by: Adar Dembo <ad...@cloudera.com>
---
.../java/org/apache/kudu/client/KuduPredicate.java | 55 ++++++++++++++++++++++
.../org/apache/kudu/client/TestKuduPredicate.java | 33 +++++++++++++
.../org/apache/kudu/spark/kudu/DefaultSource.scala | 28 +----------
3 files changed, 89 insertions(+), 27 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 762ad08..dc37706 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
@@ -22,6 +22,7 @@ import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.math.BigInteger;
import java.math.BigDecimal;
+import java.nio.ByteBuffer;
import java.sql.Timestamp;
import java.util.ArrayList;
import java.util.Arrays;
@@ -480,6 +481,60 @@ public class KuduPredicate {
}
/**
+ * Creates a new comparison predicate on a column.
+ *
+ * This method is useful when you don't care about autoboxing
+ * and your existing type handling logic is based on Java types.
+ *
+ * The accepted Object type is based on the column's {@link Type}:
+ * Type.BOOL -> java.lang.Boolean
+ * Type.INT8 -> java.lang.Byte
+ * Type.INT16 -> java.lang.Short
+ * Type.INT32 -> java.lang.Integer
+ * Type.INT64 -> java.lang.Long
+ * Type.UNIXTIME_MICROS -> java.sql.Timestamp or java.lang.Long
+ * Type.FLOAT -> java.lang.Float
+ * Type.DOUBLE -> java.lang.Double
+ * Type.STRING -> java.lang.String
+ * Type.BINARY -> byte[]
+ * Type.DECIMAL -> java.math.BigDecimal
+ *
+ * @param column column the column schema
+ * @param op the comparison operation
+ * @param value the value to compare against
+ */
+ public static KuduPredicate newComparisonPredicate(ColumnSchema column,
+ ComparisonOp op,
+ Object value) {
+ if (value instanceof Boolean) {
+ return newComparisonPredicate(column, op, (boolean) value);
+ } else if (value instanceof Byte) {
+ return newComparisonPredicate(column, op, (byte) value);
+ } else if (value instanceof Short) {
+ return newComparisonPredicate(column, op, (short) value);
+ } else if (value instanceof Integer) {
+ return newComparisonPredicate(column, op, (int) value);
+ } else if (value instanceof Long) {
+ return newComparisonPredicate(column, op, (long) value);
+ } else if (value instanceof Timestamp) {
+ return newComparisonPredicate(column, op, (Timestamp) value);
+ } else if (value instanceof Float) {
+ return newComparisonPredicate(column, op, (float) value);
+ } else if (value instanceof Double) {
+ return newComparisonPredicate(column, op, (double) value);
+ } else if (value instanceof BigDecimal) {
+ return newComparisonPredicate(column, op, (BigDecimal) value);
+ } else if (value instanceof String) {
+ return newComparisonPredicate(column, op, (String) value);
+ } else if (value instanceof byte[]) {
+ return newComparisonPredicate(column, op, (byte[]) value);
+ } else {
+ throw new IllegalArgumentException(String.format("illegal type for %s predicate: %s",
+ op, value.getClass().getName()));
+ }
+ }
+
+ /**
* Creates a new IN list predicate.
*
* The list must contain values of the correct type for the column.
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 9dcb7bc..7aec32e 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
@@ -1096,6 +1096,39 @@ public class TestKuduPredicate {
}
@Test
+ public void testCreateWithObject() {
+ Assert.assertEquals(
+ KuduPredicate.newComparisonPredicate(byteCol, EQUAL, (Object) (byte) 10),
+ KuduPredicate.newComparisonPredicate(byteCol, EQUAL, (byte) 10));
+ Assert.assertEquals(
+ KuduPredicate.newComparisonPredicate(shortCol, EQUAL, (Object) (short) 10),
+ KuduPredicate.newComparisonPredicate(shortCol, EQUAL, 10));
+ Assert.assertEquals(
+ KuduPredicate.newComparisonPredicate(intCol, EQUAL, (Object) 10),
+ KuduPredicate.newComparisonPredicate(intCol, EQUAL, 10));
+ Assert.assertEquals(
+ KuduPredicate.newComparisonPredicate(longCol, EQUAL, (Object) 10L),
+ KuduPredicate.newComparisonPredicate(longCol, EQUAL, 10L));
+ Assert.assertEquals(
+ KuduPredicate.newComparisonPredicate(floatCol, EQUAL, (Object) 12.345f),
+ KuduPredicate.newComparisonPredicate(floatCol, EQUAL, 12.345f));
+ Assert.assertEquals(
+ KuduPredicate.newComparisonPredicate(doubleCol, EQUAL, (Object) 12.345),
+ KuduPredicate.newComparisonPredicate(doubleCol, EQUAL, 12.345));
+ Assert.assertEquals(
+ KuduPredicate.newComparisonPredicate(decimal32Col, EQUAL,
+ (Object) BigDecimal.valueOf(12345,2)),
+ KuduPredicate.newComparisonPredicate(decimal32Col, EQUAL,
+ BigDecimal.valueOf(12345,2)));
+ Assert.assertEquals(
+ KuduPredicate.newComparisonPredicate(stringCol, EQUAL, (Object) "a"),
+ KuduPredicate.newComparisonPredicate(stringCol, EQUAL, "a"));
+ Assert.assertEquals(
+ KuduPredicate.newComparisonPredicate(binaryCol, EQUAL, (Object) new byte[] { (byte) 10 }),
+ KuduPredicate.newComparisonPredicate(binaryCol, EQUAL, new byte[] { (byte) 10 }));
+ }
+
+ @Test
public void testToString() {
Assert.assertEquals("`bool` = true",
KuduPredicate.newComparisonPredicate(boolCol, EQUAL, true).toString());
diff --git a/java/kudu-spark/src/main/scala/org/apache/kudu/spark/kudu/DefaultSource.scala b/java/kudu-spark/src/main/scala/org/apache/kudu/spark/kudu/DefaultSource.scala
index 4a7470f..fcbafc2 100644
--- a/java/kudu-spark/src/main/scala/org/apache/kudu/spark/kudu/DefaultSource.scala
+++ b/java/kudu-spark/src/main/scala/org/apache/kudu/spark/kudu/DefaultSource.scala
@@ -17,9 +17,7 @@
package org.apache.kudu.spark.kudu
-import java.math.BigDecimal
import java.net.InetAddress
-import java.sql.Timestamp
import scala.collection.JavaConverters._
import scala.util.Try
@@ -357,31 +355,7 @@ class KuduRelation(
column: String,
operator: ComparisonOp,
value: Any): KuduPredicate = {
- val columnSchema = table.getSchema.getColumn(column)
- value match {
- case value: Boolean =>
- KuduPredicate.newComparisonPredicate(columnSchema, operator, value)
- case value: Byte =>
- KuduPredicate.newComparisonPredicate(columnSchema, operator, value)
- case value: Short =>
- KuduPredicate.newComparisonPredicate(columnSchema, operator, value)
- case value: Int =>
- KuduPredicate.newComparisonPredicate(columnSchema, operator, value)
- case value: Long =>
- KuduPredicate.newComparisonPredicate(columnSchema, operator, value)
- case value: Timestamp =>
- KuduPredicate.newComparisonPredicate(columnSchema, operator, value)
- case value: Float =>
- KuduPredicate.newComparisonPredicate(columnSchema, operator, value)
- case value: Double =>
- KuduPredicate.newComparisonPredicate(columnSchema, operator, value)
- case value: String =>
- KuduPredicate.newComparisonPredicate(columnSchema, operator, value)
- case value: Array[Byte] =>
- KuduPredicate.newComparisonPredicate(columnSchema, operator, value)
- case value: BigDecimal =>
- KuduPredicate.newComparisonPredicate(columnSchema, operator, value)
- }
+ KuduPredicate.newComparisonPredicate(table.getSchema.getColumn(column), operator, value)
}
/**