[feature](Nereids): support comparing mv with inferred predicate (#29132)
This commit is contained in:
@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
@ -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);
|
||||
|
||||
Reference in New Issue
Block a user