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 ae8f284d429 Fix the data scan ordering when executing last query
ae8f284d429 is described below

commit ae8f284d4296d409e5344eea5cee2ada5e6e4e79
Author: Beyyes <[email protected]>
AuthorDate: Thu Sep 28 10:11:34 2023 +0800

    Fix the data scan ordering when executing last query
---
 .../db/queryengine/plan/analyze/Analysis.java      |  12 +--
 .../queryengine/plan/analyze/AnalyzeVisitor.java   |   6 +-
 .../plan/planner/LogicalPlanBuilder.java           | 102 +++++++++++----------
 .../plan/planner/LogicalPlanVisitor.java           |   5 +-
 4 files changed, 57 insertions(+), 68 deletions(-)

diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/analyze/Analysis.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/analyze/Analysis.java
index 80f9179fde2..a3e194a8e70 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/analyze/Analysis.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/analyze/Analysis.java
@@ -210,8 +210,7 @@ public class Analysis {
   // timeseries, otherwise it will be null
   private Ordering timeseriesOrderingForLastQuery = null;
 
-  // Used to store view expression in last query which is non-writable
-  private Set<Expression> lastQueryNonWritableViewExpressions;
+  // Key: non-writable view expression, Value: corresponding source expressions
   private Map<Expression, List<Expression>> 
lastQueryNonWritableViewSourceExpressionMap;
 
   private Set<Expression> lastQueryBaseExpressions;
@@ -743,15 +742,6 @@ public class Analysis {
     this.lastQueryBaseExpressions = lastQueryBaseExpressions;
   }
 
-  public Set<Expression> getLastQueryNonWritableViewExpressions() {
-    return this.lastQueryNonWritableViewExpressions;
-  }
-
-  public void setLastQueryNonWritableViewExpression(
-      Set<Expression> lastQueryNonWritableViewExpression) {
-    this.lastQueryNonWritableViewExpressions = 
lastQueryNonWritableViewExpression;
-  }
-
   public Map<Expression, List<Expression>> 
getLastQueryNonWritableViewSourceExpressionMap() {
     return this.lastQueryNonWritableViewSourceExpressionMap;
   }
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/analyze/AnalyzeVisitor.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/analyze/AnalyzeVisitor.java
index 2909bac0b30..e5832fb0213 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/analyze/AnalyzeVisitor.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/analyze/AnalyzeVisitor.java
@@ -497,7 +497,6 @@ public class AnalyzeVisitor extends 
StatementVisitor<Analysis, MPPQueryContext>
       Analysis analysis, List<Expression> selectExpressions, ISchemaTree 
schemaTree) {
     Set<Expression> sourceExpressions = new LinkedHashSet<>();
     Set<Expression> lastQueryBaseExpressions = new LinkedHashSet<>();
-    Set<Expression> lastQueryNonWritableViewExpressions = null;
     Map<Expression, List<Expression>> 
lastQueryNonWritableViewSourceExpressionMap = null;
 
     for (Expression selectExpression : selectExpressions) {
@@ -507,13 +506,11 @@ public class AnalyzeVisitor extends 
StatementVisitor<Analysis, MPPQueryContext>
           lastQueryBaseExpressions.add(lastQuerySourceExpression);
           sourceExpressions.add(lastQuerySourceExpression);
         } else {
-          if (lastQueryNonWritableViewExpressions == null) {
-            lastQueryNonWritableViewExpressions = new LinkedHashSet<>();
+          if (lastQueryNonWritableViewSourceExpressionMap == null) {
             lastQueryNonWritableViewSourceExpressionMap = new HashMap<>();
           }
           List<Expression> sourceExpressionsOfNonWritableView =
               searchSourceExpressions(lastQuerySourceExpression);
-          lastQueryNonWritableViewExpressions.add(lastQuerySourceExpression);
           lastQueryNonWritableViewSourceExpressionMap.put(
               lastQuerySourceExpression, sourceExpressionsOfNonWritableView);
           sourceExpressions.addAll(sourceExpressionsOfNonWritableView);
@@ -523,7 +520,6 @@ public class AnalyzeVisitor extends 
StatementVisitor<Analysis, MPPQueryContext>
 
     analysis.setSourceExpressions(sourceExpressions);
     analysis.setLastQueryBaseExpressions(lastQueryBaseExpressions);
-    
analysis.setLastQueryNonWritableViewExpression(lastQueryNonWritableViewExpressions);
     analysis.setLastQueryNonWritableViewSourceExpressionMap(
         lastQueryNonWritableViewSourceExpressionMap);
   }
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/planner/LogicalPlanBuilder.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/planner/LogicalPlanBuilder.java
index 3468cf3b81e..ee5b871bf93 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/planner/LogicalPlanBuilder.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/planner/LogicalPlanBuilder.java
@@ -223,7 +223,7 @@ public class LogicalPlanBuilder {
   }
 
   public LogicalPlanBuilder planLast(
-      Analysis analysis, Ordering timeseriesOrdering, Ordering 
resultTimeOrder, ZoneId zoneId) {
+      Analysis analysis, Ordering timeseriesOrdering, ZoneId zoneId) {
     Set<String> deviceAlignedSet = new HashSet<>();
     Set<String> deviceExistViewSet = new HashSet<>();
     // <Device, <Measurement, Expression>>
@@ -306,53 +306,7 @@ public class LogicalPlanBuilder {
       }
     }
 
-    Set<Expression> lastQueryNonWriteViewExpressions =
-        analysis.getLastQueryNonWritableViewExpressions();
-    Map<Expression, List<Expression>> 
lastQueryNonWritableViewSourceExpressionMap =
-        analysis.getLastQueryNonWritableViewSourceExpressionMap();
-    if (lastQueryNonWriteViewExpressions != null) {
-      for (Expression expression : lastQueryNonWriteViewExpressions) {
-        Set<Expression> sourceTransformExpressions = 
Collections.singleton(expression);
-        FunctionExpression maxTimeAgg =
-            new FunctionExpression(
-                MAX_TIME, new LinkedHashMap<>(), 
Collections.singletonList(expression));
-        FunctionExpression lastValueAgg =
-            new FunctionExpression(
-                LAST_VALUE, new LinkedHashMap<>(), 
Collections.singletonList(expression));
-        analyzeExpression(analysis, expression);
-        analyzeExpression(analysis, maxTimeAgg);
-        analyzeExpression(analysis, lastValueAgg);
-
-        Set<Expression> sources =
-            new 
LinkedHashSet<>(lastQueryNonWritableViewSourceExpressionMap.get(expression));
-        LogicalPlanBuilder planBuilder = new LogicalPlanBuilder(analysis, 
context);
-        planBuilder =
-            planBuilder
-                .planRawDataSource(
-                    sources,
-                    resultTimeOrder,
-                    analysis.getGlobalTimeFilter(),
-                    analysis.isLastLevelUseWildcard())
-                .planWhereAndSourceTransform(
-                    null, sourceTransformExpressions, false, zoneId, 
resultTimeOrder)
-                .planAggregation(
-                    new LinkedHashSet<>(Arrays.asList(maxTimeAgg, 
lastValueAgg)),
-                    null,
-                    analysis.getGroupByTimeParameter(),
-                    analysis.getGroupByParameter(),
-                    false,
-                    AggregationStep.SINGLE,
-                    resultTimeOrder);
-
-        LastQueryTransformNode transformNode =
-            new LastQueryTransformNode(
-                context.getQueryId().genPlanNodeId(),
-                planBuilder.getRoot(),
-                expression.getViewPath().getFullPath(),
-                analysis.getType(expression).toString());
-        sourceNodeList.add(transformNode);
-      }
-    }
+    processLastQueryTransformNode(analysis, sourceNodeList, zoneId);
 
     if (timeseriesOrdering != null) {
       sourceNodeList.sort(
@@ -379,7 +333,7 @@ public class LogicalPlanBuilder {
             sourceNodeList,
             analysis.getGlobalTimeFilter(),
             timeseriesOrdering,
-            lastQueryNonWriteViewExpressions != null);
+            analysis.getLastQueryNonWritableViewSourceExpressionMap() != null);
 
     ColumnHeaderConstant.lastQueryColumnHeaders.forEach(
         columnHeader ->
@@ -390,6 +344,56 @@ public class LogicalPlanBuilder {
     return this;
   }
 
+  private void processLastQueryTransformNode(
+      Analysis analysis, List<PlanNode> sourceNodeList, ZoneId zoneId) {
+    if (analysis.getLastQueryNonWritableViewSourceExpressionMap() == null) {
+      return;
+    }
+
+    for (Map.Entry<Expression, List<Expression>> entry :
+        analysis.getLastQueryNonWritableViewSourceExpressionMap().entrySet()) {
+      Expression expression = entry.getKey();
+      Set<Expression> sourceExpressions = new 
LinkedHashSet<>(entry.getValue());
+      Set<Expression> sourceTransformExpressions = 
Collections.singleton(expression);
+      FunctionExpression maxTimeAgg =
+          new FunctionExpression(
+              MAX_TIME, new LinkedHashMap<>(), 
Collections.singletonList(expression));
+      FunctionExpression lastValueAgg =
+          new FunctionExpression(
+              LAST_VALUE, new LinkedHashMap<>(), 
Collections.singletonList(expression));
+      analyzeExpression(analysis, expression);
+      analyzeExpression(analysis, maxTimeAgg);
+      analyzeExpression(analysis, lastValueAgg);
+
+      LogicalPlanBuilder planBuilder = new LogicalPlanBuilder(analysis, 
context);
+      planBuilder =
+          planBuilder
+              .planRawDataSource(
+                  sourceExpressions,
+                  Ordering.DESC,
+                  analysis.getGlobalTimeFilter(),
+                  analysis.isLastLevelUseWildcard())
+              .planWhereAndSourceTransform(
+                  null, sourceTransformExpressions, false, zoneId, 
Ordering.DESC)
+              .planAggregation(
+                  new LinkedHashSet<>(Arrays.asList(maxTimeAgg, lastValueAgg)),
+                  null,
+                  analysis.getGroupByTimeParameter(),
+                  analysis.getGroupByParameter(),
+                  false,
+                  AggregationStep.SINGLE,
+                  Ordering.DESC);
+
+      LastQueryTransformNode transformNode =
+          new LastQueryTransformNode(
+              context.getQueryId().genPlanNodeId(),
+              planBuilder.getRoot(),
+              expression.getViewPath().getFullPath(),
+              analysis.getType(expression).toString());
+      sourceNodeList.add(transformNode);
+    }
+  }
+
   public LogicalPlanBuilder planAggregationSource(
       AggregationStep curStep,
       Ordering scanOrder,
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/planner/LogicalPlanVisitor.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/planner/LogicalPlanVisitor.java
index 7472147ec98..bd345ebf612 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/planner/LogicalPlanVisitor.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/planner/LogicalPlanVisitor.java
@@ -104,7 +104,6 @@ import java.util.Map;
 import java.util.Objects;
 import java.util.Set;
 
-import static 
org.apache.iotdb.db.queryengine.plan.statement.component.Ordering.ASC;
 import static org.apache.iotdb.db.utils.constant.SqlConstant.COUNT_TIME;
 
 /**
@@ -135,7 +134,6 @@ public class LogicalPlanVisitor extends 
StatementVisitor<PlanNode, MPPQueryConte
               .planLast(
                   analysis,
                   analysis.getTimeseriesOrderingForLastQuery(),
-                  queryStatement.getResultTimeOrder(),
                   queryStatement.getSelectComponent().getZoneId())
               .planOffset(queryStatement.getRowOffset())
               .planLimit(queryStatement.getRowLimit());
@@ -617,13 +615,14 @@ public class LogicalPlanVisitor extends 
StatementVisitor<PlanNode, MPPQueryConte
                 analysis.getRelatedTemplateInfo(),
                 showTimeSeriesStatement.getAuthorityScope())
             .planSchemaQueryMerge(showTimeSeriesStatement.isOrderByHeat());
+
     // show latest timeseries
     if (showTimeSeriesStatement.isOrderByHeat()
         && null != analysis.getDataPartitionInfo()
         && 0 != analysis.getDataPartitionInfo().getDataPartitionMap().size()) {
       PlanNode lastPlanNode =
           new LogicalPlanBuilder(analysis, context)
-              .planLast(analysis, null, ASC, ZoneId.systemDefault())
+              .planLast(analysis, null, ZoneId.systemDefault())
               .getRoot();
       planBuilder = planBuilder.planSchemaQueryOrderByHeat(lastPlanNode);
     }

Reply via email to