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 2f2016d  fix bug of whole matching index
2f2016d is described below

commit 2f2016db019e70b391a5c3aa68ed1bf7bc2a6b0e
Author: kr11 <3095717866.com>
AuthorDate: Fri May 14 11:27:17 2021 +0800

    fix bug of whole matching index
    
    查询时没考虑未创建索引的序列;flush之后involvedSet没有序列化,重启后就消失了导致错误
---
 .../org/apache/iotdb/db/index/IndexProcessor.java  |   3 +-
 .../iotdb/db/index/algorithm/IoTDBIndex.java       |   6 +-
 .../apache/iotdb/db/index/algorithm/NoIndex.java   |   2 +-
 .../iotdb/db/index/algorithm/RTreeIndex.java       |  28 ++--
 .../iotdb/db/index/algorithm/elb/ELBIndex.java     |   7 +-
 .../iotdb/db/index/algorithm/mmhh/MMHHIndex.java   |  57 ++++----
 .../iotdb/db/index/algorithm/rtree/RTree.java      |   7 +-
 .../iotdb/db/index/algorithm/rtree/RTreeTest.java  |   3 +-
 .../apache/iotdb/db/index/it/DemoMMHHWindIT.java   | 150 ++++++++++++---------
 .../apache/iotdb/db/index/it/DemoRTreeWindIT.java  | 148 +++++++++++---------
 10 files changed, 236 insertions(+), 175 deletions(-)

diff --git a/server/src/main/java/org/apache/iotdb/db/index/IndexProcessor.java 
b/server/src/main/java/org/apache/iotdb/db/index/IndexProcessor.java
index 86e0ff7..e541479 100644
--- a/server/src/main/java/org/apache/iotdb/db/index/IndexProcessor.java
+++ b/server/src/main/java/org/apache/iotdb/db/index/IndexProcessor.java
@@ -62,6 +62,7 @@ import java.util.concurrent.locks.ReadWriteLock;
 import java.util.concurrent.locks.ReentrantReadWriteLock;
 
 import static org.apache.iotdb.db.index.common.IndexType.ANY_FOR_QUERY;
+import static org.apache.iotdb.db.index.common.IndexType.ELB_INDEX;
 
 /**
  * Each {@code IndexProcessor} manages all index instances under an 
<b>IndexSeries</b>.
@@ -430,7 +431,7 @@ public class IndexProcessor implements 
Comparable<IndexProcessor> {
   void endFlushMemTable() {
     // wait until all flushing tasks end.
     try {
-      waitingFlushEndAndDo(() -> {});
+      waitingFlushEndAndDo(()-> allPathsIndexMap.forEach((k,index)-> 
index.serializeIndex()));
     } catch (IOException ignored) {
       // the exception is ignored
     }
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 4cded51..6ccdc7c 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
@@ -82,8 +82,8 @@ public abstract class IoTDBIndex {
   /** A new item has been pre-processed by the FeatureExtractor, now the index 
can insert it. */
   public abstract boolean buildNext() throws IndexManagerException;
 
