You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@iotdb.apache.org by ka...@apache.org on 2021/05/13 04:14:36 UTC

[iotdb] 02/02: fix elb bug

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

commit 68a2944ab4b5efba8a701f8a460b83c5873bb5f1
Author: kr11 <3095717866.com>
AuthorDate: Thu May 13 12:14:04 2021 +0800

    fix elb bug
---
 .../iotdb/db/index/algorithm/elb/ELBIndex.java     |  14 +-
 .../algorithm/elb/feature/SequenceELBFeature.java  |   2 +-
 .../org/apache/iotdb/db/index/it/ELBWindIT.java    | 196 ++++++---------------
 3 files changed, 64 insertions(+), 148 deletions(-)

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 552fcd8..99f8cee 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
@@ -29,6 +29,7 @@ import org.apache.iotdb.db.index.common.DistSeries;
 import org.apache.iotdb.db.index.common.IndexInfo;
 import org.apache.iotdb.db.index.common.IndexUtils;
 import org.apache.iotdb.db.index.common.distance.Distance;
+import org.apache.iotdb.db.index.common.distance.LInfinityNormdouble;
 import org.apache.iotdb.db.index.read.TVListPointer;
 import org.apache.iotdb.db.index.read.optimize.IIndexCandidateOrderOptimize;
 import org.apache.iotdb.db.index.stats.IndexStatManager;
