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/10/31 07:00:20 UTC
[iotdb] branch master updated: [IOTDB-4802] Optimize the logical plan of query with only time filter (#7805)
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 021056c1bd [IOTDB-4802] Optimize the logical plan of query with only time filter (#7805)
021056c1bd is described below
commit 021056c1bd63789fe570c77dd0daaebc45657db5
Author: liuminghui233 <36...@users.noreply.github.com>
AuthorDate: Mon Oct 31 15:00:15 2022 +0800
[IOTDB-4802] Optimize the logical plan of query with only time filter (#7805)
---
.../apache/iotdb/db/mpp/plan/analyze/AnalyzeVisitor.java | 15 +++++++++------
.../db/mpp/plan/planner/plan/node/PlanGraphPrinter.java | 2 ++
.../iotdb/db/mpp/plan/plan/QueryLogicalPlanUtil.java | 11 ++++++++++-
3 files changed, 21 insertions(+), 7 deletions(-)
diff --git a/server/src/main/java/org/apache/iotdb/db/mpp/plan/analyze/AnalyzeVisitor.java b/server/src/main/java/org/apache/iotdb/db/mpp/plan/analyze/AnalyzeVisitor.java
index 74b2b9b5c5..493b6814ca 100644
--- a/server/src/main/java/org/apache/iotdb/db/mpp/plan/analyze/AnalyzeVisitor.java
+++ b/server/src/main/java/org/apache/iotdb/db/mpp/plan/analyze/AnalyzeVisitor.java
@@ -287,21 +287,24 @@ public class AnalyzeVisitor extends StatementVisitor<Analysis, MPPQueryContext>
Filter globalTimeFilter = null;
boolean hasValueFilter = false;
if (queryStatement.getWhereCondition() != null) {
- Expression predicate = queryStatement.getWhereCondition().getPredicate();
WhereCondition whereCondition = queryStatement.getWhereCondition();
+ Expression predicate = whereCondition.getPredicate();
+
Pair<Filter, Boolean> resultPair =
ExpressionAnalyzer.extractGlobalTimeFilter(predicate, true, true);
+ globalTimeFilter = resultPair.left;
+ hasValueFilter = resultPair.right;
+
predicate = ExpressionAnalyzer.evaluatePredicate(predicate);
- // set where condition to null if predicate is true
- if (predicate.getExpressionType().equals(ExpressionType.CONSTANT)
- && Boolean.parseBoolean(predicate.getExpressionString())) {
+ // set where condition to null if predicate is true or time filter.
+ if (!hasValueFilter
+ || (predicate.getExpressionType().equals(ExpressionType.CONSTANT)
+ && Boolean.parseBoolean(predicate.getExpressionString()))) {
queryStatement.setWhereCondition(null);
} else {
whereCondition.setPredicate(predicate);
}
- globalTimeFilter = resultPair.left;
- hasValueFilter = resultPair.right;
}
if (queryStatement.isGroupByTime()) {
GroupByTimeComponent groupByTimeComponent = queryStatement.getGroupByTimeComponent();
diff --git a/server/src/main/java/org/apache/iotdb/db/mpp/plan/planner/plan/node/PlanGraphPrinter.java b/server/src/main/java/org/apache/iotdb/db/mpp/plan/planner/plan/node/PlanGraphPrinter.java
index 3f91f89c0d..9dacddc4fe 100644
--- a/server/src/main/java/org/apache/iotdb/db/mpp/plan/planner/plan/node/PlanGraphPrinter.java
+++ b/server/src/main/java/org/apache/iotdb/db/mpp/plan/planner/plan/node/PlanGraphPrinter.java
@@ -86,6 +86,7 @@ public class PlanGraphPrinter extends PlanVisitor<List<String>, PlanGraphPrinter
List<String> boxValue = new ArrayList<>();
boxValue.add(String.format("SeriesScan-%s", node.getPlanNodeId().getId()));
boxValue.add(String.format("Series: %s", node.getSeriesPath()));
+ boxValue.add(String.format("TimeFilter: %s", node.getTimeFilter()));
boxValue.add(printRegion(node.getRegionReplicaSet()));
return render(node, boxValue, context);
}
@@ -98,6 +99,7 @@ public class PlanGraphPrinter extends PlanVisitor<List<String>, PlanGraphPrinter
String.format(
"Series: %s%s",
node.getAlignedPath().getDevice(), node.getAlignedPath().getMeasurementList()));
+ boxValue.add(String.format("TimeFilter: %s", node.getTimeFilter()));
boxValue.add(printRegion(node.getRegionReplicaSet()));
return render(node, boxValue, context);
}
diff --git a/server/src/test/java/org/apache/iotdb/db/mpp/plan/plan/QueryLogicalPlanUtil.java b/server/src/test/java/org/apache/iotdb/db/mpp/plan/plan/QueryLogicalPlanUtil.java
index b1eed72479..43c2420f3c 100644
--- a/server/src/test/java/org/apache/iotdb/db/mpp/plan/plan/QueryLogicalPlanUtil.java
+++ b/server/src/test/java/org/apache/iotdb/db/mpp/plan/plan/QueryLogicalPlanUtil.java
@@ -153,7 +153,7 @@ public class QueryLogicalPlanUtil {
/* Simple Query */
static {
- String sql = "SELECT ** FROM root.sg.d2 LIMIT 10 OFFSET 10";
+ String sql = "SELECT ** FROM root.sg.d2 WHERE time > 100 LIMIT 10 OFFSET 10";
QueryId queryId = new QueryId("test");
List<PlanNode> sourceNodeList = new ArrayList<>();
@@ -175,6 +175,15 @@ public class QueryLogicalPlanUtil {
sourceNodeList.add(
new AlignedSeriesScanNode(
queryId.genPlanNodeId(), (AlignedPath) schemaMap.get("root.sg.d2.a"), Ordering.ASC));
+
+ for (PlanNode sourceNode : sourceNodeList) {
+ if (sourceNode instanceof SeriesScanNode) {
+ ((SeriesScanNode) sourceNode).setTimeFilter(TimeFilter.gt(100));
+ } else if (sourceNode instanceof AlignedSeriesScanNode) {
+ ((AlignedSeriesScanNode) sourceNode).setTimeFilter(TimeFilter.gt(100));
+ }
+ }
+
TimeJoinNode timeJoinNode =
new TimeJoinNode(queryId.genPlanNodeId(), Ordering.ASC, sourceNodeList);
OffsetNode offsetNode = new OffsetNode(queryId.genPlanNodeId(), timeJoinNode, 10);