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/02/15 17:27:34 UTC
[iotdb] branch iotdb-2538 updated: add ITs
This is an automated email from the ASF dual-hosted git repository.
rong pushed a commit to branch iotdb-2538
in repository https://gitbox.apache.org/repos/asf/iotdb.git
The following commit(s) were added to refs/heads/iotdb-2538 by this push:
new cf5177b add ITs
cf5177b is described below
commit cf5177b3d841bdede29fd51e6c03dd51b1d327dc
Author: Steve Yurong Su <ro...@apache.org>
AuthorDate: Wed Feb 16 01:24:55 2022 +0800
add ITs
---
.../iotdb/db/query/udf/example/WindowStartEnd.java | 66 +++++++++
.../db/integration/IoTDBUDFWindowQueryIT.java | 165 ++++++++++++++++++++-
.../iotdb/db/query/udf/api/access/RowWindow.java | 8 +-
.../layer/MultiInputColumnIntermediateLayer.java | 6 +-
...InputColumnMultiReferenceIntermediateLayer.java | 6 +-
...nputColumnSingleReferenceIntermediateLayer.java | 6 +-
6 files changed, 247 insertions(+), 10 deletions(-)
diff --git a/integration/src/main/java/org/apache/iotdb/db/query/udf/example/WindowStartEnd.java b/integration/src/main/java/org/apache/iotdb/db/query/udf/example/WindowStartEnd.java
new file mode 100644
index 0000000..2745bec
--- /dev/null
+++ b/integration/src/main/java/org/apache/iotdb/db/query/udf/example/WindowStartEnd.java
@@ -0,0 +1,66 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.iotdb.db.query.udf.example;
+
+import org.apache.iotdb.db.query.udf.api.UDTF;
+import org.apache.iotdb.db.query.udf.api.access.RowWindow;
+import org.apache.iotdb.db.query.udf.api.collector.PointCollector;
+import org.apache.iotdb.db.query.udf.api.customizer.config.UDTFConfigurations;
+import org.apache.iotdb.db.query.udf.api.customizer.parameter.UDFParameters;
+import org.apache.iotdb.db.query.udf.api.customizer.strategy.SlidingSizeWindowAccessStrategy;
+import org.apache.iotdb.db.query.udf.api.customizer.strategy.SlidingTimeWindowAccessStrategy;
+import org.apache.iotdb.tsfile.file.metadata.enums.TSDataType;
+
+import java.io.IOException;
+
+public class WindowStartEnd implements UDTF {
+
+ @Override
+ public void beforeStart(UDFParameters parameters, UDTFConfigurations configurations) {
+ configurations.setOutputDataType(TSDataType.INT64);
+ if (ExampleUDFConstant.ACCESS_STRATEGY_SLIDING_SIZE.equals(
+ parameters.getString(ExampleUDFConstant.ACCESS_STRATEGY_KEY))) {
+ configurations.setAccessStrategy(
+ parameters.hasAttribute(ExampleUDFConstant.SLIDING_STEP_KEY)
+ ? new SlidingSizeWindowAccessStrategy(
+ parameters.getInt(ExampleUDFConstant.WINDOW_SIZE_KEY),
+ parameters.getInt(ExampleUDFConstant.SLIDING_STEP_KEY))
+ : new SlidingSizeWindowAccessStrategy(
+ parameters.getInt(ExampleUDFConstant.WINDOW_SIZE_KEY)));
+ } else {
+ configurations.setAccessStrategy(
+ parameters.hasAttribute(ExampleUDFConstant.SLIDING_STEP_KEY)
+ && parameters.hasAttribute(ExampleUDFConstant.DISPLAY_WINDOW_BEGIN_KEY)
+ && parameters.hasAttribute(ExampleUDFConstant.DISPLAY_WINDOW_END_KEY)
+ ? new SlidingTimeWindowAccessStrategy(
+ parameters.getLong(ExampleUDFConstant.TIME_INTERVAL_KEY),
+ parameters.getLong(ExampleUDFConstant.SLIDING_STEP_KEY),
+ parameters.getLong(ExampleUDFConstant.DISPLAY_WINDOW_BEGIN_KEY),
+ parameters.getLong(ExampleUDFConstant.DISPLAY_WINDOW_END_KEY))
+ : new SlidingTimeWindowAccessStrategy(
+ parameters.getLong(ExampleUDFConstant.TIME_INTERVAL_KEY)));
+ }
+ }
+
+ @Override
+ public void transform(RowWindow rowWindow, PointCollector collector) throws IOException {
+ collector.putLong(rowWindow.windowStartTime(), rowWindow.windowEndTime());
+ }
+}
diff --git a/integration/src/test/java/org/apache/iotdb/db/integration/IoTDBUDFWindowQueryIT.java b/integration/src/test/java/org/apache/iotdb/db/integration/IoTDBUDFWindowQueryIT.java
index 5aff041..808d319 100644
--- a/integration/src/test/java/org/apache/iotdb/db/integration/IoTDBUDFWindowQueryIT.java
+++ b/integration/src/test/java/org/apache/iotdb/db/integration/IoTDBUDFWindowQueryIT.java
@@ -93,6 +93,8 @@ public class IoTDBUDFWindowQueryIT {
"create function size_window_0 as 'org.apache.iotdb.db.query.udf.example.SlidingSizeWindowConstructorTester0'");
statement.execute(
"create function size_window_1 as 'org.apache.iotdb.db.query.udf.example.SlidingSizeWindowConstructorTester1'");
+ statement.execute(
+ "create function window_start_end as 'org.apache.iotdb.db.query.udf.example.WindowStartEnd'");
} catch (SQLException throwable) {
fail(throwable.getMessage());
}
@@ -202,6 +204,39 @@ public class IoTDBUDFWindowQueryIT {
fail(throwable.getMessage());
}
}
+
+ sql =
+ String.format(
+ "select window_start_end(s1, '%s'='%s', '%s'='%s') from root.vehicle.d1",
+ ExampleUDFConstant.ACCESS_STRATEGY_KEY,
+ ExampleUDFConstant.ACCESS_STRATEGY_SLIDING_SIZE,
+ ExampleUDFConstant.WINDOW_SIZE_KEY,
+ windowSize);
+
+ try (Connection conn = EnvFactory.getEnv().getConnection();
+ Statement statement = conn.createStatement()) {
+ ResultSet resultSet = statement.executeQuery(sql);
+ assertEquals(2, resultSet.getMetaData().getColumnCount());
+
+ int count = 0;
+ while (resultSet.next()) {
+ int expectedWindowSize =
+ (count < ITERATION_TIMES / windowSize)
+ ? windowSize
+ : ITERATION_TIMES - (ITERATION_TIMES / windowSize) * windowSize;
+
+ assertEquals(count * windowSize, (int) (Long.parseLong(resultSet.getString(1))));
+ assertEquals(
+ expectedWindowSize - 1,
+ Long.parseLong(resultSet.getString(2)) - Long.parseLong(resultSet.getString(1)));
+
+ ++count;
+ }
+ } catch (SQLException throwable) {
+ if (0 < windowSize || !throwable.getMessage().contains(String.valueOf(windowSize))) {
+ fail(throwable.getMessage());
+ }
+ }
}
@Test
@@ -333,6 +368,42 @@ public class IoTDBUDFWindowQueryIT {
fail(throwable.getMessage());
}
}
+
+ sql =
+ String.format(
+ "select window_start_end(s1, s1, s1, '%s'='%s', '%s'='%s', '%s'='%s', '%s'='%s', '%s'='%s') from root.vehicle.d1",
+ ExampleUDFConstant.ACCESS_STRATEGY_KEY,
+ ExampleUDFConstant.ACCESS_STRATEGY_SLIDING_TIME,
+ ExampleUDFConstant.TIME_INTERVAL_KEY,
+ timeInterval,
+ ExampleUDFConstant.SLIDING_STEP_KEY,
+ slidingStep,
+ ExampleUDFConstant.DISPLAY_WINDOW_BEGIN_KEY,
+ displayWindowBegin,
+ ExampleUDFConstant.DISPLAY_WINDOW_END_KEY,
+ displayWindowEnd);
+
+ try (Connection conn = EnvFactory.getEnv().getConnection();
+ Statement statement = conn.createStatement()) {
+ ResultSet resultSet = statement.executeQuery(sql);
+ assertEquals(2, resultSet.getMetaData().getColumnCount());
+
+ int count = 0;
+ while (resultSet.next()) {
+ int begin = displayWindowBegin + count * slidingStep;
+
+ assertEquals(begin, (int) (Long.parseLong(resultSet.getString(1))));
+ assertEquals(
+ timeInterval - 1,
+ Long.parseLong(resultSet.getString(2)) - Long.parseLong(resultSet.getString(1)));
+
+ ++count;
+ }
+ } catch (SQLException throwable) {
+ if (slidingStep > 0 && timeInterval > 0 && displayWindowEnd >= displayWindowBegin) {
+ fail(throwable.getMessage());
+ }
+ }
}
@Test
@@ -365,7 +436,7 @@ public class IoTDBUDFWindowQueryIT {
testSlidingTimeWindowWithTimeIntervalOnly(-ITERATION_TIMES);
}
- public void testSlidingTimeWindowWithTimeIntervalOnly(int timeInterval) {
+ private void testSlidingTimeWindowWithTimeIntervalOnly(int timeInterval) {
String sql =
String.format(
"select time_window_tester(s1, '%s'='%s') from root.vehicle.d1",
@@ -399,6 +470,33 @@ public class IoTDBUDFWindowQueryIT {
fail(throwable.getMessage());
}
}
+
+ sql =
+ String.format(
+ "select window_start_end(s1, '%s'='%s') from root.vehicle.d1",
+ ExampleUDFConstant.TIME_INTERVAL_KEY, timeInterval);
+
+ try (Connection conn = EnvFactory.getEnv().getConnection();
+ Statement statement = conn.createStatement()) {
+ ResultSet resultSet = statement.executeQuery(sql);
+ assertEquals(2, resultSet.getMetaData().getColumnCount());
+
+ int count = 0;
+ while (resultSet.next()) {
+ int begin = displayWindowBegin + count * timeInterval;
+
+ assertEquals(begin, (int) (Long.parseLong(resultSet.getString(1))));
+ assertEquals(
+ timeInterval - 1,
+ Long.parseLong(resultSet.getString(2)) - Long.parseLong(resultSet.getString(1)));
+
+ ++count;
+ }
+ } catch (SQLException throwable) {
+ if (timeInterval > 0) {
+ fail(throwable.getMessage());
+ }
+ }
}
@Test
@@ -483,7 +581,7 @@ public class IoTDBUDFWindowQueryIT {
(int) (1.5 * ITERATION_TIMES));
}
- public void testSlidingSizeWindowWithSlidingStep(
+ private void testSlidingSizeWindowWithSlidingStep(
int windowSize, int slidingStep, int consumptionPoint) {
String sql =
String.format(
@@ -505,7 +603,7 @@ public class IoTDBUDFWindowQueryIT {
if (ITERATION_TIMES < windowSize) {
String actual = resultSet.getString(2);
if (actual != null) {
- assertEquals(ITERATION_TIMES - count * slidingStep, Integer.parseInt(actual));
+ assertEquals(ITERATION_TIMES - (long) count * slidingStep, Integer.parseInt(actual));
++count;
}
} else if (count * slidingStep + windowSize < ITERATION_TIMES) {
@@ -518,7 +616,66 @@ public class IoTDBUDFWindowQueryIT {
String actual = resultSet.getString(2);
if (actual != null) {
assertEquals(
- ITERATION_TIMES - count * slidingStep, Integer.parseInt(resultSet.getString(2)));
+ ITERATION_TIMES - (long) count * slidingStep,
+ Integer.parseInt(resultSet.getString(2)));
+ ++count;
+ }
+ }
+ }
+ assertEquals((int) Math.ceil(ITERATION_TIMES / (double) slidingStep), count);
+ } catch (SQLException throwable) {
+ if (windowSize > 0) {
+ fail(throwable.getMessage());
+ }
+ }
+
+ sql =
+ String.format(
+ "select window_start_end(s1, '%s'='%s', '%s'='%s', '%s'='%s'), size_window_1(s1, '%s'='%s') from root.vehicle.d1",
+ ExampleUDFConstant.ACCESS_STRATEGY_KEY,
+ ExampleUDFConstant.ACCESS_STRATEGY_SLIDING_SIZE,
+ ExampleUDFConstant.WINDOW_SIZE_KEY,
+ windowSize,
+ ExampleUDFConstant.SLIDING_STEP_KEY,
+ slidingStep,
+ "consumptionPoint",
+ consumptionPoint);
+
+ try (Connection conn = EnvFactory.getEnv().getConnection();
+ Statement statement = conn.createStatement()) {
+ ResultSet resultSet = statement.executeQuery(sql);
+ assertEquals(3, resultSet.getMetaData().getColumnCount());
+
+ int count = 0;
+ while (resultSet.next()) {
+
+ if (ITERATION_TIMES < windowSize) {
+ String actual = resultSet.getString(2);
+ if (actual != null) {
+ assertEquals(count * slidingStep, Integer.parseInt(resultSet.getString(1)));
+ assertEquals(
+ ITERATION_TIMES - (long) count * slidingStep - 1,
+ Integer.parseInt(actual) - Integer.parseInt(resultSet.getString(1)));
+ ++count;
+ }
+ } else if (count * slidingStep + windowSize < ITERATION_TIMES) {
+ String actual = resultSet.getString(2);
+ if (actual != null) {
+ assertEquals(count * slidingStep, Integer.parseInt(resultSet.getString(1)));
+ assertEquals(
+ windowSize - 1,
+ Integer.parseInt(resultSet.getString(2))
+ - Integer.parseInt(resultSet.getString(1)));
+ ++count;
+ }
+ } else {
+ String actual = resultSet.getString(2);
+ if (actual != null) {
+ assertEquals(count * slidingStep, Integer.parseInt(resultSet.getString(1)));
+ assertEquals(
+ ITERATION_TIMES - (long) count * slidingStep - 1,
+ Integer.parseInt(resultSet.getString(2))
+ - Integer.parseInt(resultSet.getString(1)));
++count;
}
}
diff --git a/server/src/main/java/org/apache/iotdb/db/query/udf/api/access/RowWindow.java b/server/src/main/java/org/apache/iotdb/db/query/udf/api/access/RowWindow.java
index 10bcbc7..54b6caf 100644
--- a/server/src/main/java/org/apache/iotdb/db/query/udf/api/access/RowWindow.java
+++ b/server/src/main/java/org/apache/iotdb/db/query/udf/api/access/RowWindow.java
@@ -73,9 +73,10 @@ public interface RowWindow {
* The window start time for the i-th window (i starts at 0) can be calculated as {@code
* displayWindowBegin + i * slidingStep}.
*
+ * @return the start time of the window
+ * @since 0.13.0
* @see SlidingSizeWindowAccessStrategy
* @see SlidingTimeWindowAccessStrategy
- * @return the start time of the window
*/
long windowStartTime();
@@ -89,12 +90,13 @@ public interface RowWindow {
* SlidingTimeWindowAccessStrategy#getTimeInterval()} and slidingStep {@link
* SlidingTimeWindowAccessStrategy#getSlidingStep()}. <br>
* The window end time for the i-th window (i starts at 0) can be calculated as {@code
- * displayWindowBegin + timeInterval + i * slidingStep - 1} or {@code windowStartTime() +
+ * displayWindowBegin + i * slidingStep + timeInterval - 1} or {@code windowStartTime(i) +
* timeInterval - 1}.
*
+ * @return the end time of the window
+ * @since 0.13.0
* @see SlidingSizeWindowAccessStrategy
* @see SlidingTimeWindowAccessStrategy
- * @return the end time of the window
*/
long windowEndTime();
}
diff --git a/server/src/main/java/org/apache/iotdb/db/query/udf/core/layer/MultiInputColumnIntermediateLayer.java b/server/src/main/java/org/apache/iotdb/db/query/udf/core/layer/MultiInputColumnIntermediateLayer.java
index 8421ec7..5053672 100644
--- a/server/src/main/java/org/apache/iotdb/db/query/udf/core/layer/MultiInputColumnIntermediateLayer.java
+++ b/server/src/main/java/org/apache/iotdb/db/query/udf/core/layer/MultiInputColumnIntermediateLayer.java
@@ -337,7 +337,11 @@ public class MultiInputColumnIntermediateLayer extends IntermediateLayer
break;
}
}
- window.seek(nextIndexBegin, nextIndexEnd, nextWindowTimeBegin, nextWindowTimeEnd - 1);
+ window.seek(
+ nextIndexBegin,
+ nextIndexEnd,
+ nextWindowTimeBegin,
+ nextWindowTimeBegin + timeInterval - 1);
hasCached = nextIndexBegin != nextIndexEnd;
return hasCached;
diff --git a/server/src/main/java/org/apache/iotdb/db/query/udf/core/layer/SingleInputColumnMultiReferenceIntermediateLayer.java b/server/src/main/java/org/apache/iotdb/db/query/udf/core/layer/SingleInputColumnMultiReferenceIntermediateLayer.java
index 43404e5..eb8f10f 100644
--- a/server/src/main/java/org/apache/iotdb/db/query/udf/core/layer/SingleInputColumnMultiReferenceIntermediateLayer.java
+++ b/server/src/main/java/org/apache/iotdb/db/query/udf/core/layer/SingleInputColumnMultiReferenceIntermediateLayer.java
@@ -327,7 +327,11 @@ public class SingleInputColumnMultiReferenceIntermediateLayer extends Intermedia
break;
}
}
- window.seek(nextIndexBegin, nextIndexEnd, nextWindowTimeBegin, nextWindowTimeEnd - 1);
+ window.seek(
+ nextIndexBegin,
+ nextIndexEnd,
+ nextWindowTimeBegin,
+ nextWindowTimeBegin + timeInterval - 1);
hasCached = nextIndexBegin != nextIndexEnd;
return hasCached;
diff --git a/server/src/main/java/org/apache/iotdb/db/query/udf/core/layer/SingleInputColumnSingleReferenceIntermediateLayer.java b/server/src/main/java/org/apache/iotdb/db/query/udf/core/layer/SingleInputColumnSingleReferenceIntermediateLayer.java
index dc5c347..7a8822d 100644
--- a/server/src/main/java/org/apache/iotdb/db/query/udf/core/layer/SingleInputColumnSingleReferenceIntermediateLayer.java
+++ b/server/src/main/java/org/apache/iotdb/db/query/udf/core/layer/SingleInputColumnSingleReferenceIntermediateLayer.java
@@ -240,7 +240,11 @@ public class SingleInputColumnSingleReferenceIntermediateLayer extends Intermedi
break;
}
}
- window.seek(nextIndexBegin, nextIndexEnd, nextWindowTimeBegin, nextWindowTimeEnd - 1);
+ window.seek(
+ nextIndexBegin,
+ nextIndexEnd,
+ nextWindowTimeBegin,
+ nextWindowTimeBegin + timeInterval - 1);
hasCached = nextIndexBegin != nextIndexEnd;
return hasCached;