This is an automated email from the ASF dual-hosted git repository.

caogaofei pushed a commit to branch beyyes/join
in repository https://gitbox.apache.org/repos/asf/iotdb.git


The following commit(s) were added to refs/heads/beyyes/join by this push:
     new 36755a3e1a6 perfect join of TableDistributedPlanGenerator and 
PushPredicateIntoTableScan
36755a3e1a6 is described below

commit 36755a3e1a60eb7c71d9f09eeaa69418f6d61da6
Author: Beyyes <[email protected]>
AuthorDate: Wed Aug 21 17:33:46 2024 +0800

    perfect join of TableDistributedPlanGenerator and PushPredicateIntoTableScan
---
 .../distribute/TableDistributedPlanGenerator.java  | 11 ++++++++++
 .../PushLimitOffsetIntoTableScan.java              |  1 +
 .../optimizations/PushPredicateIntoTableScan.java  | 24 ++++++++++++++++++++++
 3 files changed, 36 insertions(+)

diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/planner/distribute/TableDistributedPlanGenerator.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/planner/distribute/TableDistributedPlanGenerator.java
index f19b97f83e3..efd17df6e23 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/planner/distribute/TableDistributedPlanGenerator.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/planner/distribute/TableDistributedPlanGenerator.java
@@ -322,7 +322,18 @@ public class TableDistributedPlanGenerator
   @Override
   public List<PlanNode> visitJoin(JoinNode node, PlanContext context) {
     List<PlanNode> leftChildrenNodes = node.getLeftChild().accept(this, 
context);
+    OrderingScheme leftChildOrdering =
+        nodeOrderingMap.get(leftChildrenNodes.get(0).getPlanNodeId());
+    PlanNode leftNode = mergeChildrenViaCollectOrMergeSort(leftChildOrdering, 
leftChildrenNodes);
+    node.setLeftChild(leftNode);
+
     List<PlanNode> rightChildrenNodes = node.getRightChild().accept(this, 
context);
+    OrderingScheme rightChildOrdering =
+        nodeOrderingMap.get(rightChildrenNodes.get(0).getPlanNodeId());
+    PlanNode rightNode = 
mergeChildrenViaCollectOrMergeSort(rightChildOrdering, leftChildrenNodes);
+    node.setLeftChild(rightNode);
+
+    return Collections.singletonList(node);
   }
 
   @Override
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/planner/optimizations/PushLimitOffsetIntoTableScan.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/planner/optimizations/PushLimitOffsetIntoTableScan.java
index 3b0ee37034f..14e04d82489 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/planner/optimizations/PushLimitOffsetIntoTableScan.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/planner/optimizations/PushLimitOffsetIntoTableScan.java
@@ -126,6 +126,7 @@ public class PushLimitOffsetIntoTableScan implements 
PlanOptimizer {
               context.isEnablePushDown(),
               context.canPushLimitToEachDevice());
       PlanNode child = node.getChild().accept(this, newContext);
+      context.setTableScanNode(newContext.getTableScanNode());
       if (!newContext.isEnablePushDown()) {
         return node;
       }
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/planner/optimizations/PushPredicateIntoTableScan.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/planner/optimizations/PushPredicateIntoTableScan.java
index 2a7648c6e63..4c7d10a5b20 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/planner/optimizations/PushPredicateIntoTableScan.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/planner/optimizations/PushPredicateIntoTableScan.java
@@ -37,12 +37,14 @@ import 
org.apache.iotdb.db.queryengine.plan.relational.metadata.DeviceEntry;
 import org.apache.iotdb.db.queryengine.plan.relational.metadata.Metadata;
 import org.apache.iotdb.db.queryengine.plan.relational.planner.Assignments;
 import 
org.apache.iotdb.db.queryengine.plan.relational.planner.EqualityInference;
+import org.apache.iotdb.db.queryengine.plan.relational.planner.OrderingScheme;
 import org.apache.iotdb.db.queryengine.plan.relational.planner.Symbol;
 import org.apache.iotdb.db.queryengine.plan.relational.planner.SymbolAllocator;
 import 
org.apache.iotdb.db.queryengine.plan.relational.planner.ir.MetadataExpressionTransformForJoin;
 import org.apache.iotdb.db.queryengine.plan.relational.planner.node.FilterNode;
 import org.apache.iotdb.db.queryengine.plan.relational.planner.node.JoinNode;
 import 
org.apache.iotdb.db.queryengine.plan.relational.planner.node.ProjectNode;
+import org.apache.iotdb.db.queryengine.plan.relational.planner.node.SortNode;
 import 
org.apache.iotdb.db.queryengine.plan.relational.planner.node.TableScanNode;
 import 
org.apache.iotdb.db.queryengine.plan.relational.sql.ast.ComparisonExpression;
 import org.apache.iotdb.db.queryengine.plan.relational.sql.ast.Expression;
@@ -76,6 +78,7 @@ import static 
org.apache.iotdb.commons.schema.table.column.TsTableColumnCategory
 import static 
org.apache.iotdb.commons.schema.table.column.TsTableColumnCategory.MEASUREMENT;
 import static 
org.apache.iotdb.commons.schema.table.column.TsTableColumnCategory.TIME;
 import static 
org.apache.iotdb.db.queryengine.plan.analyze.AnalyzeVisitor.getTimePartitionSlotList;
+import static 
org.apache.iotdb.db.queryengine.plan.relational.planner.SortOrder.ASC_NULLS_LAST;
 import static 
org.apache.iotdb.db.queryengine.plan.relational.planner.SymbolsExtractor.extractUnique;
 import static 
org.apache.iotdb.db.queryengine.plan.relational.planner.ir.DeterminismEvaluator.isDeterministic;
 import static 
org.apache.iotdb.db.queryengine.plan.relational.planner.ir.GlobalTimePredicateExtractVisitor.extractGlobalTimeFilter;
@@ -479,6 +482,27 @@ public class PushPredicateIntoTableScan implements 
PlanOptimizer {
                 node.getRightHashSymbol(),
                 node.isSpillable());
       }
+      Symbol timeSymbol = Symbol.of("time");
+      OrderingScheme orderingScheme =
+          new OrderingScheme(
+              Collections.singletonList(timeSymbol),
+              Collections.singletonMap(timeSymbol, ASC_NULLS_LAST));
+      SortNode leftSortNode =
+          new SortNode(
+              queryId.genPlanNodeId(),
+              ((JoinNode) output).getLeftChild(),
+              orderingScheme,
+              false,
+              false);
+      SortNode rightSortNode =
+          new SortNode(
+              queryId.genPlanNodeId(),
+              ((JoinNode) output).getRightChild(),
+              orderingScheme,
+              false,
+              false);
+      ((JoinNode) output).setLeftChild(leftSortNode);
+      ((JoinNode) output).setRightChild(rightSortNode);
 
       if (!postJoinPredicate.equals(TRUE_LITERAL)) {
         output =

Reply via email to