You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@iotdb.apache.org by ro...@apache.org on 2022/05/11 12:04:50 UTC
[iotdb] branch master updated: [IOTDB-3143] Potential bug fix for library-udf (#5857)
This is an automated email from the ASF dual-hosted git repository.
rong 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 542ba05ee4 [IOTDB-3143] Potential bug fix for library-udf (#5857)
542ba05ee4 is described below
commit 542ba05ee4a3bdd221ad186ec53f4edfe3139f05
Author: Pengyu Chen <48...@users.noreply.github.com>
AuthorDate: Wed May 11 20:04:45 2022 +0800
[IOTDB-3143] Potential bug fix for library-udf (#5857)
Co-authored-by: Steve Yurong Su <ro...@apache.org>
---
library-udf/pom.xml | 5 ++++
.../apache/iotdb/library/dprofile/UDTFPACF.java | 2 +-
.../org/apache/iotdb/library/dprofile/UDTFQLB.java | 2 +-
.../iotdb/library/dprofile/util/MADSketch.java | 12 ++++++--
.../iotdb/library/dprofile/util/Resampler.java | 17 -----------
.../library/dquality/util/TimeSeriesQuality.java | 30 +-------------------
.../apache/iotdb/library/drepair/util/ARFill.java | 19 +++++++------
.../iotdb/library/drepair/util/LikelihoodFill.java | 8 +++---
.../iotdb/library/drepair/util/LsGreedy.java | 5 ----
.../apache/iotdb/library/drepair/util/Screen.java | 5 ----
.../iotdb/library/drepair/util/ScreenFill.java | 3 +-
.../library/drepair/util/TimestampRepair.java | 33 ++++++++++++++++++----
.../iotdb/library/drepair/util/ValueFill.java | 9 ++++--
.../iotdb/library/drepair/util/ValueRepair.java | 26 -----------------
.../iotdb/library/frequency/util/FFTUtil.java | 8 +++++-
.../iotdb/library/util/LinearRegression.java | 8 ++++++
.../java/org/apache/iotdb/library/util/Util.java | 8 +++---
17 files changed, 86 insertions(+), 114 deletions(-)
diff --git a/library-udf/pom.xml b/library-udf/pom.xml
index eae0d16b1b..bc0cdf6c05 100644
--- a/library-udf/pom.xml
+++ b/library-udf/pom.xml
@@ -64,6 +64,11 @@
<artifactId>commons-lang3</artifactId>
<version>3.9</version>
</dependency>
+ <dependency>
+ <groupId>log4j</groupId>
+ <artifactId>log4j</artifactId>
+ <version>${log4j.version}</version>
+ </dependency>
<!-- TimeStampRepair -->
<dependency>
<groupId>gov.nist.math</groupId>
diff --git a/library-udf/src/main/java/org/apache/iotdb/library/dprofile/UDTFPACF.java b/library-udf/src/main/java/org/apache/iotdb/library/dprofile/UDTFPACF.java
index fa92dc1135..e9622ee2fb 100644
--- a/library-udf/src/main/java/org/apache/iotdb/library/dprofile/UDTFPACF.java
+++ b/library-udf/src/main/java/org/apache/iotdb/library/dprofile/UDTFPACF.java
@@ -77,7 +77,7 @@ public class UDTFPACF implements UDTF {
n = value.size();
if (n > 1) {
if (lag < 0 || lag > value.size() - 1) {
- lag = (int) Math.min(10 * Math.log10(value.size()), value.size() - 1);
+ lag = Math.min((int) (10 * Math.log10(value.size())), value.size() - 1);
}
double[] x =
Arrays.stream(value.toArray(new Double[0])).mapToDouble(Double::valueOf).toArray();
diff --git a/library-udf/src/main/java/org/apache/iotdb/library/dprofile/UDTFQLB.java b/library-udf/src/main/java/org/apache/iotdb/library/dprofile/UDTFQLB.java
index 953fb2edb9..f213ef824b 100644
--- a/library-udf/src/main/java/org/apache/iotdb/library/dprofile/UDTFQLB.java
+++ b/library-udf/src/main/java/org/apache/iotdb/library/dprofile/UDTFQLB.java
@@ -89,7 +89,7 @@ public class UDTFQLB implements UDTF {
}
}
correlation = correlation / n;
- collector.putDouble(n + shift, correlation);
+ collector.putDouble((long) n + shift, correlation);
qlb += correlation * correlation / (n - shift) * n * (n + 2);
ChiSquaredDistribution qlbdist = new ChiSquaredDistribution(shift);
double qlbprob = 1.0 - qlbdist.cumulativeProbability(qlb);
diff --git a/library-udf/src/main/java/org/apache/iotdb/library/dprofile/util/MADSketch.java b/library-udf/src/main/java/org/apache/iotdb/library/dprofile/util/MADSketch.java
index 76bad325f0..ab8bca6dfa 100644
--- a/library-udf/src/main/java/org/apache/iotdb/library/dprofile/util/MADSketch.java
+++ b/library-udf/src/main/java/org/apache/iotdb/library/dprofile/util/MADSketch.java
@@ -19,6 +19,8 @@
package org.apache.iotdb.library.dprofile.util;
import org.eclipse.collections.impl.map.mutable.UnifiedMap;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
import java.util.Arrays;
import java.util.Comparator;
@@ -40,6 +42,8 @@ public class MADSketch {
private static final double MIN_POSITIVE_VALUE = 1e-6;
+ private static final Logger logger = LoggerFactory.getLogger(MADSketch.class);
+
public MADSketch(double alpha) {
this.alpha = alpha;
@@ -86,7 +90,7 @@ public class MADSketch {
buckets[i++] =
new Bucket(
e.getKey(),
- Math.pow(gamma, e.getKey() - 1),
+ Math.pow(gamma, (double) e.getKey() - 1.0),
Math.pow(gamma, e.getKey()),
e.getValue());
}
@@ -95,7 +99,7 @@ public class MADSketch {
new Bucket(
e.getKey(),
-Math.pow(gamma, e.getKey()),
- -Math.pow(gamma, e.getKey() - 1),
+ -Math.pow(gamma, (double) e.getKey() - 1.0),
e.getValue());
}
if (zero_count > 0) {
@@ -261,7 +265,9 @@ public class MADSketch {
public void show(Bucket[] buckets) {
for (Bucket bucket : buckets) {
- System.out.println(bucket.index + ": " + bucket.count);
+ if (logger.isDebugEnabled()) {
+ logger.debug(bucket.index + ": " + bucket.count);
+ }
}
}
diff --git a/library-udf/src/main/java/org/apache/iotdb/library/dprofile/util/Resampler.java b/library-udf/src/main/java/org/apache/iotdb/library/dprofile/util/Resampler.java
index 2aae16d3c8..3c347e3879 100644
--- a/library-udf/src/main/java/org/apache/iotdb/library/dprofile/util/Resampler.java
+++ b/library-udf/src/main/java/org/apache/iotdb/library/dprofile/util/Resampler.java
@@ -26,12 +26,6 @@ import org.apache.iotdb.library.util.LongCircularQueue;
import org.eclipse.collections.impl.list.mutable.primitive.DoubleArrayList;
import org.eclipse.collections.impl.list.mutable.primitive.LongArrayList;
-import java.io.File;
-import java.io.FileNotFoundException;
-import java.text.ParseException;
-import java.text.SimpleDateFormat;
-import java.util.Scanner;
-
/** util for UDTFResample. */
public class Resampler {
@@ -85,17 +79,6 @@ public class Resampler {
valueWindow.add(value);
}
- /** insert points from a file */
- public void insert(String filename) throws FileNotFoundException, ParseException {
- Scanner sc = new Scanner(new File(filename));
- SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
- sc.useDelimiter("\\s*(,|\\r|\\n)\\s*"); // delimited by ',' or '\n', may contains ' ' nearby.
- sc.nextLine();
- while (sc.hasNext()) {
- insert(format.parse(sc.next()).getTime(), sc.nextDouble());
- }
- }
-
/** process all data in buffer */
public void flush() {
do { // process data in the last window in first cycle
diff --git a/library-udf/src/main/java/org/apache/iotdb/library/dquality/util/TimeSeriesQuality.java b/library-udf/src/main/java/org/apache/iotdb/library/dquality/util/TimeSeriesQuality.java
index dfc31d21f6..2734413d66 100644
--- a/library-udf/src/main/java/org/apache/iotdb/library/dquality/util/TimeSeriesQuality.java
+++ b/library-udf/src/main/java/org/apache/iotdb/library/dquality/util/TimeSeriesQuality.java
@@ -25,10 +25,7 @@ import org.apache.iotdb.library.util.Util;
import org.apache.commons.math3.stat.descriptive.rank.Median;
-import java.io.File;
-import java.text.SimpleDateFormat;
import java.util.ArrayList;
-import java.util.Scanner;
/** Class for computing data quality index. */
public class TimeSeriesQuality {
@@ -53,32 +50,7 @@ public class TimeSeriesQuality {
Row row = dataIterator.next();
cnt++;
double v = Util.getValueAsDouble(row);
- double t = Long.valueOf(row.getTime()).doubleValue();
- if (Double.isFinite(v)) {
- timeList.add(t);
- originList.add(v);
- } else { // processing NAN,INF
- specialCnt++;
- timeList.add(t);
- originList.add(Double.NaN);
- }
- }
- time = Util.toDoubleArray(timeList);
- origin = Util.toDoubleArray(originList);
- processNaN();
- }
-
- public TimeSeriesQuality(String filename) throws Exception {
- Scanner sc = new Scanner(new File(filename));
- ArrayList<Double> timeList = new ArrayList<>();
- ArrayList<Double> originList = new ArrayList<>();
- SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
- sc.useDelimiter("\\s*(,|\\r|\\n)\\s*"); // set separator
- sc.nextLine();
- while (sc.hasNext()) {
- cnt++;
- double t = format.parse(sc.next()).getTime();
- double v = sc.nextDouble();
+ double t = (double) row.getTime();
if (Double.isFinite(v)) {
timeList.add(t);
originList.add(v);
diff --git a/library-udf/src/main/java/org/apache/iotdb/library/drepair/util/ARFill.java b/library-udf/src/main/java/org/apache/iotdb/library/drepair/util/ARFill.java
index 90e5b7c783..cc362cbfe4 100644
--- a/library-udf/src/main/java/org/apache/iotdb/library/drepair/util/ARFill.java
+++ b/library-udf/src/main/java/org/apache/iotdb/library/drepair/util/ARFill.java
@@ -19,6 +19,7 @@
package org.apache.iotdb.library.drepair.util;
import org.apache.iotdb.db.query.udf.api.access.RowIterator;
+import org.apache.iotdb.db.query.udf.api.exception.UDFException;
public class ARFill extends ValueFill {
// TODO Higer order AR regression
@@ -35,7 +36,7 @@ public class ARFill extends ValueFill {
}
@Override
- public void fill() {
+ public void fill() throws UDFException {
// compute \sum x_t * x_{t-1}
double acf = 0;
double factor = 0;
@@ -52,16 +53,13 @@ public class ARFill extends ValueFill {
factor += left * left;
acf_cnt += 1;
}
- // acf /= acf_cnt;
- this.theta = acf / factor;
- try {
- assert this.theta < 1;
- } catch (AssertionError e) {
- System.out.println("Cannot fit AR(1) model. Please try another method.");
+ if (factor == 0d || this.theta >= 1) {
this.time = new long[] {0};
this.repaired = new double[] {0D};
- return;
+ throw new UDFException("Cannot fit AR(1) model. Please try another method.");
}
+ // acf /= acf_cnt;
+ this.theta = acf / factor;
double mean_epsilon = 0;
double var_epsilon = 0;
double cnt_epsilon = 0;
@@ -75,6 +73,11 @@ public class ARFill extends ValueFill {
mean_epsilon += epsilon;
var_epsilon += epsilon * epsilon;
}
+ if (cnt_epsilon == 0d) {
+ this.time = new long[] {0};
+ this.repaired = new double[] {0D};
+ throw new UDFException("Cannot fit AR(1) model. Please try another method.");
+ }
mean_epsilon /= cnt_epsilon;
var_epsilon /= cnt_epsilon;
for (int i = 0; i < original.length; i++) {
diff --git a/library-udf/src/main/java/org/apache/iotdb/library/drepair/util/LikelihoodFill.java b/library-udf/src/main/java/org/apache/iotdb/library/drepair/util/LikelihoodFill.java
index f293a16734..cc26be1a24 100644
--- a/library-udf/src/main/java/org/apache/iotdb/library/drepair/util/LikelihoodFill.java
+++ b/library-udf/src/main/java/org/apache/iotdb/library/drepair/util/LikelihoodFill.java
@@ -71,11 +71,11 @@ public class LikelihoodFill extends ValueFill {
|| Double.isNaN(repaired[currentIndex + 1])) {
continue;
}
- double intervalPrev1 = time[currentIndex] - time[currentIndex - 1];
- double intervalPost1 = time[currentIndex + 1] - time[currentIndex];
+ double intervalPrev1 = (double) (time[currentIndex] - time[currentIndex - 1]);
+ double intervalPost1 = (double) (time[currentIndex + 1] - time[currentIndex]);
double squareAPrev = 0.0, squareBPrev = 0.0;
if (currentIndex >= 2 && !Double.isNaN(repaired[currentIndex - 2])) {
- double intervalPrev2 = time[currentIndex - 2] - time[currentIndex - 1];
+ double intervalPrev2 = (double) (time[currentIndex - 2] - time[currentIndex - 1]);
squareAPrev = 1.0 / (intervalPrev1 * intervalPrev1);
squareBPrev =
2.0 * repaired[currentIndex - 2] / (intervalPrev2 * intervalPrev1)
@@ -99,7 +99,7 @@ public class LikelihoodFill extends ValueFill {
/ (intervalPrev1 * intervalPost1 * intervalPost1);
double squareAPost = 0.0, squareBPost = 0.0;
if (currentIndex <= n - 3 && !Double.isNaN(repaired[currentIndex + 2])) {
- double intervalPost2 = time[currentIndex + 2] - time[currentIndex + 1];
+ double intervalPost2 = (double) (time[currentIndex + 2] - time[currentIndex + 1]);
squareAPost = 1.0 / (intervalPost1 * intervalPost1);
squareBPost =
2.0 * repaired[currentIndex + 2] / (intervalPost1 * intervalPost2)
diff --git a/library-udf/src/main/java/org/apache/iotdb/library/drepair/util/LsGreedy.java b/library-udf/src/main/java/org/apache/iotdb/library/drepair/util/LsGreedy.java
index 276841c76f..21decefc20 100644
--- a/library-udf/src/main/java/org/apache/iotdb/library/drepair/util/LsGreedy.java
+++ b/library-udf/src/main/java/org/apache/iotdb/library/drepair/util/LsGreedy.java
@@ -33,11 +33,6 @@ public class LsGreedy extends ValueRepair {
setParameters();
}
- public LsGreedy(String filename) throws Exception {
- super(filename);
- setParameters();
- }
-
private void setParameters() {
double[] speed = Util.speed(original, time);
double[] speedchange = Util.variation(speed);
diff --git a/library-udf/src/main/java/org/apache/iotdb/library/drepair/util/Screen.java b/library-udf/src/main/java/org/apache/iotdb/library/drepair/util/Screen.java
index 9bc3c93c75..8c3877478a 100644
--- a/library-udf/src/main/java/org/apache/iotdb/library/drepair/util/Screen.java
+++ b/library-udf/src/main/java/org/apache/iotdb/library/drepair/util/Screen.java
@@ -37,11 +37,6 @@ public class Screen extends ValueRepair {
setParameters();
}
- public Screen(String filename) throws Exception {
- super(filename);
- setParameters();
- }
-
private void setParameters() {
// set the default speed threshold
double[] speed = Util.speed(original, time);
diff --git a/library-udf/src/main/java/org/apache/iotdb/library/drepair/util/ScreenFill.java b/library-udf/src/main/java/org/apache/iotdb/library/drepair/util/ScreenFill.java
index 6badf0446f..40131bc9e6 100644
--- a/library-udf/src/main/java/org/apache/iotdb/library/drepair/util/ScreenFill.java
+++ b/library-udf/src/main/java/org/apache/iotdb/library/drepair/util/ScreenFill.java
@@ -19,6 +19,7 @@
package org.apache.iotdb.library.drepair.util;
import org.apache.iotdb.db.query.udf.api.access.RowIterator;
+import org.apache.iotdb.db.query.udf.api.exception.UDFException;
import org.apache.iotdb.library.util.Util;
import org.apache.commons.lang3.tuple.Pair;
@@ -49,7 +50,7 @@ public class ScreenFill extends ValueFill {
}
@Override
- public void calMeanAndVar() {
+ public void calMeanAndVar() throws UDFException {
super.calMeanAndVar();
}
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 a6172fb89d..b01e87a56f 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
@@ -22,6 +22,9 @@ import org.apache.iotdb.db.query.udf.api.access.Row;
import org.apache.iotdb.db.query.udf.api.access.RowIterator;
import org.apache.iotdb.library.util.Util;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
import java.util.ArrayList;
public class TimestampRepair {
@@ -33,6 +36,7 @@ public class TimestampRepair {
protected double[] repairedValue;
protected long deltaT;
protected long start0;
+ private static final Logger logger = LoggerFactory.getLogger(TimestampRepair.class);
public TimestampRepair(RowIterator dataIterator, int intervalMode, int startPointMode)
throws Exception {
@@ -68,7 +72,7 @@ public class TimestampRepair {
noRepair();
return;
}
- int n_ = (int) Math.ceil((time[n - 1] - start0) / deltaT + 1);
+ int n_ = (int) Math.ceil((time[n - 1] - start0) / (double) deltaT + 1.0);
repaired = new long[n_];
repairedValue = new double[n_];
int m_ = this.n;
@@ -116,12 +120,17 @@ public class TimestampRepair {
int j = m_;
double unionSet = 0;
double joinSet = 0;
+
while (i >= 1 && j >= 1) {
long ps = start0 + (i - 1) * deltaT;
if (steps[i][j] == 0) {
repaired[i - 1] = ps;
repairedValue[i - 1] = original[j - 1];
- System.out.println(time[j - 1] + "," + ps + "," + original[j - 1]);
+ /*
+ if(logger.isDebugEnabled()){
+ logger.debug(time[j - 1] + "," + ps + "," + original[j - 1]);
+ }
+ */
unionSet += 1;
joinSet += 1;
i--;
@@ -131,17 +140,29 @@ public class TimestampRepair {
repaired[i - 1] = ps;
repairedValue[i - 1] = Double.NaN;
unionSet += 1;
- System.out.println("add, " + ps + "," + original[j - 1]);
+ /*
+ if(logger.isDebugEnabled()){
+ logger.debug("add, " + ps + "," + original[j - 1]);
+ }
+ */
i--;
} else {
// delete points
unionSet += 1;
- System.out.println(time[j - 1] + ",delete" + "," + original[j - 1]);
+ /*
+ if(logger.isDebugEnabled()){
+ logger.debug(time[j - 1] + ",delete" + "," + original[j - 1]);
+ }
+ */
j--;
}
}
- System.out.println(joinSet / unionSet);
- System.out.println(f[n_][m_] / n_);
+ /*
+ if(logger.isDebugEnabled()) {
+ logger.debug(joinSet / unionSet);
+ logger.debug(f[n_][m_] / n_);
+ }
+ */
}
public double[] getRepairedValue() {
diff --git a/library-udf/src/main/java/org/apache/iotdb/library/drepair/util/ValueFill.java b/library-udf/src/main/java/org/apache/iotdb/library/drepair/util/ValueFill.java
index b3bdb33eec..1275f960db 100644
--- a/library-udf/src/main/java/org/apache/iotdb/library/drepair/util/ValueFill.java
+++ b/library-udf/src/main/java/org/apache/iotdb/library/drepair/util/ValueFill.java
@@ -20,6 +20,7 @@ package org.apache.iotdb.library.drepair.util;
import org.apache.iotdb.db.query.udf.api.access.Row;
import org.apache.iotdb.db.query.udf.api.access.RowIterator;
+import org.apache.iotdb.db.query.udf.api.exception.UDFException;
import org.apache.iotdb.library.util.Util;
import java.util.ArrayList;
@@ -52,7 +53,7 @@ public abstract class ValueFill {
repaired = new double[n];
}
- public abstract void fill();
+ public abstract void fill() throws UDFException;
public long[] getTime() {
return time;
@@ -62,14 +63,16 @@ public abstract class ValueFill {
return repaired;
};
- public void calMeanAndVar() {
+ public void calMeanAndVar() throws UDFException {
for (double v : original) {
if (!Double.isNaN(v)) {
mean += v;
not_nan_number += 1;
}
}
- assert not_nan_number > 0 : "All values are NaN";
+ if (not_nan_number == 0) {
+ throw new UDFException("All values are NaN");
+ }
mean /= not_nan_number;
for (double v : original) {
if (!Double.isNaN(v)) {
diff --git a/library-udf/src/main/java/org/apache/iotdb/library/drepair/util/ValueRepair.java b/library-udf/src/main/java/org/apache/iotdb/library/drepair/util/ValueRepair.java
index 5b47ac776c..0d8f53256a 100644
--- a/library-udf/src/main/java/org/apache/iotdb/library/drepair/util/ValueRepair.java
+++ b/library-udf/src/main/java/org/apache/iotdb/library/drepair/util/ValueRepair.java
@@ -22,10 +22,7 @@ import org.apache.iotdb.db.query.udf.api.access.Row;
import org.apache.iotdb.db.query.udf.api.access.RowIterator;
import org.apache.iotdb.library.util.Util;
-import java.io.File;
-import java.text.SimpleDateFormat;
import java.util.ArrayList;
-import java.util.Scanner;
public abstract class ValueRepair {
@@ -54,29 +51,6 @@ public abstract class ValueRepair {
processNaN();
}
- public ValueRepair(String filename) throws Exception {
- Scanner sc = new Scanner(new File(filename));
- SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
- sc.useDelimiter("\\s*(,|\\r|\\n)\\s*");
- sc.nextLine();
- ArrayList<Long> timeList = new ArrayList<>();
- ArrayList<Double> originList = new ArrayList<>();
- while (sc.hasNext()) {
- timeList.add(format.parse(sc.next()).getTime());
- Double v = sc.nextDouble();
- if (!Double.isFinite(v)) {
- originList.add(Double.NaN);
- } else {
- originList.add(v);
- }
- }
- time = Util.toLongArray(timeList);
- original = Util.toDoubleArray(originList);
- n = time.length;
- repaired = new double[n];
- processNaN();
- }
-
public abstract void repair();
private void processNaN() throws Exception {
diff --git a/library-udf/src/main/java/org/apache/iotdb/library/frequency/util/FFTUtil.java b/library-udf/src/main/java/org/apache/iotdb/library/frequency/util/FFTUtil.java
index e3fde4e7de..848a158794 100644
--- a/library-udf/src/main/java/org/apache/iotdb/library/frequency/util/FFTUtil.java
+++ b/library-udf/src/main/java/org/apache/iotdb/library/frequency/util/FFTUtil.java
@@ -20,10 +20,14 @@ package org.apache.iotdb.library.frequency.util;
import org.apache.iotdb.db.query.udf.api.collector.PointCollector;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
/** Util for UDFFFT */
public class FFTUtil {
private final String result;
private final double compressRate;
+ private static final Logger logger = LoggerFactory.getLogger(FFTUtil.class);
public FFTUtil(String res, double cmprate) {
this.result = res;
@@ -44,7 +48,9 @@ public class FFTUtil {
add(collector, a, i);
temp += (a[2 * i] * a[2 * i] + a[2 * i + 1] * a[2 * i + 1]) * 2;
if (temp > compressRate * sum) {
- System.out.println(i);
+ if (logger.isDebugEnabled()) {
+ logger.debug(String.valueOf(i));
+ }
break;
}
}
diff --git a/library-udf/src/main/java/org/apache/iotdb/library/util/LinearRegression.java b/library-udf/src/main/java/org/apache/iotdb/library/util/LinearRegression.java
index d5362a8eef..b79ac7f8c3 100644
--- a/library-udf/src/main/java/org/apache/iotdb/library/util/LinearRegression.java
+++ b/library-udf/src/main/java/org/apache/iotdb/library/util/LinearRegression.java
@@ -18,6 +18,8 @@
*/
package org.apache.iotdb.library.util;
+import org.apache.iotdb.db.query.udf.api.exception.UDFException;
+
import java.util.Arrays;
/**
@@ -40,6 +42,9 @@ public class LinearRegression {
if (x.length != y.length) {
throw new Exception("Different input array length.");
}
+ if (x.length == 1) { // cannot do regression
+ throw new Exception("Input series should be longer than 1.");
+ }
e = new double[n];
yhead = new double[n];
sumx = Arrays.stream(x).sum();
@@ -55,6 +60,9 @@ public class LinearRegression {
yybar += (y[i] - ybar) * (y[i] - ybar);
xybar += (x[i] - xbar) * (y[i] - ybar);
}
+ if (xxbar == 0d) {
+ throw new UDFException("All input x are same.");
+ }
beta1 = xybar / xxbar;
beta0 = ybar - beta1 * xbar;
// analyze results
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 0329628119..0691bd3e19 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
@@ -200,7 +200,7 @@ public class Util {
int n = origin.length;
double[] var = new double[n - 1];
for (int i = 0; i < n - 1; i++) {
- var[i] = origin[i + 1] - origin[i];
+ var[i] = (double) (origin[i + 1] - origin[i]);
}
return var;
}
@@ -291,13 +291,13 @@ public class Util {
unit = 1000;
s = s.substring(0, s.length() - 1);
} else if (s.endsWith("m")) {
- unit = 60 * 1000;
+ unit = 60 * 1000L;
s = s.substring(0, s.length() - 1);
} else if (s.endsWith("h")) {
- unit = 60 * 60 * 1000;
+ unit = 60 * 60 * 1000L;
s = s.substring(0, s.length() - 1);
} else if (s.endsWith("d")) {
- unit = 24 * 60 * 60 * 1000;
+ unit = 24 * 60 * 60 * 1000L;
s = s.substring(0, s.length() - 1);
}
double v = Double.parseDouble(s);