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 242f3a051649962fc13061c53700922fa54ff97d
Author: Lei Rui <[email protected]>
AuthorDate: Mon Jan 29 01:07:03 2024 +0800

    M4
---
 .../resources/conf/iotdb-engine.properties         |  2 +-
 .../java/org/apache/iotdb/db/conf/IoTDBConfig.java |  2 +-
 .../groupby/GroupByWithoutValueFilterDataSet.java  | 91 +++++++++++++++++++---
 ...MinMax.java => LocalGroupByExecutorTri_M4.java} | 46 +++++++++--
 .../groupby/LocalGroupByExecutorTri_MinMax.java    |  8 +-
 .../iotdb/db/integration/tri/MyTest_ILTS.java      | 18 ++---
 .../iotdb/db/integration/tri/MyTest_LTTB.java      | 11 +--
 .../tri/{MyTest_MinMax.java => MyTest_M4.java}     | 39 +++++-----
 .../iotdb/db/integration/tri/MyTest_MinMax.java    |  4 +-
 .../db/integration/tri/MyTest_MinMaxLTTB.java      |  3 +-
 10 files changed, 159 insertions(+), 65 deletions(-)

diff --git a/server/src/assembly/resources/conf/iotdb-engine.properties 
b/server/src/assembly/resources/conf/iotdb-engine.properties
index 417f7bca225..80b2c384466 100644
--- a/server/src/assembly/resources/conf/iotdb-engine.properties
+++ b/server/src/assembly/resources/conf/iotdb-engine.properties
@@ -19,7 +19,7 @@
 ####################
 ### enable Tri
 ####################
