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);
}