This is an automated email from the ASF dual-hosted git repository.
hui 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 49e199ef0ea fix: consider more general type of nodes in optimization
above LimitNode (#12240)
49e199ef0ea is described below
commit 49e199ef0ea7d9c05bea23828b8ddf86a2b58b88
Author: YangCaiyin <[email protected]>
AuthorDate: Fri Mar 29 09:38:47 2024 +0800
fix: consider more general type of nodes in optimization above LimitNode
(#12240)
* fix: modify the planOptimizer of lopushdown
* fix: limit/offset node should modify their children
---
.../plan/optimization/LimitOffsetPushDown.java | 48 +++++++---------------
1 file changed, 15 insertions(+), 33 deletions(-)
diff --git
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/optimization/LimitOffsetPushDown.java
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/optimization/LimitOffsetPushDown.java
index db4374f17d8..4cd62aed025 100644
---
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/optimization/LimitOffsetPushDown.java
+++
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/optimization/LimitOffsetPushDown.java
@@ -26,13 +26,11 @@ import
org.apache.iotdb.db.queryengine.plan.analyze.ExpressionAnalyzer;
import org.apache.iotdb.db.queryengine.plan.expression.Expression;
import org.apache.iotdb.db.queryengine.plan.planner.plan.node.PlanNode;
import org.apache.iotdb.db.queryengine.plan.planner.plan.node.PlanVisitor;
-import
org.apache.iotdb.db.queryengine.plan.planner.plan.node.process.DeviceViewNode;
import org.apache.iotdb.db.queryengine.plan.planner.plan.node.process.FillNode;
import
org.apache.iotdb.db.queryengine.plan.planner.plan.node.process.FilterNode;
import
org.apache.iotdb.db.queryengine.plan.planner.plan.node.process.LimitNode;
import
org.apache.iotdb.db.queryengine.plan.planner.plan.node.process.MultiChildProcessNode;
import
org.apache.iotdb.db.queryengine.plan.planner.plan.node.process.OffsetNode;
-import
org.apache.iotdb.db.queryengine.plan.planner.plan.node.process.SingleChildProcessNode;
import org.apache.iotdb.db.queryengine.plan.planner.plan.node.process.SortNode;
import
org.apache.iotdb.db.queryengine.plan.planner.plan.node.process.TransformNode;
import
org.apache.iotdb.db.queryengine.plan.planner.plan.node.process.TwoChildProcessNode;
@@ -48,6 +46,7 @@ import org.apache.iotdb.db.utils.DateTimeUtils;
import org.apache.iotdb.tsfile.utils.TimeDuration;
import java.util.ArrayList;
+import java.util.Collections;
import java.util.List;
import java.util.concurrent.TimeUnit;
@@ -83,55 +82,43 @@ public class LimitOffsetPushDown implements PlanOptimizer {
@Override
public PlanNode visitPlan(PlanNode node, RewriterContext context) {
+ PlanNode newNode = node.clone();
for (PlanNode child : node.getChildren()) {
context.setParent(node);
- child.accept(this, context);
+ newNode.addChild(child.accept(this, context));
}
- return node;
+ return newNode;
}
@Override
public PlanNode visitLimit(LimitNode node, RewriterContext context) {
- PlanNode parent = context.getParent();
-
context.setParent(node);
context.setLimit(node.getLimit());
- node.getChild().accept(this, context);
+ node.setChild(node.getChild().accept(this, context));
if (context.isEnablePushDown()) {
- return concatParentWithChild(parent, node.getChild());
+ return node.getChild();
}
return node;
}
@Override
public PlanNode visitOffset(OffsetNode node, RewriterContext context) {
- PlanNode parent = context.getParent();
-
context.setParent(node);
context.setOffset(node.getOffset());
- node.getChild().accept(this, context);
+ node.setChild(node.getChild().accept(this, context));
if (context.isEnablePushDown()) {
- return concatParentWithChild(parent, node.getChild());
+ return node.getChild();
}
return node;
}
- private PlanNode concatParentWithChild(PlanNode parent, PlanNode child) {
- if (parent != null) {
- ((SingleChildProcessNode) parent).setChild(child);
- return parent;
- } else {
- return child;
- }
- }
-
@Override
public PlanNode visitFill(FillNode node, RewriterContext context) {
FillPolicy fillPolicy = node.getFillDescriptor().getFillPolicy();
if (fillPolicy == FillPolicy.VALUE) {
- node.getChild().accept(this, context);
+ node.setChild(node.getChild().accept(this, context));
} else {
context.setEnablePushDown(false);
}
@@ -166,7 +153,7 @@ public class LimitOffsetPushDown implements PlanOptimizer {
}
if (enablePushDown) {
- node.getChild().accept(this, context);
+ node.setChild(node.getChild().accept(this, context));
} else {
context.setEnablePushDown(false);
}
@@ -175,6 +162,11 @@ public class LimitOffsetPushDown implements PlanOptimizer {
@Override
public PlanNode visitMultiChildProcess(MultiChildProcessNode node,
RewriterContext context) {
+ if (node.getChildren().size() == 1) {
+ PlanNode child = node.getChildren().get(0).accept(this, context);
+ node.setChildren(Collections.singletonList(child));
+ return node;
+ }
context.setEnablePushDown(false);
return node;
}
@@ -192,16 +184,6 @@ public class LimitOffsetPushDown implements PlanOptimizer {
return node;
}
- @Override
- public PlanNode visitDeviceView(DeviceViewNode node, RewriterContext
context) {
- if (node.getChildren().size() == 1) {
- node.getChildren().get(0).accept(this, context);
- return node;
- } else {
- return visitMultiChildProcess(node, context);
- }
- }
-
@Override
public PlanNode visitSeriesScan(SeriesScanNode node, RewriterContext
context) {
if (context.isEnablePushDown()) {