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;