This is an automated email from the ASF dual-hosted git repository.

jackietien pushed a commit to branch dev/1.3
in repository https://gitbox.apache.org/repos/asf/iotdb.git


The following commit(s) were added to refs/heads/dev/1.3 by this push:
     new 2afddd04c85 [To dev/1.3] Support us and ns timePrecision in udf-library
2afddd04c85 is described below

commit 2afddd04c85b6595f7cd6f216d5cff25499999c9
Author: Jackie Tien <[email protected]>
AuthorDate: Sun Dec 22 12:03:54 2024 +0800

    [To dev/1.3] Support us and ns timePrecision in udf-library
---
 .../iotdb/library/dprofile/UDAFIntegral.java       | 41 ++--------
 .../iotdb/library/dprofile/UDTFResample.java       |  6 +-
 .../iotdb/library/dquality/UDTFCompleteness.java   |  3 +-
 .../iotdb/library/dquality/UDTFConsistency.java    |  2 +-
 .../iotdb/library/dquality/UDTFTimeliness.java     |  3 +-
 .../iotdb/library/dquality/UDTFValidity.java       |  3 +-
 .../iotdb/library/drepair/UDTFTimestampRepair.java | 47 ++++++++---
 .../library/drepair/util/TimestampInterval.java    | 22 +++---
 .../library/drepair/util/TimestampRepair.java      |  2 +-
 .../apache/iotdb/library/frequency/UDTFIFFT.java   |  7 +-
 .../library/series/UDTFConsecutiveSequences.java   |  5 +-
 .../library/series/UDTFConsecutiveWindows.java     | 11 ++-
 .../java/org/apache/iotdb/library/util/Util.java   | 90 ++++++++++++++++++----
 13 files changed, 152 insertions(+), 90 deletions(-)

diff --git 
a/library-udf/src/main/java/org/apache/iotdb/library/dprofile/UDAFIntegral.java 
b/library-udf/src/main/java/org/apache/iotdb/library/dprofile/UDAFIntegral.java
index 2bb938d5f32..08a50fda271 100644
--- 
a/library-udf/src/main/java/org/apache/iotdb/library/dprofile/UDAFIntegral.java
+++ 
b/library-udf/src/main/java/org/apache/iotdb/library/dprofile/UDAFIntegral.java
@@ -27,7 +27,6 @@ import 
org.apache.iotdb.udf.api.customizer.config.UDTFConfigurations;
 import org.apache.iotdb.udf.api.customizer.parameter.UDFParameterValidator;
 import org.apache.iotdb.udf.api.customizer.parameter.UDFParameters;
 import org.apache.iotdb.udf.api.customizer.strategy.RowByRowAccessStrategy;
