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

liudw pushed a commit to branch reverse_reader
in repository https://gitbox.apache.org/repos/asf/incubator-iotdb.git


The following commit(s) were added to refs/heads/reverse_reader by this push:
     new b479e5c  add 'groupByTime' order by time logic
b479e5c is described below

commit b479e5cefd565e70191c93051690d600a8c21cfb
Author: liudw <[email protected]>
AuthorDate: Sat Aug 22 01:30:00 2020 +0800

    add 'groupByTime' order by time logic
---
 .../iotdb/db/qp/logical/crud/QueryOperator.java    |  2 +-
 .../iotdb/db/qp/physical/crud/QueryPlan.java       |  2 +-
 .../db/query/aggregation/AggregateResult.java      |  7 +++--
 .../db/query/aggregation/impl/AvgAggrResult.java   |  7 +++--
 .../db/query/aggregation/impl/CountAggrResult.java |  5 ++--
 .../aggregation/impl/FirstValueAggrResult.java     |  9 ++++--
 .../aggregation/impl/LastValueAggrResult.java      | 15 ++++++----
 .../query/aggregation/impl/MaxTimeAggrResult.java  |  7 +++--
 .../query/aggregation/impl/MaxValueAggrResult.java | 13 +++++----
 .../query/aggregation/impl/MinTimeAggrResult.java  |  9 ++++--
 .../query/aggregation/impl/MinValueAggrResult.java | 11 ++++---
 .../db/query/aggregation/impl/SumAggrResult.java   |  7 +++--
 .../dataset/groupby/GroupByEngineDataSet.java      | 34 +++++++++++++++++-----
 .../groupby/GroupByWithoutValueFilterDataSet.java  |  2 +-
 .../dataset/groupby/LocalGroupByExecutor.java      | 25 +++++++++++-----
 .../db/query/executor/RawDataQueryExecutor.java    | 19 ++++++++----
 .../query/reader/series/SeriesAggregateReader.java |  2 +-
 .../reader/series/SeriesRawDataBatchReader.java    |  4 +--
 .../query/timegenerator/ServerTimeGenerator.java   | 10 +++++--
 .../iotdb/db/engine/storagegroup/TTLTest.java      |  5 ++--
 .../tsfile/read/query/dataset/QueryDataSet.java    |  8 +++++
 21 files changed, 137 insertions(+), 66 deletions(-)