-# MinMax, MinMaxLTTB, M4LTTB, LTTB, ILTS
+# MinMax, MinMaxLTTB, M4, LTTB, ILTS
 enable_Tri=MinMax
 
 p1t=0
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 d008f656bc5..2ffc96bf2d0 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
@@ -433,7 +433,7 @@ public class IoTDBConfig {
 
   private boolean enableCPV = false;
 
-  private String enableTri = ""; // MinMax, MinMaxLTTB, M4LTTB, LTTB, ILTS
+  private String enableTri = ""; // MinMax, MinMaxLTTB, M4, LTTB, ILTS
 
   private long p1t;
   private double p1v;
diff --git 
a/server/src/main/java/org/apache/iotdb/db/query/dataset/groupby/GroupByWithoutValueFilterDataSet.java
 
b/server/src/main/java/org/apache/iotdb/db/query/dataset/groupby/GroupByWithoutValueFilterDataSet.java
index c349d9dc3c9..c34fd6af987 100644
--- 
a/server/src/main/java/org/apache/iotdb/db/query/dataset/groupby/GroupByWithoutValueFilterDataSet.java
+++ 
b/server/src/main/java/org/apache/iotdb/db/query/dataset/groupby/GroupByWithoutValueFilterDataSet.java
@@ -139,10 +139,9 @@ public class GroupByWithoutValueFilterDataSet extends 
GroupByEngineDataSet {
       return nextWithoutConstraintTri_MinMax();
     } else if (CONFIG.getEnableTri().equals("MinMaxLTTB")) {
       return nextWithoutConstraintTri_MinMaxLTTB();
-    }
-    //    } else if (CONFIG.getEnableTri().equals("M4LTTB")) {
-    //      // TODO
-    else if (CONFIG.getEnableTri().equals("LTTB") || 
CONFIG.getEnableTri().equals("ILTS")) {
+    } else if (CONFIG.getEnableTri().equals("M4")) {
+      return nextWithoutConstraintTri_M4();
+    } else if (CONFIG.getEnableTri().equals("LTTB") || 
CONFIG.getEnableTri().equals("ILTS")) {
       return nextWithoutConstraintTri_LTTB();
     } else {
       return nextWithoutConstraint_raw();
@@ -165,9 +164,12 @@ public class GroupByWithoutValueFilterDataSet extends 
GroupByEngineDataSet {
       // all bucket results as string in value of MinValueAggrResult
       List<AggregateResult> aggregations =
           executor.calcResult(startTime, startTime + interval, startTime, 
endTime, interval);
-      series.append(aggregations.get(0).getResult());
+      MinMaxInfo minMaxInfo = (MinMaxInfo) aggregations.get(0).getResult();
+      series.append(minMaxInfo.val); // 
对于LTTB来说,MinValueAggrResult的[t]也无意义,因为只需要val
 
       // MIN_MAX_INT64 this type for field.setBinaryV(new 
Binary(value.toString()))
+      // 注意sql第一项一定要是min_value因为以后会用到record.addField(series, 
TSDataType.MIN_MAX_INT64)
+      // 把所有序列组装成string放在第一行第二列里,否则field类型和TSDataType.MIN_MAX_INT64对不上的会有问题。
       record.addField(series, TSDataType.MIN_MAX_INT64);
 
     } catch (QueryProcessException e) {
@@ -347,6 +349,77 @@ public class GroupByWithoutValueFilterDataSet extends 
GroupByEngineDataSet {
       series.append(pnv).append("[").append(pnt).append("]").append(",");
 
       // MIN_MAX_INT64 this type for field.setBinaryV(new 
Binary(value.toString()))
+      // 注意sql第一项一定要是min_value因为以后会用到record.addField(series, 
TSDataType.MIN_MAX_INT64)
+      // 把所有序列组装成string放在第一行第二列里,否则field类型和TSDataType.MIN_MAX_INT64对不上的会有问题。
+      record.addField(series, TSDataType.MIN_MAX_INT64);
+
+    } catch (QueryProcessException e) {
+      logger.error("GroupByWithoutValueFilterDataSet execute has error", e);
+      throw new IOException(e.getMessage(), e);
+    }
+
+    // in the end, make the next hasNextWithoutConstraint() false
+    // as we already fetch all here
+    curStartTime = endTime;
+    hasCachedTimeInterval = false;
+
+    return record;
+  }
+
+  public RowRecord nextWithoutConstraintTri_M4() throws IOException {
+    RowRecord record;
+    try {
+      GroupByExecutor executor = null;
+      for (Entry<PartialPath, GroupByExecutor> pathToExecutorEntry : 
pathExecutors.entrySet()) {
+        executor = pathToExecutorEntry.getValue(); // assume only one series 
here
+        break;
+      }
+
+      // concat results into a string
+      record = new RowRecord(0);
+      StringBuilder series = new StringBuilder();
+
+      for (long localCurStartTime = startTime;
+          localCurStartTime + interval <= endTime;
+          // 注意有等号!因为左闭右开
+          // + interval to make the last bucket complete
+          // e.g, T=11,nout=3,interval=floor(11/3)=3,
+          // [0,3),[3,6),[6,9), no need incomplete [9,11)
+          // then the number of buckets must be 
Math.floor((endTime-startTime)/interval)
+          localCurStartTime += interval) { // not change real 
curStartTime&curEndTime
+        // attention the returned aggregations need deep copy if using directly
+        List<AggregateResult> aggregations =
+            executor.calcResult(
+                localCurStartTime,
+                localCurStartTime + interval,
+                startTime,
+                endTime,
+                interval); // attention
+
+        // min_value(s0), max_value(s0),min_time(s0), max_time(s0), 
first_value(s0), last_value(s0)
+        // minValue[bottomTime]
+        series.append(aggregations.get(0).getResult()).append(",");
+        // maxValue[topTime]
+        series.append(aggregations.get(1).getResult()).append(",");
+        // firstValue[firstTime]
+        series
+            .append(aggregations.get(4).getResult())
+            .append("[")
+            .append(aggregations.get(2).getResult())
+            .append("]")
+            .append(",");
+        // lastValue[lastTime]
+        series
+            .append(aggregations.get(5).getResult())
+            .append("[")
+            .append(aggregations.get(3).getResult())
+            .append("]")
+            .append(",");
+      }
+
+      // MIN_MAX_INT64 this type for field.setBinaryV(new 
Binary(value.toString()))
+      // 注意sql第一项一定要是min_value因为以后会用到record.addField(series, 
TSDataType.MIN_MAX_INT64)
+      // 把所有序列组装成string放在第一行第二列里,否则field类型和TSDataType.MIN_MAX_INT64对不上的会有问题。
       record.addField(series, TSDataType.MIN_MAX_INT64);
 
     } catch (QueryProcessException e) {
@@ -398,6 +471,8 @@ public class GroupByWithoutValueFilterDataSet extends 
GroupByEngineDataSet {
       }
 
       // MIN_MAX_INT64 this type for field.setBinaryV(new 
Binary(value.toString()))
+      // 注意sql第一项一定要是min_value因为以后会用到record.addField(series, 
TSDataType.MIN_MAX_INT64)
+      // 把所有序列组装成string放在第一行第二列里,否则field类型和TSDataType.MIN_MAX_INT64对不上的会有问题。
       record.addField(series, TSDataType.MIN_MAX_INT64);
 
     } catch (QueryProcessException e) {
@@ -484,15 +559,13 @@ public class GroupByWithoutValueFilterDataSet extends 
GroupByEngineDataSet {
     if (CONFIG.getEnableTri().equals("MinMax") || 
CONFIG.getEnableTri().equals("MinMaxLTTB")) {
       return new LocalGroupByExecutorTri_MinMax(
           path, allSensors, dataType, context, timeFilter, fileFilter, 
ascending);
-    } else if (CONFIG.getEnableTri().equals("M4LTTB")) {
-      // TODO
-      return new LocalGroupByExecutor(
+    } else if (CONFIG.getEnableTri().equals("M4")) {
+      return new LocalGroupByExecutorTri_M4(
           path, allSensors, dataType, context, timeFilter, fileFilter, 
ascending);
     } else if (CONFIG.getEnableTri().equals("LTTB")) {
       return new LocalGroupByExecutorTri_LTTB(
           path, allSensors, dataType, context, timeFilter, fileFilter, 
ascending);
     } else if (CONFIG.getEnableTri().equals("ILTS")) {
-      // TODO
       return new LocalGroupByExecutorTri_ILTS(
           path, allSensors, dataType, context, timeFilter, fileFilter, 
ascending);
     }
diff --git 
a/server/src/main/java/org/apache/iotdb/db/query/dataset/groupby/LocalGroupByExecutorTri_MinMax.java
 
b/server/src/main/java/org/apache/iotdb/db/query/dataset/groupby/LocalGroupByExecutorTri_M4.java
similarity index 90%
copy from 
server/src/main/java/org/apache/iotdb/db/query/dataset/groupby/LocalGroupByExecutorTri_MinMax.java
copy to 
server/src/main/java/org/apache/iotdb/db/query/dataset/groupby/LocalGroupByExecutorTri_M4.java
index 445af4d839c..2978c748b54 100644
--- 
a/server/src/main/java/org/apache/iotdb/db/query/dataset/groupby/LocalGroupByExecutorTri_MinMax.java
+++ 
b/server/src/main/java/org/apache/iotdb/db/query/dataset/groupby/LocalGroupByExecutorTri_M4.java
@@ -57,7 +57,7 @@ import java.util.List;
 import java.util.ListIterator;
 import java.util.Set;
 
-public class LocalGroupByExecutorTri_MinMax implements GroupByExecutor {
+public class LocalGroupByExecutorTri_M4 implements GroupByExecutor {
 
   private static final Logger M4_CHUNK_METADATA = 
LoggerFactory.getLogger("M4_CHUNK_METADATA");
 
@@ -69,7 +69,7 @@ public class LocalGroupByExecutorTri_MinMax implements 
GroupByExecutor {
 
   private Filter timeFilter;
 
-  public LocalGroupByExecutorTri_MinMax(
+  public LocalGroupByExecutorTri_M4(
       PartialPath path,
       Set<String> allSensors,
       TSDataType dataType,
@@ -275,14 +275,14 @@ public class LocalGroupByExecutorTri_MinMax implements 
GroupByExecutor {
     }
 
     //    start = System.nanoTime();
-    calculateMinMax(currentChunkList, curStartTime, curEndTime);
+    calculateM4(currentChunkList, curStartTime, curEndTime);
     //    IOMonitor2.addMeasure(Operation.M4_LSM_FP, System.nanoTime() - 
start);
 
     return results;
   }
 
-  private void calculateMinMax(
-      List<ChunkSuit4Tri> currentChunkList, long curStartTime, long 
curEndTime) throws IOException {
+  private void calculateM4(List<ChunkSuit4Tri> currentChunkList, long 
curStartTime, long curEndTime)
+      throws IOException {
     for (ChunkSuit4Tri chunkSuit4Tri : currentChunkList) {
 
       Statistics statistics = chunkSuit4Tri.chunkMetadata.getStatistics();
@@ -302,6 +302,10 @@ public class LocalGroupByExecutorTri_MinMax implements 
GroupByExecutor {
         long bottomTime = -1;
         double maxVal = Double.MIN_VALUE;
         long topTime = -1;
+        long firstTime = -1;
+        double firstValue = 0;
+        long lastTime = -1;
+        double lastValue = 0;
 
         // 1. load page data if it hasn't been loaded
         TSDataType dataType = chunkSuit4Tri.chunkMetadata.getDataType();
@@ -335,6 +339,12 @@ public class LocalGroupByExecutorTri_MinMax implements 
GroupByExecutor {
             // 4. update MinMax by traversing points fallen within this bucket
             ByteBuffer valueBuffer = pageReader.valueBuffer;
             double v = valueBuffer.getDouble(pageReader.timeBufferLength + i * 
8);
+            if (firstTime < 0) {
+              firstTime = timestamp;
+              firstValue = v;
+            }
+            lastTime = timestamp;
+            lastValue = v;
             if (v < minVal) {
               minVal = v;
               bottomTime = timestamp;
@@ -347,6 +357,24 @@ public class LocalGroupByExecutorTri_MinMax implements 
GroupByExecutor {
         }
         // 4. update MinMax by traversing points fallen within this bucket
         if (topTime >= 0) {
+          //  min_value(s0), max_value(s0),min_time(s0), max_time(s0), 
first_value(s0),
+          // last_value(s0)
+          // update min_time
+          results
+              .get(2)
+              .updateResultUsingValues(new long[] {firstTime}, 1, new Object[] 
{firstValue});
+          // update first_value
+          results
+              .get(4)
+              .updateResultUsingValues(new long[] {firstTime}, 1, new Object[] 
{firstValue});
+          // update max_time
+          results
+              .get(3)
+              .updateResultUsingValues(new long[] {lastTime}, 1, new Object[] 
{lastValue});
+          // update last_value
+          results
+              .get(5)
+              .updateResultUsingValues(new long[] {lastTime}, 1, new Object[] 
{lastValue});
           // update BP
           MinValueAggrResult minValueAggrResult = (MinValueAggrResult) 
results.get(0);
           minValueAggrResult.updateResult(new MinMaxInfo<>(minVal, 
bottomTime));
@@ -359,9 +387,11 @@ public class LocalGroupByExecutorTri_MinMax implements 
GroupByExecutor {
   }
 
   public boolean canUseStatistics(ChunkSuit4Tri chunkSuit4Tri, long 
curStartTime, long curEndTime) {
-    long TP_t = chunkSuit4Tri.chunkMetadata.getStatistics().getTopTimestamp();
-    long BP_t = 
chunkSuit4Tri.chunkMetadata.getStatistics().getBottomTimestamp();
-    return TP_t >= curStartTime && TP_t < curEndTime && BP_t >= curStartTime 
&& BP_t < curEndTime;
+    return false;
+    //    long TP_t = 
chunkSuit4Tri.chunkMetadata.getStatistics().getTopTimestamp();
+    //    long BP_t = 
chunkSuit4Tri.chunkMetadata.getStatistics().getBottomTimestamp();
+    //    return TP_t >= curStartTime && TP_t < curEndTime && BP_t >= 
curStartTime && BP_t <
+    // curEndTime;
   }
 
   @Override
diff --git 
a/server/src/main/java/org/apache/iotdb/db/query/dataset/groupby/LocalGroupByExecutorTri_MinMax.java
 
b/server/src/main/java/org/apache/iotdb/db/query/dataset/groupby/LocalGroupByExecutorTri_MinMax.java
index 445af4d839c..7cc73b0ac0d 100644
--- 
a/server/src/main/java/org/apache/iotdb/db/query/dataset/groupby/LocalGroupByExecutorTri_MinMax.java
+++ 
b/server/src/main/java/org/apache/iotdb/db/query/dataset/groupby/LocalGroupByExecutorTri_MinMax.java
@@ -359,9 +359,11 @@ public class LocalGroupByExecutorTri_MinMax implements 
GroupByExecutor {
   }
 
   public boolean canUseStatistics(ChunkSuit4Tri chunkSuit4Tri, long 
curStartTime, long curEndTime) {
-    long TP_t = chunkSuit4Tri.chunkMetadata.getStatistics().getTopTimestamp();
-    long BP_t = 
chunkSuit4Tri.chunkMetadata.getStatistics().getBottomTimestamp();
-    return TP_t >= curStartTime && TP_t < curEndTime && BP_t >= curStartTime 
&& BP_t < curEndTime;
+    return false;
+    //    long TP_t = 
chunkSuit4Tri.chunkMetadata.getStatistics().getTopTimestamp();
+    //    long BP_t = 
chunkSuit4Tri.chunkMetadata.getStatistics().getBottomTimestamp();
+    //    return TP_t >= curStartTime && TP_t < curEndTime && BP_t >= 
curStartTime && BP_t <
+    // curEndTime;
   }
 
   @Override
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 7f489adee45..87bba5c8603 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
@@ -42,7 +42,11 @@ import static org.junit.Assert.fail;
 public class MyTest_ILTS {
 
   /*
-   * Sql format: SELECT min_value(s0), max_value(s0) ROM root.xx group by 
([tqs,tqe),IntervalLength).
+   * Sql format: SELECT min_value(s0) FROM root.vehicle.d0 group by 
([2,102),20ms)
+   * not real min_value here, actually controlled by enableTri="ILTS"
+   * 注意sql第一项一定要是min_value因为以后会用到record.addField(series, 
TSDataType.MIN_MAX_INT64)
+   * 把所有序列组装成string放在第一行第二列里,否则field类型和TSDataType.MIN_MAX_INT64对不上的会有问题。
+   *
    * Requirements:
    * (1) Don't change the sequence of the above two aggregates
    * (2) Assume each chunk has only one page.
@@ -112,9 +116,6 @@ public class MyTest_ILTS {
         int i = 0;
         while (resultSet.next()) {
           String ans = resultSet.getString(2);
-          // for LTTB all results are in the value string of MinValueAggrResult
-          // 因此对于LTTB来说,MinValueAggrResult的[t]也无意义
-          ans = ans.substring(0, ans.length() - 3);
           System.out.println(ans);
           Assert.assertEquals(res, ans);
         }
@@ -146,9 +147,6 @@ public class MyTest_ILTS {
         int i = 0;
         while (resultSet.next()) {
           String ans = resultSet.getString(2);
-          // for LTTB all results are in the value string of MinValueAggrResult
-          // 因此对于LTTB来说,MinValueAggrResult的[t]也无意义
-          ans = ans.substring(0, ans.length() - 3);
           System.out.println(ans);
           Assert.assertEquals(res, ans);
         }
@@ -214,9 +212,6 @@ public class MyTest_ILTS {
         int i = 0;
         while (resultSet.next()) {
           String ans = resultSet.getString(2);
-          // for LTTB all results are in the value string of MinValueAggrResult
-          // 因此对于LTTB来说,MinValueAggrResult的[t]也无意义
-          ans = ans.substring(0, ans.length() - 3);
           System.out.println(ans);
           Assert.assertEquals(res, ans);
         }
@@ -251,9 +246,6 @@ public class MyTest_ILTS {
         int i = 0;
         while (resultSet.next()) {
           String ans = resultSet.getString(2);
-          // for LTTB all results are in the value string of MinValueAggrResult
-          // 因此对于LTTB来说,MinValueAggrResult的[t]也无意义
-          ans = ans.substring(0, ans.length() - 3);
           System.out.println(ans);
           Assert.assertEquals(res, ans);
         }
diff --git 
a/server/src/test/java/org/apache/iotdb/db/integration/tri/MyTest_LTTB.java 
b/server/src/test/java/org/apache/iotdb/db/integration/tri/MyTest_LTTB.java
index c9ff3e446b5..0354dcb57cf 100644
--- a/server/src/test/java/org/apache/iotdb/db/integration/tri/MyTest_LTTB.java
+++ b/server/src/test/java/org/apache/iotdb/db/integration/tri/MyTest_LTTB.java
@@ -42,7 +42,10 @@ import static org.junit.Assert.fail;
 public class MyTest_LTTB {
 
   /*
-   * Sql format: SELECT min_value(s0), max_value(s0) ROM root.xx group by 
([tqs,tqe),IntervalLength).
+   * Sql format: SELECT min_value(s0) FROM root.vehicle.d0 group by 
([2,106),26ms)
+   * not real min_value here, actually controlled by enableTri="LTTB"
+   * 注意sql第一项一定要是min_value因为以后会用到record.addField(series, 
TSDataType.MIN_MAX_INT64)
+   * 把所有序列组装成string放在第一行第二列里,否则field类型和TSDataType.MIN_MAX_INT64对不上的会有问题。
    * Requirements:
    * (1) Don't change the sequence of the above two aggregates
    * (2) Assume each chunk has only one page.
@@ -111,9 +114,6 @@ public class MyTest_LTTB {
         int i = 0;
         while (resultSet.next()) {
           String ans = resultSet.getString(2);
-          // for LTTB all results are in the value string of MinValueAggrResult
-          // 因此对于LTTB来说,MinValueAggrResult的[t]也无意义
-          ans = ans.substring(0, ans.length() - 3);
           System.out.println(ans);
           Assert.assertEquals(res, ans);
         }
@@ -178,9 +178,6 @@ public class MyTest_LTTB {
         int i = 0;
         while (resultSet.next()) {
           String ans = resultSet.getString(2);
-          // for LTTB all results are in the value string of MinValueAggrResult
-          // 因此对于LTTB来说,MinValueAggrResult的[t]也无意义
-          ans = ans.substring(0, ans.length() - 3);
           System.out.println(ans);
           Assert.assertEquals(res, ans);
         }
diff --git 
a/server/src/test/java/org/apache/iotdb/db/integration/tri/MyTest_MinMax.java 
b/server/src/test/java/org/apache/iotdb/db/integration/tri/MyTest_M4.java
similarity index 87%
copy from 
server/src/test/java/org/apache/iotdb/db/integration/tri/MyTest_MinMax.java
copy to server/src/test/java/org/apache/iotdb/db/integration/tri/MyTest_M4.java
index 88d5bda26df..4cc39f797d3 100644
--- 
a/server/src/test/java/org/apache/iotdb/db/integration/tri/MyTest_MinMax.java
+++ b/server/src/test/java/org/apache/iotdb/db/integration/tri/MyTest_M4.java
@@ -24,7 +24,6 @@ import org.apache.iotdb.db.conf.IoTDBDescriptor;
 import org.apache.iotdb.db.engine.compaction.CompactionStrategy;
 import org.apache.iotdb.db.utils.EnvironmentUtils;
 import org.apache.iotdb.jdbc.Config;
-import org.apache.iotdb.jdbc.IoTDBStatement;
 import org.apache.iotdb.tsfile.common.conf.TSFileDescriptor;
 
 import org.junit.After;
@@ -40,10 +39,14 @@ import java.util.Locale;
 
 import static org.junit.Assert.fail;
 
-public class MyTest_MinMax {
+public class MyTest_M4 {
 
   /*
-   * Sql format: SELECT min_value(s0), max_value(s0) ROM root.xx group by 
([tqs,tqe),IntervalLength).
+   * Sql format: SELECT min_value(s0), max_value(s0),min_time(s0), 
max_time(s0), first_value(s0),
+   * last_value(s0) FROM root.vehicle.d0 group by ([0,100),25ms)
+   * enableTri="M4"
+   * 注意sql第一项一定要是min_value因为以后会用到record.addField(series, 
TSDataType.MIN_MAX_INT64)
+   * 把所有序列组装成string放在第一行第二列里,否则field类型和TSDataType.MIN_MAX_INT64对不上的会有问题。
    * Requirements:
    * (1) Don't change the sequence of the above two aggregates
    * (2) Assume each chunk has only one page.
@@ -73,7 +76,7 @@ public class MyTest_MinMax {
     config.setTimestampPrecision("ms");
     config.setCompactionStrategy(CompactionStrategy.NO_COMPACTION);
 
-    config.setEnableTri("MinMax");
+    config.setEnableTri("M4");
 
     // 但是如果走的是unpackOneChunkMetaData(firstChunkMetadata)就没问题,
     // 因为它直接用chunk元数据去构造pageReader,
@@ -98,17 +101,17 @@ public class MyTest_MinMax {
   @Test
   public void test1() throws Exception {
     prepareData1();
-    //    String[] res = new String[]{"0,1[20],15[2]", "25,8[25],8[25]", 
"50,3[54],3[54]",
-    // "75,null,null"};
-    String res = "1.0[20],15.0[2],8.0[25],8.0[25],3.0[54],3.0[54],null,null,";
-    // 0,BPv[t]ofBucket1,TPv[t]ofBucket1,BPv[t]ofBucket2,TPv[t]ofBucket2,...
+    String res =
+        
"1.0[20],15.0[2],5.0[1],1.0[20],8.0[25],8.0[25],8.0[25],8.0[25],3.0[54],3.0[54],3.0[54],3.0[54],null,null,null[null],null[null],";
     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), max_value(s0)"
+              "SELECT min_value(s0), max_value(s0),min_time(s0), max_time(s0), 
first_value(s0), last_value(s0)"
                   + " FROM root.vehicle.d0 group by ([0,100),25ms)");
+      // 注意需要第一项是min_value因为以后会用到record.addField(series,
+      // TSDataType.MIN_MAX_INT64)把所有序列组装成string放在第一行第二列里
       Assert.assertTrue(hasResultSet);
       try (ResultSet resultSet = statement.getResultSet()) {
         int i = 0;
@@ -119,7 +122,7 @@ public class MyTest_MinMax {
           Assert.assertEquals(res, ans);
         }
       }
-      System.out.println(((IoTDBStatement) statement).executeFinish());
+      //      System.out.println(((IoTDBStatement) statement).executeFinish());
     } catch (Exception e) {
       e.printStackTrace();
       fail(e.getMessage());
@@ -157,16 +160,14 @@ public class MyTest_MinMax {
   public void test3() {
     prepareData3();
 
-    //    String[] res = new String[]{"0,1[10],10[2]", "25,2[40],8[30]", 
"50,4[72],20[62]",
-    // "75,1[90],11[80]"};
-    String res = 
"1.0[10],10.0[2],2.0[40],8.0[30],4.0[72],20.0[62],1.0[90],11.0[80],";
-    // 0,BPv[t]ofBucket1,TPv[t]ofBucket1,BPv[t]ofBucket2,TPv[t]ofBucket2,...
+    String res =
+        
"1.0[10],10.0[2],5.0[1],4.0[22],2.0[40],8.0[30],8.0[30],2.0[40],4.0[72],20.0[62],5.0[55],4.0[72],1.0[90],11.0[80],11.0[80],1.0[90],";
     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), max_value(s0)"
+              "SELECT min_value(s0), max_value(s0),min_time(s0), max_time(s0), 
first_value(s0), last_value(s0)"
                   + " FROM root.vehicle.d0 group by ([0,100),25ms)"); // don't 
change the
       // sequence!!!
 
@@ -229,16 +230,14 @@ public class MyTest_MinMax {
   public void test3_2() {
     prepareData3_2();
 
-    //    String[] res = new String[]{"0,1[10],10[2]", "25,null,null", 
"50,4[72],20[62]",
-    // "75,1[90],11[80]"};
-    String res = 
"1.0[10],10.0[2],null,null,4.0[72],20.0[62],1.0[90],11.0[80],";
-    // 0,BPv[t]ofBucket1,TPv[t]ofBucket1,BPv[t]ofBucket2,TPv[t]ofBucket2,...
+    String res =
+        
"1.0[10],10.0[2],5.0[1],5.0[20],null,null,null[null],null[null],4.0[72],20.0[62],15.0[60],4.0[72],1.0[90],11.0[80],11.0[80],1.0[90],";
     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), max_value(s0)"
+              "SELECT min_value(s0), max_value(s0),min_time(s0), max_time(s0), 
first_value(s0), last_value(s0)"
                   + " FROM root.vehicle.d0 group by ([0,100),25ms)"); // don't 
change the
       // sequence!!!
 
diff --git 
a/server/src/test/java/org/apache/iotdb/db/integration/tri/MyTest_MinMax.java 
b/server/src/test/java/org/apache/iotdb/db/integration/tri/MyTest_MinMax.java
index 88d5bda26df..06b0432142d 100644
--- 
a/server/src/test/java/org/apache/iotdb/db/integration/tri/MyTest_MinMax.java
+++ 
b/server/src/test/java/org/apache/iotdb/db/integration/tri/MyTest_MinMax.java
@@ -24,7 +24,6 @@ import org.apache.iotdb.db.conf.IoTDBDescriptor;
 import org.apache.iotdb.db.engine.compaction.CompactionStrategy;
 import org.apache.iotdb.db.utils.EnvironmentUtils;
 import org.apache.iotdb.jdbc.Config;
-import org.apache.iotdb.jdbc.IoTDBStatement;
 import org.apache.iotdb.tsfile.common.conf.TSFileDescriptor;
 
 import org.junit.After;
@@ -44,6 +43,7 @@ public class MyTest_MinMax {
 
   /*
    * Sql format: SELECT min_value(s0), max_value(s0) ROM root.xx group by 
([tqs,tqe),IntervalLength).
+   * enableTri="MinMax"
    * Requirements:
    * (1) Don't change the sequence of the above two aggregates
    * (2) Assume each chunk has only one page.
@@ -119,7 +119,7 @@ public class MyTest_MinMax {
           Assert.assertEquals(res, ans);
         }
       }
-      System.out.println(((IoTDBStatement) statement).executeFinish());
+      //      System.out.println(((IoTDBStatement) statement).executeFinish());
     } catch (Exception e) {
       e.printStackTrace();
       fail(e.getMessage());
diff --git 
a/server/src/test/java/org/apache/iotdb/db/integration/tri/MyTest_MinMaxLTTB.java
 
b/server/src/test/java/org/apache/iotdb/db/integration/tri/MyTest_MinMaxLTTB.java
index 2dfdd40ea95..3d3491cccb7 100644
--- 
a/server/src/test/java/org/apache/iotdb/db/integration/tri/MyTest_MinMaxLTTB.java
+++ 
b/server/src/test/java/org/apache/iotdb/db/integration/tri/MyTest_MinMaxLTTB.java
@@ -42,7 +42,8 @@ import static org.junit.Assert.fail;
 public class MyTest_MinMaxLTTB {
 
   /*
-   * Sql format: SELECT min_value(s0), max_value(s0) ROM root.xx group by 
([tqs,tqe),IntervalLength).
+   * Sql format: SELECT min_value(s0), max_value(s0) FROM root.vehicle.d0 
group by ([100,2100),250ms)
+   * enableTri="MinMaxLTTB"
    * Requirements:
    * (1) Don't change the sequence of the above two aggregates
    * (2) Assume each chunk has only one page.

Reply via email to