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

leirui pushed a commit to branch research/M4-visualization
in repository https://gitbox.apache.org/repos/asf/iotdb.git

commit dbeeaccfecbb86d29b1372319b9e8fa882b81d59
Author: Lei Rui <[email protected]>
AuthorDate: Mon Jun 12 16:07:52 2023 +0800

    add log info for plan type
---
 .../apache/iotdb/db/qp/executor/PlanExecutor.java  |  12 +-
 .../apache/iotdb/db/integration/m4/MyTmpTest.java  | 675 +++++++++++++++++++++
 .../iotdb/tsfile/read/common/IOMonitor2.java       |  12 +
 3 files changed, 695 insertions(+), 4 deletions(-)

diff --git 
a/server/src/main/java/org/apache/iotdb/db/qp/executor/PlanExecutor.java 
b/server/src/main/java/org/apache/iotdb/db/qp/executor/PlanExecutor.java
index 6d7db03c876..a37e1ddf3a2 100644
--- a/server/src/main/java/org/apache/iotdb/db/qp/executor/PlanExecutor.java
+++ b/server/src/main/java/org/apache/iotdb/db/qp/executor/PlanExecutor.java
@@ -135,6 +135,8 @@ import 
org.apache.iotdb.tsfile.file.metadata.TimeseriesMetadata;
 import org.apache.iotdb.tsfile.file.metadata.enums.TSDataType;
 import org.apache.iotdb.tsfile.read.TsFileSequenceReader;
 import org.apache.iotdb.tsfile.read.common.Field;
+import org.apache.iotdb.tsfile.read.common.IOMonitor2;
+import org.apache.iotdb.tsfile.read.common.IOMonitor2.DataSetType;
 import org.apache.iotdb.tsfile.read.common.Path;
 import org.apache.iotdb.tsfile.read.common.RowRecord;
 import org.apache.iotdb.tsfile.read.query.dataset.EmptyDataSet;
@@ -524,14 +526,14 @@ public class PlanExecutor implements IPlanExecutor {
         // no time series are selected, return EmptyDataSet
         return new EmptyDataSet();
       } else if (queryPlan instanceof UDTFPlan) {
-        logger.info("UDTFPlan");
+        IOMonitor2.dataSetType = DataSetType.UDTFAlignByTimeDataSet;
         UDTFPlan udtfPlan = (UDTFPlan) queryPlan;
         queryDataSet = queryRouter.udtfQuery(udtfPlan, context);
       } else if (queryPlan instanceof GroupByTimeFillPlan) {
         GroupByTimeFillPlan groupByFillPlan = (GroupByTimeFillPlan) queryPlan;
         queryDataSet = queryRouter.groupByFill(groupByFillPlan, context);
       } else if (queryPlan instanceof GroupByTimePlan) {
-        logger.info("GroupByTimePlan");
+        IOMonitor2.dataSetType = DataSetType.GroupByWithoutValueFilterDataSet;
         GroupByTimePlan groupByTimePlan = (GroupByTimePlan) queryPlan;
         queryDataSet = queryRouter.groupBy(groupByTimePlan, context);
       } else if (queryPlan instanceof QueryIndexPlan) {
@@ -545,7 +547,7 @@ public class PlanExecutor implements IPlanExecutor {
       } else if (queryPlan instanceof LastQueryPlan) {
         queryDataSet = queryRouter.lastQuery((LastQueryPlan) queryPlan, 
context);
       } else {
-        logger.info("RawDataQueryPlan");
+        IOMonitor2.dataSetType = DataSetType.RawQueryDataSetWithoutValueFilter;
         queryDataSet = queryRouter.rawDataQuery((RawDataQueryPlan) queryPlan, 
context);
       }
     }
