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

Reply via email to