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

xuekaifeng pushed a commit to branch xkf_id_table
in repository https://gitbox.apache.org/repos/asf/iotdb.git


The following commit(s) were added to refs/heads/xkf_id_table by this push:
     new 3af148a  fix bugs
3af148a is described below

commit 3af148a7a1989734d4d08772d982af204400c9ac
Author: 151250176 <[email protected]>
AuthorDate: Tue Dec 14 16:45:27 2021 +0800

    fix bugs
---
 .../db/integration/IoTDBQueryWithIDTableIT.java    | 291 +++++++++++++++++++++
 .../apache/iotdb/db/metadata/id_table/IDTable.java |  19 ++
 .../db/metadata/id_table/IDTableHashmapImpl.java   |  32 ++-
 .../metadata/id_table/entry/DeviceIDFactory.java   |  15 ++
 .../java/org/apache/iotdb/db/rest/RestService.java |  26 +-
 .../apache/iotdb/db/utils/EnvironmentUtils.java    |   4 +
 ...mplLogFileTest.java => IDTableLogFileTest.java} |   2 +-
 ...olTest.java => IDTableResourceControlTest.java} |   2 +-
 ...mplRestartTest.java => IDTableRestartTest.java} |   2 +-
 ...DTableHashmapImplTest.java => IDTableTest.java} |   2 +-
 ...mapImplTest.java => InsertWithIDTableTest.java} |   2 +-
 ...eHashmapImpl.java => LastQueryWithIDTable.java} |  42 ++-
 ... => QueryAlignedTimeseriesWithIDTableTest.java} | 122 ++++++++-
 ...hmapImplTest.java => QueryWithIDTableTest.java} | 113 +++++++-
 14 files changed, 637 insertions(+), 37 deletions(-)

diff --git 
a/integration/src/test/java/org/apache/iotdb/db/integration/IoTDBQueryWithIDTableIT.java
 
