You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@iotdb.apache.org by xi...@apache.org on 2022/03/04 10:53:25 UTC

[iotdb] branch alignbydevicealignedbug created (now 85e6db9)

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

xiangweiwei pushed a change to branch alignbydevicealignedbug
in repository https://gitbox.apache.org/repos/asf/iotdb.git.


      at 85e6db9  Fix align by device with aligned path bug

This branch includes the following new commits:

     new 85e6db9  Fix align by device with aligned path bug

The 1 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.


[iotdb] 01/01: Fix align by device with aligned path bug

Posted by xi...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

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

commit 85e6db9bd984e83155fe3f2eb11a0a04ee11d766
Author: Alima777 <wx...@gmail.com>
AuthorDate: Fri Mar 4 18:52:18 2022 +0800

    Fix align by device with aligned path bug
---
 .../integration/aligned/IoTDBAlignByDeviceIT.java  | 275 +++++++++++++++++++++
 .../db/query/dataset/AlignByDeviceDataSet.java     |   2 +-
 2 files changed, 276 insertions(+), 1 deletion(-)

diff --git a/integration/src/test/java/org/apache/iotdb/db/integration/aligned/IoTDBAlignByDeviceIT.java b/integration/src/test/java/org/apache/iotdb/db/integration/aligned/IoTDBAlignByDeviceIT.java
index b029223..8dad630 100644
--- a/integration/src/test/java/org/apache/iotdb/db/integration/aligned/IoTDBAlignByDeviceIT.java
+++ b/integration/src/test/java/org/apache/iotdb/db/integration/aligned/IoTDBAlignByDeviceIT.java
@@ -601,6 +601,281 @@ public class IoTDBAlignByDeviceIT {
   }
 
   @Test
