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

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


The following commit(s) were added to refs/heads/f_index_dev by this push:
     new 7f9cd02  let index return result aligned by timestamp
7f9cd02 is described below

commit 7f9cd02703a02cdcc8f8f3e58c13bfbdf89deebc
Author: kr11 <3095717866.com>
AuthorDate: Tue May 11 02:40:30 2021 +0800

    let index return result aligned by timestamp
---
 .../iotdb/db/index/algorithm/IoTDBIndex.java       | 70 +++++++++++++++++++++-
 .../iotdb/db/qp/physical/crud/QueryIndexPlan.java  |  3 +-
 .../apache/iotdb/db/index/it/ELBIndexReadIT.java   | 58 +++++++++++++++++-
 3 files changed, 127 insertions(+), 4 deletions(-)

diff --git 
a/server/src/main/java/org/apache/iotdb/db/index/algorithm/IoTDBIndex.java 
b/server/src/main/java/org/apache/iotdb/db/index/algorithm/IoTDBIndex.java
index 18fac67..de9495e 100644
--- a/server/src/main/java/org/apache/iotdb/db/index/algorithm/IoTDBIndex.java
+++ b/server/src/main/java/org/apache/iotdb/db/index/algorithm/IoTDBIndex.java
@@ -17,6 +17,9 @@
  */
 package org.apache.iotdb.db.index.algorithm;
 
+import java.util.Arrays;
+import java.util.PriorityQueue;
+import java.util.TreeMap;
 import org.apache.iotdb.db.conf.IoTDBDescriptor;
 import org.apache.iotdb.db.exception.index.IndexManagerException;
 import org.apache.iotdb.db.exception.index.QueryIndexException;
@@ -35,6 +38,8 @@ import org.apache.iotdb.db.query.context.QueryContext;
 import org.apache.iotdb.db.rescon.TVListAllocator;
 import org.apache.iotdb.db.utils.datastructure.TVList;
 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;
 
@@ -151,7 +156,8 @@ public abstract class IoTDBIndex {
       List<DistSeries> res, boolean alignedByTime, int nMaxReturnSeries)
       throws QueryIndexException {
     if (alignedByTime) {
-      throw new QueryIndexException("Unsupported alignedByTime result");
+//      throw new QueryIndexException("Unsupported alignedByTime result");
+      return constructTimeAlignedSearchDataset(res, nMaxReturnSeries);
     }
     // make result paths and types
     List<PartialPath> paths = new ArrayList<>();
@@ -200,4 +206,66 @@ public abstract class IoTDBIndex {
     }
     return dataSet;
   }
