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

morrysnow 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 37777dcdb53 [fix](mtmv) Related partition exclude null generate column 
when increment build materialized view (#28855)
37777dcdb53 is described below

commit 37777dcdb532fdb96a566d839bbd04a4e2260e66
Author: seawinde <[email protected]>
AuthorDate: Sun Dec 24 01:37:55 2023 +0800

    [fix](mtmv) Related partition exclude null generate column when increment 
build materialized view (#28855)
    
    Infer partition column by materialized view partition column, exclude null 
generate column in join when increment build materialized view
---
 .../exploration/mv/MaterializedViewUtils.java      | 33 ++++++++++++++++++++++
 .../exploration/mv/MaterializedViewUtilsTest.java  | 29 ++++++++++++++++++-
 .../mv/join/inner/inner_join.groovy                |  2 +-
 3 files changed, 62 insertions(+), 2 deletions(-)

diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/exploration/mv/MaterializedViewUtils.java
 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/exploration/mv/MaterializedViewUtils.java
index e219bec04ba..ca54c376831 100644
--- 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/exploration/mv/MaterializedViewUtils.java
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/exploration/mv/MaterializedViewUtils.java
@@ -28,6 +28,7 @@ import 
org.apache.doris.nereids.trees.expressions.NamedExpression;
 import org.apache.doris.nereids.trees.expressions.Slot;
 import org.apache.doris.nereids.trees.expressions.SlotReference;
 import org.apache.doris.nereids.trees.expressions.WindowExpression;
+import org.apache.doris.nereids.trees.plans.JoinType;
 import org.apache.doris.nereids.trees.plans.Plan;
 import org.apache.doris.nereids.trees.plans.logical.LogicalAggregate;
 import org.apache.doris.nereids.trees.plans.logical.LogicalCatalogRelation;
@@ -45,6 +46,7 @@ import java.util.HashSet;
 import java.util.List;
 import java.util.Optional;
 import java.util.Set;
+import java.util.stream.Collectors;
 
 /**
  * The common util for materialized view
@@ -175,6 +177,28 @@ public class MaterializedViewUtils {
         @Override
         public Void visitLogicalJoin(LogicalJoin<? extends Plan, ? extends 
Plan> join,
                 IncrementCheckerContext context) {
+            Plan left = join.child(0);
+            Set<Column> leftColumnSet = left.getOutputSet().stream()
+                    .filter(slot -> slot instanceof SlotReference
+                            && slot.isColumnFromTable())
+                    .map(slot -> ((SlotReference) slot).getColumn().get())
+                    .collect(Collectors.toSet());
+            boolean useLeft = 
leftColumnSet.contains(context.getMvPartitionColumn().getColumn().get());
+            JoinType joinType = join.getJoinType();
+            if (joinType.isInnerJoin() || joinType.isCrossJoin()) {
+                context.setPctPossible(true);
+            } else if (joinType.isLeftJoin()
+                    || joinType.isLefSemiJoin()
+                    || joinType.isLeftAntiJoin()) {
+                context.setPctPossible(useLeft);
+            } else if (joinType.isRightJoin()
+                    || joinType.isRightAntiJoin()
+                    || joinType.isRightSemiJoin()) {
+                context.setPctPossible(!useLeft);
+            } else {
+                // un supported join type
+                context.setPctPossible(false);
+            }
             return visit(join, context);
         }
 
@@ -272,6 +296,7 @@ public class MaterializedViewUtils {
         private boolean pctPossible = true;
         private TableIf relatedTable;
         private Column relatedTableColumn;
+        private boolean joinNullGenerateSide;
 
         public IncrementCheckerContext(SlotReference mvPartitionColumn) {
             this.mvPartitionColumn = mvPartitionColumn;
@@ -304,6 +329,14 @@ public class MaterializedViewUtils {
         public void setRelatedTableColumn(Column relatedTableColumn) {
             this.relatedTableColumn = relatedTableColumn;
         }
+
+        public boolean isJoinNullGenerateSide() {
+            return joinNullGenerateSide;
+        }
+
+        public void setJoinNullGenerateSide(boolean joinNullGenerateSide) {
+            this.joinNullGenerateSide = joinNullGenerateSide;
+        }
     }
 
     /**
diff --git 
a/fe/fe-core/src/test/java/org/apache/doris/nereids/rules/exploration/mv/MaterializedViewUtilsTest.java
 
b/fe/fe-core/src/test/java/org/apache/doris/nereids/rules/exploration/mv/MaterializedViewUtilsTest.java
index 898b5843031..c2af1dbdf4a 100644
--- 
a/fe/fe-core/src/test/java/org/apache/doris/nereids/rules/exploration/mv/MaterializedViewUtilsTest.java
+++ 
b/fe/fe-core/src/test/java/org/apache/doris/nereids/rules/exploration/mv/MaterializedViewUtilsTest.java
@@ -186,7 +186,7 @@ public class MaterializedViewUtilsTest extends 
TestWithFeService {
                                 + "  (select * from "
                                 + "  lineitem "
                                 + "  where L_SHIPDATE in ('2017-01-30')) t1 "
-                                + "left join "
+                                + "right join "
                                 + "  (select * from "
                                 + "  orders "
                                 + "  where O_ORDERDATE in ('2017-01-30')) t2 "
@@ -207,6 +207,33 @@ public class MaterializedViewUtilsTest extends 
TestWithFeService {
                         });
     }
 
+    @Test
+    public void getRelatedTableInfoUseNullGenerateSideTest() {
+        PlanChecker.from(connectContext)
+                .checkExplain("SELECT t1.L_SHIPDATE, t2.O_ORDERDATE, 
t1.L_QUANTITY, t2.O_ORDERSTATUS, "
+                                + "count(distinct case when t1.L_SUPPKEY > 0 
then t2.O_ORDERSTATUS else null end) as cnt_1 "
+                                + "from "
+                                + "  (select * from "
+                                + "  lineitem "
+                                + "  where L_SHIPDATE in ('2017-01-30')) t1 "
+                                + "left join "
+                                + "  (select * from "
+                                + "  orders "
+                                + "  where O_ORDERDATE in ('2017-01-30')) t2 "
+                                + "on t1.L_ORDERKEY = t2.O_ORDERKEY "
+                                + "group by "
+                                + "t1.L_SHIPDATE, "
+                                + "t2.O_ORDERDATE, "
+                                + "t1.L_QUANTITY, "
+                                + "t2.O_ORDERSTATUS;",
+                        nereidsPlanner -> {
+                            Plan rewrittenPlan = 
nereidsPlanner.getRewrittenPlan();
+                            Optional<RelatedTableInfo> relatedTableInfo =
+                                    
MaterializedViewUtils.getRelatedTableInfo("o_orderdate", rewrittenPlan);
+                            
Assertions.assertFalse(relatedTableInfo.isPresent());
+                        });
+    }
+
     @Test
     public void getRelatedTableInfoTestWithoutPartitionTest() {
         PlanChecker.from(connectContext)
diff --git 
a/regression-test/suites/nereids_rules_p0/mv/join/inner/inner_join.groovy 
b/regression-test/suites/nereids_rules_p0/mv/join/inner/inner_join.groovy
index d8025e0bc60..0dcf33a9d87 100644
--- a/regression-test/suites/nereids_rules_p0/mv/join/inner/inner_join.groovy
+++ b/regression-test/suites/nereids_rules_p0/mv/join/inner/inner_join.groovy
@@ -393,7 +393,7 @@ suite("inner_join") {
     sql """ DROP MATERIALIZED VIEW IF EXISTS mv6_0"""
 
 
-    // filter inside + inner + right
+    // filter inside + left + right
     def mv7_0 = "select l_shipdate, o_orderdate, l_partkey, l_suppkey " +
             "from lineitem " +
             "inner join (select * from orders where o_orderdate = 
'2023-12-08') t2 " +


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to