[feature](Nereids): support comparing mv with inferred predicate (#29132)

This commit is contained in:
谢健
2023-12-29 10:38:53 +08:00
committed by GitHub
parent 253846a99d
commit 48d41a8c8b
10 changed files with 101 additions and 13 deletions

View File

@ -116,4 +116,15 @@ public class ComparisonResult {
viewNoNullableSlotBuilder.build(), valid);
}
}
@Override
public String toString() {
if (isInvalid()) {
return "INVALID";
}
return String.format("viewExpressions: %s \n "
+ "queryExpressions :%s \n "
+ "viewNoNullableSlot :%s \n",
viewExpressions, queryExpressions, viewNoNullableSlot);
}
}

View File

@ -27,6 +27,7 @@ import org.apache.doris.nereids.rules.rewrite.PushDownFilterThroughJoin;
import org.apache.doris.nereids.trees.expressions.Expression;
import org.apache.doris.nereids.trees.expressions.Slot;
import org.apache.doris.nereids.trees.plans.JoinType;
import org.apache.doris.nereids.util.ExpressionUtils;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableMap;
@ -41,6 +42,7 @@ import java.util.Map;
import java.util.Map.Entry;
import java.util.Optional;
import java.util.Set;
import java.util.stream.Collectors;
/**
* HyperGraphComparator
@ -108,16 +110,22 @@ public class HyperGraphComparator {
private ComparisonResult buildComparisonRes() {
ComparisonResult.Builder builder = new ComparisonResult.Builder();
for (Entry<Edge, List<? extends Expression>> e : pullUpQueryExprWithEdge.entrySet()) {
if (!e.getValue().isEmpty() && !canPullUp(e.getKey())) {
List<? extends Expression> rawFilter = e.getValue().stream()
.filter(expr -> !ExpressionUtils.isInferred(expr))
.collect(Collectors.toList());
if (!rawFilter.isEmpty() && !canPullUp(e.getKey())) {
return ComparisonResult.INVALID;
}
builder.addQueryExpressions(e.getValue());
builder.addQueryExpressions(rawFilter);
}
for (Entry<Edge, List<? extends Expression>> e : pullUpViewExprWithEdge.entrySet()) {
if (!e.getValue().isEmpty() && !canPullUp(e.getKey())) {
List<? extends Expression> rawFilter = e.getValue().stream()
.filter(expr -> !ExpressionUtils.isInferred(expr))
.collect(Collectors.toList());
if (!rawFilter.isEmpty() && !canPullUp(e.getKey())) {
return ComparisonResult.INVALID;
}
builder.addViewExpressions(e.getValue());
builder.addViewExpressions(rawFilter);
}
for (Pair<JoinType, Set<Slot>> inferredCond : inferredViewEdgeMap.values()) {
builder.addViewNoNullableSlot(inferredCond.second);