+
+  protected QueryDataSet constructTimeAlignedSearchDataset(
+      List<DistSeries> res, int nMaxReturnSeries) {
+    // make result paths and types
+    List<PartialPath> paths = new ArrayList<>();
+    List<TSDataType> types = new ArrayList<>();
+    Map<String, Integer> pathToIndex = new HashMap<>();
+    IndexStatManager.totalQueryCost = System.nanoTime() - 
IndexStatManager.totalQueryCost;
+    String statReport = IndexStatManager.provideReport();
+
+    // TODO it's a temp trick!
+    if (IoTDBDescriptor.getInstance().getConfig().isEnableIndexStat()) {
+      if (res.isEmpty()) {
+        // add a fake line and result
+        TVList fake = 
TVListAllocator.getInstance().allocate(TSDataType.DOUBLE);
+        fake.putDouble(0, 0);
+        try {
+          res.add(new DistSeries(0, fake, new 
PartialPath("root.sg.fake.fake")));
+        } catch (IllegalPathException e) {
+          e.printStackTrace();
+        }
+      }
+      PartialPath hackPath = new PartialPath(res.get(0).partialPath);
+      res.get(0).partialPath = hackPath.concatNode(statReport);
+    }
+    nMaxReturnSeries = Math.min(nMaxReturnSeries, res.size());
+    for (int i = 0; i < nMaxReturnSeries; i++) {
+      PartialPath series = res.get(i).partialPath;
+      paths.add(series);
+      pathToIndex.put(series.getFullPath(), i);
+      types.add(tsDataType);
+    }
+    IndexQueryDataSet dataSet = new IndexQueryDataSet(paths, types, 
pathToIndex);
+    if (nMaxReturnSeries == 0) {
+      return dataSet;
+    }
+
+    // add and sort time list
+    // TODO it's a temp trick due to nobody to ask
+    TreeMap<Long, List<Field>> timeMergedFields = new TreeMap<>();
+
+    for (int col = 0; col < nMaxReturnSeries; col++) {
+        TVList tvList = res.get(col).tvList;
+
+      for (int row = 0; row < tvList.size(); row++) {
+        long t = tvList.getTime(row);
+        Object v = IndexUtils.getValue(tvList, row);
+        //        record.addField(IndexUtils.getValue(tvList, row), 
tsDataType);
+        if (!timeMergedFields.containsKey(t)) {
+          timeMergedFields.put(t, Arrays.asList(new Field[nMaxReturnSeries]));
+        }
+        timeMergedFields.get(t).set(col, Field.getField(v, tsDataType));
+      }
+    }
+//    timeMergedFields.forEach((k,v)-> System.out.println(k + "," + v));
+    // to dataset
+    timeMergedFields.forEach((k,v)->{
+      RowRecord record = new RowRecord(k, v);
+      dataSet.putRecord(record);
+    });
+    return dataSet;
+  }
 }
