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

leirui pushed a commit to branch research/LTS-visualization
in repository https://gitbox.apache.org/repos/asf/iotdb.git

commit 5f781f9072ba06656e7ce7aa219af731a368ec4e
Author: Lei Rui <[email protected]>
AuthorDate: Wed Jan 31 19:15:02 2024 +0800

    add avg meta acc
---
 .../java/org/apache/iotdb/db/conf/IoTDBConfig.java |  6 ++--
 .../groupby/LocalGroupByExecutorTri_ILTS.java      | 37 ++++++++++++++--------
 .../groupby/LocalGroupByExecutorTri_LTTB.java      |  2 +-
 .../iotdb/db/integration/tri/MyTest_ILTS.java      | 34 +++++++++++++++++++-
 4 files changed, 60 insertions(+), 19 deletions(-)

diff --git a/server/src/main/java/org/apache/iotdb/db/conf/IoTDBConfig.java 
b/server/src/main/java/org/apache/iotdb/db/conf/IoTDBConfig.java
index 902b48ad0b6..9d749c88d3b 100644
--- a/server/src/main/java/org/apache/iotdb/db/conf/IoTDBConfig.java
+++ b/server/src/main/java/org/apache/iotdb/db/conf/IoTDBConfig.java
@@ -440,7 +440,7 @@ public class IoTDBConfig {
   private long pnt;
   private double pnv;
 
-  private int rps = 2; // fixed
+  private int rps = 2; // fixed, do not change
 
   public int getNumIterations() {
     return numIterations;
@@ -450,7 +450,7 @@ public class IoTDBConfig {
     this.numIterations = numIterations;
   }
 
-  private int numIterations = 8;
+  private int numIterations = 4;
 
   public boolean isAcc_avg() {
     return acc_avg;
@@ -476,7 +476,7 @@ public class IoTDBConfig {
     this.acc_convex = acc_convex;
   }
 
-  private boolean acc_avg = false;
+  private boolean acc_avg = true;
   private boolean acc_rectangle = true;
   private boolean acc_convex = false;
 
diff --git 
a/server/src/main/java/org/apache/iotdb/db/query/dataset/groupby/LocalGroupByExecutorTri_ILTS.java
 
b/server/src/main/java/org/apache/iotdb/db/query/dataset/groupby/LocalGroupByExecutorTri_ILTS.java
index e44150548ab..81f9af04262 100644
--- 
a/server/src/main/java/org/apache/iotdb/db/query/dataset/groupby/LocalGroupByExecutorTri_ILTS.java
+++ 
b/server/src/main/java/org/apache/iotdb/db/query/dataset/groupby/LocalGroupByExecutorTri_ILTS.java
@@ -70,8 +70,8 @@ public class LocalGroupByExecutorTri_ILTS implements 
GroupByExecutor {
   private final long pnt = CONFIG.getPnt();
   private final double pnv = CONFIG.getPnv();
 
-  private long lt = p1t;
-  private double lv = p1v;
+  private long lt;
+  private double lv;
 
   private final int N1; // 分桶数
 
@@ -179,12 +179,17 @@ public class LocalGroupByExecutorTri_ILTS implements 
GroupByExecutor {
     long[] lastIter_t = new long[N1]; // N1不包括全局首尾点
     double[] lastIter_v = new double[N1]; // N1不包括全局首尾点
     for (int num = 0; num < numIterations; num++) {
-      //      StringBuilder series = new StringBuilder();
+      // NOTE: init lt&lv at the start of each iteration is a must, because 
they are modified in
+      // each iteration
+      lt = CONFIG.getP1t();
+      lv = CONFIG.getP1v();
+
+      StringBuilder series = new StringBuilder(); // TODO debug
       // 全局首点
-      //      
series.append(p1v).append("[").append(p1t).append("]").append(",");
+      series.append(p1v).append("[").append(p1t).append("]").append(","); // 
TODO debug
       // 遍历分桶 Assume no empty buckets
       for (int b = 0; b < N1; b++) {
-        long rt = 0; // must initialize as zero, because may be used as sum 
for average
+        double rt = 0; // must initialize as zero, because may be used as sum 
for average
         double rv = 0; // must initialize as zero, because may be used as sum 
for average
         // 计算右边桶的固定点
         if (b == N1 - 1) { // 最后一个桶
@@ -212,9 +217,13 @@ public class LocalGroupByExecutorTri_ILTS implements 
GroupByExecutor {
               if (CONFIG.isAcc_avg()) {
                 if (chunkSuit4Tri.chunkMetadata.getStartTime() >= 
rightStartTime
                     && chunkSuit4Tri.chunkMetadata.getEndTime() < 
rightEndTime) {
-                  // TODO 元数据增加sum of timestamps!
-                  rt += 
chunkSuit4Tri.chunkMetadata.getStatistics().getSumDoubleValue();
-
+                  System.out.println("herehere");
+                  // TODO 以后元数据可以增加sum of timestamps,目前就基于时间戳均匀间隔1的假设来处理
+                  rt +=
+                      (chunkSuit4Tri.chunkMetadata.getStartTime()
+                              + chunkSuit4Tri.chunkMetadata.getEndTime())
+                          * 
chunkSuit4Tri.chunkMetadata.getStatistics().getCount()
+                          / 2.0;
                   rv += 
chunkSuit4Tri.chunkMetadata.getStatistics().getSumDoubleValue();
                   cnt += 
chunkSuit4Tri.chunkMetadata.getStatistics().getCount();
                   continue;
@@ -379,10 +388,11 @@ public class LocalGroupByExecutorTri_ILTS implements 
GroupByExecutor {
             chunkSuit4Tri.pageReader = null;
             // TODO 但是这样有可能导致下一轮迭代到这个桶的时候又要读一遍这个chunk
             //  但是不这样做的话相当于一轮迭代之后几乎所有的点都加载到内存留着了
+            //  还要注意的是如果被rectangle提前剪枝掉了就不会走到这一步,也就是说那个chunk的pageReader可能还留着
           }
         }
-        // 记录结果
-        //        
series.append(select_v).append("[").append(select_t).append("]").append(",");
+        // 记录结果 // TODO debug
+        
series.append(select_v).append("[").append(select_t).append("]").append(",");
 
         // 更新lt,lv
         // 下一个桶自然地以select_t, select_v作为左桶固定点
@@ -393,10 +403,9 @@ public class LocalGroupByExecutorTri_ILTS implements 
GroupByExecutor {
         lastIter_v[b] = select_v;
       } // 遍历分桶结束
 
-      // 全局尾点
-      //      
series.append(pnv).append("[").append(pnt).append("]").append(",");
-      //      System.out.println(series);
-
+      // 全局尾点 // TODO debug
+      series.append(pnv).append("[").append(pnt).append("]").append(",");
+      System.out.println(series);
     } // end Iterations
 
     // 全局首点
diff --git 
a/server/src/main/java/org/apache/iotdb/db/query/dataset/groupby/LocalGroupByExecutorTri_LTTB.java
 
b/server/src/main/java/org/apache/iotdb/db/query/dataset/groupby/LocalGroupByExecutorTri_LTTB.java
index 525c9ca78ca..f29956c7b8d 100644
--- 
a/server/src/main/java/org/apache/iotdb/db/query/dataset/groupby/LocalGroupByExecutorTri_LTTB.java
+++ 
b/server/src/main/java/org/apache/iotdb/db/query/dataset/groupby/LocalGroupByExecutorTri_LTTB.java
@@ -165,7 +165,7 @@ public class LocalGroupByExecutorTri_LTTB implements 
GroupByExecutor {
 
     // Assume no empty buckets
     for (int b = 0; b < N1; b++) {
-      long rt = 0; // must initialize as zero, because may be used as sum for 
average
+      double rt = 0; // must initialize as zero, because may be used as sum 
for average
       double rv = 0; // must initialize as zero, because may be used as sum 
for average
       // 计算右边桶的固定点
       if (b == N1 - 1) { // 最后一个桶
diff --git 
a/server/src/test/java/org/apache/iotdb/db/integration/tri/MyTest_ILTS.java 
b/server/src/test/java/org/apache/iotdb/db/integration/tri/MyTest_ILTS.java
index 7889107f8fd..ccef5e9fa84 100644
--- a/server/src/test/java/org/apache/iotdb/db/integration/tri/MyTest_ILTS.java
+++ b/server/src/test/java/org/apache/iotdb/db/integration/tri/MyTest_ILTS.java
@@ -78,7 +78,7 @@ public class MyTest_ILTS {
 
     config.setEnableTri("ILTS");
     //    config.setNumIterations(4);
-    config.setAcc_avg(false);
+    config.setAcc_avg(true);
     config.setAcc_rectangle(true);
     config.setAcc_convex(false);
 
@@ -159,6 +159,38 @@ public class MyTest_ILTS {
     }
   }
 
+  @Test
+  public void test1_3() {
+    prepareData1();
+    config.setNumIterations(2);
+    String res = "5.0[1],2.0[40],20.0[62],7.0[102],";
+    try (Connection connection =
+            DriverManager.getConnection("jdbc:iotdb://127.0.0.1:6667/", 
"root", "root");
+        Statement statement = connection.createStatement()) {
+      boolean hasResultSet =
+          statement.execute(
+              "SELECT min_value(s0)"
+                  // TODO not real min_value here, actually controlled by 
enableTri
+                  + ",max_value(s0),min_time(s0), max_time(s0), 
first_value(s0), last_value(s0)"
+                  + " FROM root.vehicle.d0 group by ([2,102),40ms)");
+      // (102-2)/(7-2)=20ms
+      // note keep no empty buckets
+
+      Assert.assertTrue(hasResultSet);
+      try (ResultSet resultSet = statement.getResultSet()) {
+        int i = 0;
+        while (resultSet.next()) {
+          String ans = resultSet.getString(2);
+          System.out.println(ans);
+          Assert.assertEquals(res, ans);
+        }
+      }
+    } catch (Exception e) {
+      e.printStackTrace();
+      fail(e.getMessage());
+    }
+  }
+
   private static void prepareData1() {
     // data:
     // 
https://user-images.githubusercontent.com/33376433/152003603-6b4e7494-00ff-47e4-bf6e-cab3c8600ce2.png

Reply via email to