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 94714d2e7069..573319e09579 100644 --- a/api/src/main/java/org/apache/iceberg/transforms/Dates.java +++ b/api/src/main/java/org/apache/iceberg/transforms/Dates.java @@ -61,6 +61,9 @@ public boolean canTransform(Type type) { @Override public Type getResultType(Type sourceType) { + if (granularity == ChronoUnit.DAYS) { + return Types.DateType.get(); + } return Types.IntegerType.get(); } 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 7259defd85f3..d8e08b721aae 100644 --- a/api/src/main/java/org/apache/iceberg/transforms/Timestamps.java +++ b/api/src/main/java/org/apache/iceberg/transforms/Timestamps.java @@ -64,6 +64,9 @@ public boolean canTransform(Type type) { @Override public Type getResultType(Type sourceType) { + if (granularity == ChronoUnit.DAYS) { + return Types.DateType.get(); + } return Types.IntegerType.get(); } diff --git a/api/src/test/java/org/apache/iceberg/transforms/TestDates.java b/api/src/test/java/org/apache/iceberg/transforms/TestDates.java index f8229ccb4dd7..c344a975f2aa 100644 --- a/api/src/test/java/org/apache/iceberg/transforms/TestDates.java +++ b/api/src/test/java/org/apache/iceberg/transforms/TestDates.java @@ -20,6 +20,7 @@ package org.apache.iceberg.transforms; import org.apache.iceberg.expressions.Literal; +import org.apache.iceberg.types.Type; import org.apache.iceberg.types.Types; import org.junit.Assert; import org.junit.Test; @@ -53,4 +54,21 @@ public void testNullHumanString() { Assert.assertEquals("Should produce \"null\" for null", "null", Transforms.day(type).toHumanString(null)); } + + @Test + public void testDatesReturnType() { + Types.DateType type = Types.DateType.get(); + + Transform year = Transforms.year(type); + Type yearResultType = year.getResultType(type); + Assert.assertEquals(Types.IntegerType.get(), yearResultType); + + Transform month = Transforms.month(type); + Type monthResultType = month.getResultType(type); + Assert.assertEquals(Types.IntegerType.get(), monthResultType); + + Transform day = Transforms.day(type); + Type dayResultType = day.getResultType(type); + Assert.assertEquals(Types.DateType.get(), dayResultType); + } } diff --git a/api/src/test/java/org/apache/iceberg/transforms/TestTimestamps.java b/api/src/test/java/org/apache/iceberg/transforms/TestTimestamps.java index 57aefca9271e..ed71a8b30400 100644 --- a/api/src/test/java/org/apache/iceberg/transforms/TestTimestamps.java +++ b/api/src/test/java/org/apache/iceberg/transforms/TestTimestamps.java @@ -20,6 +20,7 @@ package org.apache.iceberg.transforms; import org.apache.iceberg.expressions.Literal; +import org.apache.iceberg.types.Type; import org.apache.iceberg.types.Types; import org.junit.Assert; import org.junit.Test; @@ -82,4 +83,25 @@ public void testNullHumanString() { Assert.assertEquals("Should produce \"null\" for null", "null", Transforms.hour(type).toHumanString(null)); } + + @Test + public void testTimestampsReturnType() { + Types.TimestampType type = Types.TimestampType.withZone(); + + Transform year = Transforms.year(type); + Type yearResultType = year.getResultType(type); + Assert.assertEquals(Types.IntegerType.get(), yearResultType); + + Transform month = Transforms.month(type); + Type monthResultType = month.getResultType(type); + Assert.assertEquals(Types.IntegerType.get(), monthResultType); + + Transform day = Transforms.day(type); + Type dayResultType = day.getResultType(type); + Assert.assertEquals(Types.DateType.get(), dayResultType); + + Transform hour = Transforms.hour(type); + Type hourResultType = hour.getResultType(type); + Assert.assertEquals(Types.IntegerType.get(), hourResultType); + } }