diff --git 
a/server/src/main/java/org/apache/iotdb/db/qp/physical/crud/QueryIndexPlan.java 
b/server/src/main/java/org/apache/iotdb/db/qp/physical/crud/QueryIndexPlan.java
index 9410c99..63bcae8 100644
--- 
a/server/src/main/java/org/apache/iotdb/db/qp/physical/crud/QueryIndexPlan.java
+++ 
b/server/src/main/java/org/apache/iotdb/db/qp/physical/crud/QueryIndexPlan.java
@@ -28,7 +28,8 @@ public class QueryIndexPlan extends RawDataQueryPlan {
 
   private Map<String, Object> props;
   private IndexType indexType;
-  private boolean alignedByTime = false;
+  // for now, it's always true
+  private boolean alignedByTime = true;
 
   public QueryIndexPlan() {
     super();
diff --git 
a/server/src/test/java/org/apache/iotdb/db/index/it/ELBIndexReadIT.java 
b/server/src/test/java/org/apache/iotdb/db/index/it/ELBIndexReadIT.java
index 037c9f1..59f85d6 100644
--- a/server/src/test/java/org/apache/iotdb/db/index/it/ELBIndexReadIT.java
+++ b/server/src/test/java/org/apache/iotdb/db/index/it/ELBIndexReadIT.java
@@ -85,17 +85,21 @@ public class ELBIndexReadIT {
         Statement statement = connection.createStatement(); ) {
       statement.execute(String.format("SET STORAGE GROUP TO %s", 
storageGroupSub));
       statement.execute(String.format("SET STORAGE GROUP TO %s", 
storageGroupWhole));
-
+      System.out.println(String.format("SET STORAGE GROUP TO %s", 
storageGroupSub));
+      System.out.println(String.format("SET STORAGE GROUP TO %s", 
storageGroupWhole));
       statement.execute(
           String.format("CREATE TIMESERIES %s WITH 
DATATYPE=FLOAT,ENCODING=PLAIN", speed1));
+      System.out.println(String.format("CREATE TIMESERIES %s WITH 
DATATYPE=FLOAT,ENCODING=PLAIN", speed1));
 
       for (int i = 0; i < wholeSize; i++) {
         String wholePath = String.format(directionPattern, i);
         statement.execute(
             String.format("CREATE TIMESERIES %s WITH 
DATATYPE=FLOAT,ENCODING=PLAIN", wholePath));
+        System.out.println(String.format("CREATE TIMESERIES %s WITH 
DATATYPE=FLOAT,ENCODING=PLAIN", wholePath));
       }
       statement.execute(
           String.format("CREATE INDEX ON %s WITH INDEX=%s, BLOCK_SIZE=%d", 
indexSub, ELB_INDEX, 5));
+      System.out.println(String.format("CREATE INDEX ON %s WITH INDEX=%s, 
BLOCK_SIZE=%d", indexSub, ELB_INDEX, 5));
 
       TVList subInput = 
TVListAllocator.getInstance().allocate(TSDataType.DOUBLE);
       for (int i = 0; i < subLength; i++) {
@@ -169,7 +173,7 @@ public class ELBIndexReadIT {
   }
 
   @Test
-  public void checkRead() throws ClassNotFoundException {
+  public void checkMultiSeriesTimeAligned() throws ClassNotFoundException {
     Class.forName(Config.JDBC_DRIVER_NAME);
     try (Connection connection =
             DriverManager.getConnection("jdbc:iotdb://127.0.0.1:6667/", 
"root", "root");
@@ -177,6 +181,56 @@ public class ELBIndexReadIT {
 
       String querySQL =
           "SELECT speed.* FROM root.wind1.azq01 WHERE Speed "
+              + String.format("CONTAIN (%s) WITH TOLERANCE 100000 ", 
getArrayRange(170, 200, 10))
+              + String.format("CONCAT (%s) WITH TOLERANCE 50 ", 
getArrayRange(250, 300, 10))
+              + String.format("CONCAT (%s) WITH TOLERANCE 100000 ", 
getArrayRange(400, 430, 10));
+      System.out.println(querySQL);
+      boolean hasIndex = statement.execute(querySQL);
+      String gt =
+          "Time,root.wind1.azq01.speed.17,\n"
+              + "0,170.0,\n"
+              + "1,180.0,\n"
+              + "2,190.0,\n"
+              + "3,250.0,\n"
+              + "4,260.0,\n"
+              + "5,270.0,\n"
+              + "6,280.0,\n"
+              + "7,290.0,\n"
+              + "8,400.0,\n"
+              + "9,410.0,\n"
+              + "10,420.0,\n";
+      Assert.assertTrue(hasIndex);
+      try (ResultSet resultSet = statement.getResultSet()) {
+        ResultSetMetaData resultSetMetaData = resultSet.getMetaData();
+        StringBuilder sb = new StringBuilder();
+        for (int i = 1; i <= resultSetMetaData.getColumnCount(); i++) {
+          sb.append(resultSetMetaData.getColumnName(i)).append(",");
+        }
+        sb.append("\n");
+        while (resultSet.next()) {
+          for (int i = 1; i <= resultSetMetaData.getColumnCount(); i++) {
+            sb.append(resultSet.getString(i)).append(",");
+          }
+          sb.append("\n");
+        }
+        System.out.println(sb);
+//        Assert.assertEquals(gt, sb.toString());
+      }
+    } catch (Exception e) {
+      e.printStackTrace();
+      fail(e.getMessage());
+    }
+  }
+
+  @Test
+  public void checkRead() throws ClassNotFoundException {
+    Class.forName(Config.JDBC_DRIVER_NAME);
+    try (Connection connection =
+        DriverManager.getConnection("jdbc:iotdb://127.0.0.1:6667/", "root", 
"root");
+        Statement statement = connection.createStatement()) {
+
+      String querySQL =
+          "SELECT speed.* FROM root.wind1.azq01 WHERE Speed "
               + String.format("CONTAIN (%s) WITH TOLERANCE 0 ", 
getArrayRange(170, 200, 10))
               + String.format("CONCAT (%s) WITH TOLERANCE 0 ", 
getArrayRange(250, 300, 10))
               + String.format("CONCAT (%s) WITH TOLERANCE 0 ", 
getArrayRange(400, 430, 10));

Reply via email to