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

starocean999 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 584646c054d [improvement](nereids)dphyper GraphSimplifier should 
consider missed edges when estimating join cost (#21747)
584646c054d is described below

commit 584646c054d274ebb885fcbbeef3a3fff50860bb
Author: starocean999 <40539150+starocean...@users.noreply.github.com>
AuthorDate: Thu Sep 28 09:30:57 2023 +0800

    [improvement](nereids)dphyper GraphSimplifier should consider missed edges 
when estimating join cost (#21747)
---
 .../nereids/jobs/joinorder/hypergraph/Edge.java    | 27 +++++++++++++---
 .../jobs/joinorder/hypergraph/GraphSimplifier.java | 36 ++++++++++++++++++++--
 .../hypergraph/receiver/PlanReceiver.java          | 18 +----------
 3 files changed, 57 insertions(+), 24 deletions(-)

diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/jobs/joinorder/hypergraph/Edge.java
 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/jobs/joinorder/hypergraph/Edge.java
index 4172e545596..601aa001ae2 100644
--- 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/jobs/joinorder/hypergraph/Edge.java
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/jobs/joinorder/hypergraph/Edge.java
@@ -31,6 +31,7 @@ import java.util.BitSet;
 import java.util.HashSet;
 import java.util.List;
 import java.util.Set;
+import javax.annotation.Nullable;
 
 /**
  * Edge in HyperGraph
@@ -214,10 +215,6 @@ public class Edge {
         return join.getExpressions().get(0);
     }
 
-    public List<? extends Expression> getExpressions() {
-        return join.getExpressions();
-    }
-
     public List<Expression> getHashJoinConjuncts() {
         return join.getHashJoinConjuncts();
     }
@@ -237,5 +234,27 @@ public class Edge {
         return String.format("<%s - %s>", 
LongBitmap.toString(leftExtendedNodes), LongBitmap.toString(
                 rightExtendedNodes));
     }
+
+    /**
+     * extract join type and conjuncts from edges
+     */
+    public static @Nullable JoinType extractJoinTypeAndConjuncts(List<Edge> 
edges,
+            List<Expression> hashConjuncts, List<Expression> otherConjuncts) {
+        JoinType joinType = null;
+        for (Edge edge : edges) {
+            if (edge.getJoinType() != joinType && joinType != null) {
+                return null;
+            }
+            Preconditions.checkArgument(joinType == null || joinType == 
edge.getJoinType());
+            joinType = edge.getJoinType();
+            hashConjuncts.addAll(edge.getHashJoinConjuncts());
+            otherConjuncts.addAll(edge.getOtherJoinConjuncts());
+        }
+        return joinType;
+    }
+
+    public static Edge createTempEdge(LogicalJoin join) {
+        return new Edge(join, -1, null, null, 0L);
+    }
 }
 
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/jobs/joinorder/hypergraph/GraphSimplifier.java
 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/jobs/joinorder/hypergraph/GraphSimplifier.java
index 380dd698a45..1beb4a4f061 100644
--- 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/jobs/joinorder/hypergraph/GraphSimplifier.java
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/jobs/joinorder/hypergraph/GraphSimplifier.java
@@ -24,6 +24,8 @@ import org.apache.doris.nereids.cost.CostCalculator;
 import org.apache.doris.nereids.jobs.joinorder.hypergraph.bitmap.LongBitmap;
 import org.apache.doris.nereids.jobs.joinorder.hypergraph.receiver.Counter;
 import org.apache.doris.nereids.stats.JoinEstimation;
+import org.apache.doris.nereids.trees.expressions.Expression;
+import org.apache.doris.nereids.trees.plans.JoinType;
 import org.apache.doris.nereids.trees.plans.logical.LogicalJoin;
 import org.apache.doris.nereids.trees.plans.physical.PhysicalHashJoin;
 import org.apache.doris.nereids.trees.plans.physical.PhysicalNestedLoopJoin;
@@ -32,6 +34,7 @@ import org.apache.doris.statistics.Statistics;
 
 import com.google.common.base.Preconditions;
 import com.google.common.collect.ImmutableList;
+import com.google.common.collect.Lists;
 
 import java.util.ArrayList;
 import java.util.HashMap;
@@ -39,6 +42,7 @@ import java.util.List;
 import java.util.Optional;
 import java.util.PriorityQueue;
 import java.util.Stack;
+import java.util.stream.Collectors;
 import javax.annotation.Nullable;
 
 /**
@@ -388,12 +392,38 @@ public class GraphSimplifier {
         return Pair.of(joinStats, edge);
     }
 
+    private Edge processMissedEdges(int edgeIndex1, int edgeIndex2, Edge edge) 
{
+        List<Edge> edges = Lists.newArrayList(edge);
+        edges.addAll(graph.getEdges().stream()
+                .filter(e -> e.getIndex() != edgeIndex1 && e.getIndex() != 
edgeIndex2
+                        && LongBitmap.isSubset(e.getReferenceNodes(), 
edge.getReferenceNodes())
+                        && !LongBitmap.isSubset(e.getReferenceNodes(), 
edge.getLeftExtendedNodes())
+                        && !LongBitmap.isSubset(e.getReferenceNodes(), 
edge.getRightExtendedNodes()))
+                .collect(Collectors.toList()));
+        if (edges.size() > 1) {
+            List<Expression> hashConjuncts = new ArrayList<>();
+            List<Expression> otherConjuncts = new ArrayList<>();
+            JoinType joinType = Edge.extractJoinTypeAndConjuncts(edges, 
hashConjuncts, otherConjuncts);
+            LogicalJoin oldJoin = edge.getJoin();
+            LogicalJoin newJoin = new LogicalJoin<>(joinType, hashConjuncts,
+                    otherConjuncts, oldJoin.getHint(), oldJoin.left(), 
oldJoin.right());
+            Edge newEdge = Edge.createTempEdge(newJoin);
+            newEdge.setLeftExtendedNodes(edge.getLeftExtendedNodes());
+            newEdge.setRightExtendedNodes(edge.getRightExtendedNodes());
+            return newEdge;
+        } else {
+            return edge;
+        }
+    }
+
     private SimplificationStep orderJoin(Pair<Statistics, Edge> edge1Before2,
-            Pair<Statistics, Edge> edge2Before1, int edgeIndex1, int 
edgeIndex2) {
-        Cost cost1Before2 = calCost(edge1Before2.second, edge1Before2.first,
+                                         Pair<Statistics, Edge> edge2Before1, 
int edgeIndex1, int edgeIndex2) {
+        Edge edge = processMissedEdges(edgeIndex1, edgeIndex2, 
edge1Before2.second);
+        Cost cost1Before2 = calCost(edge, edge1Before2.first,
                 cacheStats.get(edge1Before2.second.getLeftExtendedNodes()),
                 cacheStats.get(edge1Before2.second.getRightExtendedNodes()));
-        Cost cost2Before1 = calCost(edge2Before1.second, edge1Before2.first,
+        edge = processMissedEdges(edgeIndex1, edgeIndex2, edge2Before1.second);
+        Cost cost2Before1 = calCost(edge, edge1Before2.first,
                 cacheStats.get(edge1Before2.second.getLeftExtendedNodes()),
                 cacheStats.get(edge1Before2.second.getRightExtendedNodes()));
         double benefit = Double.MAX_VALUE;
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/jobs/joinorder/hypergraph/receiver/PlanReceiver.java
 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/jobs/joinorder/hypergraph/receiver/PlanReceiver.java
index b33c8134c45..099118c65e6 100644
--- 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/jobs/joinorder/hypergraph/receiver/PlanReceiver.java
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/jobs/joinorder/hypergraph/receiver/PlanReceiver.java
@@ -60,7 +60,6 @@ import java.util.Set;
 import java.util.function.Supplier;
 import java.util.stream.Collectors;
 import java.util.stream.Stream;
-import javax.annotation.Nullable;
 
 /**
  * The Receiver is used for cached the plan that has been emitted and build 
the new plan
@@ -118,7 +117,7 @@ public class PlanReceiver implements AbstractReceiver {
         List<Expression> hashConjuncts = new ArrayList<>();
         List<Expression> otherConjuncts = new ArrayList<>();
 
-        JoinType joinType = extractJoinTypeAndConjuncts(edges, hashConjuncts, 
otherConjuncts);
+        JoinType joinType = Edge.extractJoinTypeAndConjuncts(edges, 
hashConjuncts, otherConjuncts);
         if (joinType == null) {
             return true;
         }
@@ -237,21 +236,6 @@ public class PlanReceiver implements AbstractReceiver {
         return plans;
     }
 
-    private @Nullable JoinType extractJoinTypeAndConjuncts(List<Edge> edges, 
List<Expression> hashConjuncts,
-            List<Expression> otherConjuncts) {
-        JoinType joinType = null;
-        for (Edge edge : edges) {
-            if (edge.getJoinType() != joinType && joinType != null) {
-                return null;
-            }
-            Preconditions.checkArgument(joinType == null || joinType == 
edge.getJoinType());
-            joinType = edge.getJoinType();
-            hashConjuncts.addAll(edge.getHashJoinConjuncts());
-            otherConjuncts.addAll(edge.getOtherJoinConjuncts());
-        }
-        return joinType;
-    }
-
     private boolean extractIsMarkJoin(List<Edge> edges) {
         boolean isMarkJoin = false;
         JoinType joinType = null;


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscr...@doris.apache.org
For additional commands, e-mail: commits-h...@doris.apache.org

Reply via email to