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 e219bec04b..ca54c37683 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 join, IncrementCheckerContext context) { + Plan left = join.child(0); + Set 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 898b584303..c2af1dbdf4 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 = + 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 d8025e0bc6..0dcf33a9d8 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 " +