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 0c26f8df4d [refactor](Nereids): move out misunderstanding func from 
JoinUtils (#18865)
0c26f8df4d is described below

commit 0c26f8df4d65d1354c34a4a44609be52573b61a8
Author: jakevin <jakevin...@gmail.com>
AuthorDate: Fri Apr 21 14:11:03 2023 +0800

    [refactor](Nereids): move out misunderstanding func from JoinUtils (#18865)
---
 .../glue/translator/PhysicalPlanTranslator.java    |  4 +-
 .../nereids/properties/RequestPropertyDeriver.java |  2 +-
 .../trees/plans/physical/PhysicalHashJoin.java     | 36 ++++++++++++++----
 .../org/apache/doris/nereids/util/JoinUtils.java   | 44 +---------------------
 .../java/org/apache/doris/nereids/util/Utils.java  | 29 --------------
 .../properties/RequestPropertyDeriverTest.java     | 13 ++-----
 6 files changed, 37 insertions(+), 91 deletions(-)

diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/glue/translator/PhysicalPlanTranslator.java
 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/glue/translator/PhysicalPlanTranslator.java
index 4b80f64036..e51e5469b7 100644
--- 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/glue/translator/PhysicalPlanTranslator.java
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/glue/translator/PhysicalPlanTranslator.java
@@ -1932,14 +1932,14 @@ public class PhysicalPlanTranslator extends 
DefaultPlanVisitor<PlanFragment, Pla
         return leftFragment;
     }
 
-    private PlanFragment 
constructBucketShuffleJoin(AbstractPhysicalJoin<PhysicalPlan, PhysicalPlan> 
physicalHashJoin,
+    private PlanFragment 
constructBucketShuffleJoin(PhysicalHashJoin<PhysicalPlan, PhysicalPlan> 
physicalHashJoin,
             HashJoinNode hashJoinNode, PlanFragment leftFragment,
             PlanFragment rightFragment, PlanTranslatorContext context) {
         // according to left partition to generate right partition expr list
         DistributionSpecHash leftDistributionSpec
                 = (DistributionSpecHash) 
physicalHashJoin.left().getPhysicalProperties().getDistributionSpec();
 
-        Pair<List<ExprId>, List<ExprId>> onClauseUsedSlots = 
JoinUtils.getOnClauseUsedSlots(physicalHashJoin);
+        Pair<List<ExprId>, List<ExprId>> onClauseUsedSlots = 
physicalHashJoin.getHashConjunctsExprIds();
         List<ExprId> rightPartitionExprIds = 
Lists.newArrayList(leftDistributionSpec.getOrderedShuffledColumns());
         for (int i = 0; i < 
leftDistributionSpec.getOrderedShuffledColumns().size(); i++) {
             int idx = leftDistributionSpec.getExprIdToEquivalenceSet()
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/properties/RequestPropertyDeriver.java
 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/properties/RequestPropertyDeriver.java
index 2ca4fdc169..a05596f7dc 100644
--- 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/properties/RequestPropertyDeriver.java
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/properties/RequestPropertyDeriver.java
@@ -144,7 +144,7 @@ public class RequestPropertyDeriver extends 
PlanVisitor<Void, PlanContext> {
     }
 
     private void addShuffleJoinRequestProperty(PhysicalHashJoin<? extends 
Plan, ? extends Plan> hashJoin) {
-        Pair<List<ExprId>, List<ExprId>> onClauseUsedSlots = 
JoinUtils.getOnClauseUsedSlots(hashJoin);
+        Pair<List<ExprId>, List<ExprId>> onClauseUsedSlots = 
hashJoin.getHashConjunctsExprIds();
         // shuffle join
         addRequestPropertyToChildren(
                 PhysicalProperties.createHash(
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/physical/PhysicalHashJoin.java
 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/physical/PhysicalHashJoin.java
index 7351ec2e32..26f56249c3 100644
--- 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/physical/PhysicalHashJoin.java
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/physical/PhysicalHashJoin.java
@@ -17,9 +17,11 @@
 
 package org.apache.doris.nereids.trees.plans.physical;
 
+import org.apache.doris.common.Pair;
 import org.apache.doris.nereids.memo.GroupExpression;
 import org.apache.doris.nereids.properties.LogicalProperties;
 import org.apache.doris.nereids.properties.PhysicalProperties;
+import org.apache.doris.nereids.trees.expressions.ExprId;
 import org.apache.doris.nereids.trees.expressions.Expression;
 import org.apache.doris.nereids.trees.expressions.MarkJoinSlotReference;
 import org.apache.doris.nereids.trees.plans.JoinHint;
@@ -35,6 +37,7 @@ import com.google.common.collect.Lists;
 
 import java.util.List;
 import java.util.Optional;
+import java.util.Set;
 
 /**
  * Physical hash join plan.
@@ -76,13 +79,7 @@ public class PhysicalHashJoin<
                 groupExpression, logicalProperties, leftChild, rightChild);
     }
 
-    /**
-     * Constructor of PhysicalHashJoinNode.
-     *
-     * @param joinType Which join type, left semi join, inner join...
-     * @param hashJoinConjuncts conjunct list could use for build hash table 
in hash join
-     */
-    public PhysicalHashJoin(
+    private PhysicalHashJoin(
             JoinType joinType,
             List<Expression> hashJoinConjuncts,
             List<Expression> otherJoinConjuncts,
@@ -98,6 +95,31 @@ public class PhysicalHashJoin<
                 groupExpression, logicalProperties, physicalProperties, 
statistics, leftChild, rightChild);
     }
 
+    /**
+     * Get all used slots from hashJoinConjuncts of join.
+     * Return pair of left used slots and right used slots.
+     */
+    public Pair<List<ExprId>, List<ExprId>> getHashConjunctsExprIds() {
+        List<ExprId> exprIds1 = 
Lists.newArrayListWithCapacity(hashJoinConjuncts.size());
+        List<ExprId> exprIds2 = 
Lists.newArrayListWithCapacity(hashJoinConjuncts.size());
+
+        Set<ExprId> leftExprIds = left().getOutputExprIdSet();
+        Set<ExprId> rightExprIds = right().getOutputExprIdSet();
+
+        for (Expression expr : hashJoinConjuncts) {
+            expr.getInputSlotExprIds().forEach(exprId -> {
+                if (leftExprIds.contains(exprId)) {
+                    exprIds1.add(exprId);
+                } else if (rightExprIds.contains(exprId)) {
+                    exprIds2.add(exprId);
+                } else {
+                    throw new RuntimeException("Could not generate valid equal 
on clause slot pairs for join");
+                }
+            });
+        }
+        return Pair.of(exprIds1, exprIds2);
+    }
+
     @Override
     public <R, C> R accept(PlanVisitor<R, C> visitor, C context) {
         return visitor.visitPhysicalHashJoin(this, context);
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/util/JoinUtils.java 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/util/JoinUtils.java
index ea7b435c96..9e31f7467e 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/nereids/util/JoinUtils.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/util/JoinUtils.java
@@ -44,7 +44,6 @@ import com.google.common.collect.Lists;
 import java.util.HashSet;
 import java.util.List;
 import java.util.Map;
-import java.util.Optional;
 import java.util.Set;
 import java.util.stream.Collectors;
 
@@ -171,47 +170,6 @@ public class JoinUtils {
         return result;
     }
 
-    /**
-     * Get all used slots from onClause of join.
-     * Return pair of left used slots and right used slots.
-     */
-    public static Pair<List<ExprId>, List<ExprId>> getOnClauseUsedSlots(
-            AbstractPhysicalJoin<? extends Plan, ? extends Plan> join) {
-
-        List<ExprId> exprIds1 = 
Lists.newArrayListWithCapacity(join.getHashJoinConjuncts().size());
-        List<ExprId> exprIds2 = 
Lists.newArrayListWithCapacity(join.getHashJoinConjuncts().size());
-
-        JoinSlotCoverageChecker checker = new JoinSlotCoverageChecker(
-                join.left().getOutputExprIdSet(),
-                join.right().getOutputExprIdSet());
-
-        for (Expression expr : join.getHashJoinConjuncts()) {
-            EqualTo equalTo = (EqualTo) expr;
-            // TODO: we could meet a = cast(b as xxx) here, need fix normalize 
join hash equals future
-            Optional<Slot> leftSlot = 
ExpressionUtils.extractSlotOrCastOnSlot(equalTo.left());
-            Optional<Slot> rightSlot = 
ExpressionUtils.extractSlotOrCastOnSlot(equalTo.right());
-            if (!leftSlot.isPresent() || !rightSlot.isPresent()) {
-                continue;
-            }
-
-            ExprId leftExprId = leftSlot.get().getExprId();
-            ExprId rightExprId = rightSlot.get().getExprId();
-
-            if (checker.isCoveredByLeftSlots(leftExprId)
-                    && checker.isCoveredByRightSlots(rightExprId)) {
-                exprIds1.add(leftExprId);
-                exprIds2.add(rightExprId);
-            } else if (checker.isCoveredByLeftSlots(rightExprId)
-                    && checker.isCoveredByRightSlots(leftExprId)) {
-                exprIds1.add(rightExprId);
-                exprIds2.add(leftExprId);
-            } else {
-                throw new RuntimeException("Could not generate valid equal on 
clause slot pairs for join: " + join);
-            }
-        }
-        return Pair.of(exprIds1, exprIds2);
-    }
-
     public static boolean shouldNestedLoopJoin(Join join) {
         return join.getHashJoinConjuncts().isEmpty();
     }
@@ -221,7 +179,7 @@ public class JoinUtils {
     }
 
     /**
-     * The left and right child of origin predicates need to be swap sometimes.
+     * The left and right child of origin predicates need to swap sometimes.
      * Case A:
      * select * from t1 join t2 on t2.id=t1.id
      * The left plan node is t1 and the right plan node is t2.
diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/util/Utils.java 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/util/Utils.java
index e19b3e6892..04ab5eb395 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/nereids/util/Utils.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/util/Utils.java
@@ -30,7 +30,6 @@ import org.apache.commons.lang3.StringUtils;
 
 import java.util.ArrayList;
 import java.util.Collection;
-import java.util.HashSet;
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
@@ -122,16 +121,6 @@ public class Utils {
         return StringUtils.join(qualifiedNameParts(qualifier, name), ".");
     }
 
-    /**
-     * equals for List but ignore order.
-     */
-    public static <E> boolean equalsIgnoreOrder(List<E> one, List<E> other) {
-        if (one.size() != other.size()) {
-            return false;
-        }
-        return new HashSet<>(one).containsAll(other) && new 
HashSet<>(other).containsAll(one);
-    }
-
     /**
      * Get sql string for plan.
      *
@@ -158,24 +147,6 @@ public class Utils {
         return stringBuilder.append(" )").toString();
     }
 
-    /**
-     * See if there are correlated columns in a subquery expression.
-     */
-    public static boolean containCorrelatedSlot(List<Expression> 
correlatedSlots, Expression expr) {
-        if (correlatedSlots.isEmpty() || expr == null) {
-            return false;
-        }
-        if (expr instanceof SlotReference) {
-            return correlatedSlots.contains(expr);
-        }
-        for (Expression child : expr.children()) {
-            if (containCorrelatedSlot(correlatedSlots, child)) {
-                return true;
-            }
-        }
-        return false;
-    }
-
     /**
      * Get the correlated columns that belong to the subquery,
      * that is, the correlated columns that can be resolved within the 
subquery.
diff --git 
a/fe/fe-core/src/test/java/org/apache/doris/nereids/properties/RequestPropertyDeriverTest.java
 
b/fe/fe-core/src/test/java/org/apache/doris/nereids/properties/RequestPropertyDeriverTest.java
index 57dddbb3df..0c9044eb3d 100644
--- 
a/fe/fe-core/src/test/java/org/apache/doris/nereids/properties/RequestPropertyDeriverTest.java
+++ 
b/fe/fe-core/src/test/java/org/apache/doris/nereids/properties/RequestPropertyDeriverTest.java
@@ -30,15 +30,12 @@ import org.apache.doris.nereids.trees.plans.AggPhase;
 import org.apache.doris.nereids.trees.plans.GroupPlan;
 import org.apache.doris.nereids.trees.plans.JoinHint;
 import org.apache.doris.nereids.trees.plans.JoinType;
-import org.apache.doris.nereids.trees.plans.Plan;
-import org.apache.doris.nereids.trees.plans.physical.AbstractPhysicalJoin;
 import org.apache.doris.nereids.trees.plans.physical.PhysicalAssertNumRows;
 import org.apache.doris.nereids.trees.plans.physical.PhysicalHashAggregate;
 import org.apache.doris.nereids.trees.plans.physical.PhysicalHashJoin;
 import org.apache.doris.nereids.trees.plans.physical.PhysicalNestedLoopJoin;
 import org.apache.doris.nereids.types.IntegerType;
 import org.apache.doris.nereids.util.ExpressionUtils;
-import org.apache.doris.nereids.util.JoinUtils;
 
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.Lists;
@@ -95,10 +92,9 @@ public class RequestPropertyDeriverTest {
 
     @Test
     public void testShuffleHashJoin() {
-        new MockUp<JoinUtils>() {
+        new MockUp<PhysicalHashJoin>() {
             @Mock
-            Pair<List<ExprId>, List<ExprId>> getOnClauseUsedSlots(
-                    AbstractPhysicalJoin<? extends Plan, ? extends Plan> join) 
{
+            Pair<List<ExprId>, List<ExprId>> getHashConjunctsExprIds() {
                 return Pair.of(Lists.newArrayList(new ExprId(0)), 
Lists.newArrayList(new ExprId(1)));
             }
         };
@@ -122,10 +118,9 @@ public class RequestPropertyDeriverTest {
 
     @Test
     public void testShuffleOrBroadcastHashJoin() {
-        new MockUp<JoinUtils>() {
+        new MockUp<PhysicalHashJoin>() {
             @Mock
-            Pair<List<ExprId>, List<ExprId>> getOnClauseUsedSlots(
-                    AbstractPhysicalJoin<? extends Plan, ? extends Plan> join) 
{
+            Pair<List<ExprId>, List<ExprId>> getHashConjunctsExprIds() {
                 return Pair.of(Lists.newArrayList(new ExprId(0)), 
Lists.newArrayList(new ExprId(1)));
             }
         };


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

Reply via email to