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