diff --git 
a/server/src/main/java/org/apache/iotdb/db/qp/logical/crud/QueryOperator.java 
b/server/src/main/java/org/apache/iotdb/db/qp/logical/crud/QueryOperator.java
index c6bde39..7707961 100644
--- 
a/server/src/main/java/org/apache/iotdb/db/qp/logical/crud/QueryOperator.java
+++ 
b/server/src/main/java/org/apache/iotdb/db/qp/logical/crud/QueryOperator.java
@@ -55,7 +55,7 @@ public class QueryOperator extends SFWOperator {
 
   private String column;
 
-  private boolean ascending;
+  private boolean ascending = true;
 
   public QueryOperator(int tokenIntType) {
     super(tokenIntType);
diff --git 
a/server/src/main/java/org/apache/iotdb/db/qp/physical/crud/QueryPlan.java 
b/server/src/main/java/org/apache/iotdb/db/qp/physical/crud/QueryPlan.java
index 8aa9773..89ab0f2 100644
--- a/server/src/main/java/org/apache/iotdb/db/qp/physical/crud/QueryPlan.java
+++ b/server/src/main/java/org/apache/iotdb/db/qp/physical/crud/QueryPlan.java
@@ -36,7 +36,7 @@ public abstract class QueryPlan extends PhysicalPlan {
   private int rowLimit = 0;
   private int rowOffset = 0;
 
-  private boolean ascending;
+  private boolean ascending = true;
 
   private Map<String, Integer> pathToIndex = new HashMap<>();
 
diff --git 
a/server/src/main/java/org/apache/iotdb/db/query/aggregation/AggregateResult.java
 
b/server/src/main/java/org/apache/iotdb/db/query/aggregation/AggregateResult.java
index 832e69a..ed798e5 100644
--- 
a/server/src/main/java/org/apache/iotdb/db/query/aggregation/AggregateResult.java
+++ 
b/server/src/main/java/org/apache/iotdb/db/query/aggregation/AggregateResult.java
@@ -78,10 +78,11 @@ public abstract class AggregateResult {
    * Aggregate results cannot be calculated using Statistics directly, using 
the data in each page
    *
    * @param dataInThisPage the data in Page
-   * @param bound          calculate points whose time < bound
+   * @param minBound       calculate points whose time > bound
+   * @param maxBound       calculate points whose time < bound
    */
-  public abstract void updateResultFromPageData(BatchData dataInThisPage, long 
bound)
-      throws IOException;
+  public abstract void updateResultFromPageData(BatchData dataInThisPage, long 
minBound,
+      long maxBound) throws IOException;
 
   /**
    * <p> This method calculates the aggregation using common timestamps of the 
cross series
diff --git 
a/server/src/main/java/org/apache/iotdb/db/query/aggregation/impl/AvgAggrResult.java
 
b/server/src/main/java/org/apache/iotdb/db/query/aggregation/impl/AvgAggrResult.java
index 2eaf975..1d16cca 100644
--- 
a/server/src/main/java/org/apache/iotdb/db/query/aggregation/impl/AvgAggrResult.java
+++ 
b/server/src/main/java/org/apache/iotdb/db/query/aggregation/impl/AvgAggrResult.java
@@ -74,13 +74,14 @@ public class AvgAggrResult extends AggregateResult {
 
   @Override
   public void updateResultFromPageData(BatchData dataInThisPage) throws 
IOException {
-    updateResultFromPageData(dataInThisPage, Long.MAX_VALUE);
+    updateResultFromPageData(dataInThisPage, Long.MIN_VALUE, Long.MAX_VALUE);
   }
 
   @Override
-  public void updateResultFromPageData(BatchData dataInThisPage, long bound) 
throws IOException {
+  public void updateResultFromPageData(BatchData dataInThisPage, long 
minBound, long maxBound)
+      throws IOException {
     while (dataInThisPage.hasCurrent()) {
-      if (dataInThisPage.currentTime() >= bound) {
+      if (dataInThisPage.currentTime() >= maxBound || 
dataInThisPage.currentTime() < minBound) {
         break;
       }
       updateAvg(seriesDataType, dataInThisPage.currentValue());
diff --git 
a/server/src/main/java/org/apache/iotdb/db/query/aggregation/impl/CountAggrResult.java
 
b/server/src/main/java/org/apache/iotdb/db/query/aggregation/impl/CountAggrResult.java
index 7b96304..b15294f 100644
--- 
a/server/src/main/java/org/apache/iotdb/db/query/aggregation/impl/CountAggrResult.java
+++ 
b/server/src/main/java/org/apache/iotdb/db/query/aggregation/impl/CountAggrResult.java
@@ -58,9 +58,10 @@ public class CountAggrResult extends AggregateResult {
   }
 
   @Override
-  public void updateResultFromPageData(BatchData dataInThisPage, long bound) {
+  public void updateResultFromPageData(BatchData dataInThisPage, long 
minBound, long maxBound)
+      throws IOException {
     while (dataInThisPage.hasCurrent()) {
-      if (dataInThisPage.currentTime() >= bound) {
+      if (dataInThisPage.currentTime() >= maxBound || 
dataInThisPage.currentTime() < minBound) {
         break;
       }
       long preValue = getLongValue();
diff --git 
a/server/src/main/java/org/apache/iotdb/db/query/aggregation/impl/FirstValueAggrResult.java
 
b/server/src/main/java/org/apache/iotdb/db/query/aggregation/impl/FirstValueAggrResult.java
index 2dc3e2b..0e2dc7a 100644
--- 
a/server/src/main/java/org/apache/iotdb/db/query/aggregation/impl/FirstValueAggrResult.java
+++ 
b/server/src/main/java/org/apache/iotdb/db/query/aggregation/impl/FirstValueAggrResult.java
@@ -75,11 +75,14 @@ public class FirstValueAggrResult extends AggregateResult {
   }
 
   @Override
-  public void updateResultFromPageData(BatchData dataInThisPage, long bound) {
+  public void updateResultFromPageData(BatchData dataInThisPage, long 
minBound, long maxBound)
+      throws IOException {
     if (hasResult()) {
       return;
     }
-    if (dataInThisPage.hasCurrent() && dataInThisPage.currentTime() < bound) {
+    if (dataInThisPage.hasCurrent()
+        && dataInThisPage.currentTime() < maxBound
+        && dataInThisPage.currentTime() >= minBound) {
       setValue(dataInThisPage.currentValue());
       timestamp = dataInThisPage.currentTime();
       dataInThisPage.next();
@@ -111,7 +114,7 @@ public class FirstValueAggrResult extends AggregateResult {
   @Override
   public void merge(AggregateResult another) {
     FirstValueAggrResult anotherFirst = (FirstValueAggrResult) another;
-    if(this.getValue() == null || this.timestamp > anotherFirst.timestamp){
+    if (this.getValue() == null || this.timestamp > anotherFirst.timestamp) {
       setValue(anotherFirst.getValue());
       timestamp = anotherFirst.timestamp;
     }
diff --git 
a/server/src/main/java/org/apache/iotdb/db/query/aggregation/impl/LastValueAggrResult.java
 
b/server/src/main/java/org/apache/iotdb/db/query/aggregation/impl/LastValueAggrResult.java
index 13a6a67..9375da0 100644
--- 
a/server/src/main/java/org/apache/iotdb/db/query/aggregation/impl/LastValueAggrResult.java
+++ 
b/server/src/main/java/org/apache/iotdb/db/query/aggregation/impl/LastValueAggrResult.java
@@ -59,15 +59,18 @@ public class LastValueAggrResult extends AggregateResult {
   }
 
   @Override
-  public void updateResultFromPageData(BatchData dataInThisPage) {
-    updateResultFromPageData(dataInThisPage, Long.MAX_VALUE);
+  public void updateResultFromPageData(BatchData dataInThisPage) throws 
IOException {
+    updateResultFromPageData(dataInThisPage, Long.MIN_VALUE, Long.MAX_VALUE);
   }
 
   @Override
-  public void updateResultFromPageData(BatchData dataInThisPage, long bound) {
+  public void updateResultFromPageData(BatchData dataInThisPage, long 
minBound, long maxBound)
+      throws IOException {
     long time = Long.MIN_VALUE;
     Object lastVal = null;
-    while (dataInThisPage.hasCurrent() && dataInThisPage.currentTime() < 
bound) {
+    while (dataInThisPage.hasCurrent()
+        && dataInThisPage.currentTime() < maxBound
+        && dataInThisPage.currentTime() >= minBound) {
       time = dataInThisPage.currentTime();
       lastVal = dataInThisPage.currentValue();
       dataInThisPage.next();
@@ -106,8 +109,8 @@ public class LastValueAggrResult extends AggregateResult {
   @Override
   public void merge(AggregateResult another) {
     LastValueAggrResult anotherLast = (LastValueAggrResult) another;
-    if(this.getValue() == null || this.timestamp < anotherLast.timestamp){
-      this.setValue( anotherLast.getValue() );
+    if (this.getValue() == null || this.timestamp < anotherLast.timestamp) {
+      this.setValue(anotherLast.getValue());
       this.timestamp = anotherLast.timestamp;
     }
   }
diff --git 
a/server/src/main/java/org/apache/iotdb/db/query/aggregation/impl/MaxTimeAggrResult.java
 
b/server/src/main/java/org/apache/iotdb/db/query/aggregation/impl/MaxTimeAggrResult.java
index 69dc286..78d834a 100644
--- 
a/server/src/main/java/org/apache/iotdb/db/query/aggregation/impl/MaxTimeAggrResult.java
+++ 
b/server/src/main/java/org/apache/iotdb/db/query/aggregation/impl/MaxTimeAggrResult.java
@@ -58,8 +58,11 @@ public class MaxTimeAggrResult extends AggregateResult {
   }
 
   @Override
-  public void updateResultFromPageData(BatchData dataInThisPage, long bound) {
-    while (dataInThisPage.hasCurrent() && dataInThisPage.currentTime() < 
bound) {
+  public void updateResultFromPageData(BatchData dataInThisPage, long 
minBound, long maxBound)
+      throws IOException {
+    while (dataInThisPage.hasCurrent()
+        && dataInThisPage.currentTime() < maxBound
+        && dataInThisPage.currentTime() >= minBound) {
       updateMaxTimeResult(dataInThisPage.currentTime());
       dataInThisPage.next();
     }
diff --git 
a/server/src/main/java/org/apache/iotdb/db/query/aggregation/impl/MaxValueAggrResult.java
 
b/server/src/main/java/org/apache/iotdb/db/query/aggregation/impl/MaxValueAggrResult.java
index 567a1e9..3c996aa 100644
--- 
a/server/src/main/java/org/apache/iotdb/db/query/aggregation/impl/MaxValueAggrResult.java
+++ 
b/server/src/main/java/org/apache/iotdb/db/query/aggregation/impl/MaxValueAggrResult.java
@@ -48,15 +48,18 @@ public class MaxValueAggrResult extends AggregateResult {
   }
 
   @Override
-  public void updateResultFromPageData(BatchData dataInThisPage) {
-    updateResultFromPageData(dataInThisPage, Long.MAX_VALUE);
+  public void updateResultFromPageData(BatchData dataInThisPage) throws 
IOException {
+    updateResultFromPageData(dataInThisPage, Long.MIN_VALUE, Long.MAX_VALUE);
   }
 
   @Override
-  public void updateResultFromPageData(BatchData dataInThisPage, long bound) {
+  public void updateResultFromPageData(BatchData dataInThisPage, long 
minBound, long maxBound)
+      throws IOException {
     Comparable<Object> maxVal = null;
 
-    while (dataInThisPage.hasCurrent() && dataInThisPage.currentTime() < 
bound) {
+    while (dataInThisPage.hasCurrent()
+        && dataInThisPage.currentTime() < maxBound
+        && dataInThisPage.currentTime() >= minBound) {
       if (maxVal == null || maxVal.compareTo(dataInThisPage.currentValue()) < 
0) {
         maxVal = (Comparable<Object>) dataInThisPage.currentValue();
       }
@@ -88,7 +91,7 @@ public class MaxValueAggrResult extends AggregateResult {
 
   @Override
   public void merge(AggregateResult another) {
-     this.updateResult((Comparable<Object>)another.getResult());
+    this.updateResult((Comparable<Object>) another.getResult());
   }
 
   @Override
diff --git 
a/server/src/main/java/org/apache/iotdb/db/query/aggregation/impl/MinTimeAggrResult.java
 
b/server/src/main/java/org/apache/iotdb/db/query/aggregation/impl/MinTimeAggrResult.java
index 27cbb29..9d15523 100644
--- 
a/server/src/main/java/org/apache/iotdb/db/query/aggregation/impl/MinTimeAggrResult.java
+++ 
b/server/src/main/java/org/apache/iotdb/db/query/aggregation/impl/MinTimeAggrResult.java
@@ -52,15 +52,18 @@ public class MinTimeAggrResult extends AggregateResult {
 
   @Override
   public void updateResultFromPageData(BatchData dataInThisPage) throws 
IOException {
-    updateResultFromPageData(dataInThisPage, Long.MAX_VALUE);
+    updateResultFromPageData(dataInThisPage, Long.MIN_VALUE, Long.MAX_VALUE);
   }
 
   @Override
-  public void updateResultFromPageData(BatchData dataInThisPage, long bound) 
throws IOException {
+  public void updateResultFromPageData(BatchData dataInThisPage, long 
minBound, long maxBound)
+      throws IOException {
     if (hasResult()) {
       return;
     }
-    if (dataInThisPage.hasCurrent() && dataInThisPage.currentTime() < bound) {
+    if (dataInThisPage.hasCurrent()
+        && dataInThisPage.currentTime() < maxBound
+        && dataInThisPage.currentTime() >= minBound) {
       setLongValue(dataInThisPage.currentTime());
     }
   }
diff --git 
a/server/src/main/java/org/apache/iotdb/db/query/aggregation/impl/MinValueAggrResult.java
 
b/server/src/main/java/org/apache/iotdb/db/query/aggregation/impl/MinValueAggrResult.java
index 7a20bbe..354ebc6 100644
--- 
a/server/src/main/java/org/apache/iotdb/db/query/aggregation/impl/MinValueAggrResult.java
+++ 
b/server/src/main/java/org/apache/iotdb/db/query/aggregation/impl/MinValueAggrResult.java
@@ -48,13 +48,16 @@ public class MinValueAggrResult extends AggregateResult {
   }
 
   @Override
-  public void updateResultFromPageData(BatchData dataInThisPage) {
-    updateResultFromPageData(dataInThisPage, Long.MAX_VALUE);
+  public void updateResultFromPageData(BatchData dataInThisPage) throws 
IOException {
+    updateResultFromPageData(dataInThisPage, Long.MIN_VALUE, Long.MAX_VALUE);
   }
 
   @Override
-  public void updateResultFromPageData(BatchData dataInThisPage, long bound) {
-    while (dataInThisPage.hasCurrent() && dataInThisPage.currentTime() < 
bound) {
+  public void updateResultFromPageData(BatchData dataInThisPage, long 
minBound, long maxBound)
+      throws IOException {
+    while (dataInThisPage.hasCurrent()
+        && dataInThisPage.currentTime() < maxBound
+        && dataInThisPage.currentTime() >= minBound) {
       updateResult((Comparable<Object>) dataInThisPage.currentValue());
       dataInThisPage.next();
     }
diff --git 
a/server/src/main/java/org/apache/iotdb/db/query/aggregation/impl/SumAggrResult.java
 
b/server/src/main/java/org/apache/iotdb/db/query/aggregation/impl/SumAggrResult.java
index 57d921e..ceb57c0 100644
--- 
a/server/src/main/java/org/apache/iotdb/db/query/aggregation/impl/SumAggrResult.java
+++ 
b/server/src/main/java/org/apache/iotdb/db/query/aggregation/impl/SumAggrResult.java
@@ -55,13 +55,14 @@ public class SumAggrResult extends AggregateResult {
 
   @Override
   public void updateResultFromPageData(BatchData dataInThisPage) throws 
IOException {
-    updateResultFromPageData(dataInThisPage, Long.MAX_VALUE);
+    updateResultFromPageData(dataInThisPage, Long.MIN_VALUE, Long.MAX_VALUE);
   }
 
   @Override
-  public void updateResultFromPageData(BatchData dataInThisPage, long bound) 
throws IOException {
+  public void updateResultFromPageData(BatchData dataInThisPage, long 
minBound, long maxBound)
+      throws IOException {
     while (dataInThisPage.hasCurrent()) {
-      if (dataInThisPage.currentTime() >= bound) {
+      if (dataInThisPage.currentTime() >= maxBound || 
dataInThisPage.currentTime() < minBound) {
         break;
       }
       updateSum(dataInThisPage.currentValue());
diff --git 
a/server/src/main/java/org/apache/iotdb/db/query/dataset/groupby/GroupByEngineDataSet.java
 
b/server/src/main/java/org/apache/iotdb/db/query/dataset/groupby/GroupByEngineDataSet.java
index df1a6cf..725671e 100644
--- 
a/server/src/main/java/org/apache/iotdb/db/query/dataset/groupby/GroupByEngineDataSet.java
+++ 
b/server/src/main/java/org/apache/iotdb/db/query/dataset/groupby/GroupByEngineDataSet.java
@@ -43,6 +43,9 @@ public abstract class GroupByEngineDataSet extends 
QueryDataSet {
 
   protected boolean leftCRightO;
 
+  protected boolean ascending;
+  protected long curSteps;
+
   public GroupByEngineDataSet() {
   }
 
@@ -50,7 +53,8 @@ public abstract class GroupByEngineDataSet extends 
QueryDataSet {
    * groupBy query.
    */
   public GroupByEngineDataSet(QueryContext context, GroupByTimePlan 
groupByTimePlan) {
-    super(groupByTimePlan.getDeduplicatedPaths(), 
groupByTimePlan.getDeduplicatedDataTypes());
+    super(groupByTimePlan.getDeduplicatedPaths(), 
groupByTimePlan.getDeduplicatedDataTypes(),
+        groupByTimePlan.isAscending());
     this.queryId = context.getQueryId();
     this.interval = groupByTimePlan.getInterval();
     this.slidingStep = groupByTimePlan.getSlidingStep();
@@ -59,8 +63,15 @@ public abstract class GroupByEngineDataSet extends 
QueryDataSet {
     this.leftCRightO = groupByTimePlan.isLeftCRightO();
     // init group by time partition
     this.hasCachedTimeInterval = false;
+    this.ascending = groupByTimePlan.isAscending();
     this.curStartTime = this.startTime - slidingStep;
     this.curEndTime = -1;
+    if (!groupByTimePlan.isAscending()) {
+      this.curSteps = this.endTime / slidingStep;
+      this.curStartTime = curSteps * slidingStep - 1;
+      this.curEndTime = Math.min(curStartTime + interval, this.endTime);
+      hasCachedTimeInterval = true;
+    }
   }
 
   @Override
@@ -71,14 +82,23 @@ public abstract class GroupByEngineDataSet extends 
QueryDataSet {
     }
 
     curStartTime += slidingStep;
-    //This is an open interval , [0-100)
-    if (curStartTime < endTime) {
-      hasCachedTimeInterval = true;
-      curEndTime = Math.min(curStartTime + interval, endTime);
-      return true;
-    } else {
+    if (ascending) {
+      //This is an open interval , [0-100)
+      if (curStartTime < endTime) {
+        hasCachedTimeInterval = true;
+        curEndTime = Math.min(curStartTime + interval, endTime);
+        return true;
+      }
       return false;
     }
+
+    curSteps--;
+    if (curSteps > 0) {
+      hasCachedTimeInterval = true;
+      curStartTime = slidingStep * curSteps - 1;
+      curEndTime = curStartTime + interval;
+    }
+    return false;
   }
 
   @Override
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 a2635f1..5ecf772 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
@@ -86,7 +86,7 @@ public class GroupByWithoutValueFilterDataSet extends 
GroupByEngineDataSet {
         //init GroupByExecutor
         pathExecutors.put(path,
             getGroupByExecutor(path, 
groupByTimePlan.getAllMeasurementsInDevice(path.getDevice()),
-                dataTypes.get(i), context, timeFilter, null, 
groupByTimePlan.isAlignByTime()));
+                dataTypes.get(i), context, timeFilter, null, 
groupByTimePlan.isAscending()));
         resultIndexes.put(path, new ArrayList<>());
       }
       resultIndexes.get(path).add(i);
diff --git 
a/server/src/main/java/org/apache/iotdb/db/query/dataset/groupby/LocalGroupByExecutor.java
 
b/server/src/main/java/org/apache/iotdb/db/query/dataset/groupby/LocalGroupByExecutor.java
index 9571608..d845998 100644
--- 
a/server/src/main/java/org/apache/iotdb/db/query/dataset/groupby/LocalGroupByExecutor.java
+++ 
b/server/src/main/java/org/apache/iotdb/db/query/dataset/groupby/LocalGroupByExecutor.java
@@ -52,6 +52,7 @@ public class LocalGroupByExecutor implements GroupByExecutor {
   // used for resetting the batch data to the last index
   private int lastReadCurArrayIndex;
   private int lastReadCurListIndex;
+  private boolean ascending;
 
   private QueryDataSource queryDataSource;
 
@@ -68,6 +69,7 @@ public class LocalGroupByExecutor implements GroupByExecutor {
     timeRange = new TimeRange(Long.MIN_VALUE, Long.MAX_VALUE);
     lastReadCurArrayIndex = 0;
     lastReadCurListIndex = 0;
+    this.ascending = ascending;
   }
 
   public boolean isEmpty() {
@@ -110,18 +112,25 @@ public class LocalGroupByExecutor implements 
GroupByExecutor {
       }
       // lazy reset batch data for calculation
       batchData.resetBatchData(lastReadCurArrayIndex, lastReadCurListIndex);
-      // skip points that cannot be calculated
-      while (batchData.hasCurrent() && batchData.currentTime() < curStartTime) 
{
-        batchData.next();
+      if (ascending) {
+        // skip points that cannot be calculated
+        while (batchData.hasCurrent() && batchData.currentTime() < 
curStartTime) {
+          batchData.next();
+        }
+      } else {
+        while (batchData.hasCurrent() && batchData.currentTime() > curEndTime) 
{
+          batchData.next();
+        }
       }
+
       if (batchData.hasCurrent()) {
-        result.updateResultFromPageData(batchData, curEndTime);
+        result.updateResultFromPageData(batchData, curStartTime, curEndTime);
       }
     }
     lastReadCurArrayIndex = batchData.getReadCurArrayIndex();
     lastReadCurListIndex = batchData.getReadCurListIndex();
     // can calc for next interval
-    if (batchData.getMaxTimestamp() >= curEndTime) {
+    if (batchData.hasCurrent()) {
       preCachedData = batchData;
     }
   }
@@ -236,9 +245,9 @@ public class LocalGroupByExecutor implements 
GroupByExecutor {
         return true;
       }
 
-      // reset the last position to zero
-      lastReadCurArrayIndex = 0;
-      lastReadCurListIndex = 0;
+      // reset the last position to current Index
+      lastReadCurArrayIndex = batchData.getReadCurArrayIndex();
+      lastReadCurListIndex = batchData.getReadCurListIndex();
       calcFromBatch(batchData, curStartTime, curEndTime);
 
       // judge whether the calculation finished
diff --git 
a/server/src/main/java/org/apache/iotdb/db/query/executor/RawDataQueryExecutor.java
 
b/server/src/main/java/org/apache/iotdb/db/query/executor/RawDataQueryExecutor.java
index 5899643..52b3624 100644
--- 
a/server/src/main/java/org/apache/iotdb/db/query/executor/RawDataQueryExecutor.java
+++ 
b/server/src/main/java/org/apache/iotdb/db/query/executor/RawDataQueryExecutor.java
@@ -54,11 +54,13 @@ public class RawDataQueryExecutor {
   protected List<Path> deduplicatedPaths;
   protected List<TSDataType> deduplicatedDataTypes;
   protected IExpression optimizedExpression;
+  protected boolean ascending;
 
   public RawDataQueryExecutor(RawDataQueryPlan queryPlan) {
     this.deduplicatedPaths = queryPlan.getDeduplicatedPaths();
     this.deduplicatedDataTypes = queryPlan.getDeduplicatedDataTypes();
     this.optimizedExpression = queryPlan.getExpression();
+    this.ascending = queryPlan.isAscending();
   }
 
   /**
@@ -86,7 +88,8 @@ public class RawDataQueryExecutor {
         readersOfSelectedSeries);
   }
 
-  protected List<ManagedSeriesReader> initManagedSeriesReader(QueryContext 
context, RawDataQueryPlan queryPlan)
+  protected List<ManagedSeriesReader> initManagedSeriesReader(QueryContext 
context,
+      RawDataQueryPlan queryPlan)
       throws StorageEngineException, QueryProcessException {
     Filter timeFilter = null;
     if (optimizedExpression != null) {
@@ -102,8 +105,9 @@ public class RawDataQueryExecutor {
           .getQueryDataSource(path, context, timeFilter);
       timeFilter = queryDataSource.updateFilterUsingTTL(timeFilter);
 
-      ManagedSeriesReader reader = new SeriesRawDataBatchReader(path, 
queryPlan.getAllMeasurementsInDevice(path.getDevice()), dataType, context,
-          queryDataSource, timeFilter, null, null);
+      ManagedSeriesReader reader = new SeriesRawDataBatchReader(path,
+          queryPlan.getAllMeasurementsInDevice(path.getDevice()), dataType, 
context,
+          queryDataSource, timeFilter, null, null, ascending);
       readersOfSelectedSeries.add(reader);
     }
     return readersOfSelectedSeries;
@@ -120,7 +124,8 @@ public class RawDataQueryExecutor {
 
     TimeGenerator timestampGenerator = getTimeGenerator(
         optimizedExpression, context, queryPlan);
-    List<Boolean> cached = markFilterdPaths(optimizedExpression, 
deduplicatedPaths, timestampGenerator.hasOrNode());
+    List<Boolean> cached = markFilterdPaths(optimizedExpression, 
deduplicatedPaths,
+        timestampGenerator.hasOrNode());
 
     List<IReaderByTimestamp> readersOfSelectedSeries = new ArrayList<>();
     for (int i = 0; i < deduplicatedPaths.size(); i++) {
@@ -129,7 +134,8 @@ public class RawDataQueryExecutor {
         continue;
       }
       Path path = deduplicatedPaths.get(i);
-      IReaderByTimestamp seriesReaderByTimestamp = getReaderByTimestamp(path, 
queryPlan.getAllMeasurementsInDevice(path.getDevice()),
+      IReaderByTimestamp seriesReaderByTimestamp = getReaderByTimestamp(path,
+          queryPlan.getAllMeasurementsInDevice(path.getDevice()),
           deduplicatedDataTypes.get(i), context);
       readersOfSelectedSeries.add(seriesReaderByTimestamp);
     }
@@ -137,7 +143,8 @@ public class RawDataQueryExecutor {
         timestampGenerator, readersOfSelectedSeries, cached);
   }
 
-  protected IReaderByTimestamp getReaderByTimestamp(Path path, Set<String> 
allSensors, TSDataType dataType,
+  protected IReaderByTimestamp getReaderByTimestamp(Path path, Set<String> 
allSensors,
+      TSDataType dataType,
       QueryContext context) throws StorageEngineException, 
QueryProcessException {
     return new SeriesReaderByTimestamp(path, allSensors,
         dataType, context,
diff --git 
a/server/src/main/java/org/apache/iotdb/db/query/reader/series/SeriesAggregateReader.java
 
b/server/src/main/java/org/apache/iotdb/db/query/reader/series/SeriesAggregateReader.java
index d25539d..f8a5e43 100644
--- 
a/server/src/main/java/org/apache/iotdb/db/query/reader/series/SeriesAggregateReader.java
+++ 
b/server/src/main/java/org/apache/iotdb/db/query/reader/series/SeriesAggregateReader.java
@@ -114,7 +114,7 @@ public class SeriesAggregateReader implements 
IAggregateReader {
 
   @Override
   public BatchData nextPage() throws IOException {
-    return seriesReader.nextPage();
+    return seriesReader.nextPage().flip();
   }
 
   private boolean containedByTimeFilter(Statistics statistics) {
diff --git 
a/server/src/main/java/org/apache/iotdb/db/query/reader/series/SeriesRawDataBatchReader.java
 
b/server/src/main/java/org/apache/iotdb/db/query/reader/series/SeriesRawDataBatchReader.java
index 6f96c47..82276d3 100644
--- 
a/server/src/main/java/org/apache/iotdb/db/query/reader/series/SeriesRawDataBatchReader.java
+++ 
b/server/src/main/java/org/apache/iotdb/db/query/reader/series/SeriesRawDataBatchReader.java
@@ -49,9 +49,9 @@ public class SeriesRawDataBatchReader implements 
ManagedSeriesReader {
 
   public SeriesRawDataBatchReader(Path seriesPath, Set<String> allSensors, 
TSDataType dataType,
       QueryContext context, QueryDataSource dataSource, Filter timeFilter, 
Filter valueFilter,
-      TsFileFilter fileFilter) {
+      TsFileFilter fileFilter, boolean ascending) {
     this.seriesReader = new SeriesReader(seriesPath, allSensors, dataType, 
context, dataSource,
-        timeFilter, valueFilter, fileFilter, true);
+        timeFilter, valueFilter, fileFilter, ascending);
   }
 
   @TestOnly
diff --git 
a/server/src/main/java/org/apache/iotdb/db/query/timegenerator/ServerTimeGenerator.java
 
b/server/src/main/java/org/apache/iotdb/db/query/timegenerator/ServerTimeGenerator.java
index ee1cf91..210373d 100644
--- 
a/server/src/main/java/org/apache/iotdb/db/query/timegenerator/ServerTimeGenerator.java
+++ 
b/server/src/main/java/org/apache/iotdb/db/query/timegenerator/ServerTimeGenerator.java
@@ -51,7 +51,8 @@ public class ServerTimeGenerator extends TimeGenerator {
   /**
    * Constructor of EngineTimeGenerator.
    */
-  public ServerTimeGenerator(IExpression expression, QueryContext context, 
RawDataQueryPlan queryPlan)
+  public ServerTimeGenerator(IExpression expression, QueryContext context,
+      RawDataQueryPlan queryPlan)
       throws StorageEngineException {
     this.context = context;
     this.queryPlan = queryPlan;
@@ -71,13 +72,16 @@ public class ServerTimeGenerator extends TimeGenerator {
     QueryDataSource queryDataSource;
     try {
       dataType = IoTDB.metaManager.getSeriesType(path.getFullPath());
-      queryDataSource = 
QueryResourceManager.getInstance().getQueryDataSource(path, context, filter);
+      queryDataSource = QueryResourceManager.getInstance()
+          .getQueryDataSource(path, context, filter);
       // update filter by TTL
       filter = queryDataSource.updateFilterUsingTTL(filter);
     } catch (Exception e) {
       throw new IOException(e);
     }
 
-    return new SeriesRawDataBatchReader(path, 
queryPlan.getAllMeasurementsInDevice(path.getDevice()), dataType, context, 
queryDataSource, null, filter, null);
+    return new SeriesRawDataBatchReader(path,
+        queryPlan.getAllMeasurementsInDevice(path.getDevice()), dataType, 
context, queryDataSource,
+        null, filter, null, true);
   }
 }
diff --git 
a/server/src/test/java/org/apache/iotdb/db/engine/storagegroup/TTLTest.java 
b/server/src/test/java/org/apache/iotdb/db/engine/storagegroup/TTLTest.java
index fa0abb2..8b6f9e0 100644
--- a/server/src/test/java/org/apache/iotdb/db/engine/storagegroup/TTLTest.java
+++ b/server/src/test/java/org/apache/iotdb/db/engine/storagegroup/TTLTest.java
@@ -98,7 +98,8 @@ public class TTLTest {
     
IoTDBDescriptor.getInstance().getConfig().setPartitionInterval(prevPartitionInterval);
   }
 
-  private void insertToStorageGroupProcessor(InsertRowPlan insertPlan) throws 
WriteProcessException {
+  private void insertToStorageGroupProcessor(InsertRowPlan insertPlan)
+      throws WriteProcessException {
     insertPlan.setDeviceMNode(deviceMNode);
     storageGroupProcessor.insert(insertPlan);
   }
@@ -218,7 +219,7 @@ public class TTLTest {
     Set<String> allSensors = new HashSet<>();
     allSensors.add(s1);
     IBatchReader reader = new SeriesRawDataBatchReader(path, allSensors, 
TSDataType.INT64,
-        EnvironmentUtils.TEST_QUERY_CONTEXT, dataSource, null, null, null);
+        EnvironmentUtils.TEST_QUERY_CONTEXT, dataSource, null, null, null, 
true);
 
     int cnt = 0;
     while (reader.hasNextBatch()) {
diff --git 
a/tsfile/src/main/java/org/apache/iotdb/tsfile/read/query/dataset/QueryDataSet.java
 
b/tsfile/src/main/java/org/apache/iotdb/tsfile/read/query/dataset/QueryDataSet.java
index bebae01..84e2a29 100644
--- 
a/tsfile/src/main/java/org/apache/iotdb/tsfile/read/query/dataset/QueryDataSet.java
+++ 
b/tsfile/src/main/java/org/apache/iotdb/tsfile/read/query/dataset/QueryDataSet.java
@@ -32,6 +32,7 @@ public abstract class QueryDataSet {
   protected int rowLimit = 0; // rowLimit > 0 means the LIMIT constraint exists
   protected int rowOffset = 0;
   protected int alreadyReturnedRowNum = 0;
+  protected boolean ascending;
 
   public QueryDataSet() {
   }
@@ -39,6 +40,13 @@ public abstract class QueryDataSet {
   public QueryDataSet(List<Path> paths, List<TSDataType> dataTypes) {
     this.paths = paths;
     this.dataTypes = dataTypes;
+    this.ascending = true;
+  }
+
+  public QueryDataSet(List<Path> paths, List<TSDataType> dataTypes, boolean 
ascending) {
+    this.paths = paths;
+    this.dataTypes = dataTypes;
+    this.ascending = ascending;
   }
 
   public boolean hasNext() throws IOException {

Reply via email to