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(",")
