This is an automated email from the ASF dual-hosted git repository. jackie pushed a commit to branch time_support in repository https://gitbox.apache.org/repos/asf/incubator-pinot.git
commit a3a5fdf56663ac0bf5b8632b8b4db1afaa665ea6 Author: Jackie (Xiaotian) Jiang <[email protected]> AuthorDate: Tue Apr 9 12:44:45 2019 -0700 Add support for <millis/milliseonds/micros/microseconds/nanos/nanoseconds>SinceEpcoh time unit string --- .../apache/pinot/common/utils/time/TimeUtils.java | 64 +++++++++++++--------- .../org/apache/pinot/common/utils/UtilsTest.java | 21 +++++-- 2 files changed, 55 insertions(+), 30 deletions(-) diff --git a/pinot-common/src/main/java/org/apache/pinot/common/utils/time/TimeUtils.java b/pinot-common/src/main/java/org/apache/pinot/common/utils/time/TimeUtils.java index f693d65..fe88253 100644 --- a/pinot-common/src/main/java/org/apache/pinot/common/utils/time/TimeUtils.java +++ b/pinot-common/src/main/java/org/apache/pinot/common/utils/time/TimeUtils.java @@ -18,8 +18,6 @@ */ package org.apache.pinot.common.utils.time; -import java.util.HashMap; -import java.util.Map; import java.util.concurrent.TimeUnit; import javax.annotation.Nullable; import org.joda.time.DateTime; @@ -31,18 +29,23 @@ import org.joda.time.format.PeriodFormatterBuilder; public class TimeUtils { + private static final String UPPER_CASE_DAYS = "DAYS"; private static final String UPPER_CASE_DAYS_SINCE_EPOCH = "DAYSSINCEEPOCH"; + private static final String UPPER_CASE_HOURS = "HOURS"; private static final String UPPER_CASE_HOURS_SINCE_EPOCH = "HOURSSINCEEPOCH"; + private static final String UPPER_CASE_MINUTES = "MINUTES"; private static final String UPPER_CASE_MINUTES_SINCE_EPOCH = "MINUTESSINCEEPOCH"; + private static final String UPPER_CASE_SECONDS = "SECONDS"; private static final String UPPER_CASE_SECONDS_SINCE_EPOCH = "SECONDSSINCEEPOCH"; - - private static final Map<String, TimeUnit> TIME_UNIT_MAP = new HashMap<>(); - - static { - for (TimeUnit timeUnit : TimeUnit.values()) { - TIME_UNIT_MAP.put(timeUnit.name(), timeUnit); - } - } + private static final String UPPER_CASE_MILLISECONDS = "MILLISECONDS"; + private static final String UPPER_CASE_MILLIS_SINCE_EPOCH = "MILLISSINCEEPOCH"; + private static final String UPPER_CASE_MILLISECONDS_SINCE_EPOCH = "MILLISECONDSSINCEEPOCH"; + private static final String UPPER_CASE_MICROSECONDS = "MICROSECONDS"; + private static final String UPPER_CASE_MICROS_SINCE_EPOCH = "MICROSSINCEEPOCH"; + private static final String UPPER_CASE_MICROSECONDS_SINCE_EPOCH = "MICROSECONDSSINCEEPOCH"; + private static final String UPPER_CASE_NANOSECONDS = "NANOSECONDS"; + private static final String UPPER_CASE_NANOS_SINCE_EPOCH = "NANOSSINCEEPOCH"; + private static final String UPPER_CASE_NANOSECONDS_SINCE_EPOCH = "NANOSECONDSSINCEEPOCH"; private static final long VALID_MIN_TIME_MILLIS = new DateTime(1971, 1, 1, 0, 0, 0, 0, DateTimeZone.UTC).getMillis(); private static final long VALID_MAX_TIME_MILLIS = new DateTime(2071, 1, 1, 0, 0, 0, 0, DateTimeZone.UTC).getMillis(); @@ -50,12 +53,15 @@ public class TimeUtils { /** * Converts a time unit string into {@link TimeUnit}, ignoring case. For {@code null} or empty time unit string, * returns {@code null}. - * <p>Supports the following legacy time unit strings: + * <p>Besides the standard time unit, also support the following time unit strings: * <ul> * <li>"daysSinceEpoch" -> DAYS</li> * <li>"hoursSinceEpoch" -> HOURS</li> * <li>"minutesSinceEpoch" -> MINUTES</li> * <li>"secondsSinceEpoch" -> SECONDS</li> + * <li>"millisSinceEpoch"/"millisecondsSinceEpoch" -> MILLISECONDS</li> + * <li>"microsSinceEpoch"/"microsecondsSinceEpoch" -> MICROSECONDS</li> + * <li>"nanosSinceEpoch"/"nanosecondsSinceEpoch" -> NANOSECONDS</li> * </ul> * * @param timeUnitString The time unit string to convert, e.g. "DAYS" or "SECONDS" @@ -67,39 +73,46 @@ public class TimeUtils { if (timeUnitString == null || timeUnitString.isEmpty()) { return null; } - String upperCaseTimeUnitString = timeUnitString.toUpperCase(); - TimeUnit timeUnit = TIME_UNIT_MAP.get(upperCaseTimeUnitString); - if (timeUnit != null) { - return timeUnit; - } - switch (upperCaseTimeUnitString) { + switch (timeUnitString.toUpperCase()) { + case UPPER_CASE_DAYS: case UPPER_CASE_DAYS_SINCE_EPOCH: return TimeUnit.DAYS; + case UPPER_CASE_HOURS: case UPPER_CASE_HOURS_SINCE_EPOCH: return TimeUnit.HOURS; + case UPPER_CASE_MINUTES: case UPPER_CASE_MINUTES_SINCE_EPOCH: return TimeUnit.MINUTES; + case UPPER_CASE_SECONDS: case UPPER_CASE_SECONDS_SINCE_EPOCH: return TimeUnit.SECONDS; + case UPPER_CASE_MILLISECONDS: + case UPPER_CASE_MILLIS_SINCE_EPOCH: + case UPPER_CASE_MILLISECONDS_SINCE_EPOCH: + return TimeUnit.MILLISECONDS; + case UPPER_CASE_MICROSECONDS: + case UPPER_CASE_MICROS_SINCE_EPOCH: + case UPPER_CASE_MICROSECONDS_SINCE_EPOCH: + return TimeUnit.MICROSECONDS; + case UPPER_CASE_NANOSECONDS: + case UPPER_CASE_NANOS_SINCE_EPOCH: + case UPPER_CASE_NANOSECONDS_SINCE_EPOCH: + return TimeUnit.NANOSECONDS; default: throw new IllegalArgumentException("Unsupported time unit: " + timeUnitString); } } /** - * Given a time value, returns true if the value is between a valid range, false otherwise - * The current valid range used is between beginning of 1971 and beginning of 2071. - * - * @param timeValueInMillis - * @return True if time value in valid range, false otherwise. + * Given a time value, returns true if the value is between a valid range, false otherwise. + * <p>The current valid range used is between beginning of 1971 and beginning of 2071. */ public static boolean timeValueInValidRange(long timeValueInMillis) { return (VALID_MIN_TIME_MILLIS <= timeValueInMillis && timeValueInMillis <= VALID_MAX_TIME_MILLIS); } /** - * Return the minimum valid time in milliseconds. - * @return + * Returns the minimum valid time in milliseconds. */ public static long getValidMinTimeMillis() { return VALID_MIN_TIME_MILLIS; @@ -107,7 +120,6 @@ public class TimeUtils { /** * Returns the maximum valid time in milliseconds. - * @return */ public static long getValidMaxTimeMillis() { return VALID_MAX_TIME_MILLIS; @@ -123,7 +135,7 @@ public class TimeUtils { * minutes (m) and seconds (s). * * @param timeStr string representing the duration - * @return the corresponding time coverted to milliseconds + * @return the corresponding time converted to milliseconds * @throws IllegalArgumentException if the string does not conform to the expected format */ public static Long convertPeriodToMillis(String timeStr) { diff --git a/pinot-common/src/test/java/org/apache/pinot/common/utils/UtilsTest.java b/pinot-common/src/test/java/org/apache/pinot/common/utils/UtilsTest.java index 10b4cff..a9a02a2 100644 --- a/pinot-common/src/test/java/org/apache/pinot/common/utils/UtilsTest.java +++ b/pinot-common/src/test/java/org/apache/pinot/common/utils/UtilsTest.java @@ -43,16 +43,29 @@ public class UtilsTest { @Test public void testTimeUtils() { - assertEquals(TimeUtils.timeUnitFromString("days"), TimeUnit.DAYS); - assertEquals(TimeUtils.timeUnitFromString("HOURS"), TimeUnit.HOURS); - assertEquals(TimeUtils.timeUnitFromString("Minutes"), TimeUnit.MINUTES); - assertEquals(TimeUtils.timeUnitFromString("SeCoNdS"), TimeUnit.SECONDS); + // Test all time units + for (TimeUnit timeUnit : TimeUnit.values()) { + assertEquals(TimeUtils.timeUnitFromString(timeUnit.name()), timeUnit); + assertEquals(TimeUtils.timeUnitFromString(timeUnit.name().toLowerCase()), timeUnit); + } + + // Test other time unit string assertEquals(TimeUtils.timeUnitFromString("daysSinceEpoch"), TimeUnit.DAYS); assertEquals(TimeUtils.timeUnitFromString("HOURSSINCEEPOCH"), TimeUnit.HOURS); assertEquals(TimeUtils.timeUnitFromString("MinutesSinceEpoch"), TimeUnit.MINUTES); assertEquals(TimeUtils.timeUnitFromString("SeCoNdSsInCeEpOcH"), TimeUnit.SECONDS); + assertEquals(TimeUtils.timeUnitFromString("millissinceepoch"), TimeUnit.MILLISECONDS); + assertEquals(TimeUtils.timeUnitFromString("MILLISECONDSSINCEEPOCH"), TimeUnit.MILLISECONDS); + assertEquals(TimeUtils.timeUnitFromString("microssinceepoch"), TimeUnit.MICROSECONDS); + assertEquals(TimeUtils.timeUnitFromString("MICROSECONDSSINCEEPOCH"), TimeUnit.MICROSECONDS); + assertEquals(TimeUtils.timeUnitFromString("nanossinceepoch"), TimeUnit.NANOSECONDS); + assertEquals(TimeUtils.timeUnitFromString("NANOSECONDSSINCEEPOCH"), TimeUnit.NANOSECONDS); + + // Test null and empty time unit string assertNull(TimeUtils.timeUnitFromString(null)); assertNull(TimeUtils.timeUnitFromString("")); + + // Test invalid time unit string try { TimeUtils.timeUnitFromString("unknown"); fail(); --------------------------------------------------------------------- To unsubscribe, e-mail: [email protected] For additional commands, e-mail: [email protected]
