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()) {

Reply via email to