@@ -383,7 +384,16 @@ public class ELBIndex extends IoTDBIndex {
     for (int i = 0; i < patternList.size(); i++) {
       double[] pattern = patternList.get(i);
       patternLength += pattern.length;
-      struct.thresholds[i] = thresholdList.get(i);
+      // note that, in following paper implementation, thres_avg means "avg threshold".
+      // The actual threshold (the meaning in SQL) of "multi-threshold pattern" is:
+      // thres_sql ** p = (thres_avg ** p) * len(subpattern)
+      // thres_avg = [(thres_sql ** p) / len(subpattern)] ** 1/p
+
+      if (struct.distance instanceof LInfinityNormdouble)
+        throw new IllegalIndexParamException("L-inf not supported yet");
+      double p = struct.distance.getP();
+      struct.thresholds[i] = Math.pow(Math.pow(thresholdList.get(i), p) / pattern.length, 1 / p);
+      //      struct.thresholds[i] = thresholdList.get(i);
       struct.borders[i + 1] = patternLength;
     }
     struct.pattern = new double[patternLength];
@@ -439,7 +449,7 @@ public class ELBIndex extends IoTDBIndex {
       }
       System.out.println(
           String.format(
-              "========== elb prune: %d/%d=%.3f",
+              "========== elb prune(1-cannot_pruned/total): 1-%d/%d=%.3f",
               cannotPrunedCount,
               windowBlockFeatures.size() - struct.blockNum + 1,
               (double) cannotPrunedCount / (windowBlockFeatures.size() - struct.blockNum)));
diff --git a/server/src/main/java/org/apache/iotdb/db/index/algorithm/elb/feature/SequenceELBFeature.java b/server/src/main/java/org/apache/iotdb/db/index/algorithm/elb/feature/SequenceELBFeature.java
index a3f8f15..cf7dd48 100644
--- a/server/src/main/java/org/apache/iotdb/db/index/algorithm/elb/feature/SequenceELBFeature.java
+++ b/server/src/main/java/org/apache/iotdb/db/index/algorithm/elb/feature/SequenceELBFeature.java
@@ -122,7 +122,7 @@ public class SequenceELBFeature extends ELBFeature {
           (pattern.maxLeftBorders[m - 1] - pattern.minLeftBorders[m - 1])
               * distance.getThresholdNoRoot(pattern.thresholdsArray[m - 1]);
       // Line 5~7,middle
-      for (int i = pattern.maxLeftBorders[m - 1]; i < pattern.minLeftBorders[n + 1] - 1; i++) {
+      for (int i = pattern.maxLeftBorders[m - 1]; i < pattern.minLeftBorders[n + 1]; i++) {
         sum += distance.getThresholdNoRoot(getAldMax(pattern, i));
       }
       // Line 8,right
diff --git a/server/src/test/java/org/apache/iotdb/db/index/it/ELBWindIT.java b/server/src/test/java/org/apache/iotdb/db/index/it/ELBWindIT.java
index 1387c42..35daf04 100644
--- a/server/src/test/java/org/apache/iotdb/db/index/it/ELBWindIT.java
+++ b/server/src/test/java/org/apache/iotdb/db/index/it/ELBWindIT.java
@@ -19,8 +19,6 @@
 package org.apache.iotdb.db.index.it;
 
 import org.apache.iotdb.db.conf.IoTDBDescriptor;
-import org.apache.iotdb.db.index.IndexManager;
-import org.apache.iotdb.db.index.common.IndexUtils;
 import org.apache.iotdb.db.rescon.TVListAllocator;
 import org.apache.iotdb.db.utils.EnvironmentUtils;
 import org.apache.iotdb.db.utils.datastructure.TVList;
@@ -32,17 +30,21 @@ import org.junit.Assert;
 import org.junit.Before;
 import org.junit.Test;
 
+import java.io.BufferedReader;
+import java.io.FileReader;
 import java.sql.Connection;
 import java.sql.DriverManager;
 import java.sql.ResultSet;
 import java.sql.ResultSetMetaData;
 import java.sql.Statement;
+import java.util.ArrayList;
+import java.util.List;
 
-import static org.apache.iotdb.db.index.IndexTestUtils.getArrayRange;
+import static org.apache.iotdb.db.index.IndexTestUtils.getStringFromList;
 import static org.apache.iotdb.db.index.common.IndexType.ELB_INDEX;
 import static org.junit.Assert.fail;
 
-public class ELBIndexReadIT {
+public class ELBWindIT {
 
   private static final String insertPattern = "INSERT INTO %s(timestamp, %s) VALUES (%d, %.3f)";
 
@@ -77,11 +79,6 @@ public class ELBIndexReadIT {
   }
 
   private static void insertSQL(boolean createTS) throws ClassNotFoundException {
-    for (int i = 0; i < 10000; i++) {
-      System.out.println(
-          String.format(insertPattern, speed1Device, speed1Sensor, i, (float) (i * 10 + 9)));
-    }
-    IndexUtils.breakDown("asd");
     Class.forName(Config.JDBC_DRIVER_NAME);
     try (Connection connection =
             DriverManager.getConnection(
@@ -109,66 +106,43 @@ public class ELBIndexReadIT {
       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++) {
-        subInput.putDouble(i, i * 10);
-      }
-      for (int i = 0; i < 20; i++) {
-        statement.execute(
-            String.format(
-                insertPattern,
-                speed1Device,
-                speed1Sensor,
-                subInput.getTime(i),
-                subInput.getDouble(i)));
-        System.out.println(
-            String.format(
-                insertPattern,
-                speed1Device,
-                speed1Sensor,
-                subInput.getTime(i),
-                subInput.getDouble(i)));
-      }
-      statement.execute("flush");
-      //      System.out.println("==========================");
-      //      System.out.println(IndexManager.getInstance().getRouter());
-
-      for (int i = 25; i < 30; i++) {
-        statement.execute(
-            String.format(
-                insertPattern,
-                speed1Device,
-                speed1Sensor,
-                subInput.getTime(i),
-                subInput.getDouble(i)));
-        System.out.println(
-            String.format(
-                insertPattern,
-                speed1Device,
-                speed1Sensor,
-                subInput.getTime(i),
-                subInput.getDouble(i)));
+      TVList subInput = TVListAllocator.getInstance().allocate(TSDataType.FLOAT);
+      // read base
+      String basePath = "/Users/kangrong/tsResearch/tols/JINFENG/d2/out_sub_base.csv";
+      int idx = 0;
+      try (BufferedReader csvReader = new BufferedReader(new FileReader(basePath))) {
+        String row;
+        while ((row = csvReader.readLine()) != null) {
+          if (idx >= 1) {
+            String[] data = row.split(",");
+            long t = Long.parseLong(data[0]);
+            float v = Float.parseFloat(data[1]);
+
+            //          subInput.putDouble(t, v);
+            subInput.putFloat(idx, v);
+          }
+          idx++;
+        }
       }
-      statement.execute("flush");
-
-      IndexManager.getInstance().stop();
-      IndexManager.getInstance().start();
 
-      for (int i = 40; i < subLength; i++) {
+      //      for (int i = 0; i < subLength; i++) {
+      //        subInput.putDouble(i, i * 10);
+      //      }
+      for (int i = 0; i < subInput.size(); i++) {
         statement.execute(
             String.format(
                 insertPattern,
                 speed1Device,
                 speed1Sensor,
                 subInput.getTime(i),
-                subInput.getDouble(i)));
-        System.out.println(
-            String.format(
-                insertPattern,
-                speed1Device,
-                speed1Sensor,
-                subInput.getTime(i),
-                subInput.getDouble(i)));
+                subInput.getFloat(i)));
+        //        System.out.println(
+        //            String.format(
+        //                insertPattern,
+        //                speed1Device,
+        //                speed1Sensor,
+        //                subInput.getTime(i),
+        //                subInput.getFloat(i)));
       }
       statement.execute("flush");
       //      System.out.println("==========================");
@@ -181,71 +155,6 @@ public class ELBIndexReadIT {
   }
 
   @Test
-  public void checkMultiSeriesTimeAlignedWithCreateTS() throws ClassNotFoundException {
-    checkMultiSeriesTimeAligned(true);
-  }
-
-  @Test
-  public void checkMultiSeriesTimeAlignedWithoutCreateTS() throws ClassNotFoundException {
-    checkMultiSeriesTimeAligned(false);
-  }
-
-  private void checkMultiSeriesTimeAligned(boolean createTS) throws ClassNotFoundException {
-    insertSQL(createTS);
-    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 100000 ", getArrayRange(170, 200, 10))
-              + String.format("CONCAT (%s) WITH TOLERANCE 200 ", 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"
-              + "17,170.0,\n"
-              + "18,180.0,\n"
-              + "19,190.0,\n"
-              + "25,250.0,\n"
-              + "26,260.0,\n"
-              + "27,270.0,\n"
-              + "28,280.0,\n"
-              + "29,290.0,\n"
-              + "40,400.0,\n"
-              + "41,410.0,\n"
-              + "42,420.0,";
-      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 checkReadWithCreateTS() throws ClassNotFoundException {
-    checkRead(true);
-  }
-
-  @Test
   public void checkReadWithoutCreateTS() throws ClassNotFoundException {
     checkRead(false);
   }
@@ -256,28 +165,25 @@ public class ELBIndexReadIT {
     try (Connection connection =
             DriverManager.getConnection("jdbc:iotdb://127.0.0.1:6667/", "root", "root");
         Statement statement = connection.createStatement()) {
-
+      String queryPath = "/Users/kangrong/tsResearch/tols/JINFENG/d2/out_sub_pattern.csv";
+      List<Float> pattern = new ArrayList<>();
+      try (BufferedReader csvReader = new BufferedReader(new FileReader(queryPath))) {
+        String row;
+        while ((row = csvReader.readLine()) != null) {
+          float v = Float.parseFloat(row);
+          pattern.add(v);
+        }
+      }
       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));
+              + String.format("CONTAIN (%s) WITH TOLERANCE 10 ", getStringFromList(pattern, 0, 30))
+              + String.format("CONCAT (%s) WITH TOLERANCE 25 ", getStringFromList(pattern, 30, 70))
+              + String.format(
+                  "CONCAT (%s) WITH TOLERANCE 10 ", getStringFromList(pattern, 70, 100));
       System.out.println(querySQL);
-      statement.setQueryTimeout(20);
+      statement.setQueryTimeout(200);
       boolean hasIndex = statement.execute(querySQL);
-      String gt =
-          "Time,root.wind1.azq01.speed.17,\n"
-              + "17,170.0,\n"
-              + "18,180.0,\n"
-              + "19,190.0,\n"
-              + "25,250.0,\n"
-              + "26,260.0,\n"
-              + "27,270.0,\n"
-              + "28,280.0,\n"
-              + "29,290.0,\n"
-              + "40,400.0,\n"
-              + "41,410.0,\n"
-              + "42,420.0,\n";
+      //      String gt = "Time,root.wind1.azq01.speed.17,\n";
       Assert.assertTrue(hasIndex);
       try (ResultSet resultSet = statement.getResultSet()) {
         ResultSetMetaData resultSetMetaData = resultSet.getMetaData();
@@ -293,7 +199,7 @@ public class ELBIndexReadIT {
           sb.append("\n");
         }
         System.out.println(sb);
-        Assert.assertEquals(gt, sb.toString());
+        //        Assert.assertEquals(gt, sb.toString());
       }
     } catch (Exception e) {
       e.printStackTrace();