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);
}