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 213747b  add g4 orderByTimeClause
213747b is described below

commit 213747ba42cd225e4556bc7a242c3d781b972900
Author: liudw <[email protected]>
AuthorDate: Fri Aug 21 15:34:48 2020 +0800

    add g4 orderByTimeClause
---
 .../org/apache/iotdb/db/qp/strategy/SqlBase.g4     | 16 +++++++
 .../iotdb/db/qp/logical/crud/QueryOperator.java    | 20 ++++++++
 .../iotdb/db/qp/physical/crud/QueryPlan.java       | 10 ++++
 .../iotdb/db/qp/strategy/LogicalGenerator.java     | 13 +++++
 .../iotdb/db/qp/strategy/PhysicalGenerator.java    |  1 +
 .../groupby/GroupByWithoutValueFilterDataSet.java  | 38 ++++++++-------
 .../dataset/groupby/LocalGroupByExecutor.java      |  4 +-
 .../db/query/executor/AggregationExecutor.java     | 55 ++++++++++++++--------
 .../iotdb/db/query/executor/fill/LinearFill.java   |  8 ++--
 .../query/reader/series/SeriesAggregateReader.java |  6 +--
 .../reader/series/SeriesAggregateReaderTest.java   |  5 +-
 11 files changed, 128 insertions(+), 48 deletions(-)

diff --git a/antlr/src/main/antlr4/org/apache/iotdb/db/qp/strategy/SqlBase.g4 
b/antlr/src/main/antlr4/org/apache/iotdb/db/qp/strategy/SqlBase.g4
index 7a49244..68fc548 100644
--- a/antlr/src/main/antlr4/org/apache/iotdb/db/qp/strategy/SqlBase.g4
+++ b/antlr/src/main/antlr4/org/apache/iotdb/db/qp/strategy/SqlBase.g4
@@ -209,6 +209,7 @@ specialClause
     : specialLimit
     | groupByTimeClause specialLimit?
     | groupByFillClause specialLimit?
+    | orderByTimeClause ?
     | fillClause slimitClause? alignByDeviceClauseOrDisableAlign?
     | alignByDeviceClauseOrDisableAlign
     | groupByLevelClause specialLimit?
@@ -220,6 +221,11 @@ specialLimit
     | alignByDeviceClauseOrDisableAlign
     ;
 
+orderByTimeClause
+    : ORDER BY TIME (DESC | ASC)
+    ;
+
+
 limitClause
     : LIMIT INT offsetClause?
     | offsetClause? LIMIT INT
@@ -689,6 +695,10 @@ TO
     : T O
     ;
 
+ORDER
+    : O R D E R
+    ;
+
 BY
     : B Y
     ;
@@ -1143,6 +1153,12 @@ SCHEMA
     : S C H E M A
     ;
 
