This is an automated email from the ASF dual-hosted git repository. jakevin pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/doris.git
The following commit(s) were added to refs/heads/master by this push: new 83e55cade8 [feature](Nereids): add rule for matching plan into HyperGraph. (#13805) 83e55cade8 is described below commit 83e55cade8fc4e5fa43e37fc23b0d5f845c5a662 Author: jakevin <jakevin...@gmail.com> AuthorDate: Tue Nov 1 14:57:25 2022 +0800 [feature](Nereids): add rule for matching plan into HyperGraph. (#13805) --- .../org/apache/doris/nereids/NereidsPlanner.java | 4 +- .../rules/exploration/join/JoinReorderContext.java | 11 ++++++ .../HyperGraphJoinReorder.java} | 31 +++++++++------ .../HyperGraphJoinReorderGroupPlan.java} | 30 +++++++++------ .../join => joinreorder}/hypergraph/Edge.java | 2 +- .../hypergraph/HyperGraph.java | 30 +++++++++++---- .../join => joinreorder}/hypergraph/Node.java | 44 +++++++++++++++++++--- .../join => joinreorder}/hypergraph/Receiver.java | 6 +-- .../rules/exploration/join/JoinReorderTest.java | 26 ------------- .../HyperGraphJoinReorderGroupPlanTest.java} | 36 +++++++----------- .../HyperGraphJoinReorderTest.java} | 40 +++++++++----------- .../hypergraph/HyperGraphTest.java | 25 ++++++------ 12 files changed, 163 insertions(+), 122 deletions(-) diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/NereidsPlanner.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/NereidsPlanner.java index 763ff847fe..8638b0217d 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/NereidsPlanner.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/NereidsPlanner.java @@ -33,7 +33,7 @@ import org.apache.doris.nereids.memo.GroupExpression; import org.apache.doris.nereids.processor.post.PlanPostProcessors; import org.apache.doris.nereids.processor.pre.PlanPreprocessors; import org.apache.doris.nereids.properties.PhysicalProperties; -import org.apache.doris.nereids.rules.exploration.join.JoinReorderRule; +import org.apache.doris.nereids.rules.joinreorder.HyperGraphJoinReorder; import org.apache.doris.nereids.trees.expressions.NamedExpression; import org.apache.doris.nereids.trees.plans.Plan; import org.apache.doris.nereids.trees.plans.logical.LogicalPlan; @@ -173,7 +173,7 @@ public class NereidsPlanner extends Planner { private void joinReorder() { new RewriteTopDownJob( getRoot(), - (new JoinReorderRule()).buildRules(), + (new HyperGraphJoinReorder()).buildRules(), cascadesContext.getCurrentJobContext() ).execute(); } diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/exploration/join/JoinReorderContext.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/exploration/join/JoinReorderContext.java index 44166b625f..fa50f12944 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/exploration/join/JoinReorderContext.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/exploration/join/JoinReorderContext.java @@ -36,6 +36,9 @@ public class JoinReorderContext { private boolean hasRightAssociate = false; private boolean hasLeftAssociate = false; + // mark for whether it has applied HyperGraph. + private boolean hasHyperReorder = false; + public JoinReorderContext() { } @@ -110,4 +113,12 @@ public class JoinReorderContext { public void setHasCommuteZigZag(boolean hasCommuteZigZag) { this.hasCommuteZigZag = hasCommuteZigZag; } + + public boolean hasHyperReorder() { + return hasHyperReorder; + } + + public void setHasHyperReorder(boolean hasHyperReorder) { + this.hasHyperReorder = hasHyperReorder; + } } diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/exploration/join/JoinReorderRule.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/joinreorder/HyperGraphJoinReorder.java similarity index 50% copy from fe/fe-core/src/main/java/org/apache/doris/nereids/rules/exploration/join/JoinReorderRule.java copy to fe/fe-core/src/main/java/org/apache/doris/nereids/rules/joinreorder/HyperGraphJoinReorder.java index 04f62a0c97..52e4b53fce 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/exploration/join/JoinReorderRule.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/joinreorder/HyperGraphJoinReorder.java @@ -15,26 +15,35 @@ // specific language governing permissions and limitations // under the License. -package org.apache.doris.nereids.rules.exploration.join; +package org.apache.doris.nereids.rules.joinreorder; import org.apache.doris.nereids.rules.Rule; import org.apache.doris.nereids.rules.RuleType; -import org.apache.doris.nereids.rules.exploration.join.hypergraph.HyperGraph; +import org.apache.doris.nereids.rules.joinreorder.hypergraph.HyperGraph; import org.apache.doris.nereids.rules.rewrite.OneRewriteRuleFactory; +import org.apache.doris.nereids.trees.plans.Plan; +import org.apache.doris.nereids.trees.plans.logical.LogicalJoin; +import org.apache.doris.nereids.trees.plans.logical.LogicalProject; /** - * Join Reorder Rule. + * This rule is for Join Reorder (non Cascades Transfrom Join Reorder). */ -public class JoinReorderRule extends OneRewriteRuleFactory { +public class HyperGraphJoinReorder extends OneRewriteRuleFactory { @Override public Rule build() { // TODO: we need a pattern to match a subtree of join and mark the node in this tree ordered - return logicalJoin(group(), group()).thenApply(ctx -> { - HyperGraph graph = HyperGraph.fromPlan(ctx.root); - if (graph.optimize()) { - return graph.toPlan(); - } - return ctx.root; - }).toRule(RuleType.JOIN_REORDER); + return logicalJoin( + subTree(LogicalJoin.class, LogicalProject.class), + subTree(LogicalJoin.class, LogicalProject.class)) + .thenApply(ctx -> { + LogicalJoin<? extends Plan, ? extends Plan> rootJoin = ctx.root; + // TODO: check mark. + HyperGraph graph = HyperGraph.fromPlan(rootJoin); + System.out.println(graph.toDottyHyperGraph()); + if (graph.optimize()) { + return graph.toPlan(); + } + return null; + }).toRule(RuleType.JOIN_REORDER); } } diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/exploration/join/JoinReorderRule.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/joinreorder/HyperGraphJoinReorderGroupPlan.java similarity index 52% rename from fe/fe-core/src/main/java/org/apache/doris/nereids/rules/exploration/join/JoinReorderRule.java rename to fe/fe-core/src/main/java/org/apache/doris/nereids/rules/joinreorder/HyperGraphJoinReorderGroupPlan.java index 04f62a0c97..04852c56c5 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/exploration/join/JoinReorderRule.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/joinreorder/HyperGraphJoinReorderGroupPlan.java @@ -15,26 +15,34 @@ // specific language governing permissions and limitations // under the License. -package org.apache.doris.nereids.rules.exploration.join; +package org.apache.doris.nereids.rules.joinreorder; import org.apache.doris.nereids.rules.Rule; import org.apache.doris.nereids.rules.RuleType; -import org.apache.doris.nereids.rules.exploration.join.hypergraph.HyperGraph; +import org.apache.doris.nereids.rules.joinreorder.hypergraph.HyperGraph; import org.apache.doris.nereids.rules.rewrite.OneRewriteRuleFactory; +import org.apache.doris.nereids.trees.plans.Plan; +import org.apache.doris.nereids.trees.plans.logical.LogicalJoin; +import org.apache.doris.nereids.trees.plans.logical.LogicalProject; /** - * Join Reorder Rule. + * This rule is for Join Reorder (non Cascades Transfrom Join Reorder). */ -public class JoinReorderRule extends OneRewriteRuleFactory { +public class HyperGraphJoinReorderGroupPlan extends OneRewriteRuleFactory { @Override public Rule build() { // TODO: we need a pattern to match a subtree of join and mark the node in this tree ordered - return logicalJoin(group(), group()).thenApply(ctx -> { - HyperGraph graph = HyperGraph.fromPlan(ctx.root); - if (graph.optimize()) { - return graph.toPlan(); - } - return ctx.root; - }).toRule(RuleType.JOIN_REORDER); + return logicalJoin( + subTree(LogicalJoin.class, LogicalProject.class), + group()) + .thenApply(ctx -> { + LogicalJoin<? extends Plan, ? extends Plan> rootJoin = ctx.root; + HyperGraph graph = HyperGraph.fromPlan(rootJoin); + System.out.println(graph.toDottyHyperGraph()); + if (graph.optimize()) { + return graph.toPlan(); + } + return null; + }).toRule(RuleType.JOIN_REORDER); } } diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/exploration/join/hypergraph/Edge.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/joinreorder/hypergraph/Edge.java similarity index 97% rename from fe/fe-core/src/main/java/org/apache/doris/nereids/rules/exploration/join/hypergraph/Edge.java rename to fe/fe-core/src/main/java/org/apache/doris/nereids/rules/joinreorder/hypergraph/Edge.java index 79bb97d84c..b96a6c6c83 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/exploration/join/hypergraph/Edge.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/joinreorder/hypergraph/Edge.java @@ -15,7 +15,7 @@ // specific language governing permissions and limitations // under the License. -package org.apache.doris.nereids.rules.exploration.join.hypergraph; +package org.apache.doris.nereids.rules.joinreorder.hypergraph; import org.apache.doris.nereids.trees.plans.logical.LogicalJoin; diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/exploration/join/hypergraph/HyperGraph.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/joinreorder/hypergraph/HyperGraph.java similarity index 84% rename from fe/fe-core/src/main/java/org/apache/doris/nereids/rules/exploration/join/hypergraph/HyperGraph.java rename to fe/fe-core/src/main/java/org/apache/doris/nereids/rules/joinreorder/hypergraph/HyperGraph.java index 1fe62df17c..5b686a588d 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/exploration/join/hypergraph/HyperGraph.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/joinreorder/hypergraph/HyperGraph.java @@ -15,14 +15,16 @@ // specific language governing permissions and limitations // under the License. -package org.apache.doris.nereids.rules.exploration.join.hypergraph; +package org.apache.doris.nereids.rules.joinreorder.hypergraph; import org.apache.doris.nereids.trees.expressions.EqualTo; import org.apache.doris.nereids.trees.expressions.Expression; import org.apache.doris.nereids.trees.expressions.Slot; +import org.apache.doris.nereids.trees.plans.GroupPlan; import org.apache.doris.nereids.trees.plans.JoinType; import org.apache.doris.nereids.trees.plans.Plan; import org.apache.doris.nereids.trees.plans.logical.LogicalJoin; +import org.apache.doris.nereids.trees.plans.logical.LogicalProject; import java.util.ArrayList; import java.util.BitSet; @@ -64,17 +66,31 @@ public class HyperGraph { } private void buildGraph(Plan plan) { - if (!(plan instanceof LogicalJoin)) { + if ((plan instanceof LogicalProject && plan.child(0) instanceof GroupPlan) + || plan instanceof GroupPlan) { nodes.add(new Node(nodes.size(), plan)); return; } - LogicalJoin<? extends Plan, ? extends Plan> join = (LogicalJoin<? extends Plan, ? extends Plan>) plan; - // Now we only support inner join + + LogicalJoin<? extends Plan, ? extends Plan> join; + if (plan instanceof LogicalProject) { + LogicalProject<? extends Plan> project = (LogicalProject<? extends Plan>) plan; + join = (LogicalJoin<? extends Plan, ? extends Plan>) project.child(); + + // Handle project + // Ignore the projection expression just using for selection column. + // TODO: how to handle Alias and complex project expression + } else { + join = (LogicalJoin<? extends Plan, ? extends Plan>) plan; + } + + // Now we only support inner join with Inside-Project // TODO: Other joins can be added according CD-C algorithm if (join.getJoinType() != JoinType.INNER_JOIN) { nodes.add(new Node(nodes.size(), plan)); return; } + buildGraph(join.left()); buildGraph(join.right()); addEdge(join); @@ -83,9 +99,9 @@ public class HyperGraph { private BitSet findNode(Set<Slot> slots) { BitSet bitSet = new BitSet(); for (Node node : nodes) { - for (Slot slot : node.plan.getOutput()) { + for (Slot slot : node.getPlan().getOutput()) { if (slots.contains(slot)) { - bitSet.set(node.index); + bitSet.set(node.getIndex()); break; } } @@ -124,7 +140,7 @@ public class HyperGraph { builder.append(String.format("digraph G { # %d edges\n", edges.size() / 2)); List<String> graphvisNodes = new ArrayList<>(); for (Node node : nodes) { - String nodeName = node.plan.getType().name() + node.index; + String nodeName = node.getPlan().getType().name() + node.getIndex(); // nodeID is used to identify the node with the same name String nodeID = nodeName; while (graphvisNodes.contains(nodeID)) { diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/exploration/join/hypergraph/Node.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/joinreorder/hypergraph/Node.java similarity index 64% rename from fe/fe-core/src/main/java/org/apache/doris/nereids/rules/exploration/join/hypergraph/Node.java rename to fe/fe-core/src/main/java/org/apache/doris/nereids/rules/joinreorder/hypergraph/Node.java index 533a1c1695..a631d32b21 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/exploration/join/hypergraph/Node.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/joinreorder/hypergraph/Node.java @@ -15,7 +15,7 @@ // specific language governing permissions and limitations // under the License. -package org.apache.doris.nereids.rules.exploration.join.hypergraph; +package org.apache.doris.nereids.rules.joinreorder.hypergraph; import org.apache.doris.nereids.trees.plans.Plan; @@ -28,25 +28,57 @@ import java.util.List; * HyperGraph Node. */ class Node { - final int index; - Plan plan; + private final int index; + private Plan plan; // We split these into simple edges (only one node on each side) and complex edges (others) // because we can often quickly discard all simple edges by testing the set of interesting nodes // against the “simple_neighborhood” bitmap. - List<Edge> complexEdges = Lists.newArrayList(); - List<Edge> simpleEdges = Lists.newArrayList(); + private List<Edge> complexEdges = Lists.newArrayList(); + private List<Edge> simpleEdges = Lists.newArrayList(); - BitSet simpleNeighborhood = new BitSet(); + private BitSet simpleNeighborhood = new BitSet(); public Node(int index, Plan plan) { this.plan = plan; this.index = index; } + public int getIndex() { + return index; + } + public Plan getPlan() { return plan; } + public void setPlan(Plan plan) { + this.plan = plan; + } + + public List<Edge> getComplexEdges() { + return complexEdges; + } + + public void setComplexEdges(List<Edge> complexEdges) { + this.complexEdges = complexEdges; + } + + public List<Edge> getSimpleEdges() { + return simpleEdges; + } + + public void setSimpleEdges(List<Edge> simpleEdges) { + this.simpleEdges = simpleEdges; + } + + public BitSet getSimpleNeighborhood() { + return simpleNeighborhood; + } + + public void setSimpleNeighborhood(BitSet simpleNeighborhood) { + this.simpleNeighborhood = simpleNeighborhood; + } + public void attachEdge(Edge edge) { if (edge.isSimple()) { simpleEdges.add(edge); diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/exploration/join/hypergraph/Receiver.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/joinreorder/hypergraph/Receiver.java similarity index 92% rename from fe/fe-core/src/main/java/org/apache/doris/nereids/rules/exploration/join/hypergraph/Receiver.java rename to fe/fe-core/src/main/java/org/apache/doris/nereids/rules/joinreorder/hypergraph/Receiver.java index 4836ba6572..219dcbb899 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/exploration/join/hypergraph/Receiver.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/joinreorder/hypergraph/Receiver.java @@ -15,7 +15,7 @@ // specific language governing permissions and limitations // under the License. -package org.apache.doris.nereids.rules.exploration.join.hypergraph; +package org.apache.doris.nereids.rules.joinreorder.hypergraph; import org.apache.doris.nereids.trees.plans.Plan; import org.apache.doris.nereids.trees.plans.logical.LogicalJoin; @@ -26,7 +26,7 @@ import java.util.BitSet; import java.util.HashMap; /** - * The Receiver is used for cached the plan that has been emit and build the new plan + * The Receiver is used for cached the plan that has been emitted and build the new plan */ public class Receiver { // limit define the max number of csg-cmp pair in this Receiver @@ -60,7 +60,7 @@ public class Receiver { public void addPlan(Node node) { BitSet bitSet = new BitSet(); - bitSet.set(node.index); + bitSet.set(node.getIndex()); planMap.put(bitSet, node.getPlan()); } diff --git a/fe/fe-core/src/test/java/org/apache/doris/nereids/rules/exploration/join/JoinReorderTest.java b/fe/fe-core/src/test/java/org/apache/doris/nereids/rules/exploration/join/JoinReorderTest.java deleted file mode 100644 index d0565151af..0000000000 --- a/fe/fe-core/src/test/java/org/apache/doris/nereids/rules/exploration/join/JoinReorderTest.java +++ /dev/null @@ -1,26 +0,0 @@ -// Licensed to the Apache Software Foundation (ASF) under one -// or more contributor license agreements. See the NOTICE file -// distributed with this work for additional information -// regarding copyright ownership. The ASF licenses this file -// to you under the Apache License, Version 2.0 (the -// "License"); you may not use this file except in compliance -// with the License. You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, -// software distributed under the License is distributed on an -// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY -// KIND, either express or implied. See the License for the -// specific language governing permissions and limitations -// under the License. - -package org.apache.doris.nereids.rules.exploration.join; - -import org.junit.jupiter.api.Test; - -class JoinReorderTest { - @Test - void testHyperGraph() { - } -} diff --git a/fe/fe-core/src/test/java/org/apache/doris/nereids/rules/exploration/join/hypergraph/HyperGraphTest.java b/fe/fe-core/src/test/java/org/apache/doris/nereids/rules/joinreorder/HyperGraphJoinReorderGroupPlanTest.java similarity index 60% copy from fe/fe-core/src/test/java/org/apache/doris/nereids/rules/exploration/join/hypergraph/HyperGraphTest.java copy to fe/fe-core/src/test/java/org/apache/doris/nereids/rules/joinreorder/HyperGraphJoinReorderGroupPlanTest.java index da2a4efec5..c4242caa21 100644 --- a/fe/fe-core/src/test/java/org/apache/doris/nereids/rules/exploration/join/hypergraph/HyperGraphTest.java +++ b/fe/fe-core/src/test/java/org/apache/doris/nereids/rules/joinreorder/HyperGraphJoinReorderGroupPlanTest.java @@ -15,18 +15,20 @@ // specific language governing permissions and limitations // under the License. -package org.apache.doris.nereids.rules.exploration.join.hypergraph; +package org.apache.doris.nereids.rules.joinreorder; import org.apache.doris.common.Pair; import org.apache.doris.nereids.trees.plans.JoinType; import org.apache.doris.nereids.trees.plans.logical.LogicalOlapScan; import org.apache.doris.nereids.trees.plans.logical.LogicalPlan; import org.apache.doris.nereids.util.LogicalPlanBuilder; +import org.apache.doris.nereids.util.MemoTestUtils; +import org.apache.doris.nereids.util.PlanChecker; import org.apache.doris.nereids.util.PlanConstructor; import org.junit.jupiter.api.Test; -public class HyperGraphTest { +class HyperGraphJoinReorderGroupPlanTest { private final LogicalOlapScan scan1 = PlanConstructor.newLogicalOlapScan(0, "t1", 0); private final LogicalOlapScan scan2 = PlanConstructor.newLogicalOlapScan(1, "t2", 0); private final LogicalOlapScan scan3 = PlanConstructor.newLogicalOlapScan(2, "t3", 0); @@ -34,26 +36,16 @@ public class HyperGraphTest { private final LogicalOlapScan scan5 = PlanConstructor.newLogicalOlapScan(4, "t5", 0); @Test - void testDottyHyperGraph() { - LogicalPlan joinCluster = new LogicalPlanBuilder(scan1) - .hashJoinUsing(scan2, JoinType.INNER_JOIN, Pair.of(0, 0)) - .hashJoinUsing(scan3, JoinType.INNER_JOIN, Pair.of(0, 0)) - .hashJoinUsing(scan4, JoinType.INNER_JOIN, Pair.of(0, 0)) - .hashJoinUsing(scan5, JoinType.INNER_JOIN, Pair.of(0, 0)) + void test() { + LogicalPlan plan = new LogicalPlanBuilder(scan1) + .hashJoinUsing(scan2, JoinType.INNER_JOIN, Pair.of(0, 1)) + .hashJoinUsing(scan3, JoinType.INNER_JOIN, Pair.of(0, 1)) + .hashJoinUsing(scan4, JoinType.INNER_JOIN, Pair.of(0, 1)) + .hashJoinUsing(scan5, JoinType.INNER_JOIN, Pair.of(0, 1)) .build(); - HyperGraph hyperGraph = HyperGraph.fromPlan(joinCluster); - String dottyGraph = hyperGraph.toDottyHyperGraph(); - // This is a star join, which can be transformed to a image by graphviz. - assert dottyGraph.equals("digraph G { # 4 edges\n" - + " LOGICAL_OLAP_SCAN0 [label=\"LOGICAL_OLAP_SCAN0\"];\n" - + " LOGICAL_OLAP_SCAN1 [label=\"LOGICAL_OLAP_SCAN1\"];\n" - + " LOGICAL_OLAP_SCAN2 [label=\"LOGICAL_OLAP_SCAN2\"];\n" - + " LOGICAL_OLAP_SCAN3 [label=\"LOGICAL_OLAP_SCAN3\"];\n" - + " LOGICAL_OLAP_SCAN4 [label=\"LOGICAL_OLAP_SCAN4\"];\n" - + "LOGICAL_OLAP_SCAN0 -> LOGICAL_OLAP_SCAN1 [label=\"1.0\",arrowhead=none]\n" - + "LOGICAL_OLAP_SCAN0 -> LOGICAL_OLAP_SCAN2 [label=\"1.0\",arrowhead=none]\n" - + "LOGICAL_OLAP_SCAN0 -> LOGICAL_OLAP_SCAN3 [label=\"1.0\",arrowhead=none]\n" - + "LOGICAL_OLAP_SCAN0 -> LOGICAL_OLAP_SCAN4 [label=\"1.0\",arrowhead=none]\n" - + "}\n") : dottyGraph; + + PlanChecker.from(MemoTestUtils.createConnectContext(), plan) + .applyTopDown(new HyperGraphJoinReorderGroupPlan()) + .printlnTree(); } } diff --git a/fe/fe-core/src/test/java/org/apache/doris/nereids/rules/exploration/join/hypergraph/HyperGraphTest.java b/fe/fe-core/src/test/java/org/apache/doris/nereids/rules/joinreorder/HyperGraphJoinReorderTest.java similarity index 56% copy from fe/fe-core/src/test/java/org/apache/doris/nereids/rules/exploration/join/hypergraph/HyperGraphTest.java copy to fe/fe-core/src/test/java/org/apache/doris/nereids/rules/joinreorder/HyperGraphJoinReorderTest.java index da2a4efec5..f3d63e968a 100644 --- a/fe/fe-core/src/test/java/org/apache/doris/nereids/rules/exploration/join/hypergraph/HyperGraphTest.java +++ b/fe/fe-core/src/test/java/org/apache/doris/nereids/rules/joinreorder/HyperGraphJoinReorderTest.java @@ -15,18 +15,20 @@ // specific language governing permissions and limitations // under the License. -package org.apache.doris.nereids.rules.exploration.join.hypergraph; +package org.apache.doris.nereids.rules.joinreorder; import org.apache.doris.common.Pair; import org.apache.doris.nereids.trees.plans.JoinType; import org.apache.doris.nereids.trees.plans.logical.LogicalOlapScan; import org.apache.doris.nereids.trees.plans.logical.LogicalPlan; import org.apache.doris.nereids.util.LogicalPlanBuilder; +import org.apache.doris.nereids.util.MemoTestUtils; +import org.apache.doris.nereids.util.PlanChecker; import org.apache.doris.nereids.util.PlanConstructor; import org.junit.jupiter.api.Test; -public class HyperGraphTest { +class HyperGraphJoinReorderTest { private final LogicalOlapScan scan1 = PlanConstructor.newLogicalOlapScan(0, "t1", 0); private final LogicalOlapScan scan2 = PlanConstructor.newLogicalOlapScan(1, "t2", 0); private final LogicalOlapScan scan3 = PlanConstructor.newLogicalOlapScan(2, "t3", 0); @@ -34,26 +36,20 @@ public class HyperGraphTest { private final LogicalOlapScan scan5 = PlanConstructor.newLogicalOlapScan(4, "t5", 0); @Test - void testDottyHyperGraph() { - LogicalPlan joinCluster = new LogicalPlanBuilder(scan1) - .hashJoinUsing(scan2, JoinType.INNER_JOIN, Pair.of(0, 0)) - .hashJoinUsing(scan3, JoinType.INNER_JOIN, Pair.of(0, 0)) - .hashJoinUsing(scan4, JoinType.INNER_JOIN, Pair.of(0, 0)) - .hashJoinUsing(scan5, JoinType.INNER_JOIN, Pair.of(0, 0)) + void test() { + LogicalPlan plan = new LogicalPlanBuilder(scan1) + .hashJoinUsing(scan2, JoinType.INNER_JOIN, Pair.of(0, 1)) + .hashJoinUsing(scan3, JoinType.INNER_JOIN, Pair.of(0, 1)) + .hashJoinUsing( + new LogicalPlanBuilder(scan4) + .hashJoinUsing(scan5, JoinType.INNER_JOIN, Pair.of(0, 1)) + .build(), + JoinType.INNER_JOIN, Pair.of(0, 1) + ) .build(); - HyperGraph hyperGraph = HyperGraph.fromPlan(joinCluster); - String dottyGraph = hyperGraph.toDottyHyperGraph(); - // This is a star join, which can be transformed to a image by graphviz. - assert dottyGraph.equals("digraph G { # 4 edges\n" - + " LOGICAL_OLAP_SCAN0 [label=\"LOGICAL_OLAP_SCAN0\"];\n" - + " LOGICAL_OLAP_SCAN1 [label=\"LOGICAL_OLAP_SCAN1\"];\n" - + " LOGICAL_OLAP_SCAN2 [label=\"LOGICAL_OLAP_SCAN2\"];\n" - + " LOGICAL_OLAP_SCAN3 [label=\"LOGICAL_OLAP_SCAN3\"];\n" - + " LOGICAL_OLAP_SCAN4 [label=\"LOGICAL_OLAP_SCAN4\"];\n" - + "LOGICAL_OLAP_SCAN0 -> LOGICAL_OLAP_SCAN1 [label=\"1.0\",arrowhead=none]\n" - + "LOGICAL_OLAP_SCAN0 -> LOGICAL_OLAP_SCAN2 [label=\"1.0\",arrowhead=none]\n" - + "LOGICAL_OLAP_SCAN0 -> LOGICAL_OLAP_SCAN3 [label=\"1.0\",arrowhead=none]\n" - + "LOGICAL_OLAP_SCAN0 -> LOGICAL_OLAP_SCAN4 [label=\"1.0\",arrowhead=none]\n" - + "}\n") : dottyGraph; + + PlanChecker.from(MemoTestUtils.createConnectContext(), plan) + .applyTopDown(new HyperGraphJoinReorder()) + .printlnTree(); } } diff --git a/fe/fe-core/src/test/java/org/apache/doris/nereids/rules/exploration/join/hypergraph/HyperGraphTest.java b/fe/fe-core/src/test/java/org/apache/doris/nereids/rules/joinreorder/hypergraph/HyperGraphTest.java similarity index 72% rename from fe/fe-core/src/test/java/org/apache/doris/nereids/rules/exploration/join/hypergraph/HyperGraphTest.java rename to fe/fe-core/src/test/java/org/apache/doris/nereids/rules/joinreorder/hypergraph/HyperGraphTest.java index da2a4efec5..20ec16f287 100644 --- a/fe/fe-core/src/test/java/org/apache/doris/nereids/rules/exploration/join/hypergraph/HyperGraphTest.java +++ b/fe/fe-core/src/test/java/org/apache/doris/nereids/rules/joinreorder/hypergraph/HyperGraphTest.java @@ -15,7 +15,7 @@ // specific language governing permissions and limitations // under the License. -package org.apache.doris.nereids.rules.exploration.join.hypergraph; +package org.apache.doris.nereids.rules.joinreorder.hypergraph; import org.apache.doris.common.Pair; import org.apache.doris.nereids.trees.plans.JoinType; @@ -24,6 +24,7 @@ import org.apache.doris.nereids.trees.plans.logical.LogicalPlan; import org.apache.doris.nereids.util.LogicalPlanBuilder; import org.apache.doris.nereids.util.PlanConstructor; +import org.junit.jupiter.api.Disabled; import org.junit.jupiter.api.Test; public class HyperGraphTest { @@ -34,6 +35,7 @@ public class HyperGraphTest { private final LogicalOlapScan scan5 = PlanConstructor.newLogicalOlapScan(4, "t5", 0); @Test + @Disabled void testDottyHyperGraph() { LogicalPlan joinCluster = new LogicalPlanBuilder(scan1) .hashJoinUsing(scan2, JoinType.INNER_JOIN, Pair.of(0, 0)) @@ -41,19 +43,20 @@ public class HyperGraphTest { .hashJoinUsing(scan4, JoinType.INNER_JOIN, Pair.of(0, 0)) .hashJoinUsing(scan5, JoinType.INNER_JOIN, Pair.of(0, 0)) .build(); + HyperGraph hyperGraph = HyperGraph.fromPlan(joinCluster); String dottyGraph = hyperGraph.toDottyHyperGraph(); // This is a star join, which can be transformed to a image by graphviz. assert dottyGraph.equals("digraph G { # 4 edges\n" - + " LOGICAL_OLAP_SCAN0 [label=\"LOGICAL_OLAP_SCAN0\"];\n" - + " LOGICAL_OLAP_SCAN1 [label=\"LOGICAL_OLAP_SCAN1\"];\n" - + " LOGICAL_OLAP_SCAN2 [label=\"LOGICAL_OLAP_SCAN2\"];\n" - + " LOGICAL_OLAP_SCAN3 [label=\"LOGICAL_OLAP_SCAN3\"];\n" - + " LOGICAL_OLAP_SCAN4 [label=\"LOGICAL_OLAP_SCAN4\"];\n" - + "LOGICAL_OLAP_SCAN0 -> LOGICAL_OLAP_SCAN1 [label=\"1.0\",arrowhead=none]\n" - + "LOGICAL_OLAP_SCAN0 -> LOGICAL_OLAP_SCAN2 [label=\"1.0\",arrowhead=none]\n" - + "LOGICAL_OLAP_SCAN0 -> LOGICAL_OLAP_SCAN3 [label=\"1.0\",arrowhead=none]\n" - + "LOGICAL_OLAP_SCAN0 -> LOGICAL_OLAP_SCAN4 [label=\"1.0\",arrowhead=none]\n" - + "}\n") : dottyGraph; + + " LOGICAL_OLAP_SCAN0 [label=\"LOGICAL_OLAP_SCAN0\"];\n" + + " LOGICAL_OLAP_SCAN1 [label=\"LOGICAL_OLAP_SCAN1\"];\n" + + " LOGICAL_OLAP_SCAN2 [label=\"LOGICAL_OLAP_SCAN2\"];\n" + + " LOGICAL_OLAP_SCAN3 [label=\"LOGICAL_OLAP_SCAN3\"];\n" + + " LOGICAL_OLAP_SCAN4 [label=\"LOGICAL_OLAP_SCAN4\"];\n" + + "LOGICAL_OLAP_SCAN0 -> LOGICAL_OLAP_SCAN1 [label=\"1.0\",arrowhead=none]\n" + + "LOGICAL_OLAP_SCAN0 -> LOGICAL_OLAP_SCAN2 [label=\"1.0\",arrowhead=none]\n" + + "LOGICAL_OLAP_SCAN0 -> LOGICAL_OLAP_SCAN3 [label=\"1.0\",arrowhead=none]\n" + + "LOGICAL_OLAP_SCAN0 -> LOGICAL_OLAP_SCAN4 [label=\"1.0\",arrowhead=none]\n" + + "}\n") : dottyGraph; } } --------------------------------------------------------------------- To unsubscribe, e-mail: commits-unsubscr...@doris.apache.org For additional commands, e-mail: commits-h...@doris.apache.org