@@ -1045,7 +1047,9 @@ public class PlanExecutor implements IPlanExecutor {
     Collections.sort(
         tsfiles,
         (o1, o2) -> {
-          if (establishTime[o1] == establishTime[o2]) return 0;
+          if (establishTime[o1] == establishTime[o2]) {
+            return 0;
+          }
           return establishTime[o1] < establishTime[o2] ? -1 : 1;
         });
     for (Integer i : tsfiles) {
diff --git 
a/server/src/test/java/org/apache/iotdb/db/integration/m4/MyTmpTest.java 
b/server/src/test/java/org/apache/iotdb/db/integration/m4/MyTmpTest.java
new file mode 100644
index 00000000000..677c79ab535
--- /dev/null
+++ b/server/src/test/java/org/apache/iotdb/db/integration/m4/MyTmpTest.java
@@ -0,0 +1,675 @@
+/*
+ * 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.integration.m4;
+
+import org.apache.iotdb.db.conf.IoTDBConfig;
+import org.apache.iotdb.db.conf.IoTDBDescriptor;
+import org.apache.iotdb.db.engine.compaction.CompactionStrategy;
+import org.apache.iotdb.db.utils.EnvironmentUtils;
+import org.apache.iotdb.jdbc.Config;
+import org.apache.iotdb.tsfile.common.conf.TSFileDescriptor;
+
+import org.junit.After;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+
+import java.sql.Connection;
+import java.sql.DriverManager;
+import java.sql.ResultSet;
+import java.sql.Statement;
+import java.util.Locale;
+
+import static org.junit.Assert.fail;
+
+public class MyTmpTest {
+
+  private static final String TIMESTAMP_STR = "Time";
+
+  private static String[] creationSqls =
+      new String[] {
+        "SET STORAGE GROUP TO root.vehicle.d0",
+        "CREATE TIMESERIES root.vehicle.d0.s0 WITH DATATYPE=INT64, 
ENCODING=PLAIN",
+        // IoTDB int data type does not support plain encoding, so use long 
data type
+      };
+
+  private final String d0s0 = "root.vehicle.d0.s0";
+
+  private static final String insertTemplate =
+      "INSERT INTO root.vehicle.d0(timestamp,s0)" + " VALUES(%d,%d)";
+
+  private static final IoTDBConfig config = 
IoTDBDescriptor.getInstance().getConfig();
+  private static boolean originalEnableCPV;
+  private static boolean originalUseChunkIndex;
+
+  private static boolean originalUseMad;
+  private static CompactionStrategy originalCompactionStrategy;
+
+  @Before
+  public void setUp() throws Exception {
+    TSFileDescriptor.getInstance().getConfig().setTimeEncoder("PLAIN");
+    originalCompactionStrategy = config.getCompactionStrategy();
+    config.setCompactionStrategy(CompactionStrategy.NO_COMPACTION);
+
+    originalEnableCPV = config.isEnableCPV();
+    config.setEnableCPV(true); // CPV
+
+    originalUseChunkIndex = 
TSFileDescriptor.getInstance().getConfig().isUseChunkIndex();
+    TSFileDescriptor.getInstance().getConfig().setUseChunkIndex(false);
+
+    originalUseMad = TSFileDescriptor.getInstance().getConfig().isUseMad();
+    TSFileDescriptor.getInstance().getConfig().setUseMad(true);
+
+    EnvironmentUtils.envSetUp();
+    Class.forName(Config.JDBC_DRIVER_NAME);
+    config.setTimestampPrecision("ms");
+  }
+
+  @After
+  public void tearDown() throws Exception {
+    EnvironmentUtils.cleanEnv();
+    config.setCompactionStrategy(originalCompactionStrategy);
+    config.setEnableCPV(originalEnableCPV);
+    
TSFileDescriptor.getInstance().getConfig().setUseChunkIndex(originalUseChunkIndex);
+    TSFileDescriptor.getInstance().getConfig().setUseMad(originalUseMad);
+  }
+
+  @Test
+  public void test1() throws Exception {
+    prepareData1();
+
+    String[] res =
+        new String[] {
+          "0,1,20,5,20,5[1],30[10]",
+          "25,25,45,8,30,8[25],40[30]",
+          "50,52,54,8,18,8[52],18[54]",
+          "75,null,null,null,null,null,null"
+        };
+    try (Connection connection =
+            DriverManager.getConnection("jdbc:iotdb://127.0.0.1:6667/", 
"root", "root");
+        Statement statement = connection.createStatement()) {
+      boolean hasResultSet =
+          statement.execute(
+              "SELECT M4(s0,'tqs'='0','tqe'='100','w'='4')"
+                  + " FROM root.vehicle.d0 where time>=0 and time<100");
+
+      Assert.assertTrue(hasResultSet);
+      try (ResultSet resultSet = statement.getResultSet()) {
+        int i = 0;
+        while (resultSet.next()) {
+          String ans = resultSet.getString(TIMESTAMP_STR) + "," + 
resultSet.getString(1);
+          System.out.println(ans);
+          //          Assert.assertEquals(res[i++], ans);
+        }
+      }
+    } catch (Exception e) {
+      e.printStackTrace();
+      fail(e.getMessage());
+    }
+  }
+
+  @Test
+  public void test5() throws Exception {
+    prepareData5();
+
+    String[] res =
+        new String[] {
+          "0,1,20,5,20,5[1],30[10]",
+          "25,25,45,8,30,8[25],40[30]",
+          "50,null,null,null,null,null,null",
+          "75,null,null,null,null,null,null"
+        };
+    try (Connection connection =
+            DriverManager.getConnection("jdbc:iotdb://127.0.0.1:6667/", 
"root", "root");
+        Statement statement = connection.createStatement()) {
+      boolean hasResultSet =
+          statement.execute(
+              "SELECT min_time(s0), max_time(s0), first_value(s0), 
last_value(s0), min_value(s0), max_value(s0)"
+                  + " FROM root.vehicle.d0 group by ([0,100),25ms)");
+
+      Assert.assertTrue(hasResultSet);
+      try (ResultSet resultSet = statement.getResultSet()) {
+        int i = 0;
+        while (resultSet.next()) {
+          String ans =
+              resultSet.getString(TIMESTAMP_STR)
+                  + ","
+                  + resultSet.getString(String.format("min_time(%s)", d0s0))
+                  + ","
+                  + resultSet.getString(String.format("max_time(%s)", d0s0))
+                  + ","
+                  + resultSet.getString(String.format("first_value(%s)", d0s0))
+                  + ","
+                  + resultSet.getString(String.format("last_value(%s)", d0s0))
+                  + ","
+                  + resultSet.getString(String.format("min_value(%s)", d0s0))
+                  + ","
+                  + resultSet.getString(String.format("max_value(%s)", d0s0));
+          System.out.println(ans);
+          Assert.assertEquals(res[i++], ans);
+        }
+      }
+    } catch (Exception e) {
+      e.printStackTrace();
+      fail(e.getMessage());
+    }
+  }
+
+  private static void prepareData1() {
+    // data:
+    // 
https://user-images.githubusercontent.com/33376433/151985070-73158010-8ba0-409d-a1c1-df69bad1aaee.png
+    try (Connection connection =
+            DriverManager.getConnection(
+                Config.IOTDB_URL_PREFIX + "127.0.0.1:6667/", "root", "root");
+        Statement statement = connection.createStatement()) {
+
+      for (String sql : creationSqls) {
+        statement.execute(sql);
+      }
+
+      statement.execute(String.format(Locale.ENGLISH, insertTemplate, 1, 5));
+      statement.execute(String.format(Locale.ENGLISH, insertTemplate, 2, 15));
+      statement.execute(String.format(Locale.ENGLISH, insertTemplate, 20, 1));
+      statement.execute(String.format(Locale.ENGLISH, insertTemplate, 25, 8));
+      statement.execute(String.format(Locale.ENGLISH, insertTemplate, 54, 3));
+      statement.execute(String.format(Locale.ENGLISH, insertTemplate, 120, 8));
+      statement.execute("FLUSH");
+
+      statement.execute(String.format(Locale.ENGLISH, insertTemplate, 5, 10));
+      statement.execute(String.format(Locale.ENGLISH, insertTemplate, 8, 8));
+      statement.execute(String.format(Locale.ENGLISH, insertTemplate, 10, 30));
+      statement.execute(String.format(Locale.ENGLISH, insertTemplate, 20, 20));
+      statement.execute("FLUSH");
+
+      statement.execute(String.format(Locale.ENGLISH, insertTemplate, 27, 20));
+      statement.execute(String.format(Locale.ENGLISH, insertTemplate, 30, 40));
+      statement.execute(String.format(Locale.ENGLISH, insertTemplate, 35, 10));
+      statement.execute(String.format(Locale.ENGLISH, insertTemplate, 40, 20));
+      statement.execute("FLUSH");
+
+      statement.execute(String.format(Locale.ENGLISH, insertTemplate, 33, 9));
+      statement.execute(String.format(Locale.ENGLISH, insertTemplate, 45, 30));
+      statement.execute(String.format(Locale.ENGLISH, insertTemplate, 52, 8));
+      statement.execute(String.format(Locale.ENGLISH, insertTemplate, 54, 18));
+      statement.execute("FLUSH");
+
+    } catch (Exception e) {
+      e.printStackTrace();
+    }
+  }
+
+  private static void prepareData5() {
+    // data:
+    // 
https://user-images.githubusercontent.com/33376433/151985070-73158010-8ba0-409d-a1c1-df69bad1aaee.png
+    try (Connection connection =
+            DriverManager.getConnection(
+                Config.IOTDB_URL_PREFIX + "127.0.0.1:6667/", "root", "root");
+        Statement statement = connection.createStatement()) {
+
+      for (String sql : creationSqls) {
+        statement.execute(sql);
+      }
+
+      statement.execute(String.format(Locale.ENGLISH, insertTemplate, 1, 5));
+      statement.execute(String.format(Locale.ENGLISH, insertTemplate, 2, 15));
+      statement.execute(String.format(Locale.ENGLISH, insertTemplate, 20, 1));
+      statement.execute(String.format(Locale.ENGLISH, insertTemplate, 25, 8));
+      statement.execute(String.format(Locale.ENGLISH, insertTemplate, 54, 3));
+      statement.execute(String.format(Locale.ENGLISH, insertTemplate, 120, 8));
+      statement.execute("FLUSH");
+
+      statement.execute(String.format(Locale.ENGLISH, insertTemplate, 5, 10));
+      statement.execute(String.format(Locale.ENGLISH, insertTemplate, 8, 8));
+      statement.execute(String.format(Locale.ENGLISH, insertTemplate, 10, 30));
+      statement.execute(String.format(Locale.ENGLISH, insertTemplate, 20, 20));
+      statement.execute("FLUSH");
+
+      statement.execute(String.format(Locale.ENGLISH, insertTemplate, 27, 20));
+      statement.execute(String.format(Locale.ENGLISH, insertTemplate, 30, 40));
+      statement.execute(String.format(Locale.ENGLISH, insertTemplate, 35, 10));
+      statement.execute(String.format(Locale.ENGLISH, insertTemplate, 40, 20));
+      statement.execute("FLUSH");
+
+      statement.execute(String.format(Locale.ENGLISH, insertTemplate, 33, 9));
+      statement.execute(String.format(Locale.ENGLISH, insertTemplate, 45, 30));
+      statement.execute(String.format(Locale.ENGLISH, insertTemplate, 52, 8));
+      statement.execute(String.format(Locale.ENGLISH, insertTemplate, 54, 18));
+      statement.execute("FLUSH");
+
+      statement.execute("delete from root.vehicle.d0.s0 where time>=52 and 
time<=54");
+
+    } catch (Exception e) {
+      e.printStackTrace();
+    }
+  }
+
+  @Test
+  public void test2() { // add deletes
+    prepareData2();
+
+    String[] res =
+        new String[] {
+          "0,1,20,5,20,5[1],30[10]",
+          "25,25,27,8,20,8[25],20[27]",
+          "50,null,null,null,null,null,null",
+          "75,null,null,null,null,null,null"
+        };
+    try (Connection connection =
+            DriverManager.getConnection("jdbc:iotdb://127.0.0.1:6667/", 
"root", "root");
+        Statement statement = connection.createStatement()) {
+      boolean hasResultSet =
+          statement.execute(
+              "SELECT min_time(s0), max_time(s0), first_value(s0), 
last_value(s0), min_value(s0), max_value(s0)"
+                  + " FROM root.vehicle.d0 group by ([0,100),25ms)"); // don't 
change the
+      // sequence!!!
+
+      Assert.assertTrue(hasResultSet);
+      try (ResultSet resultSet = statement.getResultSet()) {
+        int i = 0;
+        while (resultSet.next()) {
+          String ans =
+              resultSet.getString(TIMESTAMP_STR)
+                  + ","
+                  + resultSet.getString(String.format("min_time(%s)", d0s0))
+                  + ","
+                  + resultSet.getString(String.format("max_time(%s)", d0s0))
+                  + ","
+                  + resultSet.getString(String.format("first_value(%s)", d0s0))
+                  + ","
+                  + resultSet.getString(String.format("last_value(%s)", d0s0))
+                  + ","
+                  + resultSet.getString(String.format("min_value(%s)", d0s0))
+                  + ","
+                  + resultSet.getString(String.format("max_value(%s)", d0s0));
+          System.out.println(ans);
+          Assert.assertEquals(res[i++], ans);
+        }
+      }
+    } catch (Exception e) {
+      e.printStackTrace();
+      fail(e.getMessage());
+    }
+  }
+
+  private static void prepareData2() {
+    // data:
+    // 
https://user-images.githubusercontent.com/33376433/151995378-07a2f8df-5cac-499a-ae88-e3b017eee07a.png
+    try (Connection connection =
+            DriverManager.getConnection(
+                Config.IOTDB_URL_PREFIX + "127.0.0.1:6667/", "root", "root");
+        Statement statement = connection.createStatement()) {
+
+      for (String sql : creationSqls) {
+        statement.execute(sql);
+      }
+
+      statement.execute(String.format(Locale.ENGLISH, insertTemplate, 1, 5));
+      statement.execute(String.format(Locale.ENGLISH, insertTemplate, 2, 15));
+      statement.execute(String.format(Locale.ENGLISH, insertTemplate, 20, 1));
+      statement.execute(String.format(Locale.ENGLISH, insertTemplate, 25, 8));
+      statement.execute(String.format(Locale.ENGLISH, insertTemplate, 54, 3));
+      statement.execute(String.format(Locale.ENGLISH, insertTemplate, 120, 8));
+      statement.execute("FLUSH");
+
+      statement.execute(String.format(Locale.ENGLISH, insertTemplate, 5, 10));
+      statement.execute(String.format(Locale.ENGLISH, insertTemplate, 8, 8));
+      statement.execute(String.format(Locale.ENGLISH, insertTemplate, 10, 30));
+      statement.execute(String.format(Locale.ENGLISH, insertTemplate, 20, 20));
+      statement.execute("FLUSH");
+
+      statement.execute(String.format(Locale.ENGLISH, insertTemplate, 27, 20));
+      statement.execute(String.format(Locale.ENGLISH, insertTemplate, 30, 40));
+      statement.execute(String.format(Locale.ENGLISH, insertTemplate, 35, 10));
+      statement.execute(String.format(Locale.ENGLISH, insertTemplate, 40, 20));
+      statement.execute("FLUSH");
+
+      statement.execute(String.format(Locale.ENGLISH, insertTemplate, 33, 9));
+      statement.execute(String.format(Locale.ENGLISH, insertTemplate, 45, 30));
+      statement.execute(String.format(Locale.ENGLISH, insertTemplate, 52, 8));
+      statement.execute(String.format(Locale.ENGLISH, insertTemplate, 54, 18));
+      statement.execute("FLUSH");
+
+      statement.execute("delete from root.vehicle.d0.s0 where time>=28 and 
time<=60");
+
+    } catch (Exception e) {
+      e.printStackTrace();
+    }
+  }
+
+  @Test
+  public void test2_2() { // use data2 but change the sql from group by 
([0,100),25ms) to group by
+    // ([0,150),25ms)
+    prepareData2();
+
+    String[] res =
+        new String[] {
+          "0,1,20,5,20,5[1],30[10]",
+          "25,25,27,8,20,8[25],20[27]",
+          "50,null,null,null,null,null,null",
+          "75,null,null,null,null,null,null",
+          "100,120,120,8,8,8[120],8[120]",
+          "125,null,null,null,null,null,null"
+        };
+    try (Connection connection =
+            DriverManager.getConnection("jdbc:iotdb://127.0.0.1:6667/", 
"root", "root");
+        Statement statement = connection.createStatement()) {
+      boolean hasResultSet =
+          statement.execute(
+              "SELECT min_time(s0), max_time(s0), first_value(s0), 
last_value(s0), min_value(s0), max_value(s0)"
+                  + " FROM root.vehicle.d0 group by ([0,150),25ms)"); // don't 
change the
+      // sequence!!!
+
+      Assert.assertTrue(hasResultSet);
+      try (ResultSet resultSet = statement.getResultSet()) {
+        int i = 0;
+        while (resultSet.next()) {
+          String ans =
+              resultSet.getString(TIMESTAMP_STR)
+                  + ","
+                  + resultSet.getString(String.format("min_time(%s)", d0s0))
+                  + ","
+                  + resultSet.getString(String.format("max_time(%s)", d0s0))
+                  + ","
+                  + resultSet.getString(String.format("first_value(%s)", d0s0))
+                  + ","
+                  + resultSet.getString(String.format("last_value(%s)", d0s0))
+                  + ","
+                  + resultSet.getString(String.format("min_value(%s)", d0s0))
+                  + ","
+                  + resultSet.getString(String.format("max_value(%s)", d0s0));
+          System.out.println(ans);
+          Assert.assertEquals(res[i++], ans);
+        }
+      }
+    } catch (Exception e) {
+      e.printStackTrace();
+      fail(e.getMessage());
+    }
+  }
+
+  @Test
+  public void test3() { // all seq
+    prepareData3();
+
+    String[] res =
+        new String[] {
+          "0,1,22,5,4,1[10],10[2]",
+          "25,30,40,8,2,2[40],8[30]",
+          "50,55,72,5,4,4[72],20[62]",
+          "75,80,90,11,1,1[90],11[80]"
+        };
+    try (Connection connection =
+            DriverManager.getConnection("jdbc:iotdb://127.0.0.1:6667/", 
"root", "root");
+        Statement statement = connection.createStatement()) {
+      boolean hasResultSet =
+          statement.execute(
+              "SELECT min_time(s0), max_time(s0), first_value(s0), 
last_value(s0), min_value(s0), max_value(s0)"
+                  + " FROM root.vehicle.d0 group by ([0,100),25ms)"); // don't 
change the
+      // sequence!!!
+
+      Assert.assertTrue(hasResultSet);
+      try (ResultSet resultSet = statement.getResultSet()) {
+        int i = 0;
+        while (resultSet.next()) {
+          String ans =
+              resultSet.getString(TIMESTAMP_STR)
+                  + ","
+                  + resultSet.getString(String.format("min_time(%s)", d0s0))
+                  + ","
+                  + resultSet.getString(String.format("max_time(%s)", d0s0))
+                  + ","
+                  + resultSet.getString(String.format("first_value(%s)", d0s0))
+                  + ","
+                  + resultSet.getString(String.format("last_value(%s)", d0s0))
+                  + ","
+                  + resultSet.getString(String.format("min_value(%s)", d0s0))
+                  + ","
+                  + resultSet.getString(String.format("max_value(%s)", d0s0));
+          System.out.println(ans);
+          Assert.assertEquals(res[i++], ans);
+        }
+      }
+    } catch (Exception e) {
+      e.printStackTrace();
+      fail(e.getMessage());
+    }
+  }
+
+  private static void prepareData3() {
+    // data:
+    // 
https://user-images.githubusercontent.com/33376433/152003603-6b4e7494-00ff-47e4-bf6e-cab3c8600ce2.png
+    try (Connection connection =
+            DriverManager.getConnection(
+                Config.IOTDB_URL_PREFIX + "127.0.0.1:6667/", "root", "root");
+        Statement statement = connection.createStatement()) {
+
+      for (String sql : creationSqls) {
+        statement.execute(sql);
+      }
+
+      statement.execute(String.format(Locale.ENGLISH, insertTemplate, 1, 5));
+      statement.execute(String.format(Locale.ENGLISH, insertTemplate, 2, 10));
+      statement.execute(String.format(Locale.ENGLISH, insertTemplate, 10, 1));
+      statement.execute(String.format(Locale.ENGLISH, insertTemplate, 20, 5));
+      statement.execute("FLUSH");
+
+      statement.execute(String.format(Locale.ENGLISH, insertTemplate, 22, 4));
+      statement.execute(String.format(Locale.ENGLISH, insertTemplate, 30, 8));
+      statement.execute(String.format(Locale.ENGLISH, insertTemplate, 40, 2));
+      statement.execute(String.format(Locale.ENGLISH, insertTemplate, 55, 5));
+      statement.execute("FLUSH");
+
+      statement.execute(String.format(Locale.ENGLISH, insertTemplate, 60, 15));
+      statement.execute(String.format(Locale.ENGLISH, insertTemplate, 62, 20));
+      statement.execute(String.format(Locale.ENGLISH, insertTemplate, 65, 8));
+      statement.execute(String.format(Locale.ENGLISH, insertTemplate, 70, 18));
+      statement.execute("FLUSH");
+
+      statement.execute(String.format(Locale.ENGLISH, insertTemplate, 72, 4));
+      statement.execute(String.format(Locale.ENGLISH, insertTemplate, 80, 11));
+      statement.execute(String.format(Locale.ENGLISH, insertTemplate, 90, 1));
+      statement.execute(String.format(Locale.ENGLISH, insertTemplate, 105, 7));
+      statement.execute("FLUSH");
+    } catch (Exception e) {
+      e.printStackTrace();
+    }
+  }
+
+  @Test
+  public void test3_2() { // not seq but no overlap
+    prepareData3_2();
+
+    String[] res =
+        new String[] {
+          "0,1,22,5,4,1[10],10[2]",
+          "25,30,40,8,2,2[40],8[30]",
+          "50,55,72,5,4,4[72],20[62]",
+          "75,80,90,11,1,1[90],11[80]"
+        };
+    try (Connection connection =
+            DriverManager.getConnection("jdbc:iotdb://127.0.0.1:6667/", 
"root", "root");
+        Statement statement = connection.createStatement()) {
+      boolean hasResultSet =
+          statement.execute(
+              "SELECT min_time(s0), max_time(s0), first_value(s0), 
last_value(s0), min_value(s0), max_value(s0)"
+                  + " FROM root.vehicle.d0 group by ([0,100),25ms)"); // don't 
change the
+      // sequence!!!
+
+      Assert.assertTrue(hasResultSet);
+      try (ResultSet resultSet = statement.getResultSet()) {
+        int i = 0;
+        while (resultSet.next()) {
+          String ans =
+              resultSet.getString(TIMESTAMP_STR)
+                  + ","
+                  + resultSet.getString(String.format("min_time(%s)", d0s0))
+                  + ","
+                  + resultSet.getString(String.format("max_time(%s)", d0s0))
+                  + ","
+                  + resultSet.getString(String.format("first_value(%s)", d0s0))
+                  + ","
+                  + resultSet.getString(String.format("last_value(%s)", d0s0))
+                  + ","
+                  + resultSet.getString(String.format("min_value(%s)", d0s0))
+                  + ","
+                  + resultSet.getString(String.format("max_value(%s)", d0s0));
+          System.out.println(ans);
+          Assert.assertEquals(res[i++], ans);
+        }
+      }
+    } catch (Exception e) {
+      e.printStackTrace();
+      fail(e.getMessage());
+    }
+  }
+
+  private static void prepareData3_2() {
+    // data:
+    // 
https://user-images.githubusercontent.com/33376433/152003603-6b4e7494-00ff-47e4-bf6e-cab3c8600ce2.png
+    try (Connection connection =
+            DriverManager.getConnection(
+                Config.IOTDB_URL_PREFIX + "127.0.0.1:6667/", "root", "root");
+        Statement statement = connection.createStatement()) {
+
+      for (String sql : creationSqls) {
+        statement.execute(sql);
+      }
+
+      statement.execute(String.format(Locale.ENGLISH, insertTemplate, 72, 4));
+      statement.execute(String.format(Locale.ENGLISH, insertTemplate, 80, 11));
+      statement.execute(String.format(Locale.ENGLISH, insertTemplate, 90, 1));
+      statement.execute(String.format(Locale.ENGLISH, insertTemplate, 105, 7));
+      statement.execute("FLUSH");
+
+      statement.execute(String.format(Locale.ENGLISH, insertTemplate, 1, 5));
+      statement.execute(String.format(Locale.ENGLISH, insertTemplate, 2, 10));
+      statement.execute(String.format(Locale.ENGLISH, insertTemplate, 10, 1));
+      statement.execute(String.format(Locale.ENGLISH, insertTemplate, 20, 5));
+      statement.execute("FLUSH");
+
+      statement.execute(String.format(Locale.ENGLISH, insertTemplate, 22, 4));
+      statement.execute(String.format(Locale.ENGLISH, insertTemplate, 30, 8));
+      statement.execute(String.format(Locale.ENGLISH, insertTemplate, 40, 2));
+      statement.execute(String.format(Locale.ENGLISH, insertTemplate, 55, 5));
+      statement.execute("FLUSH");
+
+      statement.execute(String.format(Locale.ENGLISH, insertTemplate, 60, 15));
+      statement.execute(String.format(Locale.ENGLISH, insertTemplate, 62, 20));
+      statement.execute(String.format(Locale.ENGLISH, insertTemplate, 65, 8));
+      statement.execute(String.format(Locale.ENGLISH, insertTemplate, 70, 18));
+      statement.execute("FLUSH");
+    } catch (Exception e) {
+      e.printStackTrace();
+    }
+  }
+
+  @Test
+  public void test4() { // delete sequence move forward
+    prepareData4();
+
+    String[] res =
+        new String[] {
+          "0,1,20,5,20,5[1],30[10]",
+          "25,25,45,8,30,8[25],30[45]",
+          "50,52,54,8,18,8[52],18[54]",
+          "75,null,null,null,null,null,null"
+        };
+    try (Connection connection =
+            DriverManager.getConnection("jdbc:iotdb://127.0.0.1:6667/", 
"root", "root");
+        Statement statement = connection.createStatement()) {
+      boolean hasResultSet =
+          statement.execute(
+              "SELECT min_time(s0), max_time(s0), first_value(s0), 
last_value(s0), min_value(s0), max_value(s0)"
+                  + " FROM root.vehicle.d0 group by ([0,100),25ms)"); // don't 
change the
+      // sequence!!!
+
+      Assert.assertTrue(hasResultSet);
+      try (ResultSet resultSet = statement.getResultSet()) {
+        int i = 0;
+        while (resultSet.next()) {
+          String ans =
+              resultSet.getString(TIMESTAMP_STR)
+                  + ","
+                  + resultSet.getString(String.format("min_time(%s)", d0s0))
+                  + ","
+                  + resultSet.getString(String.format("max_time(%s)", d0s0))
+                  + ","
+                  + resultSet.getString(String.format("first_value(%s)", d0s0))
+                  + ","
+                  + resultSet.getString(String.format("last_value(%s)", d0s0))
+                  + ","
+                  + resultSet.getString(String.format("min_value(%s)", d0s0))
+                  + ","
+                  + resultSet.getString(String.format("max_value(%s)", d0s0));
+          System.out.println(ans);
+          Assert.assertEquals(res[i++], ans);
+        }
+      }
+    } catch (Exception e) {
+      e.printStackTrace();
+      fail(e.getMessage());
+    }
+  }
+
+  private static void prepareData4() {
+    // data:
+    // 
https://user-images.githubusercontent.com/33376433/152006061-f1d95952-3f5c-4d88-b34e-45d3bb61b600.png
+    try (Connection connection =
+            DriverManager.getConnection(
+                Config.IOTDB_URL_PREFIX + "127.0.0.1:6667/", "root", "root");
+        Statement statement = connection.createStatement()) {
+
+      for (String sql : creationSqls) {
+        statement.execute(sql);
+      }
+
+      statement.execute(String.format(Locale.ENGLISH, insertTemplate, 1, 5));
+      statement.execute(String.format(Locale.ENGLISH, insertTemplate, 2, 15));
+      statement.execute(String.format(Locale.ENGLISH, insertTemplate, 20, 1));
+      statement.execute(String.format(Locale.ENGLISH, insertTemplate, 25, 8));
+      statement.execute(String.format(Locale.ENGLISH, insertTemplate, 54, 3));
+      statement.execute(String.format(Locale.ENGLISH, insertTemplate, 120, 8));
+      statement.execute("FLUSH");
+
+      statement.execute(String.format(Locale.ENGLISH, insertTemplate, 5, 10));
+      statement.execute(String.format(Locale.ENGLISH, insertTemplate, 8, 8));
+      statement.execute(String.format(Locale.ENGLISH, insertTemplate, 10, 30));
+      statement.execute(String.format(Locale.ENGLISH, insertTemplate, 20, 20));
+      statement.execute("FLUSH");
+
+      statement.execute(String.format(Locale.ENGLISH, insertTemplate, 27, 20));
+      statement.execute(String.format(Locale.ENGLISH, insertTemplate, 30, 40));
+      statement.execute(String.format(Locale.ENGLISH, insertTemplate, 35, 10));
+      statement.execute(String.format(Locale.ENGLISH, insertTemplate, 40, 20));
+      statement.execute("FLUSH");
+
+      statement.execute("delete from root.vehicle.d0.s0 where time>=28 and 
time<=42");
+
+      statement.execute(String.format(Locale.ENGLISH, insertTemplate, 33, 9));
+      statement.execute(String.format(Locale.ENGLISH, insertTemplate, 45, 30));
+      statement.execute(String.format(Locale.ENGLISH, insertTemplate, 52, 8));
+      statement.execute(String.format(Locale.ENGLISH, insertTemplate, 54, 18));
+      statement.execute("FLUSH");
+
+    } catch (Exception e) {
+      e.printStackTrace();
+    }
+  }
+}
diff --git 
a/tsfile/src/main/java/org/apache/iotdb/tsfile/read/common/IOMonitor2.java 
b/tsfile/src/main/java/org/apache/iotdb/tsfile/read/common/IOMonitor2.java
index 5af7b162f4c..d9eeaf30b6c 100644
--- a/tsfile/src/main/java/org/apache/iotdb/tsfile/read/common/IOMonitor2.java
+++ b/tsfile/src/main/java/org/apache/iotdb/tsfile/read/common/IOMonitor2.java
@@ -23,6 +23,12 @@ import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 public class IOMonitor2 {
+  public enum DataSetType { // dataSet, executor, reader, file
+    NONE,
+    RawQueryDataSetWithoutValueFilter,
+    UDTFAlignByTimeDataSet,
+    GroupByWithoutValueFilterDataSet
+  }
 
   public enum Operation {
     DCP_Server_Query_Execute("DCP_Server_Query_Execute"),
@@ -76,6 +82,8 @@ public class IOMonitor2 {
 
   public static long DCP_D_traversedPointNum = 0;
 
+  public static DataSetType dataSetType = DataSetType.NONE;
+
   private static final Logger DEBUG_LOGGER = 
LoggerFactory.getLogger("IOMonitor2");
 
   private static void reset() {
@@ -101,6 +109,8 @@ public class IOMonitor2 {
     DCP_D_DECODE_PAGEDATA_TRAVERSE_POINTS_ns = 0;
 
     DCP_D_traversedPointNum = 0;
+
+    dataSetType = DataSetType.NONE;
   }
 
   public static void addMeasure(Operation operation, long 
elapsedTimeInNanosecond) {
@@ -179,6 +189,8 @@ public class IOMonitor2 {
 
   public static String print() {
     StringBuilder stringBuilder = new StringBuilder();
+    
stringBuilder.append("dataSetType").append(",").append(dataSetType).append("\n");
+
     stringBuilder
         .append("Server_Query_Execute_ns")
         .append(",")

Reply via email to