[feature](Nereids): eliminate filter true and add checker. (#12821)

This commit is contained in:
jakevin
2022-09-22 02:31:11 +08:00
committed by GitHub
parent e21ffac419
commit 0dee640a3e
4 changed files with 43 additions and 11 deletions

View File

@ -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));

View File

@ -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);
}
}

View File

@ -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);
}
}

View File

@ -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);
}
}