Skip to content

Commit 15e3b49

Browse files
seawindestephen
authored and
stephen
committed
[fix](mtmv) Related partition exclude null generate column when increment build materialized view (apache#28855)
Infer partition column by materialized view partition column, exclude null generate column in join when increment build materialized view
1 parent a277c1b commit 15e3b49

File tree

3 files changed

+62
-2
lines changed

3 files changed

+62
-2
lines changed

fe/fe-core/src/main/java/org/apache/doris/nereids/rules/exploration/mv/MaterializedViewUtils.java

+33
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@
2828
import org.apache.doris.nereids.trees.expressions.Slot;
2929
import org.apache.doris.nereids.trees.expressions.SlotReference;
3030
import org.apache.doris.nereids.trees.expressions.WindowExpression;
31+
import org.apache.doris.nereids.trees.plans.JoinType;
3132
import org.apache.doris.nereids.trees.plans.Plan;
3233
import org.apache.doris.nereids.trees.plans.logical.LogicalAggregate;
3334
import org.apache.doris.nereids.trees.plans.logical.LogicalCatalogRelation;
@@ -45,6 +46,7 @@
4546
import java.util.List;
4647
import java.util.Optional;
4748
import java.util.Set;
49+
import java.util.stream.Collectors;
4850

4951
/**
5052
* The common util for materialized view
@@ -175,6 +177,28 @@ public Void visitLogicalFilter(LogicalFilter<? extends Plan> filter, IncrementCh
175177
@Override
176178
public Void visitLogicalJoin(LogicalJoin<? extends Plan, ? extends Plan> join,
177179
IncrementCheckerContext context) {
180+
Plan left = join.child(0);
181+
Set<Column> leftColumnSet = left.getOutputSet().stream()
182+
.filter(slot -> slot instanceof SlotReference
183+
&& slot.isColumnFromTable())
184+
.map(slot -> ((SlotReference) slot).getColumn().get())
185+
.collect(Collectors.toSet());
186+
boolean useLeft = leftColumnSet.contains(context.getMvPartitionColumn().getColumn().get());
187+
JoinType joinType = join.getJoinType();
188+
if (joinType.isInnerJoin() || joinType.isCrossJoin()) {
189+
context.setPctPossible(true);
190+
} else if (joinType.isLeftJoin()
191+
|| joinType.isLefSemiJoin()
192+
|| joinType.isLeftAntiJoin()) {
193+
context.setPctPossible(useLeft);
194+
} else if (joinType.isRightJoin()
195+
|| joinType.isRightAntiJoin()
196+
|| joinType.isRightSemiJoin()) {
197+
context.setPctPossible(!useLeft);
198+
} else {
199+
// un supported join type
200+
context.setPctPossible(false);
201+
}
178202
return visit(join, context);
179203
}
180204

@@ -272,6 +296,7 @@ private static final class IncrementCheckerContext {
272296
private boolean pctPossible = true;
273297
private TableIf relatedTable;
274298
private Column relatedTableColumn;
299+
private boolean joinNullGenerateSide;
275300

276301
public IncrementCheckerContext(SlotReference mvPartitionColumn) {
277302
this.mvPartitionColumn = mvPartitionColumn;
@@ -304,6 +329,14 @@ public Column getRelatedTableColumn() {
304329
public void setRelatedTableColumn(Column relatedTableColumn) {
305330
this.relatedTableColumn = relatedTableColumn;
306331
}
332+
333+
public boolean isJoinNullGenerateSide() {
334+
return joinNullGenerateSide;
335+
}
336+
337+
public void setJoinNullGenerateSide(boolean joinNullGenerateSide) {
338+
this.joinNullGenerateSide = joinNullGenerateSide;
339+
}
307340
}
308341

309342
/**

fe/fe-core/src/test/java/org/apache/doris/nereids/rules/exploration/mv/MaterializedViewUtilsTest.java

+28-1
Original file line numberDiff line numberDiff line change
@@ -186,7 +186,7 @@ public void getRelatedTableInfoUseRightTest() {
186186
+ " (select * from "
187187
+ " lineitem "
188188
+ " where L_SHIPDATE in ('2017-01-30')) t1 "
189-
+ "left join "
189+
+ "right join "
190190
+ " (select * from "
191191
+ " orders "
192192
+ " where O_ORDERDATE in ('2017-01-30')) t2 "
@@ -207,6 +207,33 @@ public void getRelatedTableInfoUseRightTest() {
207207
});
208208
}
209209

210+
@Test
211+
public void getRelatedTableInfoUseNullGenerateSideTest() {
212+
PlanChecker.from(connectContext)
213+
.checkExplain("SELECT t1.L_SHIPDATE, t2.O_ORDERDATE, t1.L_QUANTITY, t2.O_ORDERSTATUS, "
214+
+ "count(distinct case when t1.L_SUPPKEY > 0 then t2.O_ORDERSTATUS else null end) as cnt_1 "
215+
+ "from "
216+
+ " (select * from "
217+
+ " lineitem "
218+
+ " where L_SHIPDATE in ('2017-01-30')) t1 "
219+
+ "left join "
220+
+ " (select * from "
221+
+ " orders "
222+
+ " where O_ORDERDATE in ('2017-01-30')) t2 "
223+
+ "on t1.L_ORDERKEY = t2.O_ORDERKEY "
224+
+ "group by "
225+
+ "t1.L_SHIPDATE, "
226+
+ "t2.O_ORDERDATE, "
227+
+ "t1.L_QUANTITY, "
228+
+ "t2.O_ORDERSTATUS;",
229+
nereidsPlanner -> {
230+
Plan rewrittenPlan = nereidsPlanner.getRewrittenPlan();
231+
Optional<RelatedTableInfo> relatedTableInfo =
232+
MaterializedViewUtils.getRelatedTableInfo("o_orderdate", rewrittenPlan);
233+
Assertions.assertFalse(relatedTableInfo.isPresent());
234+
});
235+
}
236+
210237
@Test
211238
public void getRelatedTableInfoTestWithoutPartitionTest() {
212239
PlanChecker.from(connectContext)

regression-test/suites/nereids_rules_p0/mv/join/inner/inner_join.groovy

+1-1
Original file line numberDiff line numberDiff line change
@@ -393,7 +393,7 @@ suite("inner_join") {
393393
sql """ DROP MATERIALIZED VIEW IF EXISTS mv6_0"""
394394

395395

396-
// filter inside + inner + right
396+
// filter inside + left + right
397397
def mv7_0 = "select l_shipdate, o_orderdate, l_partkey, l_suppkey " +
398398
"from lineitem " +
399399
"inner join (select * from orders where o_orderdate = '2023-12-08') t2 " +

0 commit comments

Comments
 (0)