epgif commented on code in PR #9008: URL: https://github.com/apache/iceberg/pull/9008#discussion_r1629892839
########## api/src/test/java/org/apache/iceberg/transforms/TestTimestamps.java: ########## @@ -241,4 +243,54 @@ public void testTimestampsReturnType() { Type hourResultType = hour.getResultType(type); assertThat(hourResultType).isEqualTo(Types.IntegerType.get()); } + + @Test + public void apply_bad_source_type() { + Timestamps badSourceType = + new Timestamps(ChronoUnit.CENTURIES, Timestamps.ResultTypeUnit.YEARS, "year"); + assertThatThrownBy(() -> badSourceType.apply(11L)) + .isInstanceOf(UnsupportedOperationException.class) + .hasMessageMatching("Unsupported source type unit: Centuries"); + } + + @Test + public void apply_bad_result_type() { + Timestamps badResultType = + new Timestamps(ChronoUnit.MICROS, Timestamps.ResultTypeUnit.NANOS, "nano"); + assertThatThrownBy(() -> badResultType.apply(11L)) + .isInstanceOf(UnsupportedOperationException.class) + .hasMessageMatching("Unsupported result type unit: NANOS"); + } + + @Test + public void get_TimestampType_ChronoUnit() { + Types.TimestampType timestampType = Types.TimestampType.withZone(); + assertThatThrownBy(() -> Timestamps.get(timestampType, ChronoUnit.CENTURIES)) + .isInstanceOf(IllegalArgumentException.class) + .hasMessageMatching("Unsupported source/result type units: timestamptz->Centuries"); Review Comment: done ########## api/src/test/java/org/apache/iceberg/transforms/TestYears.java: ########## @@ -0,0 +1,34 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.apache.iceberg.transforms; + +import static org.assertj.core.api.Assertions.assertThatThrownBy; + +import org.junit.jupiter.api.Test; + +public class TestYears { + @Test + public void satisfiesOrderOf() { + assertThatThrownBy(() -> YEARS.satisfiesOrderOf(Timestamps.DAY_FROM_NANOS)) + .isInstanceOf(UnsupportedOperationException.class) + .hasMessageMatching("Unsupported timestamp unit: DAYS"); + } + + private static final Years<Object> YEARS = Years.get(); Review Comment: done ########## api/src/main/java/org/apache/iceberg/transforms/Timestamps.java: ########## @@ -31,54 +33,162 @@ import org.apache.iceberg.util.DateTimeUtil; import org.apache.iceberg.util.SerializableFunction; -enum Timestamps implements Transform<Long, Integer> { - YEAR(ChronoUnit.YEARS, "year"), - MONTH(ChronoUnit.MONTHS, "month"), - DAY(ChronoUnit.DAYS, "day"), - HOUR(ChronoUnit.HOURS, "hour"); +class Timestamps implements Transform<Long, Integer> { + + static final Timestamps YEAR_FROM_MICROS = + new Timestamps(ChronoUnit.MICROS, ResultTypeUnit.YEARS, "year"); + static final Timestamps MONTH_FROM_MICROS = + new Timestamps(ChronoUnit.MICROS, ResultTypeUnit.MONTHS, "month"); + static final Timestamps DAY_FROM_MICROS = + new Timestamps(ChronoUnit.MICROS, ResultTypeUnit.DAYS, "day"); + static final Timestamps HOUR_FROM_MICROS = + new Timestamps(ChronoUnit.MICROS, ResultTypeUnit.HOURS, "hour"); + static final Timestamps YEAR_FROM_NANOS = + new Timestamps(ChronoUnit.NANOS, ResultTypeUnit.YEARS, "year"); + static final Timestamps MONTH_FROM_NANOS = + new Timestamps(ChronoUnit.NANOS, ResultTypeUnit.MONTHS, "month"); + static final Timestamps DAY_FROM_NANOS = + new Timestamps(ChronoUnit.NANOS, ResultTypeUnit.DAYS, "day"); + static final Timestamps HOUR_FROM_NANOS = + new Timestamps(ChronoUnit.NANOS, ResultTypeUnit.HOURS, "hour"); + + static Timestamps get(Types.TimestampType type, String resultTypeUnit) { + switch (resultTypeUnit.toLowerCase(Locale.ENGLISH)) { + case "year": + return get(type, ChronoUnit.YEARS); + case "month": + return get(type, ChronoUnit.MONTHS); + case "day": + return get(type, ChronoUnit.DAYS); + case "hour": + return get(type, ChronoUnit.HOURS); + default: + throw new IllegalArgumentException( + "Unsupported source/result type units: " + type + "->" + resultTypeUnit); Review Comment: done -- This is an automated message from the Apache Git Service. To respond to the message, please log on to GitHub and use the URL above to go to the specific comment. To unsubscribe, e-mail: issues-unsubscr...@iceberg.apache.org For queries about this service, please contact Infrastructure at: us...@infra.apache.org --------------------------------------------------------------------- To unsubscribe, e-mail: issues-unsubscr...@iceberg.apache.org For additional commands, e-mail: issues-h...@iceberg.apache.org