+  public void selectAllAlignedWithValueFilterTest1() throws ClassNotFoundException {
+
+    String[] retArray =
+        new String[] {
+          "1,root.sg1.d1,1.0,1,1,true,aligned_test1",
+          "3,root.sg1.d1,30000.0,null,30000,true,aligned_unseq_test3",
+          "4,root.sg1.d1,4.0,4,null,true,aligned_test4",
+          "5,root.sg1.d1,5.0,5,null,true,aligned_test5",
+          "6,root.sg1.d1,6.0,6,6,true,null",
+          "10,root.sg1.d1,null,10,10,true,aligned_test10",
+          "13,root.sg1.d1,130000.0,130000,130000,true,aligned_unseq_test13",
+          "21,root.sg1.d1,null,null,21,true,null",
+          "22,root.sg1.d1,null,null,22,true,null",
+          "24,root.sg1.d1,null,null,24,true,null",
+          "25,root.sg1.d1,null,null,25,true,null",
+        };
+
+    String[] columnNames = {"Device", "s1", "s2", "s3", "s4", "s5"};
+
+    Class.forName(Config.JDBC_DRIVER_NAME);
+    try (Connection connection =
+            DriverManager.getConnection(
+                Config.IOTDB_URL_PREFIX + "127.0.0.1:6667/", "root", "root");
+        Statement statement = connection.createStatement()) {
+
+      boolean hasResultSet =
+          statement.execute("select * from root.sg1.d1 where s4 = true align by device");
+      Assert.assertTrue(hasResultSet);
+
+      try (ResultSet resultSet = statement.getResultSet()) {
+        ResultSetMetaData resultSetMetaData = resultSet.getMetaData();
+        Map<String, Integer> map = new HashMap<>();
+        for (int i = 1; i <= resultSetMetaData.getColumnCount(); i++) {
+          map.put(resultSetMetaData.getColumnName(i), i);
+        }
+        assertEquals(columnNames.length + 1, resultSetMetaData.getColumnCount());
+        int cnt = 0;
+        while (resultSet.next()) {
+          StringBuilder builder = new StringBuilder();
+          builder.append(resultSet.getString(1));
+          for (String columnName : columnNames) {
+            int index = map.get(columnName);
+            builder.append(",").append(resultSet.getString(index));
+          }
+          assertEquals(retArray[cnt], builder.toString());
+          cnt++;
+        }
+        assertEquals(retArray.length, cnt);
+      }
+
+    } catch (SQLException e) {
+      e.printStackTrace();
+      fail(e.getMessage());
+    }
+  }
+
+  @Test
+  public void selectAllAlignedWithValueFilterTest2() throws ClassNotFoundException {
+
+    String[] retArray =
+        new String[] {
+          "12,root.sg1.d1,12.0,12,12,null,null",
+          "14,root.sg1.d1,14.0,14,14,null,null",
+          "15,root.sg1.d1,15.0,15,15,null,null",
+          "16,root.sg1.d1,16.0,16,16,null,null",
+          "17,root.sg1.d1,17.0,17,17,null,null",
+          "18,root.sg1.d1,18.0,18,18,null,null",
+          "19,root.sg1.d1,19.0,19,19,null,null",
+          "20,root.sg1.d1,20.0,20,20,null,null",
+        };
+
+    String[] columnNames = {"Device", "s1", "s2", "s3", "s4", "s5"};
+
+    Class.forName(Config.JDBC_DRIVER_NAME);
+    try (Connection connection =
+            DriverManager.getConnection(
+                Config.IOTDB_URL_PREFIX + "127.0.0.1:6667/", "root", "root");
+        Statement statement = connection.createStatement()) {
+
+      boolean hasResultSet =
+          statement.execute("select * from root.sg1.d1 where s1 > 11 and s2 <= 33 align by device");
+      Assert.assertTrue(hasResultSet);
+
+      try (ResultSet resultSet = statement.getResultSet()) {
+        ResultSetMetaData resultSetMetaData = resultSet.getMetaData();
+        Map<String, Integer> map = new HashMap<>();
+        for (int i = 1; i <= resultSetMetaData.getColumnCount(); i++) {
+          map.put(resultSetMetaData.getColumnName(i), i);
+        }
+        assertEquals(columnNames.length + 1, resultSetMetaData.getColumnCount());
+        int cnt = 0;
+        while (resultSet.next()) {
+          StringBuilder builder = new StringBuilder();
+          builder.append(resultSet.getString(1));
+          for (String columnName : columnNames) {
+            int index = map.get(columnName);
+            builder.append(",").append(resultSet.getString(index));
+          }
+          assertEquals(retArray[cnt], builder.toString());
+          cnt++;
+        }
+        assertEquals(retArray.length, cnt);
+      }
+
+    } catch (SQLException e) {
+      e.printStackTrace();
+      fail(e.getMessage());
+    }
+  }
+
+  @Test
+  public void selectAllAlignedWithTimeAndValueFilterTest1() throws ClassNotFoundException {
+
+    String[] retArray =
+        new String[] {
+          "9,root.sg1.d1,9.0,9,9,false,aligned_test9",
+          "11,root.sg1.d1,11.0,11,11,null,null",
+          "12,root.sg1.d1,12.0,12,12,null,null",
+          "14,root.sg1.d1,14.0,14,14,null,null",
+          "15,root.sg1.d1,15.0,15,15,null,null",
+          "16,root.sg1.d1,16.0,16,16,null,null",
+          "17,root.sg1.d1,17.0,17,17,null,null",
+          "18,root.sg1.d1,18.0,18,18,null,null",
+        };
+
+    String[] columnNames = {"Device", "s1", "s2", "s3", "s4", "s5"};
+
+    Class.forName(Config.JDBC_DRIVER_NAME);
+    try (Connection connection =
+            DriverManager.getConnection(
+                Config.IOTDB_URL_PREFIX + "127.0.0.1:6667/", "root", "root");
+        Statement statement = connection.createStatement()) {
+
+      boolean hasResultSet =
+          statement.execute(
+              "select * from root.sg1.d1 where time >= 9 and time <= 33 and s1 < 19 align by device");
+      Assert.assertTrue(hasResultSet);
+
+      try (ResultSet resultSet = statement.getResultSet()) {
+        ResultSetMetaData resultSetMetaData = resultSet.getMetaData();
+        Map<String, Integer> map = new HashMap<>();
+        for (int i = 1; i <= resultSetMetaData.getColumnCount(); i++) {
+          map.put(resultSetMetaData.getColumnName(i), i);
+        }
+        assertEquals(columnNames.length + 1, resultSetMetaData.getColumnCount());
+        int cnt = 0;
+        while (resultSet.next()) {
+          StringBuilder builder = new StringBuilder();
+          builder.append(resultSet.getString(1));
+          for (String columnName : columnNames) {
+            int index = map.get(columnName);
+            builder.append(",").append(resultSet.getString(index));
+          }
+          assertEquals(retArray[cnt], builder.toString());
+          cnt++;
+        }
+        assertEquals(retArray.length, cnt);
+      }
+
+    } catch (SQLException e) {
+      e.printStackTrace();
+      fail(e.getMessage());
+    }
+  }
+
+  @Test
+  public void selectSomeAlignedWithValueFilterTest1() throws ClassNotFoundException {
+
+    String[] retArray =
+        new String[] {
+          "1,root.sg1.d1,1.0,true,aligned_test1",
+          "2,root.sg1.d1,2.0,null,aligned_test2",
+          "4,root.sg1.d1,4.0,true,aligned_test4",
+          "5,root.sg1.d1,5.0,true,aligned_test5",
+          "6,root.sg1.d1,6.0,true,null",
+          "7,root.sg1.d1,7.0,false,aligned_test7",
+          "8,root.sg1.d1,8.0,null,aligned_test8",
+          "9,root.sg1.d1,9.0,false,aligned_test9",
+          "11,root.sg1.d1,11.0,null,null",
+          "12,root.sg1.d1,12.0,null,null",
+          "14,root.sg1.d1,14.0,null,null",
+          "15,root.sg1.d1,15.0,null,null",
+          "16,root.sg1.d1,16.0,null,null",
+          "34,root.sg1.d1,null,null,aligned_test34",
+        };
+
+    String[] columnNames = {"Device", "s1", "s4", "s5"};
+
+    Class.forName(Config.JDBC_DRIVER_NAME);
+    try (Connection connection =
+            DriverManager.getConnection(
+                Config.IOTDB_URL_PREFIX + "127.0.0.1:6667/", "root", "root");
+        Statement statement = connection.createStatement()) {
+
+      boolean hasResultSet =
+          statement.execute(
+              "select s1,s4,s5 from root.sg1.d1 where s1 < 17 or s5 = 'aligned_test34' align by device");
+      Assert.assertTrue(hasResultSet);
+
+      try (ResultSet resultSet = statement.getResultSet()) {
+        ResultSetMetaData resultSetMetaData = resultSet.getMetaData();
+        Map<String, Integer> map = new HashMap<>();
+        for (int i = 1; i <= resultSetMetaData.getColumnCount(); i++) {
+          map.put(resultSetMetaData.getColumnName(i), i);
+        }
+        assertEquals(columnNames.length + 1, resultSetMetaData.getColumnCount());
+        int cnt = 0;
+        while (resultSet.next()) {
+          StringBuilder builder = new StringBuilder();
+          builder.append(resultSet.getString(1));
+          for (String columnName : columnNames) {
+            int index = map.get(columnName);
+            builder.append(",").append(resultSet.getString(index));
+          }
+          assertEquals(retArray[cnt], builder.toString());
+          cnt++;
+        }
+        assertEquals(retArray.length, cnt);
+      }
+
+    } catch (SQLException e) {
+      e.printStackTrace();
+      fail(e.getMessage());
+    }
+  }
+
+  @Test
+  public void selectSomeAlignedWithValueFilterTest2() throws ClassNotFoundException {
+
+    String[] retArray =
+        new String[] {
+          "7,root.sg1.d1,7.0,false", "9,root.sg1.d1,9.0,false",
+        };
+
+    String[] columnNames = {"Device", "s1", "s4"};
+
+    Class.forName(Config.JDBC_DRIVER_NAME);
+    try (Connection connection =
+            DriverManager.getConnection(
+                Config.IOTDB_URL_PREFIX + "127.0.0.1:6667/", "root", "root");
+        Statement statement = connection.createStatement()) {
+
+      boolean hasResultSet =
+          statement.execute(
+              "select s1,s4 from root.sg1.d1 where s1 < 19 and s4 = false align by device");
+      Assert.assertTrue(hasResultSet);
+
+      try (ResultSet resultSet = statement.getResultSet()) {
+        ResultSetMetaData resultSetMetaData = resultSet.getMetaData();
+        Map<String, Integer> map = new HashMap<>();
+        for (int i = 1; i <= resultSetMetaData.getColumnCount(); i++) {
+          map.put(resultSetMetaData.getColumnName(i), i);
+        }
+        assertEquals(columnNames.length + 1, resultSetMetaData.getColumnCount());
+        int cnt = 0;
+        while (resultSet.next()) {
+          StringBuilder builder = new StringBuilder();
+          builder.append(resultSet.getString(1));
+          for (String columnName : columnNames) {
+            int index = map.get(columnName);
+            builder.append(",").append(resultSet.getString(index));
+          }
+          assertEquals(retArray[cnt], builder.toString());
+          cnt++;
+        }
+        assertEquals(retArray.length, cnt);
+      }
+
+    } catch (SQLException e) {
+      e.printStackTrace();
+      fail(e.getMessage());
+    }
+  }
+
+  @Test
   public void countAllAlignedWithoutTimeFilterTest() throws ClassNotFoundException {
     String[] retArray = new String[] {"root.sg1.d1", "20", "29", "28", "19", "20"};
     String[] columnNames = {
diff --git a/server/src/main/java/org/apache/iotdb/db/query/dataset/AlignByDeviceDataSet.java b/server/src/main/java/org/apache/iotdb/db/query/dataset/AlignByDeviceDataSet.java
index c26d335..3576b83 100644
--- a/server/src/main/java/org/apache/iotdb/db/query/dataset/AlignByDeviceDataSet.java
+++ b/server/src/main/java/org/apache/iotdb/db/query/dataset/AlignByDeviceDataSet.java
@@ -206,8 +206,8 @@ public class AlignByDeviceDataSet extends QueryDataSet {
             break;
           case QUERY:
             // Group all the subSensors of one vector into one VectorPartialPath
-            executePaths = MetaUtils.groupAlignedPaths(executePaths);
             rawDataQueryPlan.setDeduplicatedPathsAndUpdate(executePaths);
+            rawDataQueryPlan.setDeduplicatedVectorPaths(MetaUtils.groupAlignedPaths(executePaths));
             rawDataQueryPlan.setExpression(expression);
             currentDataSet = queryRouter.rawDataQuery(rawDataQueryPlan, context);
             break;