You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@pinot.apache.org by ja...@apache.org on 2019/04/09 19:45:55 UTC

[incubator-pinot] 01/01: Add support for SinceEpcoh time unit string

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 <xa...@linkedin.com>
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: commits-unsubscribe@pinot.apache.org
For additional commands, e-mail: commits-help@pinot.apache.org