|
28 | 28 | import org.apache.doris.nereids.trees.expressions.Slot;
|
29 | 29 | import org.apache.doris.nereids.trees.expressions.SlotReference;
|
30 | 30 | import org.apache.doris.nereids.trees.expressions.WindowExpression;
|
| 31 | +import org.apache.doris.nereids.trees.plans.JoinType; |
31 | 32 | import org.apache.doris.nereids.trees.plans.Plan;
|
32 | 33 | import org.apache.doris.nereids.trees.plans.logical.LogicalAggregate;
|
33 | 34 | import org.apache.doris.nereids.trees.plans.logical.LogicalCatalogRelation;
|
|
45 | 46 | import java.util.List;
|
46 | 47 | import java.util.Optional;
|
47 | 48 | import java.util.Set;
|
| 49 | +import java.util.stream.Collectors; |
48 | 50 |
|
49 | 51 | /**
|
50 | 52 | * The common util for materialized view
|
@@ -175,6 +177,28 @@ public Void visitLogicalFilter(LogicalFilter<? extends Plan> filter, IncrementCh
|
175 | 177 | @Override
|
176 | 178 | public Void visitLogicalJoin(LogicalJoin<? extends Plan, ? extends Plan> join,
|
177 | 179 | 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 | + } |
178 | 202 | return visit(join, context);
|
179 | 203 | }
|
180 | 204 |
|
@@ -272,6 +296,7 @@ private static final class IncrementCheckerContext {
|
272 | 296 | private boolean pctPossible = true;
|
273 | 297 | private TableIf relatedTable;
|
274 | 298 | private Column relatedTableColumn;
|
| 299 | + private boolean joinNullGenerateSide; |
275 | 300 |
|
276 | 301 | public IncrementCheckerContext(SlotReference mvPartitionColumn) {
|
277 | 302 | this.mvPartitionColumn = mvPartitionColumn;
|
@@ -304,6 +329,14 @@ public Column getRelatedTableColumn() {
|
304 | 329 | public void setRelatedTableColumn(Column relatedTableColumn) {
|
305 | 330 | this.relatedTableColumn = relatedTableColumn;
|
306 | 331 | }
|
| 332 | + |
| 333 | + public boolean isJoinNullGenerateSide() { |
| 334 | + return joinNullGenerateSide; |
| 335 | + } |
| 336 | + |
| 337 | + public void setJoinNullGenerateSide(boolean joinNullGenerateSide) { |
| 338 | + this.joinNullGenerateSide = joinNullGenerateSide; |
| 339 | + } |
307 | 340 | }
|
308 | 341 |
|
309 | 342 | /**
|
|
0 commit comments