-  /** This index will be closed, it's time to serialize in-memory data to disk 
for next open. */
-  protected abstract void flushIndex();
+  /** It's time to serialize in-memory data to disk. */
+  public abstract void serializeIndex();
 
   /**
    * execute index query and return the result.
@@ -123,7 +123,7 @@ public abstract class IoTDBIndex {
 
   /** Close the index, release resources of the index structure and the 
feature extractor. */
   public ByteBuffer closeAndRelease() throws IOException {
-    flushIndex();
+    serializeIndex();
     if (indexFeatureExtractor != null) {
       return indexFeatureExtractor.closeAndRelease();
     } else {
diff --git 
a/server/src/main/java/org/apache/iotdb/db/index/algorithm/NoIndex.java 
b/server/src/main/java/org/apache/iotdb/db/index/algorithm/NoIndex.java
index 1e9ff88..8888ad3 100644
--- a/server/src/main/java/org/apache/iotdb/db/index/algorithm/NoIndex.java
+++ b/server/src/main/java/org/apache/iotdb/db/index/algorithm/NoIndex.java
@@ -51,7 +51,7 @@ public class NoIndex extends IoTDBIndex {
   }
 
   @Override
-  protected void flushIndex() {
+  public void serializeIndex() {
     // NoIndex does nothing
   }
 
diff --git 
a/server/src/main/java/org/apache/iotdb/db/index/algorithm/RTreeIndex.java 
b/server/src/main/java/org/apache/iotdb/db/index/algorithm/RTreeIndex.java
index 653b1c7..a385cc7 100644
--- a/server/src/main/java/org/apache/iotdb/db/index/algorithm/RTreeIndex.java
+++ b/server/src/main/java/org/apache/iotdb/db/index/algorithm/RTreeIndex.java
@@ -80,6 +80,7 @@ import static 
org.apache.iotdb.db.index.common.IndexConstant.SEED_PICKER;
 import static org.apache.iotdb.db.index.common.IndexConstant.SERIES_LENGTH;
 import static org.apache.iotdb.db.index.common.IndexConstant.THRESHOLD;
 import static org.apache.iotdb.db.index.common.IndexConstant.TOP_K;
+import static org.apache.iotdb.db.index.common.IndexType.MMHH;
 import static org.apache.iotdb.db.index.common.IndexType.RTREE_PAA;
 
 /**
@@ -104,7 +105,9 @@ public abstract class RTreeIndex extends IoTDBIndex {
    * <p>The range of dimension {@code i} is {@code [corner[i], 
corner[i]+range[i]]}
    */
   private final boolean usePointType;
-  /** For generality, RTree only store ids of identifiers or others. */
+  /**
+   * For generality, RTree only store ids of identifiers or others.
+   */
   private RTree<PartialPath> rTree;
 
   protected float[] currentLowerBounds;
@@ -128,7 +131,7 @@ public abstract class RTreeIndex extends IoTDBIndex {
     if (indexDirFile.exists()) {
       logger.info("reload index {} from {}", RTREE_PAA, indexDir);
       featureFile = IndexUtils.getIndexFile(indexDir + File.separator + 
"rTreeFeature");
-      deserializeFeatures();
+      deserializeRTree();
     } else {
       logger.info("mkdir index {} in {}", RTREE_PAA, indexDir);
       indexDirFile.mkdirs();
@@ -136,23 +139,27 @@ public abstract class RTreeIndex extends IoTDBIndex {
     }
   }
 
-  private void deserializeFeatures() {
+  private void deserializeRTree() {
     if (!featureFile.exists()) {
       return;
     }
     try (InputStream inputStream = new FileInputStream(featureFile)) {
-      this.rTree = RTree.deserializePartialPath(inputStream);
+      logger.info("reload index {} from {}", RTREE_PAA, featureFile);
+      this.rTree = RTree.deserialize(inputStream, involvedPathSet);
+      logger.info("Deserialize RTreeIndex rTree: {}", 
rTree.toString().substring(0, 10));
+      logger.info("Deserialize InvolvedSet: {}, {}", involvedPathSet.size(), 
involvedPathSet);
     } catch (IOException e) {
       logger.error("Error when deserialize ELB features. Given up.", e);
     }
   }
 
   @Override
-  protected void flushIndex() {
+  public void serializeIndex() {
     logger.info("RTreeIndex {} starts serialization", indexSeries);
+    logger.info("RTreeIndex RTree to serialized: {}", 
rTree.toString().substring(0, 10));
+    logger.info("Serialize InvolvedSet: {}, {}", involvedPathSet.size(), 
involvedPathSet);
     try (OutputStream outputStream = new FileOutputStream(featureFile)) {
       rTree.serialize(outputStream);
-      rTree.clear();
     } catch (IOException e) {
       logger.error("Error when serialize router. Given up.", e);
     }
@@ -241,6 +248,7 @@ public abstract class RTreeIndex extends IoTDBIndex {
     return res;
   }
 
+  @Override
   public void endFlushTask() {
     super.endFlushTask();
     currentInsertPath = null;
@@ -267,12 +275,16 @@ public abstract class RTreeIndex extends IoTDBIndex {
   //  protected abstract BiConsumer<String, InputStream> getDeserializeFunc();
   //  protected abstract List<Identifier> getQueryCandidates(List<Integer> 
candidateIds);
 
-  /** */
+  /**
+   *
+   */
   protected abstract float[] calcQueryFeature(double[] patterns);
 
   public static class RTreeQueryStruct {
 
-    /** features is represented by float array */
+    /**
+     * features is represented by float array
+     */
     float[] patternFeatures;
     //    TriFunction<float[], float[], float[], Double> calcLowerDistFunc;
     //
diff --git 
a/server/src/main/java/org/apache/iotdb/db/index/algorithm/elb/ELBIndex.java 
b/server/src/main/java/org/apache/iotdb/db/index/algorithm/elb/ELBIndex.java
index 99f8cee..84f149d 100644
--- a/server/src/main/java/org/apache/iotdb/db/index/algorithm/elb/ELBIndex.java
+++ b/server/src/main/java/org/apache/iotdb/db/index/algorithm/elb/ELBIndex.java
@@ -175,8 +175,13 @@ public class ELBIndex extends IoTDBIndex {
     }
   }
 
+//  @Override
+//  public void endFlushTask() {
+//    super.endFlushTask();
+//  }
+
   @Override
-  protected void flushIndex() {
+  public void serializeIndex() {
     logger.info("ELBIndex {} start serialization", indexSeries);
     try (OutputStream outputStream = new FileOutputStream(featureFile)) {
       ReadWriteIOUtils.write(windowBlockFeatures.size(), outputStream);
diff --git 
a/server/src/main/java/org/apache/iotdb/db/index/algorithm/mmhh/MMHHIndex.java 
b/server/src/main/java/org/apache/iotdb/db/index/algorithm/mmhh/MMHHIndex.java
index 8367b95..48fd146 100644
--- 
a/server/src/main/java/org/apache/iotdb/db/index/algorithm/mmhh/MMHHIndex.java
+++ 
b/server/src/main/java/org/apache/iotdb/db/index/algorithm/mmhh/MMHHIndex.java
@@ -80,7 +80,9 @@ import static 
org.apache.iotdb.db.index.common.IndexConstant.SERIES_LENGTH;
 import static org.apache.iotdb.db.index.common.IndexConstant.TOP_K;
 import static org.apache.iotdb.db.index.common.IndexType.MMHH;
 
-/** Refer to: Kang, Rong, et al. Maximum-margin hamming hashing. ICCV. 
IEEE/CVF. 2019: 8252-8261. */
+/**
+ * Refer to: Kang, Rong, et al. Maximum-margin hamming hashing. ICCV. 
IEEE/CVF. 2019: 8252-8261.
+ */
 public class MMHHIndex extends IoTDBIndex {
 
   private static final Logger logger = 
LoggerFactory.getLogger(MMHHIndex.class);
@@ -109,8 +111,10 @@ public class MMHHIndex extends IoTDBIndex {
 
     File indexDirFile = IndexUtils.getIndexFile(indexDir);
     if (indexDirFile.exists()) {
-      logger.info("reload index {} from {}", MMHH, indexDir);
+      logger.info("reload index {} from {}", MMHH, featureFile);
       deserializeHashLookup();
+      logger.info("Deserialize MMHHIndex hashTable: {}", hashLookupTable);
+      logger.info("Deserialize InvolvedSet: {}, {}", involvedPathSet.size(), 
involvedPathSet);
     } else {
       indexDirFile.mkdirs();
       hashLookupTable = new HashMap<>();
@@ -145,7 +149,10 @@ public class MMHHIndex extends IoTDBIndex {
     return res;
   }
 
-  /** should be concise into WholeIndex or IoTDBIndex, it's duplicate */
+  /**
+   * should be concise into WholeIndex or IoTDBIndex, it's duplicate
+   */
+  @Override
   public void endFlushTask() {
     super.endFlushTask();
     currentInsertPath = null;
@@ -170,19 +177,21 @@ public class MMHHIndex extends IoTDBIndex {
   }
 
   @Override
-  protected void flushIndex() {
+  public void serializeIndex() {
     logger.info("MMHHIndex {} starts serialization", indexSeries);
+    logger.info("MMHHIndex hashTable to serialized: {}", hashLookupTable);
+    logger.info("Serialize InvolvedSet: {}, {}", involvedPathSet.size(), 
involvedPathSet);
     serializeHashLookup();
-    hashLookupTable.clear();
     logger.info("MMHHIndex {} finishes serialization", indexSeries);
   }
 
   private void deserializeHashLookup() {
+    hashLookupTable = new HashMap<>();
+
     if (!featureFile.exists()) {
       return;
     }
     try (InputStream inputStream = new FileInputStream(featureFile)) {
-      hashLookupTable = new HashMap<>();
       int tableSize = ReadWriteIOUtils.readInt(inputStream);
       for (int i = 0; i < tableSize; i++) {
         Long key = ReadWriteIOUtils.readLong(inputStream);
@@ -191,6 +200,7 @@ public class MMHHIndex extends IoTDBIndex {
         for (int j = 0; j < bucketSize; j++) {
           Long v = ReadWriteIOUtils.readLong(inputStream);
           bucket.add(v);
+          involvedPathSet.add(seriesIdToPath(v));
           itemSize++;
         }
         hashLookupTable.put(key, bucket);
@@ -222,7 +232,9 @@ public class MMHHIndex extends IoTDBIndex {
 
   private static class MMHHQueryStruct {
 
-    /** features is represented by float array */
+    /**
+     * features is represented by float array
+     */
     //    float[] patternFeatures;
     //    TriFunction<float[], float[], float[], Double> calcLowerDistFunc;
     //
@@ -382,23 +394,6 @@ public class MMHHIndex extends IoTDBIndex {
     if (!uninvolvedList.isEmpty()) {
       Function<PartialPath, TVList> loadSeriesFunc =
           getLoadSeriesFunc(context, tsDataType, mmhhFeatureExtractor);
-      BiFunction<double[], TVList, Double> exactDistFunc = 
getCalcExactDistFunc();
-      //
-      //      PriorityQueue<DistSeries> topKPQ = new 
PriorityQueue<>(struct.topK,
-      //          new DistSeriesComparator());
-      //      topKPQ.addAll(res);
-      //      double kthMinDist = topKPQ.isEmpty() ? Double.MAX_VALUE : 
topKPQ.peek().dist;
-      //      for (PartialPath path : uninvolvedList) {
-      //        TVList tvList = loadSeriesFunc.apply(path);
-      //        double tempDist = exactDistFunc.apply(struct.patterns, tvList);
-      //        if (topKPQ.size() < struct.topK || tempDist < kthMinDist) {
-      //          if (topKPQ.size() == struct.topK) {
-      //            topKPQ.poll();
-      //          }
-      //          topKPQ.add(new DistSeries(tempDist, tvList, path));
-      //          kthMinDist = topKPQ.peek().dist;
-      //        }
-      //      }
       for (PartialPath path : uninvolvedList) {
         TVList rawData = loadSeriesFunc.apply(path);
         res.add(new DistSeries(0, rawData, path));
@@ -445,7 +440,9 @@ public class MMHHIndex extends IoTDBIndex {
     return res;
   }
 
-  /** if res has reached topK */
+  /**
+   * if res has reached topK
+   */
   private boolean scanBucket(
       long queryCode,
       int doneIdx,
@@ -511,12 +508,16 @@ public class MMHHIndex extends IoTDBIndex {
     }
   }
 
-  private DistSeries readRawData(
-      int hammingDist, Long seriesId, Function<PartialPath, TVList> 
loadSeriesFunc) {
+  private PartialPath seriesIdToPath(Long seriesId) {
     int len = indexSeries.getNodeLength();
     String[] nodes = Arrays.copyOf(indexSeries.getNodes(), len);
     nodes[len - 2] = seriesId.toString();
-    PartialPath path = new PartialPath(nodes);
+    return new PartialPath(nodes);
+  }
+
+  private DistSeries readRawData(
+      int hammingDist, Long seriesId, Function<PartialPath, TVList> 
loadSeriesFunc) {
+    PartialPath path = seriesIdToPath(seriesId);
     TVList rawData = loadSeriesFunc.apply(path);
     return new DistSeries(hammingDist, rawData, path);
   }
diff --git 
a/server/src/main/java/org/apache/iotdb/db/index/algorithm/rtree/RTree.java 
b/server/src/main/java/org/apache/iotdb/db/index/algorithm/rtree/RTree.java
index ecf4fc5..7639447 100644
--- a/server/src/main/java/org/apache/iotdb/db/index/algorithm/rtree/RTree.java
+++ b/server/src/main/java/org/apache/iotdb/db/index/algorithm/rtree/RTree.java
@@ -431,7 +431,8 @@ public class RTree<T> {
     }
   }
 
-  public static RTree<PartialPath> deserializePartialPath(InputStream 
inputStream)
+  public static RTree<PartialPath> deserialize(InputStream inputStream,
+      Set<PartialPath> involvedPathSet)
       throws IOException {
     int dim = ReadWriteIOUtils.readInt(inputStream);
     int nMaxPerNode = ReadWriteIOUtils.readInt(inputStream);
@@ -444,7 +445,9 @@ public class RTree<T> {
         inputStream,
         in -> {
           try {
-            return new PartialPath(ReadWriteIOUtils.readString(inputStream));
+            PartialPath path = new 
PartialPath(ReadWriteIOUtils.readString(inputStream));
+            involvedPathSet.add(path);
+            return path;
           } catch (IOException | IllegalPathException e) {
             logger.error("read path error", e);
             return null;
diff --git 
a/server/src/test/java/org/apache/iotdb/db/index/algorithm/rtree/RTreeTest.java 
b/server/src/test/java/org/apache/iotdb/db/index/algorithm/rtree/RTreeTest.java
index 753cbf7..d0fd10d 100644
--- 
a/server/src/test/java/org/apache/iotdb/db/index/algorithm/rtree/RTreeTest.java
+++ 
b/server/src/test/java/org/apache/iotdb/db/index/algorithm/rtree/RTreeTest.java
@@ -17,6 +17,7 @@
  */
 package org.apache.iotdb.db.index.algorithm.rtree;
 
+import java.util.HashSet;
 import org.apache.iotdb.db.exception.metadata.IllegalPathException;
 import org.apache.iotdb.db.index.algorithm.rtree.RTree.RNode;
 import org.apache.iotdb.db.index.algorithm.rtree.RTree.SeedsPicker;
@@ -56,7 +57,7 @@ public class RTreeTest {
     rTree.serialize(out);
     InputStream in = new ByteArrayInputStream(out.toByteArray());
 
-    RTree<PartialPath> rTree2 = RTree.deserializePartialPath(in);
+    RTree<PartialPath> rTree2 = RTree.deserialize(in, new HashSet<>());
     Assert.assertEquals(rTree.toString(), rTree2.toString());
   }
 
diff --git 
a/server/src/test/java/org/apache/iotdb/db/index/it/DemoMMHHWindIT.java 
b/server/src/test/java/org/apache/iotdb/db/index/it/DemoMMHHWindIT.java
index a92a481..06ef98f 100644
--- a/server/src/test/java/org/apache/iotdb/db/index/it/DemoMMHHWindIT.java
+++ b/server/src/test/java/org/apache/iotdb/db/index/it/DemoMMHHWindIT.java
@@ -18,7 +18,10 @@
  */
 package org.apache.iotdb.db.index.it;
 
+import java.sql.SQLException;
 import org.apache.iotdb.db.conf.IoTDBDescriptor;
+import org.apache.iotdb.db.exception.StartupException;
+import org.apache.iotdb.db.index.IndexManager;
 import org.apache.iotdb.db.rescon.TVListAllocator;
 import org.apache.iotdb.db.utils.EnvironmentUtils;
 import org.apache.iotdb.db.utils.datastructure.TVList;
@@ -85,12 +88,23 @@ public class DemoMMHHWindIT {
     IoTDBDescriptor.getInstance().getConfig().setEnableIndex(false);
   }
 
+  private void executeNonQuery(String sql) {
+    try (Connection connection =
+        DriverManager.getConnection(
+            Config.IOTDB_URL_PREFIX + "127.0.0.1:6667/", "root", "root");
+        Statement statement = connection.createStatement();) {
+      statement.execute(sql);
+    } catch (SQLException e) {
+      e.printStackTrace();
+    }
+  }
+
   private static void insertSQL(boolean createTS) throws 
ClassNotFoundException {
     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(); ) {
+        DriverManager.getConnection(
+            Config.IOTDB_URL_PREFIX + "127.0.0.1:6667/", "root", "root");
+        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));
@@ -191,29 +205,70 @@ public class DemoMMHHWindIT {
   }
 
   @Test
-  public void checkReadWithoutCreateTS() throws ClassNotFoundException {
-    checkRead(false);
+  public void checkReadWithoutCreateTS() throws ClassNotFoundException, 
StartupException {
+    insertSQL(false);
+    System.out.println("<<<<<<< Query after insert");
+    // MMHH is approximate index. Before flushing, the index hasn't been built 
thus the query is turned to scan and sort by euclidean distance.
+    // Therefore, the first query result might be slightly different from the 
later three queries.
+    checkReads(false);
+    executeNonQuery("flush");
+    System.out.println("<<<<<<< Query after insert + flush");
+    checkReads(true);
+    IndexManager.getInstance().stop();
+    IndexManager.getInstance().start();
+    System.out.println("<<<<<<< Query after stop and restart");
+    checkReads(true);
+    executeNonQuery("flush");
+    System.out.println("<<<<<<< Query after stop and restart + flush");
+    checkReads(true);
+  }
+
+  private void checkReads(boolean assertResult) throws ClassNotFoundException {
+    String template = "SELECT TOP 3 speed FROM root.wind2.* WHERE speed LIKE 
(%s)";
+    String q1Line = 
"20.0,20.0,20.0,20.0,20.0,20.0,20.0,20.0,20.0,20.0,20.0,20.0,"
+        + 
"20.0,20.0,20.0,20.0,20.0,20.0,20.0,20.0,20.0,20.0,20.0,20.0,20.0,20.0,"
+        + "20.0,20.0,20.0,20.0,20.0,"
+        + 
"20.5,21.0,21.5,22.0,22.5,23.0,23.5,24.0,24.5,25.0,25.5,26.0,26.5,27.0,"
+        + 
"27.5,28.0,28.5,29.0,29.5,30.0,29.5,29.0,28.5,28.0,27.5,27.0,26.5,26.0,"
+        + "25.5,25.0,24.5,24.0,23.5,23.0,22.5,22.0,21.5,21.0,20.5,"
+        + 
"20.0,20.0,20.0,20.0,20.0,20.0,20.0,20.0,20.0,20.0,20.0,20.0,20.0,20.0,"
+        + 
"20.0,20.0,20.0,20.0,20.0,20.0,20.0,20.0,20.0,20.0,20.0,20.0,20.0,20.0,20.0,20.0";
+    String q2Best = 
"17.548,16.949,16.906,16.993,17.630,16.945,17.284,16.831,16.706,17.216,"
+        + 
"16.937,16.196,15.916,15.947,15.200,16.076,16.000,16.152,15.537,15.362,"
+        + 
"15.737,15.656,15.995,15.698,15.857,15.706,16.643,16.779,16.383,17.665,"
+        + 
"18.364,19.835,18.765,18.451,19.949,19.530,20.692,20.544,20.879,20.904,"
+        + 
"21.953,21.726,22.571,23.718,24.009,23.462,23.782,23.871,24.508,24.553,"
+        + 
"24.843,24.750,25.500,25.127,25.079,24.951,24.683,24.003,22.977,21.877,"
+        + 
"21.850,21.100,20.499,19.988,19.376,18.960,19.471,17.961,17.570,18.652,"
+        + 
"18.555,18.401,18.645,17.587,18.056,18.448,17.901,18.105,17.168,18.083,"
+        + 
"18.283,16.916,17.099,17.115,18.685,17.483,16.859,16.968,16.339,17.476,"
+        + 
"16.835,16.379,17.312,17.789,17.147,17.456,18.596,18.269,17.956,17.851";
+    String q3_76 = 
"18.735,18.299,19.216,18.049,18.762,18.739,18.745,18.074,18.398,17.306,"
+        + 
"17.455,17.401,16.886,16.683,16.413,16.469,17.458,17.429,17.450,16.701,"
+        + 
"16.932,16.032,16.755,16.264,17.173,16.238,16.335,15.200,16.120,16.209,"
+        + 
"18.333,18.754,18.621,18.898,19.394,21.456,20.956,22.844,23.484,23.219,"
+        + 
"23.903,25.306,24.586,25.023,24.670,25.361,25.771,26.625,27.457,27.110,"
+        + 
"26.849,26.500,26.552,26.922,26.056,25.468,25.656,25.830,25.439,25.058,"
+        + 
"23.967,24.251,22.794,22.174,21.551,20.847,20.373,20.662,19.614,19.460,"
+        + 
"18.355,17.562,18.276,18.907,18.524,18.557,18.104,18.487,18.885,19.310,"
+        + 
"19.461,19.036,19.356,19.737,19.328,19.652,19.566,19.629,18.953,18.839,"
+        + 
"18.754,19.221,19.215,19.359,19.324,19.729,19.575,19.720,19.591,19.761";
+    String gt_q1_line = 
"Time,root.wind2.1417439639000.speed.(D_Ham=0),root.wind2.1417437998000.speed.(D_Ham=0),root.wind2.1417403228000.speed.(D_Ham=0),\n";
+    String gt_q2_best = 
"Time,root.wind2.1417403228000.speed.(D_Ham=0),root.wind2.1417439639000.speed.(D_Ham=0),root.wind2.1417434715000.speed.(D_Ham=0),\n";
+    String gt_q3_series76 = 
"Time,root.wind2.1417439639000.speed.(D_Ham=0),root.wind2.1417403228000.speed.(D_Ham=0),root.wind2.1417437998000.speed.(D_Ham=0),\n";
+    checkRead(String.format(template, q1Line), assertResult ? gt_q1_line : 
null, true);
+    checkRead(String.format(template, q2Best), assertResult ? gt_q2_best : 
null, true);
+    checkRead(String.format(template, q3_76), assertResult ? gt_q3_series76 : 
null, true);
   }
 
-  private void checkRead(boolean createTS) throws ClassNotFoundException {
-    insertSQL(createTS);
+  private void checkRead(String querySQL, String gt, boolean onlyHeader)
+      throws ClassNotFoundException {
     Class.forName(Config.JDBC_DRIVER_NAME);
     try (Connection connection =
-            DriverManager.getConnection("jdbc:iotdb://127.0.0.1:6667/", 
"root", "root");
+        DriverManager.getConnection("jdbc:iotdb://127.0.0.1:6667/", "root", 
"root");
         Statement statement = connection.createStatement()) {
-      String q1Line =
-          "20.0,20.0,20.0,20.0,20.0,20.0,20.0,20.0,20.0,20.0,20.0,20.0,"
-              + 
"20.0,20.0,20.0,20.0,20.0,20.0,20.0,20.0,20.0,20.0,20.0,20.0,20.0,20.0,"
-              + "20.0,20.0,20.0,20.0,20.0,"
-              + 
"20.5,21.0,21.5,22.0,22.5,23.0,23.5,24.0,24.5,25.0,25.5,26.0,26.5,27.0,"
-              + 
"27.5,28.0,28.5,29.0,29.5,30.0,29.5,29.0,28.5,28.0,27.5,27.0,26.5,26.0,"
-              + "25.5,25.0,24.5,24.0,23.5,23.0,22.5,22.0,21.5,21.0,20.5,"
-              + 
"20.0,20.0,20.0,20.0,20.0,20.0,20.0,20.0,20.0,20.0,20.0,20.0,20.0,20.0,"
-              + 
"20.0,20.0,20.0,20.0,20.0,20.0,20.0,20.0,20.0,20.0,20.0,20.0,20.0,20.0,20.0,20.0";
-      String querySQL =
-          String.format("SELECT TOP 3 speed FROM root.wind2.* WHERE speed LIKE 
(%s)", q1Line);
-      System.out.println(querySQL);
-      statement.setQueryTimeout(200);
+//      System.out.println(querySQL);
+//      statement.setQueryTimeout(200);
       boolean hasIndex = statement.execute(querySQL);
       //      String gt = "Time,root.wind1.azq01.speed.17,\n";
       Assert.assertTrue(hasIndex);
@@ -224,55 +279,20 @@ public class DemoMMHHWindIT {
           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(",");
+        if (!onlyHeader) {
+          while (resultSet.next()) {
+            for (int i = 1; i <= resultSetMetaData.getColumnCount(); i++) {
+              sb.append(resultSet.getString(i)).append(",");
+            }
+            sb.append("\n");
           }
-          sb.append("\n");
         }
+        System.out.println(">>>>>>>>> Query Result:");
         System.out.println(sb);
-        //        Assert.assertEquals(gt, sb.toString());
-      }
-      // ========================================
-      String basePath = 
"/Users/kangrong/tsResearch/tols/JINFENG/d2/out_sub_base.csv";
-      List<Float> base = new ArrayList<>();
-      try (BufferedReader csvReader = new BufferedReader(new 
FileReader(basePath))) {
-        String row;
-        int idx = 0;
-        while ((row = csvReader.readLine()) != null) {
-          if (idx >= 1) {
-            String[] data = row.split(",");
-            long t = Long.parseLong(data[0]);
-            float v = Float.parseFloat(data[1]);
-            base.add(v);
-          }
-          idx++;
+        if (gt != null) {
+          Assert.assertEquals(gt, sb.toString());
         }
       }
-      String q2Line = getStringFromList(base, 7600, 7600 + 100);
-      querySQL =
-          String.format("SELECT TOP 3 speed FROM root.wind2.* WHERE speed LIKE 
(%s)", q2Line);
-      System.out.println(querySQL);
-      statement.setQueryTimeout(200);
-      hasIndex = statement.execute(querySQL);
-      //      String gt = "Time,root.wind1.azq01.speed.17,\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());
diff --git 
a/server/src/test/java/org/apache/iotdb/db/index/it/DemoRTreeWindIT.java 
b/server/src/test/java/org/apache/iotdb/db/index/it/DemoRTreeWindIT.java
index 1891d56..a85cfb4 100644
--- a/server/src/test/java/org/apache/iotdb/db/index/it/DemoRTreeWindIT.java
+++ b/server/src/test/java/org/apache/iotdb/db/index/it/DemoRTreeWindIT.java
@@ -18,7 +18,10 @@
  */
 package org.apache.iotdb.db.index.it;
 
+import java.sql.SQLException;
 import org.apache.iotdb.db.conf.IoTDBDescriptor;
+import org.apache.iotdb.db.exception.StartupException;
+import org.apache.iotdb.db.index.IndexManager;
 import org.apache.iotdb.db.rescon.TVListAllocator;
 import org.apache.iotdb.db.utils.EnvironmentUtils;
 import org.apache.iotdb.db.utils.datastructure.TVList;
@@ -82,12 +85,23 @@ public class DemoRTreeWindIT {
     IoTDBDescriptor.getInstance().getConfig().setEnableIndex(false);
   }
 
+  private void executeNonQuery(String sql) {
+    try (Connection connection =
+        DriverManager.getConnection(
+            Config.IOTDB_URL_PREFIX + "127.0.0.1:6667/", "root", "root");
+        Statement statement = connection.createStatement();) {
+      statement.execute(sql);
+    } catch (SQLException e) {
+      e.printStackTrace();
+    }
+  }
+
   private static void insertSQL(boolean createTS) throws 
ClassNotFoundException {
     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(); ) {
+        DriverManager.getConnection(
+            Config.IOTDB_URL_PREFIX + "127.0.0.1:6667/", "root", "root");
+        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));
@@ -167,29 +181,68 @@ public class DemoRTreeWindIT {
   }
 
   @Test
-  public void checkReadWithoutCreateTS() throws ClassNotFoundException {
-    checkRead(false);
+  public void checkReadWithoutCreateTS() throws ClassNotFoundException, 
StartupException {
+    insertSQL(false);
+    System.out.println("<<<<<<< Query after insert");
+    checkReads(true);
+    executeNonQuery("flush");
+    System.out.println("<<<<<<< Query after insert + flush");
+    checkReads(true);
+    IndexManager.getInstance().stop();
+    IndexManager.getInstance().start();
+    System.out.println("<<<<<<< Query after stop and restart");
+    checkReads(true);
+    executeNonQuery("flush");
+    System.out.println("<<<<<<< Query after stop and restart + flush");
+    checkReads(true);
+  }
+
+  private void checkReads(boolean assertResult) throws ClassNotFoundException {
+    String template = "SELECT TOP 3 speed FROM root.wind2.* WHERE speed LIKE 
(%s)";
+    String q1Line = 
"20.0,20.0,20.0,20.0,20.0,20.0,20.0,20.0,20.0,20.0,20.0,20.0,"
+        + 
"20.0,20.0,20.0,20.0,20.0,20.0,20.0,20.0,20.0,20.0,20.0,20.0,20.0,20.0,"
+        + "20.0,20.0,20.0,20.0,20.0,"
+        + 
"20.5,21.0,21.5,22.0,22.5,23.0,23.5,24.0,24.5,25.0,25.5,26.0,26.5,27.0,"
+        + 
"27.5,28.0,28.5,29.0,29.5,30.0,29.5,29.0,28.5,28.0,27.5,27.0,26.5,26.0,"
+        + "25.5,25.0,24.5,24.0,23.5,23.0,22.5,22.0,21.5,21.0,20.5,"
+        + 
"20.0,20.0,20.0,20.0,20.0,20.0,20.0,20.0,20.0,20.0,20.0,20.0,20.0,20.0,"
+        + 
"20.0,20.0,20.0,20.0,20.0,20.0,20.0,20.0,20.0,20.0,20.0,20.0,20.0,20.0,20.0,20.0";
+    String q2Best = 
"17.548,16.949,16.906,16.993,17.630,16.945,17.284,16.831,16.706,17.216,"
+        + 
"16.937,16.196,15.916,15.947,15.200,16.076,16.000,16.152,15.537,15.362,"
+        + 
"15.737,15.656,15.995,15.698,15.857,15.706,16.643,16.779,16.383,17.665,"
+        + 
"18.364,19.835,18.765,18.451,19.949,19.530,20.692,20.544,20.879,20.904,"
+        + 
"21.953,21.726,22.571,23.718,24.009,23.462,23.782,23.871,24.508,24.553,"
+        + 
"24.843,24.750,25.500,25.127,25.079,24.951,24.683,24.003,22.977,21.877,"
+        + 
"21.850,21.100,20.499,19.988,19.376,18.960,19.471,17.961,17.570,18.652,"
+        + 
"18.555,18.401,18.645,17.587,18.056,18.448,17.901,18.105,17.168,18.083,"
+        + 
"18.283,16.916,17.099,17.115,18.685,17.483,16.859,16.968,16.339,17.476,"
+        + 
"16.835,16.379,17.312,17.789,17.147,17.456,18.596,18.269,17.956,17.851";
+    String q3_76 = 
"18.735,18.299,19.216,18.049,18.762,18.739,18.745,18.074,18.398,17.306,"
+        + 
"17.455,17.401,16.886,16.683,16.413,16.469,17.458,17.429,17.450,16.701,"
+        + 
"16.932,16.032,16.755,16.264,17.173,16.238,16.335,15.200,16.120,16.209,"
+        + 
"18.333,18.754,18.621,18.898,19.394,21.456,20.956,22.844,23.484,23.219,"
+        + 
"23.903,25.306,24.586,25.023,24.670,25.361,25.771,26.625,27.457,27.110,"
+        + 
"26.849,26.500,26.552,26.922,26.056,25.468,25.656,25.830,25.439,25.058,"
+        + 
"23.967,24.251,22.794,22.174,21.551,20.847,20.373,20.662,19.614,19.460,"
+        + 
"18.355,17.562,18.276,18.907,18.524,18.557,18.104,18.487,18.885,19.310,"
+        + 
"19.461,19.036,19.356,19.737,19.328,19.652,19.566,19.629,18.953,18.839,"
+        + 
"18.754,19.221,19.215,19.359,19.324,19.729,19.575,19.720,19.591,19.761";
+    String gt_q1_line = 
"Time,root.wind2.1417439639000.speed.(D=20.17),root.wind2.1417437998000.speed.(D=32.81),root.wind2.1417437450000.speed.(D=34.97),\n";
+    String gt_q2_best = 
"Time,root.wind2.1417403228000.speed.(D=16.92),root.wind2.1417439639000.speed.(D=17.02),root.wind2.1417434715000.speed.(D=21.14),\n";
+    String gt_q3_series76 = 
"Time,root.wind2.1417439639000.speed.(D=0.00),root.wind2.1417403228000.speed.(D=21.57),root.wind2.1417437998000.speed.(D=29.78),\n";
+    checkRead(String.format(template, q1Line), assertResult ? gt_q1_line : 
null, true);
+    checkRead(String.format(template, q2Best), assertResult ? gt_q2_best : 
null, true);
+    checkRead(String.format(template, q3_76), assertResult ? gt_q3_series76 : 
null, true);
   }
 
-  private void checkRead(boolean createTS) throws ClassNotFoundException {
-    insertSQL(createTS);
+  private void checkRead(String querySQL, String gt, boolean onlyHeader)
+      throws ClassNotFoundException {
     Class.forName(Config.JDBC_DRIVER_NAME);
     try (Connection connection =
-            DriverManager.getConnection("jdbc:iotdb://127.0.0.1:6667/", 
"root", "root");
+        DriverManager.getConnection("jdbc:iotdb://127.0.0.1:6667/", "root", 
"root");
         Statement statement = connection.createStatement()) {
-      String q1Line =
-          "20.0,20.0,20.0,20.0,20.0,20.0,20.0,20.0,20.0,20.0,20.0,20.0,"
-              + 
"20.0,20.0,20.0,20.0,20.0,20.0,20.0,20.0,20.0,20.0,20.0,20.0,20.0,20.0,"
-              + "20.0,20.0,20.0,20.0,20.0,"
-              + 
"20.5,21.0,21.5,22.0,22.5,23.0,23.5,24.0,24.5,25.0,25.5,26.0,26.5,27.0,"
-              + 
"27.5,28.0,28.5,29.0,29.5,30.0,29.5,29.0,28.5,28.0,27.5,27.0,26.5,26.0,"
-              + "25.5,25.0,24.5,24.0,23.5,23.0,22.5,22.0,21.5,21.0,20.5,"
-              + 
"20.0,20.0,20.0,20.0,20.0,20.0,20.0,20.0,20.0,20.0,20.0,20.0,20.0,20.0,"
-              + 
"20.0,20.0,20.0,20.0,20.0,20.0,20.0,20.0,20.0,20.0,20.0,20.0,20.0,20.0,20.0,20.0";
-      String querySQL =
-          String.format("SELECT TOP 3 speed FROM root.wind2.* WHERE speed LIKE 
(%s)", q1Line);
-      System.out.println(querySQL);
-      statement.setQueryTimeout(200);
+//      System.out.println(querySQL);
+//      statement.setQueryTimeout(200);
       boolean hasIndex = statement.execute(querySQL);
       //      String gt = "Time,root.wind1.azq01.speed.17,\n";
       Assert.assertTrue(hasIndex);
@@ -200,55 +253,20 @@ public class DemoRTreeWindIT {
           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(",");
+        if (!onlyHeader) {
+          while (resultSet.next()) {
+            for (int i = 1; i <= resultSetMetaData.getColumnCount(); i++) {
+              sb.append(resultSet.getString(i)).append(",");
+            }
+            sb.append("\n");
           }
-          sb.append("\n");
         }
+        System.out.println(">>>>>>>>> Query Result:");
         System.out.println(sb);
-        //        Assert.assertEquals(gt, sb.toString());
-      }
-      // ========================================
-      String basePath = 
"/Users/kangrong/tsResearch/tols/JINFENG/d2/out_sub_base.csv";
-      List<Float> base = new ArrayList<>();
-      try (BufferedReader csvReader = new BufferedReader(new 
FileReader(basePath))) {
-        String row;
-        int idx = 0;
-        while ((row = csvReader.readLine()) != null) {
-          if (idx >= 1) {
-            String[] data = row.split(",");
-            long t = Long.parseLong(data[0]);
-            float v = Float.parseFloat(data[1]);
-            base.add(v);
-          }
-          idx++;
+        if (gt != null) {
+          Assert.assertEquals(gt, sb.toString());
         }
       }
-      String q2Line = getStringFromList(base, 7600, 7600 + 100);
-      querySQL =
-          String.format("SELECT TOP 3 speed FROM root.wind2.* WHERE speed LIKE 
(%s)", q2Line);
-      System.out.println(querySQL);
-      statement.setQueryTimeout(200);
-      hasIndex = statement.execute(querySQL);
-      //      String gt = "Time,root.wind1.azq01.speed.17,\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());

Reply via email to