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)
   }
 
   /**