b/integration/src/test/java/org/apache/iotdb/db/integration/IoTDBQueryWithIDTableIT.java
new file mode 100644
index 0000000..9385ffd
--- /dev/null
+++ 
b/integration/src/test/java/org/apache/iotdb/db/integration/IoTDBQueryWithIDTableIT.java
@@ -0,0 +1,291 @@
+/*
+ * 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;
+
+import org.apache.iotdb.db.conf.IoTDBDescriptor;
+import org.apache.iotdb.db.metadata.id_table.entry.DeviceIDFactory;
+import org.apache.iotdb.integration.env.EnvFactory;
+import org.apache.iotdb.itbase.category.ClusterTest;
+import org.apache.iotdb.itbase.category.LocalStandaloneTest;
+
+import org.junit.AfterClass;
+import org.junit.Assert;
+import org.junit.BeforeClass;
+import org.junit.Test;
+import org.junit.experimental.categories.Category;
+
+import java.sql.Connection;
+import java.sql.ResultSet;
+import java.sql.ResultSetMetaData;
+import java.sql.SQLException;
+import java.sql.Statement;
+import java.sql.Types;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import static org.junit.Assert.fail;
+
+@Category({LocalStandaloneTest.class, ClusterTest.class})
+public class IoTDBQueryWithIDTableIT {
+
+  private static String[] sqls =
+      new String[] {
+        "SET STORAGE GROUP TO root.vehicle",
+        "SET STORAGE GROUP TO root.other",
+        "CREATE TIMESERIES root.vehicle.d0.s0 WITH DATATYPE=INT32, 
ENCODING=RLE",
+        "CREATE TIMESERIES root.vehicle.d0.s1 WITH DATATYPE=INT64, 
ENCODING=RLE",
+        "CREATE TIMESERIES root.vehicle.d0.s2 WITH DATATYPE=FLOAT, 
ENCODING=RLE",
+        "CREATE TIMESERIES root.vehicle.d0.s3 WITH DATATYPE=TEXT, 
ENCODING=PLAIN",
+        "CREATE TIMESERIES root.vehicle.d0.s4 WITH DATATYPE=BOOLEAN, 
ENCODING=PLAIN",
+        "CREATE TIMESERIES root.vehicle.d1.s0 WITH DATATYPE=INT32, 
ENCODING=RLE",
+        "CREATE TIMESERIES root.other.d1.s0 WITH DATATYPE=FLOAT, ENCODING=RLE",
+        "insert into root.vehicle.d0(timestamp,s0) values(1,101)",
+        "insert into root.vehicle.d0(timestamp,s0) values(2,198)",
+        "insert into root.vehicle.d0(timestamp,s0) values(100,99)",
+        "insert into root.vehicle.d0(timestamp,s0) values(101,99)",
+        "insert into root.vehicle.d0(timestamp,s0) values(102,80)",
+        "insert into root.vehicle.d0(timestamp,s0) values(103,99)",
+        "insert into root.vehicle.d0(timestamp,s0) values(104,90)",
+        "insert into root.vehicle.d0(timestamp,s0) values(105,99)",
+        "insert into root.vehicle.d0(timestamp,s0) values(106,99)",
+        "insert into root.vehicle.d0(timestamp,s0) values(2,10000)",
+        "insert into root.vehicle.d0(timestamp,s0) values(50,10000)",
+        "insert into root.vehicle.d0(timestamp,s0) values(1000,22222)",
+        "insert into root.vehicle.d0(timestamp,s1) values(1,1101)",
+        "insert into root.vehicle.d0(timestamp,s1) values(2,198)",
+        "flush",
+        "insert into root.vehicle.d0(timestamp,s1) values(100,199)",
+        "insert into root.vehicle.d0(timestamp,s1) values(101,199)",
+        "insert into root.vehicle.d0(timestamp,s1) values(102,180)",
+        "insert into root.vehicle.d0(timestamp,s1) values(103,199)",
+        "insert into root.vehicle.d0(timestamp,s1) values(104,190)",
+        "insert into root.vehicle.d0(timestamp,s1) values(105,199)",
+        "insert into root.vehicle.d0(timestamp,s1) values(2,40000)",
+        "insert into root.vehicle.d0(timestamp,s1) values(50,50000)",
+        "insert into root.vehicle.d0(timestamp,s1) values(1000,55555)",
+        "insert into root.vehicle.d0(timestamp,s1) 
values(2000-01-01T08:00:00+08:00, 100)",
+        "insert into root.vehicle.d0(timestamp,s2) values(1000,55555)",
+        "insert into root.vehicle.d0(timestamp,s2) values(2,2.22)",
+        "insert into root.vehicle.d0(timestamp,s2) values(3,3.33)",
+        "insert into root.vehicle.d0(timestamp,s2) values(4,4.44)",
+        "insert into root.vehicle.d0(timestamp,s2) values(102,10.00)",
+        "insert into root.vehicle.d0(timestamp,s2) values(105,11.11)",
+        "insert into root.vehicle.d0(timestamp,s2) values(1000,1000.11)",
+        "insert into root.vehicle.d0(timestamp,s3) values(60,'aaaaa')",
+        "insert into root.vehicle.d0(timestamp,s3) values(70,'bbbbb')",
+        "insert into root.vehicle.d0(timestamp,s3) values(80,'ccccc')",
+        "insert into root.vehicle.d0(timestamp,s3) values(101,'ddddd')",
+        "insert into root.vehicle.d0(timestamp,s3) values(102,'fffff')",
+        "insert into root.vehicle.d0(timestamp,s3) 
values(2000-01-01T08:00:00+08:00, 'good')",
+        "insert into root.vehicle.d0(timestamp,s4) values(100, false)",
+        "insert into root.vehicle.d0(timestamp,s4) values(100, true)",
+        "insert into root.vehicle.d1(timestamp,s0) values(1,999)",
+        "insert into root.vehicle.d1(timestamp,s0) values(1000,888)",
+        "insert into root.other.d1(timestamp,s0) values(2, 3.14)",
+      };
+
+  private static boolean isEnableIDTable = false;
+
+  private static String originalDeviceIDTransformationMethod = null;
+
+  @BeforeClass
+  public static void setUp() throws Exception {
+    IoTDBDescriptor.getInstance().getConfig().setAutoCreateSchemaEnabled(true);
+    isEnableIDTable = 
IoTDBDescriptor.getInstance().getConfig().isEnableIDTable();
+    originalDeviceIDTransformationMethod =
+        
IoTDBDescriptor.getInstance().getConfig().getDeviceIDTransformationMethod();
+
+    IoTDBDescriptor.getInstance().getConfig().setEnableIDTable(true);
+    
IoTDBDescriptor.getInstance().getConfig().setDeviceIDTransformationMethod("SHA256");
+    EnvFactory.getEnv().initBeforeClass();
+    insertData();
+  }
+
+  @AfterClass
+  public static void tearDown() throws Exception {
+    
IoTDBDescriptor.getInstance().getConfig().setEnableIDTable(isEnableIDTable);
+    IoTDBDescriptor.getInstance()
+        .getConfig()
+        .setDeviceIDTransformationMethod(originalDeviceIDTransformationMethod);
+    // reset id method
+    DeviceIDFactory.getInstance().reset();
+
+    EnvFactory.getEnv().cleanAfterClass();
+  }
+
+  private static void insertData() {
+    try (Connection connection = EnvFactory.getEnv().getConnection();
+        Statement statement = connection.createStatement()) {
+
+      for (String sql : sqls) {
+        statement.execute(sql);
+      }
+    } catch (Exception e) {
+      e.printStackTrace();
+    }
+  }
+
+  @Test
+  public void selectTest() {
+    String[] retArray =
+        new String[] {
+          "1,root.vehicle.d0,101,1101,null,null,null,",
+          "2,root.vehicle.d0,10000,40000,2.22,null,null,",
+          "3,root.vehicle.d0,null,null,3.33,null,null,",
+          "4,root.vehicle.d0,null,null,4.44,null,null,",
+          "50,root.vehicle.d0,10000,50000,null,null,null,",
+          "60,root.vehicle.d0,null,null,null,aaaaa,null,",
+          "70,root.vehicle.d0,null,null,null,bbbbb,null,",
+          "80,root.vehicle.d0,null,null,null,ccccc,null,",
+          "100,root.vehicle.d0,99,199,null,null,true,",
+          "101,root.vehicle.d0,99,199,null,ddddd,null,",
+          "102,root.vehicle.d0,80,180,10.0,fffff,null,",
+          "103,root.vehicle.d0,99,199,null,null,null,",
+          "104,root.vehicle.d0,90,190,null,null,null,",
+          "105,root.vehicle.d0,99,199,11.11,null,null,",
+          "106,root.vehicle.d0,99,null,null,null,null,",
+          "1000,root.vehicle.d0,22222,55555,1000.11,null,null,",
+          "946684800000,root.vehicle.d0,null,100,null,good,null,",
+          "1,root.vehicle.d1,999,null,null,null,null,",
+          "1000,root.vehicle.d1,888,null,null,null,null,",
+        };
+
+    try (Connection connection = EnvFactory.getEnv().getConnection();
+        Statement statement = connection.createStatement()) {
+      boolean hasResultSet = statement.execute("select * from root.vehicle.** 
align by device");
+      Assert.assertTrue(hasResultSet);
+
+      try (ResultSet resultSet = statement.getResultSet()) {
+        ResultSetMetaData resultSetMetaData = resultSet.getMetaData();
+        List<Integer> actualIndexToExpectedIndexList =
+            checkHeader(
+                resultSetMetaData,
+                "Time,Device,s0,s1,s2,s3,s4",
+                new int[] {
+                  Types.TIMESTAMP,
+                  Types.VARCHAR,
+                  Types.INTEGER,
+                  Types.BIGINT,
+                  Types.FLOAT,
+                  Types.VARCHAR,
+                  Types.BOOLEAN
+                });
+
+        int cnt = 0;
+        while (resultSet.next()) {
+          String[] expectedStrings = retArray[cnt].split(",");
+          StringBuilder expectedBuilder = new StringBuilder();
+          StringBuilder actualBuilder = new StringBuilder();
+          for (int i = 1; i <= resultSetMetaData.getColumnCount(); i++) {
+            actualBuilder.append(resultSet.getString(i)).append(",");
+            expectedBuilder
+                .append(expectedStrings[actualIndexToExpectedIndexList.get(i - 
1)])
+                .append(",");
+          }
+          Assert.assertEquals(expectedBuilder.toString(), 
actualBuilder.toString());
+          cnt++;
+        }
+        Assert.assertEquals(19, cnt);
+      }
+    } catch (Exception e) {
+      e.printStackTrace();
+      fail(e.getMessage());
+    }
+  }
+
+  @Test
+  public void selectWithDuplicatedPathsTest() {
+    String[] retArray =
+        new String[] {
+          "1,root.vehicle.d0,101,101,1101,",
+          "2,root.vehicle.d0,10000,10000,40000,",
+          "50,root.vehicle.d0,10000,10000,50000,",
+          "100,root.vehicle.d0,99,99,199,",
+          "101,root.vehicle.d0,99,99,199,",
+          "102,root.vehicle.d0,80,80,180,",
+          "103,root.vehicle.d0,99,99,199,",
+          "104,root.vehicle.d0,90,90,190,",
+          "105,root.vehicle.d0,99,99,199,",
+          "106,root.vehicle.d0,99,99,null,",
+          "1000,root.vehicle.d0,22222,22222,55555,",
+          "946684800000,root.vehicle.d0,null,null,100,",
+          "1,root.vehicle.d1,999,999,null,",
+          "1000,root.vehicle.d1,888,888,null,"
+        };
+
+    try (Connection connection = EnvFactory.getEnv().getConnection();
+        Statement statement = connection.createStatement()) {
+      boolean hasResultSet =
+          statement.execute(
+              "select s0,s0,s1 from root.vehicle.d0, root.vehicle.d1 align by 
device");
+      Assert.assertTrue(hasResultSet);
+
+      try (ResultSet resultSet = statement.getResultSet()) {
+        ResultSetMetaData resultSetMetaData = resultSet.getMetaData();
+        List<Integer> actualIndexToExpectedIndexList =
+            checkHeader(
+                resultSetMetaData,
+                "Time,Device,s0,s0,s1",
+                new int[] {
+                  Types.TIMESTAMP, Types.VARCHAR, Types.INTEGER, 
Types.INTEGER, Types.BIGINT
+                });
+
+        int cnt = 0;
+        while (resultSet.next()) {
+          String[] expectedStrings = retArray[cnt].split(",");
+          StringBuilder expectedBuilder = new StringBuilder();
+          StringBuilder actualBuilder = new StringBuilder();
+          for (int i = 1; i <= resultSetMetaData.getColumnCount(); i++) {
+            actualBuilder.append(resultSet.getString(i)).append(",");
+            expectedBuilder
+                .append(expectedStrings[actualIndexToExpectedIndexList.get(i - 
1)])
+                .append(",");
+          }
+          Assert.assertEquals(expectedBuilder.toString(), 
actualBuilder.toString());
+          cnt++;
+        }
+        Assert.assertEquals(14, cnt);
+      }
+    } catch (Exception e) {
+      e.printStackTrace();
+      fail(e.getMessage());
+    }
+  }
+
+  private List<Integer> checkHeader(
+      ResultSetMetaData resultSetMetaData, String expectedHeaderStrings, int[] 
expectedTypes)
+      throws SQLException {
+    String[] expectedHeaders = expectedHeaderStrings.split(",");
+    Map<String, Integer> expectedHeaderToTypeIndexMap = new HashMap<>();
+    for (int i = 0; i < expectedHeaders.length; ++i) {
+      expectedHeaderToTypeIndexMap.put(expectedHeaders[i], i);
+    }
+
+    List<Integer> actualIndexToExpectedIndexList = new ArrayList<>();
+    for (int i = 1; i <= resultSetMetaData.getColumnCount(); i++) {
+      Integer typeIndex = 
expectedHeaderToTypeIndexMap.get(resultSetMetaData.getColumnName(i));
+      Assert.assertNotNull(typeIndex);
+      Assert.assertEquals(expectedTypes[typeIndex], 
resultSetMetaData.getColumnType(i));
+      actualIndexToExpectedIndexList.add(typeIndex);
+    }
+    return actualIndexToExpectedIndexList;
+  }
+}
diff --git 
a/server/src/main/java/org/apache/iotdb/db/metadata/id_table/IDTable.java 
b/server/src/main/java/org/apache/iotdb/db/metadata/id_table/IDTable.java
index cd7494a..6645cc2 100644
--- a/server/src/main/java/org/apache/iotdb/db/metadata/id_table/IDTable.java
+++ b/server/src/main/java/org/apache/iotdb/db/metadata/id_table/IDTable.java
@@ -1,3 +1,22 @@
+/*
+ * 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.metadata.id_table;
 
 import org.apache.iotdb.db.conf.IoTDBConfig;
diff --git 
a/server/src/main/java/org/apache/iotdb/db/metadata/id_table/IDTableHashmapImpl.java
 
b/server/src/main/java/org/apache/iotdb/db/metadata/id_table/IDTableHashmapImpl.java
index 12e7083..777657b 100644
--- 
a/server/src/main/java/org/apache/iotdb/db/metadata/id_table/IDTableHashmapImpl.java
+++ 
b/server/src/main/java/org/apache/iotdb/db/metadata/id_table/IDTableHashmapImpl.java
@@ -32,10 +32,13 @@ import 
org.apache.iotdb.db.metadata.id_table.entry.TimeseriesID;
 import org.apache.iotdb.db.metadata.mnode.IMeasurementMNode;
 import org.apache.iotdb.db.metadata.path.PartialPath;
 import org.apache.iotdb.db.qp.physical.crud.InsertPlan;
+import org.apache.iotdb.db.qp.physical.crud.InsertRowPlan;
+import org.apache.iotdb.db.qp.physical.crud.InsertTabletPlan;
 import org.apache.iotdb.db.qp.physical.sys.CreateAlignedTimeSeriesPlan;
 import org.apache.iotdb.db.qp.physical.sys.CreateTimeSeriesPlan;
 import org.apache.iotdb.db.service.IoTDB;
 import org.apache.iotdb.db.utils.TestOnly;
+import org.apache.iotdb.db.utils.TypeInferenceUtils;
 import org.apache.iotdb.tsfile.file.metadata.enums.TSDataType;
 import org.apache.iotdb.tsfile.read.TimeValuePair;
 import org.apache.iotdb.tsfile.write.schema.IMeasurementSchema;
@@ -400,7 +403,17 @@ public class IDTableHashmapImpl implements IDTable {
   // from mmanger
   private void checkDataTypeMatch(InsertPlan plan, int loc, TSDataType 
dataType)
       throws MetadataException {
-    TSDataType insertDataType = plan.getDataTypes()[loc];
+    TSDataType insertDataType;
+    if (plan instanceof InsertRowPlan) {
+      if (!((InsertRowPlan) plan).isNeedInferType()) {
+        // only when InsertRowPlan's values is object[], we should check type
+        insertDataType = getTypeInLoc(plan, loc);
+      } else {
+        insertDataType = dataType;
+      }
+    } else {
+      insertDataType = getTypeInLoc(plan, loc);
+    }
     if (dataType != insertDataType) {
       String measurement = plan.getMeasurements()[loc];
       logger.warn(
@@ -412,6 +425,23 @@ public class IDTableHashmapImpl implements IDTable {
     }
   }
 
+  /** get dataType of plan, in loc measurements only support InsertRowPlan and 
InsertTabletPlan */
+  private TSDataType getTypeInLoc(InsertPlan plan, int loc) throws 
MetadataException {
+    TSDataType dataType;
+    if (plan instanceof InsertRowPlan) {
+      InsertRowPlan tPlan = (InsertRowPlan) plan;
+      dataType =
+          TypeInferenceUtils.getPredictedDataType(tPlan.getValues()[loc], 
tPlan.isNeedInferType());
+    } else if (plan instanceof InsertTabletPlan) {
+      dataType = (plan).getDataTypes()[loc];
+    } else {
+      throw new MetadataException(
+          String.format(
+              "Only support insert and insertTablet, plan is [%s]", 
plan.getOperatorType()));
+    }
+    return dataType;
+  }
+
   @TestOnly
   public Map<IDeviceID, DeviceEntry>[] getIdTables() {
     return idTables;
diff --git 
a/server/src/main/java/org/apache/iotdb/db/metadata/id_table/entry/DeviceIDFactory.java
 
b/server/src/main/java/org/apache/iotdb/db/metadata/id_table/entry/DeviceIDFactory.java
index 2884c53..047b727 100644
--- 
a/server/src/main/java/org/apache/iotdb/db/metadata/id_table/entry/DeviceIDFactory.java
+++ 
b/server/src/main/java/org/apache/iotdb/db/metadata/id_table/entry/DeviceIDFactory.java
@@ -21,6 +21,7 @@ package org.apache.iotdb.db.metadata.id_table.entry;
 
 import org.apache.iotdb.db.conf.IoTDBDescriptor;
 import org.apache.iotdb.db.metadata.path.PartialPath;
+import org.apache.iotdb.db.utils.TestOnly;
 
 import java.util.function.Function;
 
@@ -69,4 +70,18 @@ public class DeviceIDFactory {
   public IDeviceID getDeviceID(PartialPath devicePath) {
     return getDeviceIDFunction.apply(devicePath);
   }
+
+  /** reset id method */
+  @TestOnly
+  public void reset() {
+    if (IoTDBDescriptor.getInstance().getConfig().isEnableIDTable()
+        && IoTDBDescriptor.getInstance()
+            .getConfig()
+            .getDeviceIDTransformationMethod()
+            .equals("SHA256")) {
+      getDeviceIDFunction = partialPath -> new 
SHA256DeviceID(partialPath.toString());
+    } else {
+      getDeviceIDFunction = partialPath -> new 
PlainDeviceID(partialPath.toString());
+    }
+  }
 }
diff --git a/server/src/main/java/org/apache/iotdb/db/rest/RestService.java 
b/server/src/main/java/org/apache/iotdb/db/rest/RestService.java
index 68b2e60..75928f7 100644
--- a/server/src/main/java/org/apache/iotdb/db/rest/RestService.java
+++ b/server/src/main/java/org/apache/iotdb/db/rest/RestService.java
@@ -103,12 +103,12 @@ public class RestService implements IService {
   }
 
   private void serverStart() {
-    //    try {
-    //      server.start();
-    //    } catch (Exception e) {
-    //      LOGGER.warn("RestService failed to start: {}", e.getMessage());
-    //      server.destroy();
-    //    }
+    try {
+      server.start();
+    } catch (Exception e) {
+      LOGGER.warn("RestService failed to start: {}", e.getMessage());
+      server.destroy();
+    }
   }
 
   @Override
@@ -129,13 +129,13 @@ public class RestService implements IService {
 
   @Override
   public void stop() {
-    //    try {
-    //      server.stop();
-    //    } catch (Exception e) {
-    //      LOGGER.warn("RestService failed to stop: {}", e.getMessage());
-    //    } finally {
-    //      server.destroy();
-    //    }
+    try {
+      server.stop();
+    } catch (Exception e) {
+      LOGGER.warn("RestService failed to stop: {}", e.getMessage());
+    } finally {
+      server.destroy();
+    }
   }
 
   @Override
diff --git 
a/server/src/main/java/org/apache/iotdb/db/utils/EnvironmentUtils.java 
b/server/src/main/java/org/apache/iotdb/db/utils/EnvironmentUtils.java
index 374ee76..fb84eb7 100644
--- a/server/src/main/java/org/apache/iotdb/db/utils/EnvironmentUtils.java
+++ b/server/src/main/java/org/apache/iotdb/db/utils/EnvironmentUtils.java
@@ -36,6 +36,7 @@ import org.apache.iotdb.db.exception.StorageEngineException;
 import org.apache.iotdb.db.exception.TriggerManagementException;
 import org.apache.iotdb.db.exception.UDFRegistrationException;
 import org.apache.iotdb.db.metadata.id_table.IDTableManager;
+import org.apache.iotdb.db.metadata.id_table.entry.DeviceIDFactory;
 import org.apache.iotdb.db.query.context.QueryContext;
 import org.apache.iotdb.db.query.control.FileReaderManager;
 import org.apache.iotdb.db.query.control.QueryResourceManager;
@@ -274,6 +275,9 @@ public class EnvironmentUtils {
 
     createAllDir();
 
+    // reset id method
+    DeviceIDFactory.getInstance().reset();
+
     TEST_QUERY_JOB_ID = QueryResourceManager.getInstance().assignQueryId(true);
     TEST_QUERY_CONTEXT = new QueryContext(TEST_QUERY_JOB_ID);
   }
diff --git 
a/server/src/test/java/org/apache/iotdb/db/metadata/id_table/IDTableHashmapImplLogFileTest.java
 
b/server/src/test/java/org/apache/iotdb/db/metadata/id_table/IDTableLogFileTest.java
similarity index 99%
rename from 
server/src/test/java/org/apache/iotdb/db/metadata/id_table/IDTableHashmapImplLogFileTest.java
rename to 
server/src/test/java/org/apache/iotdb/db/metadata/id_table/IDTableLogFileTest.java
index 10147a3..50eed1b 100644
--- 
a/server/src/test/java/org/apache/iotdb/db/metadata/id_table/IDTableHashmapImplLogFileTest.java
+++ 
b/server/src/test/java/org/apache/iotdb/db/metadata/id_table/IDTableLogFileTest.java
@@ -40,7 +40,7 @@ import java.util.HashSet;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.fail;
 
-public class IDTableHashmapImplLogFileTest {
+public class IDTableLogFileTest {
 
   private boolean isEnableIDTable = false;
 
diff --git 
a/server/src/test/java/org/apache/iotdb/db/metadata/id_table/IDTableHashmapImplResourceControlTest.java
 
b/server/src/test/java/org/apache/iotdb/db/metadata/id_table/IDTableResourceControlTest.java
similarity index 99%
rename from 
server/src/test/java/org/apache/iotdb/db/metadata/id_table/IDTableHashmapImplResourceControlTest.java
rename to 
server/src/test/java/org/apache/iotdb/db/metadata/id_table/IDTableResourceControlTest.java
index a4047fa..096a87c 100644
--- 
a/server/src/test/java/org/apache/iotdb/db/metadata/id_table/IDTableHashmapImplResourceControlTest.java
+++ 
b/server/src/test/java/org/apache/iotdb/db/metadata/id_table/IDTableResourceControlTest.java
@@ -51,7 +51,7 @@ import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertNotNull;
 import static org.junit.Assert.fail;
 
-public class IDTableHashmapImplResourceControlTest {
+public class IDTableResourceControlTest {
   private final Planner processor = new Planner();
 
   private boolean isEnableIDTable = false;
diff --git 
a/server/src/test/java/org/apache/iotdb/db/metadata/id_table/IDTableHashmapImplRestartTest.java
 
b/server/src/test/java/org/apache/iotdb/db/metadata/id_table/IDTableRestartTest.java
similarity index 99%
rename from 
server/src/test/java/org/apache/iotdb/db/metadata/id_table/IDTableHashmapImplRestartTest.java
rename to 
server/src/test/java/org/apache/iotdb/db/metadata/id_table/IDTableRestartTest.java
index 1634a83..721880c 100644
--- 
a/server/src/test/java/org/apache/iotdb/db/metadata/id_table/IDTableHashmapImplRestartTest.java
+++ 
b/server/src/test/java/org/apache/iotdb/db/metadata/id_table/IDTableRestartTest.java
@@ -48,7 +48,7 @@ import java.util.Set;
 
 import static org.junit.Assert.assertEquals;
 
-public class IDTableHashmapImplRestartTest {
+public class IDTableRestartTest {
 
   private final Planner processor = new Planner();
 
diff --git 
a/server/src/test/java/org/apache/iotdb/db/metadata/id_table/IDTableHashmapImplTest.java
 b/server/src/test/java/org/apache/iotdb/db/metadata/id_table/IDTableTest.java
similarity index 99%
rename from 
server/src/test/java/org/apache/iotdb/db/metadata/id_table/IDTableHashmapImplTest.java
rename to 
server/src/test/java/org/apache/iotdb/db/metadata/id_table/IDTableTest.java
index 740906f..675b8cd 100644
--- 
a/server/src/test/java/org/apache/iotdb/db/metadata/id_table/IDTableHashmapImplTest.java
+++ 
b/server/src/test/java/org/apache/iotdb/db/metadata/id_table/IDTableTest.java
@@ -58,7 +58,7 @@ import static org.junit.Assert.assertNull;
 import static org.junit.Assert.assertTrue;
 import static org.junit.Assert.fail;
 
-public class IDTableHashmapImplTest {
+public class IDTableTest {
 
   private CompressionType compressionType;
 
diff --git 
a/server/src/test/java/org/apache/iotdb/db/metadata/id_table/InsertWithIDTableHashmapImplTest.java
 
b/server/src/test/java/org/apache/iotdb/db/metadata/id_table/InsertWithIDTableTest.java
similarity index 99%
rename from 
server/src/test/java/org/apache/iotdb/db/metadata/id_table/InsertWithIDTableHashmapImplTest.java
rename to 
server/src/test/java/org/apache/iotdb/db/metadata/id_table/InsertWithIDTableTest.java
index f559d57..ac5ee56 100644
--- 
a/server/src/test/java/org/apache/iotdb/db/metadata/id_table/InsertWithIDTableHashmapImplTest.java
+++ 
b/server/src/test/java/org/apache/iotdb/db/metadata/id_table/InsertWithIDTableTest.java
@@ -60,7 +60,7 @@ import java.util.List;
 
 import static org.junit.Assert.assertEquals;
 
-public class InsertWithIDTableHashmapImplTest {
+public class InsertWithIDTableTest {
   private final Planner processor = new Planner();
 
   private boolean isEnableIDTable = false;
diff --git 
a/server/src/test/java/org/apache/iotdb/db/metadata/id_table/LastQueryWithIDTableHashmapImpl.java
 
b/server/src/test/java/org/apache/iotdb/db/metadata/id_table/LastQueryWithIDTable.java
similarity index 87%
rename from 
server/src/test/java/org/apache/iotdb/db/metadata/id_table/LastQueryWithIDTableHashmapImpl.java
rename to 
server/src/test/java/org/apache/iotdb/db/metadata/id_table/LastQueryWithIDTable.java
index 807b917..8409afe 100644
--- 
a/server/src/test/java/org/apache/iotdb/db/metadata/id_table/LastQueryWithIDTableHashmapImpl.java
+++ 
b/server/src/test/java/org/apache/iotdb/db/metadata/id_table/LastQueryWithIDTable.java
@@ -1,5 +1,33 @@
+/*
+ * 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.metadata.id_table;
 
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNull;
+import static org.junit.Assert.assertTrue;
+
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
 import org.apache.iotdb.db.conf.IoTDBDescriptor;
 import org.apache.iotdb.db.exception.StorageEngineException;
 import org.apache.iotdb.db.exception.metadata.IllegalPathException;
@@ -18,24 +46,12 @@ import 
org.apache.iotdb.tsfile.file.metadata.enums.TSDataType;
 import org.apache.iotdb.tsfile.read.common.RowRecord;
 import org.apache.iotdb.tsfile.read.query.dataset.QueryDataSet;
 import org.apache.iotdb.tsfile.utils.Binary;
-
 import org.junit.After;
 import org.junit.Assert;
 import org.junit.Before;
 import org.junit.Test;
 
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Set;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNull;
-import static org.junit.Assert.assertTrue;
-
-public class LastQueryWithIDTableHashmapImpl {
+public class LastQueryWithIDTable {
   private final Planner processor = new Planner();
 
   private boolean isEnableIDTable = false;
diff --git 
a/server/src/test/java/org/apache/iotdb/db/metadata/id_table/QueryWithIDTableHashmapImplTest.java
 
b/server/src/test/java/org/apache/iotdb/db/metadata/id_table/QueryAlignedTimeseriesWithIDTableTest.java
similarity index 63%
copy from 
server/src/test/java/org/apache/iotdb/db/metadata/id_table/QueryWithIDTableHashmapImplTest.java
copy to 
server/src/test/java/org/apache/iotdb/db/metadata/id_table/QueryAlignedTimeseriesWithIDTableTest.java
index 6952d53..0c923c8 100644
--- 
a/server/src/test/java/org/apache/iotdb/db/metadata/id_table/QueryWithIDTableHashmapImplTest.java
+++ 
b/server/src/test/java/org/apache/iotdb/db/metadata/id_table/QueryAlignedTimeseriesWithIDTableTest.java
@@ -36,6 +36,7 @@ import org.apache.iotdb.db.utils.EnvironmentUtils;
 import 
org.apache.iotdb.tsfile.exception.filter.QueryFilterOptimizationException;
 import org.apache.iotdb.tsfile.file.metadata.enums.TSDataType;
 import org.apache.iotdb.tsfile.read.TimeValuePair;
+import org.apache.iotdb.tsfile.read.common.Field;
 import org.apache.iotdb.tsfile.read.common.RowRecord;
 import org.apache.iotdb.tsfile.read.query.dataset.QueryDataSet;
 import org.apache.iotdb.tsfile.utils.Binary;
@@ -61,7 +62,7 @@ import java.util.Set;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertTrue;
 
-public class QueryWithIDTableHashmapImplTest {
+public class QueryAlignedTimeseriesWithIDTableTest {
   private final Planner processor = new Planner();
 
   private boolean isEnableIDTable = false;
@@ -78,6 +79,61 @@ public class QueryWithIDTableHashmapImplTest {
               "113\troot.isp.d1.s1\t13.0\tDOUBLE",
               "113\troot.isp.d1.s2\t23.0\tFLOAT"));
 
+  private static String[] sqls =
+      new String[] {
+        "SET STORAGE GROUP TO root.vehicle",
+        "SET STORAGE GROUP TO root.other",
+        "CREATE TIMESERIES root.vehicle.d0.s0 WITH DATATYPE=INT32, 
ENCODING=RLE",
+        "CREATE TIMESERIES root.vehicle.d0.s1 WITH DATATYPE=INT64, 
ENCODING=RLE",
+        "CREATE TIMESERIES root.vehicle.d0.s2 WITH DATATYPE=FLOAT, 
ENCODING=RLE",
+        "CREATE TIMESERIES root.vehicle.d0.s3 WITH DATATYPE=TEXT, 
ENCODING=PLAIN",
+        "CREATE TIMESERIES root.vehicle.d0.s4 WITH DATATYPE=BOOLEAN, 
ENCODING=PLAIN",
+        "CREATE TIMESERIES root.vehicle.d1.s0 WITH DATATYPE=INT32, 
ENCODING=RLE",
+        "CREATE TIMESERIES root.other.d1.s0 WITH DATATYPE=FLOAT, ENCODING=RLE",
+        "insert into root.vehicle.d0(timestamp,s0) values(1,101)",
+        "insert into root.vehicle.d0(timestamp,s0) values(2,198)",
+        "insert into root.vehicle.d0(timestamp,s0) values(100,99)",
+        "insert into root.vehicle.d0(timestamp,s0) values(101,99)",
+        "insert into root.vehicle.d0(timestamp,s0) values(102,80)",
+        "insert into root.vehicle.d0(timestamp,s0) values(103,99)",
+        "insert into root.vehicle.d0(timestamp,s0) values(104,90)",
+        "insert into root.vehicle.d0(timestamp,s0) values(105,99)",
+        "insert into root.vehicle.d0(timestamp,s0) values(106,99)",
+        "insert into root.vehicle.d0(timestamp,s0) values(2,10000)",
+        "insert into root.vehicle.d0(timestamp,s0) values(50,10000)",
+        "insert into root.vehicle.d0(timestamp,s0) values(1000,22222)",
+        "insert into root.vehicle.d0(timestamp,s1) values(1,1101)",
+        "insert into root.vehicle.d0(timestamp,s1) values(2,198)",
+        "insert into root.vehicle.d0(timestamp,s1) values(100,199)",
+        "insert into root.vehicle.d0(timestamp,s1) values(101,199)",
+        "insert into root.vehicle.d0(timestamp,s1) values(102,180)",
+        "insert into root.vehicle.d0(timestamp,s1) values(103,199)",
+        "insert into root.vehicle.d0(timestamp,s1) values(104,190)",
+        "insert into root.vehicle.d0(timestamp,s1) values(105,199)",
+        "insert into root.vehicle.d0(timestamp,s1) values(2,40000)",
+        "insert into root.vehicle.d0(timestamp,s1) values(50,50000)",
+        "insert into root.vehicle.d0(timestamp,s1) values(1000,55555)",
+        "insert into root.vehicle.d0(timestamp,s1) 
values(2000-01-01T08:00:00+08:00, 100)",
+        "insert into root.vehicle.d0(timestamp,s2) values(1000,55555)",
+        "insert into root.vehicle.d0(timestamp,s2) values(2,2.22)",
+        "insert into root.vehicle.d0(timestamp,s2) values(3,3.33)",
+        "insert into root.vehicle.d0(timestamp,s2) values(4,4.44)",
+        "insert into root.vehicle.d0(timestamp,s2) values(102,10.00)",
+        "insert into root.vehicle.d0(timestamp,s2) values(105,11.11)",
+        "insert into root.vehicle.d0(timestamp,s2) values(1000,1000.11)",
+        "insert into root.vehicle.d0(timestamp,s3) values(60,'aaaaa')",
+        "insert into root.vehicle.d0(timestamp,s3) values(70,'bbbbb')",
+        "insert into root.vehicle.d0(timestamp,s3) values(80,'ccccc')",
+        "insert into root.vehicle.d0(timestamp,s3) values(101,'ddddd')",
+        "insert into root.vehicle.d0(timestamp,s3) values(102,'fffff')",
+        "insert into root.vehicle.d0(timestamp,s3) 
values(2000-01-01T08:00:00+08:00, 'good')",
+        "insert into root.vehicle.d0(timestamp,s4) values(100, false)",
+        "insert into root.vehicle.d0(timestamp,s4) values(100, true)",
+        "insert into root.vehicle.d1(timestamp,s0) values(1,999)",
+        "insert into root.vehicle.d1(timestamp,s0) values(1000,888)",
+        "insert into root.other.d1(timestamp,s0) values(2, 3.14)",
+      };
+
   @Before
   public void before() {
     IoTDBDescriptor.getInstance().getConfig().setAutoCreateSchemaEnabled(true);
@@ -109,10 +165,11 @@ public class QueryWithIDTableHashmapImplTest {
     PlanExecutor executor = new PlanExecutor();
     QueryPlan queryPlan = (QueryPlan) processor.parseSQLToPhysicalPlan("select 
* from root.isp.d1");
     QueryDataSet dataSet = executor.processQuery(queryPlan, 
EnvironmentUtils.TEST_QUERY_CONTEXT);
-    Assert.assertEquals(6, dataSet.getPaths().size());
+
     int count = 0;
     while (dataSet.hasNext()) {
       RowRecord record = dataSet.next();
+      System.out.println(record);
       count++;
     }
 
@@ -120,6 +177,61 @@ public class QueryWithIDTableHashmapImplTest {
   }
 
   @Test
+  public void testAggregateQueryAfterFlush()
+      throws MetadataException, QueryProcessException, StorageEngineException, 
InterruptedException,
+          QueryFilterOptimizationException, IOException {
+    insertDataInDisk();
+    insertDataInMemory();
+
+    PlanExecutor executor = new PlanExecutor();
+    QueryPlan queryPlan =
+        (QueryPlan) processor.parseSQLToPhysicalPlan("select count(*) from 
root.isp.d1");
+    QueryDataSet dataSet = executor.processQuery(queryPlan, 
EnvironmentUtils.TEST_QUERY_CONTEXT);
+    Assert.assertEquals(6, dataSet.getPaths().size());
+    int count = 0;
+    while (dataSet.hasNext()) {
+      RowRecord record = dataSet.next();
+      for (Field f : record.getFields()) {
+        assertEquals(8L, f.getLongV());
+      }
+      count++;
+    }
+
+    assertEquals(1, count);
+  }
+
+  @Test
+  public void testGroupByQueryAfterFlush()
+      throws MetadataException, QueryProcessException, StorageEngineException, 
InterruptedException,
+          QueryFilterOptimizationException, IOException {
+    insertDataInDisk();
+    insertDataInMemory();
+
+    PlanExecutor executor = new PlanExecutor();
+    QueryPlan queryPlan =
+        (QueryPlan)
+            processor.parseSQLToPhysicalPlan(
+                "select count(*) from root.isp.d1 group by ([10, 114), 10ms)");
+    QueryDataSet dataSet = executor.processQuery(queryPlan, 
EnvironmentUtils.TEST_QUERY_CONTEXT);
+    System.out.println(dataSet.getPaths());
+    Assert.assertEquals(6, dataSet.getPaths().size());
+    int count = 0;
+    while (dataSet.hasNext()) {
+      RowRecord record = dataSet.next();
+      for (Field f : record.getFields()) {
+        if (count == 0 || count == 10) {
+          assertEquals(4L, f.getLongV());
+        } else {
+          assertEquals(0L, f.getLongV());
+        }
+      }
+      count++;
+    }
+
+    assertEquals(11, count);
+  }
+
+  @Test
   public void testLastCacheQuery()
       throws QueryProcessException, MetadataException, InterruptedException,
           QueryFilterOptimizationException, StorageEngineException, 
IOException {
@@ -203,7 +315,8 @@ public class QueryWithIDTableHashmapImplTest {
         new InsertTabletPlan(
             new PartialPath("root.isp.d1"),
             new String[] {"s1", "s2", "s3", "s4", "s5", "s6"},
-            dataTypes);
+            dataTypes,
+            true);
     tabletPlan.setTimes(times);
     tabletPlan.setColumns(columns);
     tabletPlan.setRowCount(times.length);
@@ -245,7 +358,8 @@ public class QueryWithIDTableHashmapImplTest {
         new InsertTabletPlan(
             new PartialPath("root.isp.d1"),
             new String[] {"s1", "s2", "s3", "s4", "s5", "s6"},
-            dataTypes);
+            dataTypes,
+            true);
     tabletPlan.setTimes(times);
     tabletPlan.setColumns(columns);
     tabletPlan.setRowCount(times.length);
diff --git 
a/server/src/test/java/org/apache/iotdb/db/metadata/id_table/QueryWithIDTableHashmapImplTest.java
 
b/server/src/test/java/org/apache/iotdb/db/metadata/id_table/QueryWithIDTableTest.java
similarity index 64%
rename from 
server/src/test/java/org/apache/iotdb/db/metadata/id_table/QueryWithIDTableHashmapImplTest.java
rename to 
server/src/test/java/org/apache/iotdb/db/metadata/id_table/QueryWithIDTableTest.java
index 6952d53..900adf4 100644
--- 
a/server/src/test/java/org/apache/iotdb/db/metadata/id_table/QueryWithIDTableHashmapImplTest.java
+++ 
b/server/src/test/java/org/apache/iotdb/db/metadata/id_table/QueryWithIDTableTest.java
@@ -36,6 +36,7 @@ import org.apache.iotdb.db.utils.EnvironmentUtils;
 import 
org.apache.iotdb.tsfile.exception.filter.QueryFilterOptimizationException;
 import org.apache.iotdb.tsfile.file.metadata.enums.TSDataType;
 import org.apache.iotdb.tsfile.read.TimeValuePair;
+import org.apache.iotdb.tsfile.read.common.Field;
 import org.apache.iotdb.tsfile.read.common.RowRecord;
 import org.apache.iotdb.tsfile.read.query.dataset.QueryDataSet;
 import org.apache.iotdb.tsfile.utils.Binary;
@@ -61,7 +62,7 @@ import java.util.Set;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertTrue;
 
-public class QueryWithIDTableHashmapImplTest {
+public class QueryWithIDTableTest {
   private final Planner processor = new Planner();
 
   private boolean isEnableIDTable = false;
@@ -78,6 +79,61 @@ public class QueryWithIDTableHashmapImplTest {
               "113\troot.isp.d1.s1\t13.0\tDOUBLE",
               "113\troot.isp.d1.s2\t23.0\tFLOAT"));
 
+  private static String[] sqls =
+      new String[] {
+        "SET STORAGE GROUP TO root.vehicle",
+        "SET STORAGE GROUP TO root.other",
+        "CREATE TIMESERIES root.vehicle.d0.s0 WITH DATATYPE=INT32, 
ENCODING=RLE",
+        "CREATE TIMESERIES root.vehicle.d0.s1 WITH DATATYPE=INT64, 
ENCODING=RLE",
+        "CREATE TIMESERIES root.vehicle.d0.s2 WITH DATATYPE=FLOAT, 
ENCODING=RLE",
+        "CREATE TIMESERIES root.vehicle.d0.s3 WITH DATATYPE=TEXT, 
ENCODING=PLAIN",
+        "CREATE TIMESERIES root.vehicle.d0.s4 WITH DATATYPE=BOOLEAN, 
ENCODING=PLAIN",
+        "CREATE TIMESERIES root.vehicle.d1.s0 WITH DATATYPE=INT32, 
ENCODING=RLE",
+        "CREATE TIMESERIES root.other.d1.s0 WITH DATATYPE=FLOAT, ENCODING=RLE",
+        "insert into root.vehicle.d0(timestamp,s0) values(1,101)",
+        "insert into root.vehicle.d0(timestamp,s0) values(2,198)",
+        "insert into root.vehicle.d0(timestamp,s0) values(100,99)",
+        "insert into root.vehicle.d0(timestamp,s0) values(101,99)",
+        "insert into root.vehicle.d0(timestamp,s0) values(102,80)",
+        "insert into root.vehicle.d0(timestamp,s0) values(103,99)",
+        "insert into root.vehicle.d0(timestamp,s0) values(104,90)",
+        "insert into root.vehicle.d0(timestamp,s0) values(105,99)",
+        "insert into root.vehicle.d0(timestamp,s0) values(106,99)",
+        "insert into root.vehicle.d0(timestamp,s0) values(2,10000)",
+        "insert into root.vehicle.d0(timestamp,s0) values(50,10000)",
+        "insert into root.vehicle.d0(timestamp,s0) values(1000,22222)",
+        "insert into root.vehicle.d0(timestamp,s1) values(1,1101)",
+        "insert into root.vehicle.d0(timestamp,s1) values(2,198)",
+        "insert into root.vehicle.d0(timestamp,s1) values(100,199)",
+        "insert into root.vehicle.d0(timestamp,s1) values(101,199)",
+        "insert into root.vehicle.d0(timestamp,s1) values(102,180)",
+        "insert into root.vehicle.d0(timestamp,s1) values(103,199)",
+        "insert into root.vehicle.d0(timestamp,s1) values(104,190)",
+        "insert into root.vehicle.d0(timestamp,s1) values(105,199)",
+        "insert into root.vehicle.d0(timestamp,s1) values(2,40000)",
+        "insert into root.vehicle.d0(timestamp,s1) values(50,50000)",
+        "insert into root.vehicle.d0(timestamp,s1) values(1000,55555)",
+        "insert into root.vehicle.d0(timestamp,s1) 
values(2000-01-01T08:00:00+08:00, 100)",
+        "insert into root.vehicle.d0(timestamp,s2) values(1000,55555)",
+        "insert into root.vehicle.d0(timestamp,s2) values(2,2.22)",
+        "insert into root.vehicle.d0(timestamp,s2) values(3,3.33)",
+        "insert into root.vehicle.d0(timestamp,s2) values(4,4.44)",
+        "insert into root.vehicle.d0(timestamp,s2) values(102,10.00)",
+        "insert into root.vehicle.d0(timestamp,s2) values(105,11.11)",
+        "insert into root.vehicle.d0(timestamp,s2) values(1000,1000.11)",
+        "insert into root.vehicle.d0(timestamp,s3) values(60,'aaaaa')",
+        "insert into root.vehicle.d0(timestamp,s3) values(70,'bbbbb')",
+        "insert into root.vehicle.d0(timestamp,s3) values(80,'ccccc')",
+        "insert into root.vehicle.d0(timestamp,s3) values(101,'ddddd')",
+        "insert into root.vehicle.d0(timestamp,s3) values(102,'fffff')",
+        "insert into root.vehicle.d0(timestamp,s3) 
values(2000-01-01T08:00:00+08:00, 'good')",
+        "insert into root.vehicle.d0(timestamp,s4) values(100, false)",
+        "insert into root.vehicle.d0(timestamp,s4) values(100, true)",
+        "insert into root.vehicle.d1(timestamp,s0) values(1,999)",
+        "insert into root.vehicle.d1(timestamp,s0) values(1000,888)",
+        "insert into root.other.d1(timestamp,s0) values(2, 3.14)",
+      };
+
   @Before
   public void before() {
     IoTDBDescriptor.getInstance().getConfig().setAutoCreateSchemaEnabled(true);
@@ -120,6 +176,61 @@ public class QueryWithIDTableHashmapImplTest {
   }
 
   @Test
+  public void testAggregateQueryAfterFlush()
+      throws MetadataException, QueryProcessException, StorageEngineException, 
InterruptedException,
+          QueryFilterOptimizationException, IOException {
+    insertDataInDisk();
+    insertDataInMemory();
+
+    PlanExecutor executor = new PlanExecutor();
+    QueryPlan queryPlan =
+        (QueryPlan) processor.parseSQLToPhysicalPlan("select count(*) from 
root.isp.d1");
+    QueryDataSet dataSet = executor.processQuery(queryPlan, 
EnvironmentUtils.TEST_QUERY_CONTEXT);
+    Assert.assertEquals(6, dataSet.getPaths().size());
+    int count = 0;
+    while (dataSet.hasNext()) {
+      RowRecord record = dataSet.next();
+      for (Field f : record.getFields()) {
+        assertEquals(8L, f.getLongV());
+      }
+      count++;
+    }
+
+    assertEquals(1, count);
+  }
+
+  @Test
+  public void testGroupByQueryAfterFlush()
+      throws MetadataException, QueryProcessException, StorageEngineException, 
InterruptedException,
+          QueryFilterOptimizationException, IOException {
+    insertDataInDisk();
+    insertDataInMemory();
+
+    PlanExecutor executor = new PlanExecutor();
+    QueryPlan queryPlan =
+        (QueryPlan)
+            processor.parseSQLToPhysicalPlan(
+                "select count(*) from root.isp.d1 group by ([10, 114), 10ms)");
+    QueryDataSet dataSet = executor.processQuery(queryPlan, 
EnvironmentUtils.TEST_QUERY_CONTEXT);
+    System.out.println(dataSet.getPaths());
+    Assert.assertEquals(6, dataSet.getPaths().size());
+    int count = 0;
+    while (dataSet.hasNext()) {
+      RowRecord record = dataSet.next();
+      for (Field f : record.getFields()) {
+        if (count == 0 || count == 10) {
+          assertEquals(4L, f.getLongV());
+        } else {
+          assertEquals(0L, f.getLongV());
+        }
+      }
+      count++;
+    }
+
+    assertEquals(11, count);
+  }
+
+  @Test
   public void testLastCacheQuery()
       throws QueryProcessException, MetadataException, InterruptedException,
           QueryFilterOptimizationException, StorageEngineException, 
IOException {

Reply via email to