You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@iotdb.apache.org by ja...@apache.org on 2022/01/15 09:21:02 UTC

[iotdb] branch master updated: [IOTDB-2403] The parameter "ascending" is not set correctly when getting QueryDataSource (#4830)

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

jackietien pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/iotdb.git


The following commit(s) were added to refs/heads/master by this push:
     new b959fb3  [IOTDB-2403] The parameter "ascending" is not set correctly when getting QueryDataSource (#4830)
b959fb3 is described below

commit b959fb3251088ee9e4dd52b42aac36214e3cc84a
Author: liuminghui233 <36...@users.noreply.github.com>
AuthorDate: Sat Jan 15 17:20:30 2022 +0800

    [IOTDB-2403] The parameter "ascending" is not set correctly when getting QueryDataSource (#4830)
---
 .../iotdb/cluster/query/LocalQueryExecutor.java      |  3 ++-
 .../cluster/query/reader/ClusterReaderFactory.java   |  2 +-
 .../db/metadata/lastCache/LastCacheManager.java      |  4 +++-
 .../apache/iotdb/db/query/context/QueryContext.java  |  9 ---------
 .../iotdb/db/query/control/QueryResourceManager.java |  4 ++--
 .../groupby/GroupByWithValueFilterDataSet.java       |  3 ++-
 .../dataset/groupby/LocalAlignedGroupByExecutor.java |  2 +-
 .../query/dataset/groupby/LocalGroupByExecutor.java  |  2 +-
 .../iotdb/db/query/executor/AggregationExecutor.java | 20 +++++++++++++-------
 .../iotdb/db/query/executor/FillQueryExecutor.java   |  3 ++-
 .../iotdb/db/query/executor/LastQueryExecutor.java   |  4 +++-
 .../db/query/executor/RawDataQueryExecutor.java      |  6 ++++--
 .../iotdb/db/query/executor/fill/LinearFill.java     |  8 ++++++--
 .../iotdb/db/query/executor/fill/PreviousFill.java   |  5 ++++-
 .../db/query/timegenerator/ServerTimeGenerator.java  |  3 ++-
 .../iotdb/db/service/thrift/impl/TSServiceImpl.java  |  1 -
 .../db/engine/modification/DeletionFileNodeTest.java |  4 ++--
 17 files changed, 48 insertions(+), 35 deletions(-)

diff --git a/cluster/src/main/java/org/apache/iotdb/cluster/query/LocalQueryExecutor.java b/cluster/src/main/java/org/apache/iotdb/cluster/query/LocalQueryExecutor.java
index 10997f5..8c4cd69 100644
--- a/cluster/src/main/java/org/apache/iotdb/cluster/query/LocalQueryExecutor.java
+++ b/cluster/src/main/java/org/apache/iotdb/cluster/query/LocalQueryExecutor.java
@@ -750,7 +750,8 @@ public class LocalQueryExecutor {
         dataType,
         ascResults,
         descResults,
-        new SlotTsFileFilter(nodeSlots));
+        new SlotTsFileFilter(nodeSlots),
+        ascending);
     return results;
   }
 
diff --git a/cluster/src/main/java/org/apache/iotdb/cluster/query/reader/ClusterReaderFactory.java b/cluster/src/main/java/org/apache/iotdb/cluster/query/reader/ClusterReaderFactory.java
index 123d734..56560ecc 100644
--- a/cluster/src/main/java/org/apache/iotdb/cluster/query/reader/ClusterReaderFactory.java
+++ b/cluster/src/main/java/org/apache/iotdb/cluster/query/reader/ClusterReaderFactory.java
@@ -553,7 +553,7 @@ public class ClusterReaderFactory {
     // If requiredSlots is not null, it means that this node should provide partial data as previous
     // holder, in order to assist the new holder to read the complete data.
     QueryDataSource queryDataSource =
-        QueryResourceManager.getInstance().getQueryDataSource(path, context, timeFilter);
+        QueryResourceManager.getInstance().getQueryDataSource(path, context, timeFilter, ascending);
     valueFilter = queryDataSource.updateFilterUsingTTL(valueFilter);
     return path.createSeriesReader(
         allSensors,
diff --git a/server/src/main/java/org/apache/iotdb/db/metadata/lastCache/LastCacheManager.java b/server/src/main/java/org/apache/iotdb/db/metadata/lastCache/LastCacheManager.java
index 17ec217..6f57d91 100644
--- a/server/src/main/java/org/apache/iotdb/db/metadata/lastCache/LastCacheManager.java
+++ b/server/src/main/java/org/apache/iotdb/db/metadata/lastCache/LastCacheManager.java
@@ -220,9 +220,11 @@ public class LastCacheManager {
       return getLastCache(node).getTimestamp();
     } else {
       try {
+        // for the parameter "ascending": true or false both ok here,
+        // because LastPointReader will do itself sort logic instead of depending on fillOrderIndex.
         QueryDataSource dataSource =
             QueryResourceManager.getInstance()
-                .getQueryDataSource(node.getPartialPath(), queryContext, null);
+                .getQueryDataSource(node.getPartialPath(), queryContext, null, false);
         Set<String> measurementSet = new HashSet<>();
         measurementSet.add(node.getPartialPath().getFullPath());
         LastPointReader lastReader =
diff --git a/server/src/main/java/org/apache/iotdb/db/query/context/QueryContext.java b/server/src/main/java/org/apache/iotdb/db/query/context/QueryContext.java
index fb75003..df1b008 100644
--- a/server/src/main/java/org/apache/iotdb/db/query/context/QueryContext.java
+++ b/server/src/main/java/org/apache/iotdb/db/query/context/QueryContext.java
@@ -54,7 +54,6 @@ public class QueryContext {
 
   private boolean debug;
   private boolean enableTracing = false;
-  private boolean ascending;
 
   /**
    * To reduce the cost of memory, we only keep the a certain size statement. For statement whose
@@ -200,12 +199,4 @@ public class QueryContext {
   public boolean isInterrupted() {
     return isInterrupted;
   }
-
-  public boolean isAscending() {
-    return ascending;
-  }
-
-  public void setAscending(boolean ascending) {
-    this.ascending = ascending;
-  }
 }
diff --git a/server/src/main/java/org/apache/iotdb/db/query/control/QueryResourceManager.java b/server/src/main/java/org/apache/iotdb/db/query/control/QueryResourceManager.java
index d10ad3f..36b6b66 100644
--- a/server/src/main/java/org/apache/iotdb/db/query/control/QueryResourceManager.java
+++ b/server/src/main/java/org/apache/iotdb/db/query/control/QueryResourceManager.java
@@ -145,7 +145,7 @@ public class QueryResourceManager {
    *     an aligned device, it should be AlignedPath instead of MeasurementPath
    */
   public QueryDataSource getQueryDataSource(
-      PartialPath selectedPath, QueryContext context, Filter timeFilter)
+      PartialPath selectedPath, QueryContext context, Filter timeFilter, boolean ascending)
       throws StorageEngineException, QueryProcessException {
 
     long queryId = context.getQueryId();
@@ -179,7 +179,7 @@ public class QueryResourceManager {
     queryDataSource.setDataTTL(cachedQueryDataSource.getDataTTL());
 
     // calculate the read order of unseqResources
-    QueryUtils.fillOrderIndexes(queryDataSource, deviceId, context.isAscending());
+    QueryUtils.fillOrderIndexes(queryDataSource, deviceId, ascending);
 
     return queryDataSource;
   }
diff --git a/server/src/main/java/org/apache/iotdb/db/query/dataset/groupby/GroupByWithValueFilterDataSet.java b/server/src/main/java/org/apache/iotdb/db/query/dataset/groupby/GroupByWithValueFilterDataSet.java
index 67ab3d7..feee017 100644
--- a/server/src/main/java/org/apache/iotdb/db/query/dataset/groupby/GroupByWithValueFilterDataSet.java
+++ b/server/src/main/java/org/apache/iotdb/db/query/dataset/groupby/GroupByWithValueFilterDataSet.java
@@ -158,7 +158,8 @@ public class GroupByWithValueFilterDataSet extends GroupByEngineDataSet {
         queryPlan.getAllMeasurementsInDevice(path.getDevice()),
         path.getSeriesType(),
         context,
-        QueryResourceManager.getInstance().getQueryDataSource(path, context, null),
+        QueryResourceManager.getInstance()
+            .getQueryDataSource(path, context, null, queryPlan.isAscending()),
         null,
         ascending);
   }
diff --git a/server/src/main/java/org/apache/iotdb/db/query/dataset/groupby/LocalAlignedGroupByExecutor.java b/server/src/main/java/org/apache/iotdb/db/query/dataset/groupby/LocalAlignedGroupByExecutor.java
index e788e27..bebb354 100644
--- a/server/src/main/java/org/apache/iotdb/db/query/dataset/groupby/LocalAlignedGroupByExecutor.java
+++ b/server/src/main/java/org/apache/iotdb/db/query/dataset/groupby/LocalAlignedGroupByExecutor.java
@@ -68,7 +68,7 @@ public class LocalAlignedGroupByExecutor implements AlignedGroupByExecutor {
       boolean ascending)
       throws StorageEngineException, QueryProcessException {
     queryDataSource =
-        QueryResourceManager.getInstance().getQueryDataSource(path, context, timeFilter);
+        QueryResourceManager.getInstance().getQueryDataSource(path, context, timeFilter, ascending);
     // update filter by TTL
     timeFilter = queryDataSource.updateFilterUsingTTL(timeFilter);
 
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 75d1d72..22563f8 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
@@ -66,7 +66,7 @@ public class LocalGroupByExecutor implements GroupByExecutor {
       boolean ascending)
       throws StorageEngineException, QueryProcessException {
     queryDataSource =
-        QueryResourceManager.getInstance().getQueryDataSource(path, context, timeFilter);
+        QueryResourceManager.getInstance().getQueryDataSource(path, context, timeFilter, ascending);
     // update filter by TTL
     timeFilter = queryDataSource.updateFilterUsingTTL(timeFilter);
     // init SeriesAggregateReader for non-aligned series
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 a810b53..8d7bbf9 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
@@ -192,7 +192,8 @@ public class AggregationExecutor {
         tsDataType,
         ascAggregateResultList,
         descAggregateResultList,
-        null);
+        null,
+        ascending);
 
     int ascIndex = 0;
     int descIndex = 0;
@@ -241,7 +242,8 @@ public class AggregationExecutor {
         TSDataType.VECTOR,
         ascAggregateResultList,
         descAggregateResultList,
-        null);
+        null,
+        ascending);
 
     for (int i = 0; i < subIndexes.size(); i++) {
       List<Integer> subIndex = subIndexes.get(i);
@@ -265,12 +267,14 @@ public class AggregationExecutor {
       TSDataType tsDataType,
       List<AggregateResult> ascAggregateResultList,
       List<AggregateResult> descAggregateResultList,
-      TsFileFilter fileFilter)
+      TsFileFilter fileFilter,
+      boolean ascending)
       throws StorageEngineException, IOException, QueryProcessException {
 
     // construct series reader without value filter
     QueryDataSource queryDataSource =
-        QueryResourceManager.getInstance().getQueryDataSource(seriesPath, context, timeFilter);
+        QueryResourceManager.getInstance()
+            .getQueryDataSource(seriesPath, context, timeFilter, ascending);
     if (fileFilter != null) {
       QueryUtils.filterQueryDataSource(queryDataSource, fileFilter);
     }
@@ -315,12 +319,14 @@ public class AggregationExecutor {
       TSDataType tsDataType,
       List<List<AggregateResult>> ascAggregateResultList,
       List<List<AggregateResult>> descAggregateResultList,
-      TsFileFilter fileFilter)
+      TsFileFilter fileFilter,
+      boolean ascending)
       throws StorageEngineException, IOException, QueryProcessException {
 
     // construct series reader without value filter
     QueryDataSource queryDataSource =
-        QueryResourceManager.getInstance().getQueryDataSource(alignedPath, context, timeFilter);
+        QueryResourceManager.getInstance()
+            .getQueryDataSource(alignedPath, context, timeFilter, ascending);
     if (fileFilter != null) {
       QueryUtils.filterQueryDataSource(queryDataSource, fileFilter);
     }
@@ -690,7 +696,7 @@ public class AggregationExecutor {
         queryPlan.getAllMeasurementsInDevice(path.getDevice()),
         dataType,
         context,
-        QueryResourceManager.getInstance().getQueryDataSource(path, context, null),
+        QueryResourceManager.getInstance().getQueryDataSource(path, context, null, ascending),
         null,
         ascending);
   }
diff --git a/server/src/main/java/org/apache/iotdb/db/query/executor/FillQueryExecutor.java b/server/src/main/java/org/apache/iotdb/db/query/executor/FillQueryExecutor.java
index bcef343..ae4eefb 100644
--- a/server/src/main/java/org/apache/iotdb/db/query/executor/FillQueryExecutor.java
+++ b/server/src/main/java/org/apache/iotdb/db/query/executor/FillQueryExecutor.java
@@ -247,7 +247,8 @@ public class FillQueryExecutor {
       PartialPath path = selectedSeries.get(i);
       TSDataType dataType = dataTypes.get(i);
       QueryDataSource queryDataSource =
-          QueryResourceManager.getInstance().getQueryDataSource(path, context, timeFilter);
+          QueryResourceManager.getInstance()
+              .getQueryDataSource(path, context, timeFilter, plan.isAscending());
       timeFilter = queryDataSource.updateFilterUsingTTL(timeFilter);
       ManagedSeriesReader reader =
           new SeriesRawDataBatchReader(
diff --git a/server/src/main/java/org/apache/iotdb/db/query/executor/LastQueryExecutor.java b/server/src/main/java/org/apache/iotdb/db/query/executor/LastQueryExecutor.java
index 256a9f7..39128a6 100644
--- a/server/src/main/java/org/apache/iotdb/db/query/executor/LastQueryExecutor.java
+++ b/server/src/main/java/org/apache/iotdb/db/query/executor/LastQueryExecutor.java
@@ -75,6 +75,7 @@ public class LastQueryExecutor {
   // for test to reload this parameter after restart, it can't be final
   private static boolean ID_TABLE_ENABLED =
       IoTDBDescriptor.getInstance().getConfig().isEnableIDTable();
+  private static boolean ascending;
 
   private static final Logger logger = LoggerFactory.getLogger(LastQueryExecutor.class);
 
@@ -82,6 +83,7 @@ public class LastQueryExecutor {
     this.selectedSeries = lastQueryPlan.getDeduplicatedPaths();
     this.dataTypes = lastQueryPlan.getDeduplicatedDataTypes();
     this.expression = lastQueryPlan.getExpression();
+    this.ascending = lastQueryPlan.isAscending();
   }
 
   public LastQueryExecutor(List<PartialPath> selectedSeries, List<TSDataType> dataTypes) {
@@ -190,7 +192,7 @@ public class LastQueryExecutor {
       for (int i = 0; i < nonCachedPaths.size(); i++) {
         QueryDataSource dataSource =
             QueryResourceManager.getInstance()
-                .getQueryDataSource(nonCachedPaths.get(i), context, filter);
+                .getQueryDataSource(nonCachedPaths.get(i), context, filter, ascending);
         LastPointReader lastReader =
             nonCachedPaths
                 .get(i)
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 c1f101e..7cb7c73 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
@@ -124,7 +124,8 @@ public class RawDataQueryExecutor {
         TSDataType dataType = path.getSeriesType();
 
         QueryDataSource queryDataSource =
-            QueryResourceManager.getInstance().getQueryDataSource(path, context, timeFilter);
+            QueryResourceManager.getInstance()
+                .getQueryDataSource(path, context, timeFilter, queryPlan.isAscending());
         timeFilter = queryDataSource.updateFilterUsingTTL(timeFilter);
 
         ManagedSeriesReader reader =
@@ -283,7 +284,8 @@ public class RawDataQueryExecutor {
         allSensors,
         dataType,
         context,
-        QueryResourceManager.getInstance().getQueryDataSource(path, context, null),
+        QueryResourceManager.getInstance()
+            .getQueryDataSource(path, context, null, queryPlan.isAscending()),
         null,
         queryPlan.isAscending());
   }
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 4151bbc..f810780 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
@@ -152,8 +152,11 @@ public class LinearFill extends IFill {
 
   protected TimeValuePair calculatePrecedingPoint()
       throws QueryProcessException, StorageEngineException, IOException {
+    // for the parameter "ascending": true or false both ok here,
+    // because LastPointReader will do itself sort logic instead of depending on fillOrderIndex.
     QueryDataSource dataSource =
-        QueryResourceManager.getInstance().getQueryDataSource(seriesPath, context, beforeFilter);
+        QueryResourceManager.getInstance()
+            .getQueryDataSource(seriesPath, context, beforeFilter, false);
     LastPointReader lastReader =
         new LastPointReader(
             seriesPath,
@@ -183,7 +186,8 @@ public class LinearFill extends IFill {
         dataType,
         aggregateResultList,
         null,
-        null);
+        null,
+        true);
 
     return convertToResult(minTimeResult, firstValueResult);
   }
diff --git a/server/src/main/java/org/apache/iotdb/db/query/executor/fill/PreviousFill.java b/server/src/main/java/org/apache/iotdb/db/query/executor/fill/PreviousFill.java
index 43249c3..f41e351 100644
--- a/server/src/main/java/org/apache/iotdb/db/query/executor/fill/PreviousFill.java
+++ b/server/src/main/java/org/apache/iotdb/db/query/executor/fill/PreviousFill.java
@@ -114,8 +114,11 @@ public class PreviousFill extends IFill {
   @Override
   public TimeValuePair getFillResult()
       throws IOException, QueryProcessException, StorageEngineException {
+    // for the parameter "ascending": true or false both ok here,
+    // because LastPointReader will do itself sort logic instead of depending on fillOrderIndex.
     QueryDataSource dataSource =
-        QueryResourceManager.getInstance().getQueryDataSource(seriesPath, context, timeFilter);
+        QueryResourceManager.getInstance()
+            .getQueryDataSource(seriesPath, context, timeFilter, false);
     // update filter by TTL
     timeFilter = dataSource.updateFilterUsingTTL(timeFilter);
     LastPointReader lastReader =
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 e0068d4..55fc9b7 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
@@ -146,7 +146,8 @@ public class ServerTimeGenerator extends TimeGenerator {
     QueryDataSource queryDataSource;
     try {
       queryDataSource =
-          QueryResourceManager.getInstance().getQueryDataSource(path, context, valueFilter);
+          QueryResourceManager.getInstance()
+              .getQueryDataSource(path, context, valueFilter, queryPlan.isAscending());
       // update valueFilter by TTL
       valueFilter = queryDataSource.updateFilterUsingTTL(valueFilter);
     } catch (Exception e) {
diff --git a/server/src/main/java/org/apache/iotdb/db/service/thrift/impl/TSServiceImpl.java b/server/src/main/java/org/apache/iotdb/db/service/thrift/impl/TSServiceImpl.java
index f30afd8..044dc45 100644
--- a/server/src/main/java/org/apache/iotdb/db/service/thrift/impl/TSServiceImpl.java
+++ b/server/src/main/java/org/apache/iotdb/db/service/thrift/impl/TSServiceImpl.java
@@ -746,7 +746,6 @@ public class TSServiceImpl implements TSIService.Iface {
           queryId, TracingConstant.ACTIVITY_PARSE_SQL, System.currentTimeMillis());
       TRACING_MANAGER.setSeriesPathNum(queryId, plan.getPaths().size());
     }
-    context.setAscending(plan.isAscending());
 
     TSExecuteStatementResp resp = null;
     // execute it before createDataSet since it may change the content of query plan
diff --git a/server/src/test/java/org/apache/iotdb/db/engine/modification/DeletionFileNodeTest.java b/server/src/test/java/org/apache/iotdb/db/engine/modification/DeletionFileNodeTest.java
index 51656fd..7e539a4 100644
--- a/server/src/test/java/org/apache/iotdb/db/engine/modification/DeletionFileNodeTest.java
+++ b/server/src/test/java/org/apache/iotdb/db/engine/modification/DeletionFileNodeTest.java
@@ -184,7 +184,7 @@ public class DeletionFileNodeTest {
       QueryDataSource dataSource =
           QueryResourceManager.getInstance()
               .getQueryDataSource(
-                  (PartialPath) expression.getSeriesPath(), TEST_QUERY_CONTEXT, null);
+                  (PartialPath) expression.getSeriesPath(), TEST_QUERY_CONTEXT, null, true);
 
       int count = 0;
       for (TsFileResource seqResource : dataSource.getSeqResources()) {
@@ -332,7 +332,7 @@ public class DeletionFileNodeTest {
       QueryDataSource dataSource =
           QueryResourceManager.getInstance()
               .getQueryDataSource(
-                  (PartialPath) expression.getSeriesPath(), TEST_QUERY_CONTEXT, null);
+                  (PartialPath) expression.getSeriesPath(), TEST_QUERY_CONTEXT, null, true);
 
       List<ReadOnlyMemChunk> timeValuePairs =
           dataSource