+DESC
+    : D E S C
+    ;
+ASC
+    : A S C
+    ;
 //============================
 // End of the keywords list
 //============================
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 1166592..c6bde39 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
@@ -53,6 +53,10 @@ public class QueryOperator extends SFWOperator {
   private boolean isAlignByDevice = false;
   private boolean isAlignByTime = true;
 
+  private String column;
+
+  private boolean ascending;
+
   public QueryOperator(int tokenIntType) {
     super(tokenIntType);
     operatorType = Operator.OperatorType.QUERY;
@@ -193,4 +197,20 @@ public class QueryOperator extends SFWOperator {
   public void setGroupByTime(boolean groupByTime) {
     isGroupByTime = groupByTime;
   }
+
+  public String getColumn() {
+    return column;
+  }
+
+  public void setColumn(String column) {
+    this.column = column;
+  }
+
+  public boolean isAscending() {
+    return ascending;
+  }
+
+  public void setAscending(boolean ascending) {
+    this.ascending = ascending;
+  }
 }
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 58b4c13..8aa9773 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,6 +36,8 @@ public abstract class QueryPlan extends PhysicalPlan {
   private int rowLimit = 0;
   private int rowOffset = 0;
 
+  private boolean ascending;
+
   private Map<String, Integer> pathToIndex = new HashMap<>();
 
   public QueryPlan() {
@@ -99,4 +101,12 @@ public abstract class QueryPlan extends PhysicalPlan {
   public Map<String, Integer> getPathToIndex() {
     return pathToIndex;
   }
+
+  public boolean isAscending() {
+    return ascending;
+  }
+
+  public void setAscending(boolean ascending) {
+    this.ascending = ascending;
+  }
 }
diff --git 
a/server/src/main/java/org/apache/iotdb/db/qp/strategy/LogicalGenerator.java 
b/server/src/main/java/org/apache/iotdb/db/qp/strategy/LogicalGenerator.java
index 6ad6202..ec09ffb 100644
--- a/server/src/main/java/org/apache/iotdb/db/qp/strategy/LogicalGenerator.java
+++ b/server/src/main/java/org/apache/iotdb/db/qp/strategy/LogicalGenerator.java
@@ -126,6 +126,7 @@ import 
org.apache.iotdb.db.qp.strategy.SqlBaseParser.NodeNameContext;
 import 
org.apache.iotdb.db.qp.strategy.SqlBaseParser.NodeNameWithoutStarContext;
 import org.apache.iotdb.db.qp.strategy.SqlBaseParser.OffsetClauseContext;
 import org.apache.iotdb.db.qp.strategy.SqlBaseParser.OrExpressionContext;
+import org.apache.iotdb.db.qp.strategy.SqlBaseParser.OrderByTimeClauseContext;
 import org.apache.iotdb.db.qp.strategy.SqlBaseParser.PredicateContext;
 import org.apache.iotdb.db.qp.strategy.SqlBaseParser.PrefixPathContext;
 import org.apache.iotdb.db.qp.strategy.SqlBaseParser.PrivilegesContext;
@@ -1043,6 +1044,18 @@ public class LogicalGenerator extends 
SqlBaseBaseListener {
   }
 
   @Override
+  public void enterOrderByTimeClause(OrderByTimeClauseContext ctx) {
+    super.enterOrderByTimeClause(ctx);
+    queryOp.setColumn(ctx.TIME().getText());
+    if (ctx.ASC() == null) {
+      queryOp.setAscending(false);
+    }
+    if (ctx.DESC() == null) {
+      queryOp.setAscending(true);
+    }
+  }
+
+  @Override
   public void enterSlimitClause(SlimitClauseContext ctx) {
     super.enterSlimitClause(ctx);
     int slimit;
diff --git 
a/server/src/main/java/org/apache/iotdb/db/qp/strategy/PhysicalGenerator.java 
b/server/src/main/java/org/apache/iotdb/db/qp/strategy/PhysicalGenerator.java
index 64990b7..1c86630 100644
--- 
a/server/src/main/java/org/apache/iotdb/db/qp/strategy/PhysicalGenerator.java
+++ 
b/server/src/main/java/org/apache/iotdb/db/qp/strategy/PhysicalGenerator.java
@@ -578,6 +578,7 @@ public class PhysicalGenerator {
 
     queryPlan.setRowLimit(queryOperator.getRowLimit());
     queryPlan.setRowOffset(queryOperator.getRowOffset());
+    queryPlan.setAscending(queryOperator.isAscending());
 
     return queryPlan;
   }
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 25db91a..a2635f1 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
@@ -42,20 +42,18 @@ import java.util.Map.Entry;
 public class GroupByWithoutValueFilterDataSet extends GroupByEngineDataSet {
 
   private static final Logger logger = LoggerFactory
-          .getLogger(GroupByWithoutValueFilterDataSet.class);
+      .getLogger(GroupByWithoutValueFilterDataSet.class);
 
   private Map<Path, GroupByExecutor> pathExecutors = new HashMap<>();
 
   /**
    * path -> result index for each aggregation
-   *
+   * <p>
    * e.g.,
-   *
-   * deduplicated paths : s1, s2, s1
-   * deduplicated aggregations : count, count, sum
-   *
-   * s1 -> 0, 2
-   * s2 -> 1
+   * <p>
+   * deduplicated paths : s1, s2, s1 deduplicated aggregations : count, count, 
sum
+   * <p>
+   * s1 -> 0, 2 s2 -> 1
    */
   private Map<Path, List<Integer>> resultIndexes = new HashMap<>();
 
@@ -66,14 +64,14 @@ public class GroupByWithoutValueFilterDataSet extends 
GroupByEngineDataSet {
    * constructor.
    */
   public GroupByWithoutValueFilterDataSet(QueryContext context, 
GroupByTimePlan groupByTimePlan)
-          throws StorageEngineException, QueryProcessException {
+      throws StorageEngineException, QueryProcessException {
     super(context, groupByTimePlan);
 
     initGroupBy(context, groupByTimePlan);
   }
 
   protected void initGroupBy(QueryContext context, GroupByTimePlan 
groupByTimePlan)
-          throws StorageEngineException, QueryProcessException {
+      throws StorageEngineException, QueryProcessException {
     IExpression expression = groupByTimePlan.getExpression();
 
     Filter timeFilter = null;
@@ -87,12 +85,14 @@ public class GroupByWithoutValueFilterDataSet extends 
GroupByEngineDataSet {
       if (!pathExecutors.containsKey(path)) {
         //init GroupByExecutor
         pathExecutors.put(path,
-                getGroupByExecutor(path, 
groupByTimePlan.getAllMeasurementsInDevice(path.getDevice()), dataTypes.get(i), 
context, timeFilter, null));
+            getGroupByExecutor(path, 
groupByTimePlan.getAllMeasurementsInDevice(path.getDevice()),
+                dataTypes.get(i), context, timeFilter, null, 
groupByTimePlan.isAlignByTime()));
         resultIndexes.put(path, new ArrayList<>());
       }
       resultIndexes.get(path).add(i);
       AggregateResult aggrResult = AggregateResultFactory
-              
.getAggrResultByName(groupByTimePlan.getDeduplicatedAggregations().get(i), 
dataTypes.get(i));
+          
.getAggrResultByName(groupByTimePlan.getDeduplicatedAggregations().get(i),
+              dataTypes.get(i));
       pathExecutors.get(path).addAggregateResult(aggrResult);
     }
   }
@@ -101,14 +101,14 @@ public class GroupByWithoutValueFilterDataSet extends 
GroupByEngineDataSet {
   protected RowRecord nextWithoutConstraint() throws IOException {
     if (!hasCachedTimeInterval) {
       throw new IOException("need to call hasNext() before calling next() "
-              + "in GroupByWithoutValueFilterDataSet.");
+          + "in GroupByWithoutValueFilterDataSet.");
     }
     hasCachedTimeInterval = false;
     RowRecord record;
     if (leftCRightO) {
       record = new RowRecord(curStartTime);
     } else {
-      record = new RowRecord(curEndTime-1);
+      record = new RowRecord(curEndTime - 1);
     }
 
     AggregateResult[] fields = new AggregateResult[paths.size()];
@@ -137,9 +137,11 @@ public class GroupByWithoutValueFilterDataSet extends 
GroupByEngineDataSet {
     return record;
   }
 
-  protected GroupByExecutor getGroupByExecutor(Path path, Set<String> 
allSensors, TSDataType dataType,
-                                               QueryContext context, Filter 
timeFilter, TsFileFilter fileFilter)
-          throws StorageEngineException, QueryProcessException {
-    return new LocalGroupByExecutor(path, allSensors, dataType, context, 
timeFilter, fileFilter);
+  protected GroupByExecutor getGroupByExecutor(Path path, Set<String> 
allSensors,
+      TSDataType dataType,
+      QueryContext context, Filter timeFilter, TsFileFilter fileFilter, 
boolean ascending)
+      throws StorageEngineException, QueryProcessException {
+    return new LocalGroupByExecutor(path, allSensors, dataType, context, 
timeFilter, fileFilter,
+        ascending);
   }
 }
\ No newline at end of file
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 3ccd596..9571608 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
@@ -56,14 +56,14 @@ public class LocalGroupByExecutor implements 
GroupByExecutor {
   private QueryDataSource queryDataSource;
 
   public LocalGroupByExecutor(Path path, Set<String> allSensors, TSDataType 
dataType,
-      QueryContext context, Filter timeFilter, TsFileFilter fileFilter)
+      QueryContext context, Filter timeFilter, TsFileFilter fileFilter, 
boolean ascending)
       throws StorageEngineException, QueryProcessException {
     queryDataSource = QueryResourceManager.getInstance()
         .getQueryDataSource(path, context, timeFilter);
     // update filter by TTL
     timeFilter = queryDataSource.updateFilterUsingTTL(timeFilter);
     this.reader = new SeriesAggregateReader(path, allSensors, dataType, 
context, queryDataSource,
-        timeFilter, null, fileFilter);
+        timeFilter, null, fileFilter, ascending);
     this.preCachedData = null;
     timeRange = new TimeRange(Long.MIN_VALUE, Long.MAX_VALUE);
     lastReadCurArrayIndex = 0;
diff --git 
a/server/src/main/java/org/apache/iotdb/db/query/executor/AggregationExecutor.java
 
b/server/src/main/java/org/apache/iotdb/db/query/executor/AggregationExecutor.java
index e7f51cd..202607a 100644
--- 
a/server/src/main/java/org/apache/iotdb/db/query/executor/AggregationExecutor.java
+++ 
b/server/src/main/java/org/apache/iotdb/db/query/executor/AggregationExecutor.java
@@ -77,7 +77,8 @@ public class AggregationExecutor {
    *
    * @param context query context
    */
-  public QueryDataSet executeWithoutValueFilter(QueryContext context, 
AggregationPlan aggregationPlan)
+  public QueryDataSet executeWithoutValueFilter(QueryContext context,
+      AggregationPlan aggregationPlan)
       throws StorageEngineException, IOException, QueryProcessException {
 
     Filter timeFilter = null;
@@ -89,7 +90,9 @@ public class AggregationExecutor {
     Map<Path, List<Integer>> pathToAggrIndexesMap = 
groupAggregationsBySeries(selectedSeries);
     AggregateResult[] aggregateResultList = new 
AggregateResult[selectedSeries.size()];
     for (Map.Entry<Path, List<Integer>> entry : 
pathToAggrIndexesMap.entrySet()) {
-      List<AggregateResult> aggregateResults = aggregateOneSeries(entry, 
aggregationPlan.getAllMeasurementsInDevice(entry.getKey().getDevice()), 
timeFilter, context);
+      List<AggregateResult> aggregateResults = aggregateOneSeries(entry,
+          
aggregationPlan.getAllMeasurementsInDevice(entry.getKey().getDevice()), 
timeFilter,
+          context, aggregationPlan.isAscending());
       int index = 0;
       for (int i : entry.getValue()) {
         aggregateResultList[i] = aggregateResults.get(index);
@@ -104,14 +107,14 @@ public class AggregationExecutor {
    * get aggregation result for one series
    *
    * @param pathToAggrIndexes entry of path to aggregation indexes map
-   * @param timeFilter time filter
-   * @param context query context
+   * @param timeFilter        time filter
+   * @param context           query context
    * @return AggregateResult list
    */
   protected List<AggregateResult> aggregateOneSeries(
       Map.Entry<Path, List<Integer>> pathToAggrIndexes,
       Set<String> measurements,
-      Filter timeFilter, QueryContext context)
+      Filter timeFilter, QueryContext context, boolean ascending)
       throws IOException, QueryProcessException, StorageEngineException {
     List<AggregateResult> aggregateResultList = new ArrayList<>();
 
@@ -124,12 +127,15 @@ public class AggregationExecutor {
           .getAggrResultByName(aggregations.get(i), tsDataType);
       aggregateResultList.add(aggregateResult);
     }
-    aggregateOneSeries(seriesPath, measurements, context, timeFilter, 
tsDataType, aggregateResultList, null);
+    aggregateOneSeries(seriesPath, measurements, context, timeFilter, 
tsDataType,
+        aggregateResultList, null, ascending);
     return aggregateResultList;
   }
 
-  public static void aggregateOneSeries(Path seriesPath, Set<String> 
measurements, QueryContext context, Filter timeFilter,
-      TSDataType tsDataType, List<AggregateResult> aggregateResultList, 
TsFileFilter fileFilter)
+  public static void aggregateOneSeries(Path seriesPath, Set<String> 
measurements,
+      QueryContext context, Filter timeFilter,
+      TSDataType tsDataType, List<AggregateResult> aggregateResultList, 
TsFileFilter fileFilter,
+      boolean ascending)
       throws StorageEngineException, IOException, QueryProcessException {
 
     // construct series reader without value filter
@@ -142,7 +148,7 @@ public class AggregationExecutor {
     timeFilter = queryDataSource.updateFilterUsingTTL(timeFilter);
 
     IAggregateReader seriesReader = new SeriesAggregateReader(seriesPath, 
measurements,
-        tsDataType, context, queryDataSource, timeFilter, null, null);
+        tsDataType, context, queryDataSource, timeFilter, null, null, 
ascending);
     aggregateFromReader(seriesReader, aggregateResultList);
   }
 
@@ -156,7 +162,7 @@ public class AggregationExecutor {
       if (seriesReader.canUseCurrentFileStatistics()) {
         Statistics fileStatistics = seriesReader.currentFileStatistics();
         remainingToCalculate = aggregateStatistics(aggregateResultList, 
isCalculatedArray,
-                remainingToCalculate, fileStatistics);
+            remainingToCalculate, fileStatistics);
         if (remainingToCalculate == 0) {
           return;
         }
@@ -169,7 +175,7 @@ public class AggregationExecutor {
         if (seriesReader.canUseCurrentChunkStatistics()) {
           Statistics chunkStatistics = seriesReader.currentChunkStatistics();
           remainingToCalculate = aggregateStatistics(aggregateResultList, 
isCalculatedArray,
-                  remainingToCalculate, chunkStatistics);
+              remainingToCalculate, chunkStatistics);
           if (remainingToCalculate == 0) {
             return;
           }
@@ -178,7 +184,7 @@ public class AggregationExecutor {
         }
 
         remainingToCalculate = aggregatePages(seriesReader, 
aggregateResultList,
-                isCalculatedArray, remainingToCalculate);
+            isCalculatedArray, remainingToCalculate);
         if (remainingToCalculate == 0) {
           return;
         }
@@ -189,6 +195,7 @@ public class AggregationExecutor {
 
   /**
    * Aggregate each result in the list with the statistics
+   *
    * @param aggregateResultList
    * @param isCalculatedArray
    * @param remainingToCalculate
@@ -217,7 +224,8 @@ public class AggregationExecutor {
   }
 
   private static int aggregatePages(IAggregateReader seriesReader,
-      List<AggregateResult> aggregateResultList, boolean[] isCalculatedArray, 
int remainingToCalculate)
+      List<AggregateResult> aggregateResultList, boolean[] isCalculatedArray,
+      int remainingToCalculate)
       throws IOException, QueryProcessException {
     while (seriesReader.hasNextPage()) {
       //cal by page statistics
@@ -270,20 +278,24 @@ public class AggregationExecutor {
     List<AggregateResult> aggregateResults = new ArrayList<>();
     for (int i = 0; i < selectedSeries.size(); i++) {
       TSDataType type = dataTypes.get(i);
-      AggregateResult result = 
AggregateResultFactory.getAggrResultByName(aggregations.get(i), type);
+      AggregateResult result = AggregateResultFactory
+          .getAggrResultByName(aggregations.get(i), type);
       aggregateResults.add(result);
     }
     aggregateWithValueFilter(aggregateResults, timestampGenerator, 
readersOfSelectedSeries);
     return constructDataSet(aggregateResults, queryPlan);
   }
 
-  protected TimeGenerator getTimeGenerator(QueryContext context, 
RawDataQueryPlan queryPlan) throws StorageEngineException {
+  protected TimeGenerator getTimeGenerator(QueryContext context, 
RawDataQueryPlan queryPlan)
+      throws StorageEngineException {
     return new ServerTimeGenerator(expression, context, queryPlan);
   }
 
-  protected IReaderByTimestamp getReaderByTime(Path path, RawDataQueryPlan 
queryPlan, TSDataType dataType,
+  protected IReaderByTimestamp getReaderByTime(Path path, RawDataQueryPlan 
queryPlan,
+      TSDataType dataType,
       QueryContext context) throws StorageEngineException, 
QueryProcessException {
-    return new SeriesReaderByTimestamp(path, 
queryPlan.getAllMeasurementsInDevice(path.getDevice()), dataType, context,
+    return new SeriesReaderByTimestamp(path, 
queryPlan.getAllMeasurementsInDevice(path.getDevice()),
+        dataType, context,
         QueryResourceManager.getInstance().getQueryDataSource(path, context, 
null), null);
   }
 
@@ -319,7 +331,8 @@ public class AggregationExecutor {
    *
    * @param aggregateResultList aggregate result list
    */
-  private QueryDataSet constructDataSet(List<AggregateResult> 
aggregateResultList, RawDataQueryPlan plan) {
+  private QueryDataSet constructDataSet(List<AggregateResult> 
aggregateResultList,
+      RawDataQueryPlan plan) {
     RowRecord record = new RowRecord(0);
     for (AggregateResult resultData : aggregateResultList) {
       TSDataType dataType = resultData.getResultDataType();
@@ -327,10 +340,12 @@ public class AggregationExecutor {
     }
 
     SingleDataSet dataSet = null;
-    if (((AggregationPlan)plan).getLevel() >= 0) {
+    if (((AggregationPlan) plan).getLevel() >= 0) {
       // current only support count operation
       Map<Integer, String> pathIndex = new HashMap<>();
-      Map<String, Long> finalPaths = 
FilePathUtils.getPathByLevel(plan.getDeduplicatedPaths(), 
((AggregationPlan)plan).getLevel(), pathIndex);
+      Map<String, Long> finalPaths = FilePathUtils
+          .getPathByLevel(plan.getDeduplicatedPaths(), ((AggregationPlan) 
plan).getLevel(),
+              pathIndex);
 
       RowRecord curRecord = FilePathUtils.mergeRecordByPath(record, 
finalPaths, pathIndex);
 
diff --git 
a/server/src/main/java/org/apache/iotdb/db/query/executor/fill/LinearFill.java 
b/server/src/main/java/org/apache/iotdb/db/query/executor/fill/LinearFill.java
index 4dbac70..697836c 100644
--- 
a/server/src/main/java/org/apache/iotdb/db/query/executor/fill/LinearFill.java
+++ 
b/server/src/main/java/org/apache/iotdb/db/query/executor/fill/LinearFill.java
@@ -138,7 +138,8 @@ public class LinearFill extends IFill {
     QueryDataSource dataSource =
         QueryResourceManager.getInstance().getQueryDataSource(seriesPath, 
context, beforeFilter);
     LastPointReader lastReader =
-        new LastPointReader(seriesPath, dataType, deviceMeasurements, context, 
dataSource, queryTime, beforeFilter);
+        new LastPointReader(seriesPath, dataType, deviceMeasurements, context, 
dataSource,
+            queryTime, beforeFilter);
 
     return lastReader.readLastPoint();
   }
@@ -153,10 +154,11 @@ public class LinearFill extends IFill {
     aggregateResultList.add(minTimeResult);
     aggregateResultList.add(firstValueResult);
     AggregationExecutor.aggregateOneSeries(
-        seriesPath, deviceMeasurements, context, afterFilter, dataType, 
aggregateResultList, null);
+        seriesPath, deviceMeasurements, context, afterFilter, dataType, 
aggregateResultList, null,
+        true);
 
     if (minTimeResult.getResult() != null) {
-      long timestamp = (long)(minTimeResult.getResult());
+      long timestamp = (long) (minTimeResult.getResult());
       result.setTimestamp(timestamp);
     }
     if (firstValueResult.getResult() != null) {
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 bc4c20f..d25539d 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
@@ -36,11 +36,11 @@ public class SeriesAggregateReader implements 
IAggregateReader {
 
   private final SeriesReader seriesReader;
 
-  public SeriesAggregateReader(Path seriesPath, Set<String> allSensors,  
TSDataType dataType,
+  public SeriesAggregateReader(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);
   }
 
   @Override
diff --git 
a/server/src/test/java/org/apache/iotdb/db/query/reader/series/SeriesAggregateReaderTest.java
 
b/server/src/test/java/org/apache/iotdb/db/query/reader/series/SeriesAggregateReaderTest.java
index d2c4943..acad606 100644
--- 
a/server/src/test/java/org/apache/iotdb/db/query/reader/series/SeriesAggregateReaderTest.java
+++ 
b/server/src/test/java/org/apache/iotdb/db/query/reader/series/SeriesAggregateReaderTest.java
@@ -74,8 +74,9 @@ public class SeriesAggregateReaderTest {
       Set<String> allSensors = new HashSet<>();
       allSensors.add("sensor0");
       QueryDataSource queryDataSource = new QueryDataSource(path, 
seqResources, unseqResources);
-      SeriesAggregateReader seriesReader = new SeriesAggregateReader(path, 
allSensors, TSDataType.INT32,
-          new QueryContext(), queryDataSource, null, null, null);
+      SeriesAggregateReader seriesReader = new SeriesAggregateReader(path, 
allSensors,
+          TSDataType.INT32,
+          new QueryContext(), queryDataSource, null, null, null, true);
       AggregateResult aggregateResult = AggregateResultFactory
           .getAggrResultByName("count", TSDataType.INT32);
       int loopTime = 0;

Reply via email to