[feature](Nereids): eliminate filter true and add checker. (#12821)
This commit is contained in:
@ -19,6 +19,7 @@ package org.apache.doris.nereids.processor.post;
|
||||
|
||||
import org.apache.doris.nereids.CascadesContext;
|
||||
import org.apache.doris.nereids.trees.expressions.Slot;
|
||||
import org.apache.doris.nereids.trees.expressions.literal.BooleanLiteral;
|
||||
import org.apache.doris.nereids.trees.plans.Plan;
|
||||
import org.apache.doris.nereids.trees.plans.physical.PhysicalFilter;
|
||||
import org.apache.doris.nereids.trees.plans.physical.PhysicalProject;
|
||||
@ -48,6 +49,8 @@ public class Validator extends PlanPostProcessor {
|
||||
|
||||
@Override
|
||||
public Plan visitPhysicalFilter(PhysicalFilter<? extends Plan> filter, CascadesContext context) {
|
||||
Preconditions.checkArgument(filter.getPredicates() != BooleanLiteral.TRUE);
|
||||
|
||||
Plan child = filter.child();
|
||||
// Forbidden filter-project, we must make filter-project -> project-filter.
|
||||
Preconditions.checkArgument(!(child instanceof PhysicalProject));
|
||||
|
||||
@ -24,14 +24,22 @@ import org.apache.doris.nereids.trees.expressions.literal.BooleanLiteral;
|
||||
import org.apache.doris.nereids.trees.plans.logical.LogicalEmptyRelation;
|
||||
|
||||
/**
|
||||
* Eliminate filter false.
|
||||
* Eliminate filter which is FALSE or TRUE.
|
||||
*/
|
||||
public class EliminateFilter extends OneRewriteRuleFactory {
|
||||
@Override
|
||||
public Rule build() {
|
||||
return logicalFilter()
|
||||
.when(filter -> filter.getPredicates() == BooleanLiteral.FALSE)
|
||||
.then(filter -> new LogicalEmptyRelation(filter.getOutput()))
|
||||
.when(filter -> filter.getPredicates() instanceof BooleanLiteral)
|
||||
.then(filter -> {
|
||||
if (filter.getPredicates() == BooleanLiteral.FALSE) {
|
||||
return new LogicalEmptyRelation(filter.getOutput());
|
||||
} else if (filter.getPredicates() == BooleanLiteral.TRUE) {
|
||||
return filter.child();
|
||||
} else {
|
||||
throw new RuntimeException("predicates is BooleanLiteral but isn't FALSE or TRUE");
|
||||
}
|
||||
})
|
||||
.toRule(RuleType.ELIMINATE_FILTER);
|
||||
}
|
||||
}
|
||||
|
||||
@ -22,8 +22,9 @@ import org.apache.doris.nereids.rules.Rule;
|
||||
import org.apache.doris.nereids.trees.expressions.literal.BooleanLiteral;
|
||||
import org.apache.doris.nereids.trees.plans.Plan;
|
||||
import org.apache.doris.nereids.trees.plans.logical.LogicalEmptyRelation;
|
||||
import org.apache.doris.nereids.trees.plans.logical.LogicalFilter;
|
||||
import org.apache.doris.nereids.trees.plans.logical.LogicalOlapScan;
|
||||
import org.apache.doris.nereids.trees.plans.logical.LogicalPlan;
|
||||
import org.apache.doris.nereids.util.LogicalPlanBuilder;
|
||||
import org.apache.doris.nereids.util.MemoTestUtils;
|
||||
import org.apache.doris.nereids.util.PlanConstructor;
|
||||
|
||||
@ -33,20 +34,32 @@ import org.junit.jupiter.api.Test;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* MergeConsecutiveFilter ut
|
||||
*/
|
||||
public class EliminateFilterTest {
|
||||
@Test
|
||||
public void testEliminateFilter() {
|
||||
LogicalOlapScan scan = PlanConstructor.newLogicalOlapScan(0, "t1", 0);
|
||||
LogicalFilter<LogicalOlapScan> filter = new LogicalFilter<>(BooleanLiteral.FALSE, scan);
|
||||
public void testEliminateFilterFalse() {
|
||||
LogicalPlan filterFalse = new LogicalPlanBuilder(PlanConstructor.newLogicalOlapScan(0, "t1", 0))
|
||||
.filter(BooleanLiteral.FALSE)
|
||||
.build();
|
||||
|
||||
CascadesContext cascadesContext = MemoTestUtils.createCascadesContext(filter);
|
||||
CascadesContext cascadesContext = MemoTestUtils.createCascadesContext(filterFalse);
|
||||
List<Rule> rules = Lists.newArrayList(new EliminateFilter().build());
|
||||
cascadesContext.topDownRewrite(rules);
|
||||
|
||||
Plan actual = cascadesContext.getMemo().copyOut();
|
||||
Assertions.assertTrue(actual instanceof LogicalEmptyRelation);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testEliminateFilterTrue() {
|
||||
LogicalPlan filterFalse = new LogicalPlanBuilder(PlanConstructor.newLogicalOlapScan(0, "t1", 0))
|
||||
.filter(BooleanLiteral.TRUE)
|
||||
.build();
|
||||
|
||||
CascadesContext cascadesContext = MemoTestUtils.createCascadesContext(filterFalse);
|
||||
List<Rule> rules = Lists.newArrayList(new EliminateFilter().build());
|
||||
cascadesContext.topDownRewrite(rules);
|
||||
|
||||
Plan actual = cascadesContext.getMemo().copyOut();
|
||||
Assertions.assertTrue(actual instanceof LogicalOlapScan);
|
||||
}
|
||||
}
|
||||
|
||||
@ -19,8 +19,10 @@ package org.apache.doris.nereids.util;
|
||||
|
||||
import org.apache.doris.common.Pair;
|
||||
import org.apache.doris.nereids.trees.expressions.EqualTo;
|
||||
import org.apache.doris.nereids.trees.expressions.Expression;
|
||||
import org.apache.doris.nereids.trees.expressions.NamedExpression;
|
||||
import org.apache.doris.nereids.trees.plans.JoinType;
|
||||
import org.apache.doris.nereids.trees.plans.logical.LogicalFilter;
|
||||
import org.apache.doris.nereids.trees.plans.logical.LogicalJoin;
|
||||
import org.apache.doris.nereids.trees.plans.logical.LogicalLimit;
|
||||
import org.apache.doris.nereids.trees.plans.logical.LogicalOlapScan;
|
||||
@ -85,4 +87,10 @@ public class LogicalPlanBuilder {
|
||||
public LogicalPlanBuilder limit(long limit) {
|
||||
return limit(limit, 0);
|
||||
}
|
||||
|
||||
public LogicalPlanBuilder filter(Expression predicate) {
|
||||
LogicalFilter<LogicalPlan> limitPlan = new LogicalFilter<>(predicate, this.plan);
|
||||
return from(limitPlan);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user