You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@iceberg.apache.org by bl...@apache.org on 2019/08/22 18:40:19 UTC

[incubator-iceberg] branch master updated: Handle null values in transforms (#378)

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

blue pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/incubator-iceberg.git


The following commit(s) were added to refs/heads/master by this push:
     new e1562f5  Handle null values in transforms (#378)
e1562f5 is described below

commit e1562f5e594bf82ce7c9514703a9f65bcef97d3d
Author: Ryan Blue <rd...@users.noreply.github.com>
AuthorDate: Thu Aug 22 11:40:14 2019 -0700

    Handle null values in transforms (#378)
---
 .../java/org/apache/iceberg/transforms/Bucket.java  |  3 +++
 .../java/org/apache/iceberg/transforms/Dates.java   |  5 +++++
 .../org/apache/iceberg/transforms/Timestamps.java   |  8 ++++++--
 .../org/apache/iceberg/transforms/Truncate.java     | 21 +++++++++++++++++++++
 4 files changed, 35 insertions(+), 2 deletions(-)

diff --git a/api/src/main/java/org/apache/iceberg/transforms/Bucket.java b/api/src/main/java/org/apache/iceberg/transforms/Bucket.java
index d088119..bc43537 100644
--- a/api/src/main/java/org/apache/iceberg/transforms/Bucket.java
+++ b/api/src/main/java/org/apache/iceberg/transforms/Bucket.java
@@ -79,6 +79,9 @@ abstract class Bucket<T> implements Transform<T, Integer> {
 
   @Override
   public Integer apply(T value) {
+    if (value == null) {
+      return null;
+    }
     return (hash(value) & Integer.MAX_VALUE) % numBuckets;
   }
 
diff --git a/api/src/main/java/org/apache/iceberg/transforms/Dates.java b/api/src/main/java/org/apache/iceberg/transforms/Dates.java
index 94714d2..f651795 100644
--- a/api/src/main/java/org/apache/iceberg/transforms/Dates.java
+++ b/api/src/main/java/org/apache/iceberg/transforms/Dates.java
@@ -48,9 +48,14 @@ enum Dates implements Transform<Integer, Integer> {
 
   @Override
   public Integer apply(Integer days) {
+    if (days == null) {
+      return null;
+    }
+
     if (granularity == ChronoUnit.DAYS) {
       return days;
     }
+
     return (int) granularity.between(EPOCH, EPOCH.plusDays(days));
   }
 
diff --git a/api/src/main/java/org/apache/iceberg/transforms/Timestamps.java b/api/src/main/java/org/apache/iceberg/transforms/Timestamps.java
index 7259def..b6d8253 100644
--- a/api/src/main/java/org/apache/iceberg/transforms/Timestamps.java
+++ b/api/src/main/java/org/apache/iceberg/transforms/Timestamps.java
@@ -49,12 +49,16 @@ enum Timestamps implements Transform<Long, Integer> {
 
   @Override
   public Integer apply(Long timestampMicros) {
+    if (timestampMicros == null) {
+      return null;
+    }
+
     // discards fractional seconds, not needed for calculation
     OffsetDateTime timestamp = Instant
         .ofEpochSecond(timestampMicros / 1_000_000)
         .atOffset(ZoneOffset.UTC);
-    Integer year = Long.valueOf(granularity.between(EPOCH, timestamp)).intValue();
-    return year;
+
+    return (int) granularity.between(EPOCH, timestamp);
   }
 
   @Override
diff --git a/api/src/main/java/org/apache/iceberg/transforms/Truncate.java b/api/src/main/java/org/apache/iceberg/transforms/Truncate.java
index 148f205..140fa5b 100644
--- a/api/src/main/java/org/apache/iceberg/transforms/Truncate.java
+++ b/api/src/main/java/org/apache/iceberg/transforms/Truncate.java
@@ -76,6 +76,10 @@ abstract class Truncate<T> implements Transform<T, T> {
 
     @Override
     public Integer apply(Integer value) {
+      if (value == null) {
+        return null;
+      }
+
       return value - (((value % width) + width) % width);
     }
 
@@ -141,6 +145,10 @@ abstract class Truncate<T> implements Transform<T, T> {
 
     @Override
     public Long apply(Long value) {
+      if (value == null) {
+        return null;
+      }
+
       return value - (((value % width) + width) % width);
     }
 
@@ -203,6 +211,10 @@ abstract class Truncate<T> implements Transform<T, T> {
 
     @Override
     public CharSequence apply(CharSequence value) {
+      if (value == null) {
+        return null;
+      }
+
       return UnicodeUtil.truncateString(value, length);
     }
 
@@ -282,6 +294,10 @@ abstract class Truncate<T> implements Transform<T, T> {
 
     @Override
     public ByteBuffer apply(ByteBuffer value) {
+      if (value == null) {
+        return null;
+      }
+
       ByteBuffer ret = value.duplicate();
       ret.limit(Math.min(value.limit(), value.position() + length));
       return ret;
@@ -353,12 +369,17 @@ abstract class Truncate<T> implements Transform<T, T> {
 
     @Override
     public BigDecimal apply(BigDecimal value) {
+      if (value == null) {
+        return null;
+      }
+
       BigDecimal remainder = new BigDecimal(
           value.unscaledValue()
               .remainder(unscaledWidth)
               .add(unscaledWidth)
               .remainder(unscaledWidth),
           value.scale());
+
       return value.subtract(remainder);
     }