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 =