This is an automated email from the ASF dual-hosted git repository.
jackietien pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/iotdb.git
The following commit(s) were added to refs/heads/master by this push:
new e1884cad2f8 Support us and ns timePrecision in udf-library part-1
e1884cad2f8 is described below
commit e1884cad2f8361daf4b934882ed6401a0be890b6
Author: Beasttt <[email protected]>
AuthorDate: Thu Dec 12 15:06:46 2024 +0800
Support us and ns timePrecision in udf-library part-1
---
.../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 +-
.../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 ++++++++++++++++++----
9 files changed, 99 insertions(+), 31 deletions(-)
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/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);
}