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 f04e020df77 fix: consider more general type of nodes above TopK-Node
as parent
f04e020df77 is described below
commit f04e020df778f250da274f84c19ae9e862191b28
Author: YangCaiyin <[email protected]>
AuthorDate: Sat Mar 23 08:24:56 2024 +0800
fix: consider more general type of nodes above TopK-Node as parent
---
.../OrderByExpressionWithLimitChangeToTopK.java | 68 +++++++++++-----------
1 file changed, 35 insertions(+), 33 deletions(-)
diff --git
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/optimization/OrderByExpressionWithLimitChangeToTopK.java
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/optimization/OrderByExpressionWithLimitChangeToTopK.java
index b9e35e86167..1f0730b3c6b 100644
---
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/optimization/OrderByExpressionWithLimitChangeToTopK.java
+++
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/optimization/OrderByExpressionWithLimitChangeToTopK.java
@@ -27,6 +27,7 @@ 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.MergeSortNode;
+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;
@@ -35,6 +36,9 @@ import
org.apache.iotdb.db.queryengine.plan.planner.plan.node.process.TransformN
import org.apache.iotdb.db.queryengine.plan.statement.StatementType;
import org.apache.iotdb.db.queryengine.plan.statement.crud.QueryStatement;
+import java.util.ArrayList;
+import java.util.List;
+
import static
org.apache.iotdb.db.queryengine.plan.planner.plan.node.process.TopKNode.LIMIT_VALUE_USE_TOP_K;
import static
org.apache.iotdb.db.queryengine.plan.statement.component.FillPolicy.LINEAR;
@@ -93,16 +97,34 @@ public class OrderByExpressionWithLimitChangeToTopK
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 newNode;
+ }
+
+ @Override
+ public PlanNode visitSingleChildProcess(SingleChildProcessNode node,
RewriterContext context) {
+ context.setParent(node);
+ node.setChild(node.getChild().accept(this, context));
+ return node;
+ }
+
+ @Override
+ public PlanNode visitMultiChildProcess(MultiChildProcessNode node,
RewriterContext context) {
+ List<PlanNode> visitedChildren = new ArrayList<>();
+ for (int i = 0; i < node.getChildren().size(); i++) {
+ context.setParent(node);
+ visitedChildren.add(node.getChildren().get(i).accept(this, context));
+ }
+ node.setChildren(visitedChildren);
return node;
}
@Override
public PlanNode visitLimit(LimitNode limitNode, RewriterContext
rewriterContext) {
- PlanNode parent = rewriterContext.getParent();
if (limitNode.getChild() instanceof OffsetNode) {
rewriterContext.setParent(limitNode);
@@ -114,16 +136,16 @@ public class OrderByExpressionWithLimitChangeToTopK
implements PlanOptimizer {
}
if (limitNode.getChild() instanceof SortNode) {
- return rewriterContext.returnSortNode(limitNode, parent);
+ return rewriterContext.returnSortNode(limitNode);
} else if (limitNode.getChild() instanceof MergeSortNode) {
- return rewriterContext.returnMergeSortNode(limitNode, parent);
+ return rewriterContext.returnMergeSortNode(limitNode);
} else if (limitNode.getChild() instanceof TransformNode
&& !(limitNode.getChild() instanceof FilterNode)) {
- return rewriterContext.returnTransformNodeFillNode(limitNode, parent);
+ return rewriterContext.returnTransformNodeFillNode(limitNode);
} else if (limitNode.getChild() instanceof FillNode
&& !LINEAR.equals(
((FillNode)
limitNode.getChild()).getFillDescriptor().getFillPolicy())) {
- return rewriterContext.returnTransformNodeFillNode(limitNode, parent);
+ return rewriterContext.returnTransformNodeFillNode(limitNode);
}
return limitNode;
@@ -180,7 +202,7 @@ public class OrderByExpressionWithLimitChangeToTopK
implements PlanOptimizer {
return this.mppQueryContext;
}
- private PlanNode returnSortNode(LimitNode limitNode, PlanNode parent) {
+ private PlanNode returnSortNode(LimitNode limitNode) {
SortNode sortNode = (SortNode) limitNode.getChild();
TopKNode topKNode =
new TopKNode(
@@ -190,15 +212,10 @@ public class OrderByExpressionWithLimitChangeToTopK
implements PlanOptimizer {
sortNode.getOutputColumnNames());
topKNode.setChildren(sortNode.getChildren());
- if (parent != null) {
- ((SingleChildProcessNode) parent).setChild(topKNode);
- return parent;
- } else {
- return topKNode;
- }
+ return topKNode;
}
- private PlanNode returnMergeSortNode(LimitNode limitNode, PlanNode parent)
{
+ private PlanNode returnMergeSortNode(LimitNode limitNode) {
MergeSortNode mergeSortNode = (MergeSortNode) limitNode.getChild();
TopKNode topKNode =
new TopKNode(
@@ -208,15 +225,10 @@ public class OrderByExpressionWithLimitChangeToTopK
implements PlanOptimizer {
mergeSortNode.getOutputColumnNames());
topKNode.setChildren(mergeSortNode.getChildren());
- if (parent != null) {
- ((SingleChildProcessNode) parent).setChild(topKNode);
- return parent;
- } else {
- return topKNode;
- }
+ return topKNode;
}
- private PlanNode returnTransformNodeFillNode(LimitNode limitNode, PlanNode
parent) {
+ private PlanNode returnTransformNodeFillNode(LimitNode limitNode) {
SingleChildProcessNode singleNode = (SingleChildProcessNode)
limitNode.getChild();
if (singleNode.getChild() instanceof SortNode) {
SortNode sortNode = (SortNode) singleNode.getChild();
@@ -229,12 +241,7 @@ public class OrderByExpressionWithLimitChangeToTopK
implements PlanOptimizer {
topKNode.setChildren(sortNode.getChildren());
singleNode.setChild(topKNode);
- if (parent != null) {
- ((SingleChildProcessNode) parent).setChild(singleNode);
- return parent;
- } else {
- return singleNode;
- }
+ return singleNode;
} else if (singleNode.getChild() instanceof MergeSortNode) {
MergeSortNode mergeSortNode = (MergeSortNode) singleNode.getChild();
TopKNode topKNode =
@@ -246,12 +253,7 @@ public class OrderByExpressionWithLimitChangeToTopK
implements PlanOptimizer {
topKNode.setChildren(mergeSortNode.getChildren());
singleNode.setChild(topKNode);
- if (parent != null) {
- ((SingleChildProcessNode) parent).setChild(singleNode);
- return parent;
- } else {
- return singleNode;
- }
+ return singleNode;
}
return limitNode;