-import org.apache.iotdb.udf.api.exception.UDFException;
 import org.apache.iotdb.udf.api.type.Type;
 
 /**
@@ -37,11 +36,7 @@ import org.apache.iotdb.udf.api.type.Type;
 public class UDAFIntegral implements UDTF {
 
   private static final String TIME_UNIT_KEY = "unit";
-  private static final String TIME_UNIT_MS = "1S";
   private static final String TIME_UNIT_S = "1s";
-  private static final String TIME_UNIT_M = "1m";
-  private static final String TIME_UNIT_H = "1H";
-  private static final String TIME_UNIT_D = "1d";
 
   long unitTime;
   long lastTime = -1;
@@ -53,41 +48,19 @@ public class UDAFIntegral implements UDTF {
     validator
         .validateInputSeriesNumber(1)
         .validate(
-            unit ->
-                TIME_UNIT_D.equals(unit)
-                    || TIME_UNIT_H.equals(unit)
-                    || TIME_UNIT_M.equals(unit)
-                    || TIME_UNIT_S.equals(unit)
-                    || TIME_UNIT_MS.equals(unit),
-            "Unknown time unit input",
-            validator.getParameters().getStringOrDefault(TIME_UNIT_KEY, 
TIME_UNIT_S));
+            x -> (long) x > 0,
+            "Unknown time unit input. Supported units are ns, us, ms, s, m, h, 
d.",
+            Util.parseTime(
+                validator.getParameters().getStringOrDefault(TIME_UNIT_KEY, 
TIME_UNIT_S),
+                validator.getParameters()));
   }
 
   @Override
   public void beforeStart(UDFParameters parameters, UDTFConfigurations 
configurations)
       throws Exception {
     configurations.setAccessStrategy(new 
RowByRowAccessStrategy()).setOutputDataType(Type.DOUBLE);
-    switch (parameters.getStringOrDefault(TIME_UNIT_KEY, TIME_UNIT_S)) {
-      case TIME_UNIT_MS:
-        unitTime = 1L;
-        break;
-      case TIME_UNIT_S:
-        unitTime = 1000L;
-        break;
-      case TIME_UNIT_M:
-        unitTime = 60000L;
-        break;
-      case TIME_UNIT_H:
-        unitTime = 3600000L;
-        break;
-      case TIME_UNIT_D:
-        unitTime = 3600000L * 24L;
-        break;
-      default:
-        throw new UDFException(
-            "Unknown time unit input: "
-                + parameters.getStringOrDefault(TIME_UNIT_KEY, TIME_UNIT_S));
-    }
+    unitTime =
+        Util.parseTime(parameters.getStringOrDefault(TIME_UNIT_KEY, 
TIME_UNIT_S), parameters);
   }
 
   @Override
diff --git 
a/library-udf/src/main/java/org/apache/iotdb/library/dprofile/UDTFResample.java 
b/library-udf/src/main/java/org/apache/iotdb/library/dprofile/UDTFResample.java
index 91cbf24ae2c..15d2828c04f 100644
--- 
a/library-udf/src/main/java/org/apache/iotdb/library/dprofile/UDTFResample.java
+++ 
b/library-udf/src/main/java/org/apache/iotdb/library/dprofile/UDTFResample.java
@@ -34,19 +34,19 @@ import java.text.SimpleDateFormat;
 
 /** This function does upsample or downsample of input series. */
 public class UDTFResample implements UDTF {
-
   private static final String START_PARAM = "start";
   private Resampler resampler;
 
   @Override
   public void validate(UDFParameterValidator validator) throws Exception {
+
     validator
         .validateInputSeriesNumber(1)
         .validateInputSeriesDataType(0, Type.DOUBLE, Type.FLOAT, Type.INT32, 
Type.INT64)
         .validate(
             x -> (long) x > 0,
             "gap should be a time period whose unit is ms, s, m, h, d.",
-            Util.parseTime(validator.getParameters().getString("every")))
+            Util.parseTime(validator.getParameters().getString("every"), 
validator.getParameters()))
         .validate(
             x ->
                 "min".equals(x)
@@ -80,7 +80,7 @@ public class UDTFResample implements UDTF {
   public void beforeStart(UDFParameters parameters, UDTFConfigurations 
configurations)
       throws Exception {
     configurations.setAccessStrategy(new 
RowByRowAccessStrategy()).setOutputDataType(Type.DOUBLE);
-    long newPeriod = Util.parseTime(parameters.getString("every"));
+    long newPeriod = Util.parseTime(parameters.getString("every"), parameters);
     String aggregator = parameters.getStringOrDefault("aggr", 
"mean").toLowerCase();
     String interpolator = parameters.getStringOrDefault("interp", 
"nan").toLowerCase();
     SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
diff --git 
a/library-udf/src/main/java/org/apache/iotdb/library/dquality/UDTFCompleteness.java
 
b/library-udf/src/main/java/org/apache/iotdb/library/dquality/UDTFCompleteness.java
index e5241062d6c..8b349240386 100644
--- 
a/library-udf/src/main/java/org/apache/iotdb/library/dquality/UDTFCompleteness.java
+++ 
b/library-udf/src/main/java/org/apache/iotdb/library/dquality/UDTFCompleteness.java
@@ -36,6 +36,7 @@ import java.util.logging.Logger;
 
 /** This function calculates completeness of input series. */
 public class UDTFCompleteness implements UDTF {
+
   private boolean downtime;
 
   @Override
@@ -44,7 +45,7 @@ public class UDTFCompleteness implements UDTF {
     long window = Integer.MAX_VALUE;
     if (udfp.hasAttribute("window")) {
       String s = udfp.getString("window");
-      window = Util.parseTime(s);
+      window = Util.parseTime(s, udfp);
       if (window > 0) {
         isTime = true;
       } else {
diff --git 
a/library-udf/src/main/java/org/apache/iotdb/library/dquality/UDTFConsistency.java
 
b/library-udf/src/main/java/org/apache/iotdb/library/dquality/UDTFConsistency.java
index 52f27876468..3178d33343c 100644
--- 
a/library-udf/src/main/java/org/apache/iotdb/library/dquality/UDTFConsistency.java
+++ 
b/library-udf/src/main/java/org/apache/iotdb/library/dquality/UDTFConsistency.java
@@ -44,7 +44,7 @@ public class UDTFConsistency implements UDTF {
     long window = Integer.MAX_VALUE;
     if (udfp.hasAttribute("window")) {
       String s = udfp.getString("window");
-      window = Util.parseTime(s);
+      window = Util.parseTime(s, udfp);
       if (window > 0) {
         isTime = true;
       } else {
diff --git 
a/library-udf/src/main/java/org/apache/iotdb/library/dquality/UDTFTimeliness.java
 
b/library-udf/src/main/java/org/apache/iotdb/library/dquality/UDTFTimeliness.java
index 8ac93e1bf54..7a5fc98e182 100644
--- 
a/library-udf/src/main/java/org/apache/iotdb/library/dquality/UDTFTimeliness.java
+++ 
b/library-udf/src/main/java/org/apache/iotdb/library/dquality/UDTFTimeliness.java
@@ -37,13 +37,14 @@ import java.util.logging.Logger;
 
 /** This function calculates timeliness of input series. */
 public class UDTFTimeliness implements UDTF {
+
   @Override
   public void beforeStart(UDFParameters udfp, UDTFConfigurations udtfc) throws 
Exception {
     boolean isTime = false;
     long window = Integer.MAX_VALUE;
     if (udfp.hasAttribute("window")) {
       String s = udfp.getString("window");
-      window = Util.parseTime(s);
+      window = Util.parseTime(s, udfp);
       if (window > 0) {
         isTime = true;
       } else {
diff --git 
a/library-udf/src/main/java/org/apache/iotdb/library/dquality/UDTFValidity.java 
b/library-udf/src/main/java/org/apache/iotdb/library/dquality/UDTFValidity.java
index 7e7028d382f..e3b0de6065b 100644
--- 
a/library-udf/src/main/java/org/apache/iotdb/library/dquality/UDTFValidity.java
+++ 
b/library-udf/src/main/java/org/apache/iotdb/library/dquality/UDTFValidity.java
@@ -37,13 +37,14 @@ import java.util.logging.Logger;
 
 /** This function calculates validity of input series. */
 public class UDTFValidity implements UDTF {
+
   @Override
   public void beforeStart(UDFParameters udfp, UDTFConfigurations udtfc) throws 
Exception {
     boolean isTime = false;
     long window = Integer.MAX_VALUE;
     if (udfp.hasAttribute("window")) {
       String s = udfp.getString("window");
-      window = Util.parseTime(s);
+      window = Util.parseTime(s, udfp);
       if (window > 0) {
         isTime = true;
       } else {
diff --git 
a/library-udf/src/main/java/org/apache/iotdb/library/drepair/UDTFTimestampRepair.java
 
b/library-udf/src/main/java/org/apache/iotdb/library/drepair/UDTFTimestampRepair.java
index 9554cff6d18..2a605b9ab3a 100644
--- 
a/library-udf/src/main/java/org/apache/iotdb/library/drepair/UDTFTimestampRepair.java
+++ 
b/library-udf/src/main/java/org/apache/iotdb/library/drepair/UDTFTimestampRepair.java
@@ -20,6 +20,7 @@
 package org.apache.iotdb.library.drepair;
 
 import org.apache.iotdb.library.drepair.util.TimestampRepair;
+import org.apache.iotdb.library.util.Util;
 import org.apache.iotdb.udf.api.UDTF;
 import org.apache.iotdb.udf.api.access.RowWindow;
 import org.apache.iotdb.udf.api.collector.PointCollector;
@@ -33,18 +34,30 @@ import org.apache.iotdb.udf.api.type.Type;
 /** This function is used for timestamp repair. */
 public class UDTFTimestampRepair implements UDTF {
   String intervalMethod;
-  int interval;
-  int intervalMode;
+  long interval;
+  long intervalMode;
 
   @Override
   public void validate(UDFParameterValidator validator) throws Exception {
     validator
         .validateInputSeriesNumber(1)
-        .validateInputSeriesDataType(0, Type.DOUBLE, Type.FLOAT, Type.INT32, 
Type.INT64)
-        .validate(
-            x -> (Integer) x >= 0,
-            "Interval should be a positive integer.",
-            validator.getParameters().getIntOrDefault("interval", 0));
+        .validateInputSeriesDataType(0, Type.DOUBLE, Type.FLOAT, Type.INT32, 
Type.INT64);
+
+    String intervalString = 
validator.getParameters().getStringOrDefault("interval", null);
+    if (intervalString != null) {
+      try {
+        interval = Long.parseLong(intervalString);
+      } catch (NumberFormatException e) {
+        try {
+          interval = Util.parseTime(intervalString, validator.getParameters());
+        } catch (Exception ex) {
+          throw new UDFException("Invalid time format for interval.");
+        }
+      }
+      validator.validate(
+          x -> interval > 0,
+          "Invalid time unit input. Supported units are ns, us, ms, s, m, h, 
d.");
+    }
   }
 
   @Override
@@ -53,16 +66,28 @@ public class UDTFTimestampRepair implements UDTF {
     configurations
         .setAccessStrategy(new 
SlidingSizeWindowAccessStrategy(Integer.MAX_VALUE))
         .setOutputDataType(parameters.getDataType(0));
+
     intervalMethod = parameters.getStringOrDefault("method", "Median");
-    interval = parameters.getIntOrDefault("interval", 0);
+    String intervalString = parameters.getStringOrDefault("interval", null);
+
+    if (intervalString != null) {
+      try {
+        interval = Long.parseLong(intervalString);
+      } catch (NumberFormatException e) {
+        interval = Util.parseTime(intervalString, parameters);
+      }
+    } else {
+      interval = 0;
+    }
+
     if (interval > 0) {
       intervalMode = interval;
     } else if ("Median".equalsIgnoreCase(intervalMethod)) {
-      intervalMode = -1;
+      intervalMode = -1L;
     } else if ("Mode".equalsIgnoreCase(intervalMethod)) {
-      intervalMode = -2;
+      intervalMode = -2L;
     } else if ("Cluster".equalsIgnoreCase(intervalMethod)) {
-      intervalMode = -3;
+      intervalMode = -3L;
     } else {
       throw new UDFException("Illegal method.");
     }
diff --git 
a/library-udf/src/main/java/org/apache/iotdb/library/drepair/util/TimestampInterval.java
 
b/library-udf/src/main/java/org/apache/iotdb/library/drepair/util/TimestampInterval.java
index 57feae84229..f596a3552db 100644
--- 
a/library-udf/src/main/java/org/apache/iotdb/library/drepair/util/TimestampInterval.java
+++ 
b/library-udf/src/main/java/org/apache/iotdb/library/drepair/util/TimestampInterval.java
@@ -44,19 +44,15 @@ public class TimestampInterval {
 
   // get standard interval
   // -1 median -2 mode -3 cluster
-  public long getInterval(int mode) {
-    switch (mode) {
-      case -1:
-        this.deltaT = getIntervalByMedian();
-        break;
-      case -2:
-        this.deltaT = getIntervalByMode();
-        break;
-      case -3:
-        this.deltaT = getIntervalByCluster();
-        break;
-      default:
-        this.deltaT = mode;
+  public long getInterval(long mode) {
+    if (mode == -1L) {
+      this.deltaT = getIntervalByMedian();
+    } else if (mode == -2L) {
+      this.deltaT = getIntervalByMode();
+    } else if (mode == -3L) {
+      this.deltaT = getIntervalByCluster();
+    } else {
+      this.deltaT = mode;
     }
     return this.deltaT;
   }
diff --git 
a/library-udf/src/main/java/org/apache/iotdb/library/drepair/util/TimestampRepair.java
 
b/library-udf/src/main/java/org/apache/iotdb/library/drepair/util/TimestampRepair.java
index d1a856e56a9..4b98256436b 100644
--- 
a/library-udf/src/main/java/org/apache/iotdb/library/drepair/util/TimestampRepair.java
+++ 
b/library-udf/src/main/java/org/apache/iotdb/library/drepair/util/TimestampRepair.java
@@ -35,7 +35,7 @@ public class TimestampRepair {
   protected long deltaT;
   protected long start0;
 
-  public TimestampRepair(RowIterator dataIterator, int intervalMode, int 
startPointMode)
+  public TimestampRepair(RowIterator dataIterator, long intervalMode, int 
startPointMode)
       throws Exception {
     ArrayList<Long> timeList = new ArrayList<>();
     ArrayList<Double> originList = new ArrayList<>();
diff --git 
a/library-udf/src/main/java/org/apache/iotdb/library/frequency/UDTFIFFT.java 
b/library-udf/src/main/java/org/apache/iotdb/library/frequency/UDTFIFFT.java
index 38a655f7b2c..6e5f52d7e6f 100644
--- a/library-udf/src/main/java/org/apache/iotdb/library/frequency/UDTFIFFT.java
+++ b/library-udf/src/main/java/org/apache/iotdb/library/frequency/UDTFIFFT.java
@@ -42,6 +42,7 @@ public class UDTFIFFT implements UDTF {
   private final DoubleArrayList real = new DoubleArrayList();
   private final DoubleArrayList imag = new DoubleArrayList();
   private final IntArrayList time = new IntArrayList();
+
   private long start;
   private long interval;
 
@@ -53,7 +54,9 @@ public class UDTFIFFT implements UDTF {
         .validate(
             x -> (long) x > 0,
             "interval should be a time period whose unit is ms, s, m, h, d.",
-            
Util.parseTime(validator.getParameters().getStringOrDefault("interval", "1s")));
+            Util.parseTime(
+                validator.getParameters().getStringOrDefault("interval", "1s"),
+                validator.getParameters()));
     SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
     if (validator.getParameters().hasAttribute(START_PARAM)) {
       validator.validate(
@@ -67,7 +70,7 @@ public class UDTFIFFT implements UDTF {
   public void beforeStart(UDFParameters parameters, UDTFConfigurations 
configurations)
       throws Exception {
     configurations.setAccessStrategy(new 
RowByRowAccessStrategy()).setOutputDataType(Type.DOUBLE);
-    this.interval = Util.parseTime(parameters.getStringOrDefault("interval", 
"1s"));
+    this.interval = Util.parseTime(parameters.getStringOrDefault("interval", 
"1s"), parameters);
     SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
     this.start = 0;
     if (parameters.hasAttribute(START_PARAM)) {
diff --git 
a/library-udf/src/main/java/org/apache/iotdb/library/series/UDTFConsecutiveSequences.java
 
b/library-udf/src/main/java/org/apache/iotdb/library/series/UDTFConsecutiveSequences.java
index c58111fa0ad..a13caa63243 100644
--- 
a/library-udf/src/main/java/org/apache/iotdb/library/series/UDTFConsecutiveSequences.java
+++ 
b/library-udf/src/main/java/org/apache/iotdb/library/series/UDTFConsecutiveSequences.java
@@ -41,14 +41,15 @@ public class UDTFConsecutiveSequences implements UDTF {
     validator.validate(
         x -> (long) x > 0,
         "gap should be a time period whose unit is ms, s, m, h.",
-        Util.parseTime(validator.getParameters().getStringOrDefault("gap", 
"1ms")));
+        Util.parseTime(
+            validator.getParameters().getStringOrDefault("gap", "1ms"), 
validator.getParameters()));
   }
 
   @Override
   public void beforeStart(UDFParameters parameters, UDTFConfigurations 
configurations)
       throws Exception {
     configurations.setAccessStrategy(new 
RowByRowAccessStrategy()).setOutputDataType(Type.INT32);
-    long gap = Util.parseTime(parameters.getStringOrDefault("gap", "0ms"));
+    long gap = Util.parseTime(parameters.getStringOrDefault("gap", "0ms"), 
parameters);
     consUtil = new ConsecutiveUtil(-gap, -gap, gap);
   }
 
diff --git 
a/library-udf/src/main/java/org/apache/iotdb/library/series/UDTFConsecutiveWindows.java
 
b/library-udf/src/main/java/org/apache/iotdb/library/series/UDTFConsecutiveWindows.java
index e7abedef87e..d7dbe4148b3 100644
--- 
a/library-udf/src/main/java/org/apache/iotdb/library/series/UDTFConsecutiveWindows.java
+++ 
b/library-udf/src/main/java/org/apache/iotdb/library/series/UDTFConsecutiveWindows.java
@@ -44,19 +44,22 @@ public class UDTFConsecutiveWindows implements UDTF {
         .validate(
             x -> (long) x > 0,
             "gap should be a time period whose unit is ms, s, m, h.",
-            Util.parseTime(validator.getParameters().getStringOrDefault("gap", 
"1ms")))
+            Util.parseTime(
+                validator.getParameters().getStringOrDefault("gap", "1ms"),
+                validator.getParameters()))
         .validate(
             x -> (long) x > 0,
             "length should be a time period whose unit is ms, s, m, h.",
-            Util.parseTime(validator.getParameters().getString("length")));
+            Util.parseTime(
+                validator.getParameters().getString("length"), 
validator.getParameters()));
   }
 
   @Override
   public void beforeStart(UDFParameters parameters, UDTFConfigurations 
configurations)
       throws Exception {
     configurations.setAccessStrategy(new 
RowByRowAccessStrategy()).setOutputDataType(Type.INT32);
-    long gap = Util.parseTime(parameters.getStringOrDefault("gap", "0ms"));
-    len = Util.parseTime(parameters.getString("length"));
+    long gap = Util.parseTime(parameters.getStringOrDefault("gap", "0ms"), 
parameters);
+    len = Util.parseTime(parameters.getString("length"), parameters);
     int count = gap == 0 ? 0 : (int) (len / gap + 1);
     consUtil = new ConsecutiveUtil(-gap, -gap, gap);
     consUtil.setCount(count);
diff --git a/library-udf/src/main/java/org/apache/iotdb/library/util/Util.java 
b/library-udf/src/main/java/org/apache/iotdb/library/util/Util.java
index 5c65c4314ce..e30cc7d45c3 100644
--- a/library-udf/src/main/java/org/apache/iotdb/library/util/Util.java
+++ b/library-udf/src/main/java/org/apache/iotdb/library/util/Util.java
@@ -21,6 +21,7 @@ package org.apache.iotdb.library.util;
 
 import org.apache.iotdb.udf.api.access.Row;
 import org.apache.iotdb.udf.api.collector.PointCollector;
+import org.apache.iotdb.udf.api.customizer.parameter.UDFParameters;
 import org.apache.iotdb.udf.api.type.Type;
 
 import org.apache.commons.math3.stat.descriptive.rank.Median;
@@ -32,6 +33,9 @@ import java.util.List;
 
 /** This class offers functions of getting and putting values from iotdb 
interface. */
 public class Util {
+  private static final String TIMESTAMP_PRECISION = "timestampPrecision";
+  public static final String MS_PRECISION = "ms";
+
   private Util() {
     throw new IllegalStateException("Utility class");
   }
@@ -300,26 +304,80 @@ public class Util {
    * @param s input string
    * @return timestamp
    */
-  public static long parseTime(String s) {
+  public static long parseTime(String s, UDFParameters parameters) {
     long unit = 0;
+    String timestampPrecision =
+        parameters.getSystemStringOrDefault(TIMESTAMP_PRECISION, MS_PRECISION);
     s = s.toLowerCase();
     s = s.replace(" ", "");
-    if (s.endsWith("ms")) {
-      unit = 1;
-      s = s.substring(0, s.length() - 2);
-    } else if (s.endsWith("s")) {
-      unit = 1000;
-      s = s.substring(0, s.length() - 1);
-    } else if (s.endsWith("m")) {
-      unit = 60 * 1000L;
-      s = s.substring(0, s.length() - 1);
-    } else if (s.endsWith("h")) {
-      unit = 60 * 60 * 1000L;
-      s = s.substring(0, s.length() - 1);
-    } else if (s.endsWith("d")) {
-      unit = 24 * 60 * 60 * 1000L;
-      s = s.substring(0, s.length() - 1);
+    if (timestampPrecision.equals("ms")) {
+      if (s.endsWith("ns") || s.endsWith("us")) {
+        throw new IllegalArgumentException(
+            "The provided time precision is higher than the system's time 
precision (ms). Please check your input.");
+      } else if (s.endsWith("ms")) {
+        unit = 1;
+        s = s.substring(0, s.length() - 2);
+      } else if (s.endsWith("s")) {
+        unit = 1000;
+        s = s.substring(0, s.length() - 1);
+      } else if (s.endsWith("m")) {
+        unit = 60 * 1000L;
+        s = s.substring(0, s.length() - 1);
+      } else if (s.endsWith("h")) {
+        unit = 60 * 60 * 1000L;
+        s = s.substring(0, s.length() - 1);
+      } else if (s.endsWith("d")) {
+        unit = 24 * 60 * 60 * 1000L;
+        s = s.substring(0, s.length() - 1);
+      }
+    } else if (timestampPrecision.equals("us")) {
+      if (s.endsWith("ns")) {
+        throw new IllegalArgumentException(
+            "The provided time precision is higher than the system's time 
precision (us). Please check your input.");
+      } else if (s.endsWith("us")) {
+        unit = 1;
+        s = s.substring(0, s.length() - 2);
+      } else if (s.endsWith("ms")) {
+        unit = 1000;
+        s = s.substring(0, s.length() - 2);
+      } else if (s.endsWith("s")) {
+        unit = 1000 * 1000;
+        s = s.substring(0, s.length() - 1);
+      } else if (s.endsWith("m")) {
+        unit = 60 * 1000 * 1000L;
+        s = s.substring(0, s.length() - 1);
+      } else if (s.endsWith("h")) {
+        unit = 60 * 60 * 1000 * 1000L;
+        s = s.substring(0, s.length() - 1);
+      } else if (s.endsWith("d")) {
+        unit = 24 * 60 * 60 * 1000 * 1000L;
+        s = s.substring(0, s.length() - 1);
+      }
+    } else if (timestampPrecision.equals("ns")) {
+      if (s.endsWith("ns")) {
+        unit = 1;
+        s = s.substring(0, s.length() - 2);
+      } else if (s.endsWith("us")) {
+        unit = 1000;
+        s = s.substring(0, s.length() - 2);
+      } else if (s.endsWith("ms")) {
+        unit = 1000 * 1000;
+        s = s.substring(0, s.length() - 2);
+      } else if (s.endsWith("s")) {
+        unit = 1000 * 1000 * 1000;
+        s = s.substring(0, s.length() - 1);
+      } else if (s.endsWith("m")) {
+        unit = 60 * 1000 * 1000 * 1000L;
+        s = s.substring(0, s.length() - 1);
+      } else if (s.endsWith("h")) {
+        unit = 60 * 60 * 1000 * 1000 * 1000L;
+        s = s.substring(0, s.length() - 1);
+      } else if (s.endsWith("d")) {
+        unit = 24 * 60 * 60 * 1000 * 1000 * 1000L;
+        s = s.substring(0, s.length() - 1);
+      }
     }
+
     double v = Double.parseDouble(s);
     return (long) (unit * v);
   }

Reply via email to