You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@doris.apache.org by GitBox <gi...@apache.org> on 2022/10/13 14:21:49 UTC

[GitHub] [doris] jackwener commented on a diff in pull request #13353: [feature](Nereids): use Multi join to rearrange join to eliminate cross join by using predicate.

jackwener commented on code in PR #13353:
URL: https://github.com/apache/doris/pull/13353#discussion_r994712048


##########
fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/logical/MultiJoin.java:
##########
@@ -17,189 +17,170 @@
 
 package org.apache.doris.nereids.rules.rewrite.logical;
 
-import org.apache.doris.common.Pair;
-import org.apache.doris.nereids.trees.expressions.EqualTo;
+import org.apache.doris.nereids.memo.GroupExpression;
+import org.apache.doris.nereids.properties.LogicalProperties;
 import org.apache.doris.nereids.trees.expressions.Expression;
 import org.apache.doris.nereids.trees.expressions.Slot;
-import org.apache.doris.nereids.trees.expressions.SlotReference;
-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.LogicalFilter;
-import org.apache.doris.nereids.trees.plans.logical.LogicalJoin;
+import org.apache.doris.nereids.trees.plans.PlanType;
+import org.apache.doris.nereids.trees.plans.logical.AbstractLogicalPlan;
 import org.apache.doris.nereids.trees.plans.visitor.PlanVisitor;
-import org.apache.doris.nereids.util.ExpressionUtils;
-import org.apache.doris.nereids.util.JoinUtils;
-import org.apache.doris.nereids.util.PlanUtils;
+import org.apache.doris.nereids.util.Utils;
+
+import com.google.common.collect.ImmutableList;
+import com.google.common.collect.ImmutableList.Builder;
 
-import java.util.ArrayList;
-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;
 
 /**
  * A MultiJoin represents a join of N inputs (NAry-Join).
  * The regular Join represent strictly binary input (Binary-Join).
+ * <p>
+ * One {@link MultiJoin} just contains one {@link JoinType} of SEMI/ANTI/OUTER Join.
+ * <p>
+ * onlyJoinType is Full OUTER JOIN, children.size() == 2.
+ * leftChild [Full OUTER JOIN] rightChild.
+ * <p>
+ * onlyJoinType is LEFT (OUTER/SEMI/ANTI) JOIN,
+ * children[0, last) [LEFT (OUTER/SEMI/ANTI) JOIN] lastChild.
+ * eg: MJ([LOJ] A, B, C, D) is {A B C} [LOJ] {D}.
+ * <p>
+ * onlyJoinType is RIGHT (OUTER/SEMI/ANTI) JOIN,
+ * firstChild [RIGHT (OUTER/SEMI/ANTI) JOIN] children[1, last].
+ * eg: MJ([ROJ] A, B, C, D) is {A} [ROJ] {B C D}.
  */
-public class MultiJoin extends PlanVisitor<Void, Void> {
+public class MultiJoin extends AbstractLogicalPlan {
     /*
      *        topJoin
      *        /     \            MultiJoin
      *   bottomJoin  C  -->     /    |    \
      *     /    \              A     B     C
      *    A      B
      */
-    public final List<Plan> joinInputs = new ArrayList<>();
-    public final List<Expression> conjunctsForAllHashJoins = new ArrayList<>();
-    private List<Expression> conjunctsKeepInFilter = new ArrayList<>();
-
-    /**
-     * reorderJoinsAccordingToConditions
-     *
-     * @return join or filter
-     */
-    public Optional<Plan> reorderJoinsAccordingToConditions() {
-        if (joinInputs.size() >= 2) {
-            Plan root = reorderJoinsAccordingToConditions(joinInputs, conjunctsForAllHashJoins);
-            return Optional.of(PlanUtils.filterOrSelf(conjunctsKeepInFilter, root));
-        }
-        return Optional.empty();
+
+    // Push predicates into it.
+    // But joinFilter shouldn't contain predicate which just contains one predicate like `T.key > 1`.
+    // Because these predicate should be pushdown.
+    private final List<Expression> joinFilter;
+    // MultiJoin just contains one OUTER/SEMI/ANTI.
+    private final Optional<JoinType> onlyJoinType;
+    // When contains one OUTER/SEMI/ANTI join, keep separately its condition.
+    private final List<Expression> notInnerJoinConditions;
+
+    // private final List<@Nullable List<NamedExpression>> projFields;

Review Comment:
   current it's useless



-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: commits-unsubscribe@doris.apache.org

For queries about this service, please contact Infrastructure at:
users@infra.apache.org


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