[feature](Nereids): add is null in predicate and put or expansion rule in rewriter (#28348)

add is null in predicate
put or expansion rule in rewrite job
This commit is contained in:
谢健
2023-12-18 20:00:32 +08:00
committed by GitHub
parent 868884145c
commit 9cf9d568c7
6 changed files with 34 additions and 9 deletions

View File

@ -80,6 +80,7 @@ import org.apache.doris.nereids.rules.rewrite.MergeOneRowRelationIntoUnion;
import org.apache.doris.nereids.rules.rewrite.MergeProjects;
import org.apache.doris.nereids.rules.rewrite.MergeSetOperations;
import org.apache.doris.nereids.rules.rewrite.NormalizeSort;
import org.apache.doris.nereids.rules.rewrite.OrExpansion;
import org.apache.doris.nereids.rules.rewrite.PruneEmptyPartition;
import org.apache.doris.nereids.rules.rewrite.PruneFileScanPartition;
import org.apache.doris.nereids.rules.rewrite.PruneOlapScanPartition;
@ -405,6 +406,8 @@ public class Rewriter extends AbstractBatchJobExecutor {
topic("rewrite cte sub-tree",
custom(RuleType.REWRITE_CTE_CHILDREN, () -> new RewriteCteChildren(jobs))
),
topic("or expansion",
topDown(new OrExpansion())),
topic("whole plan check",
custom(RuleType.ADJUST_NULLABLE, AdjustNullable::new)
)

View File

@ -18,7 +18,6 @@
package org.apache.doris.nereids.rules;
import org.apache.doris.nereids.rules.exploration.MergeProjectsCBO;
import org.apache.doris.nereids.rules.exploration.OrExpansion;
import org.apache.doris.nereids.rules.exploration.TransposeAggSemiJoin;
import org.apache.doris.nereids.rules.exploration.TransposeAggSemiJoinProject;
import org.apache.doris.nereids.rules.exploration.join.InnerJoinLAsscom;
@ -122,7 +121,6 @@ public class RuleSet {
.add(PushDownProjectThroughSemiJoin.INSTANCE)
.add(TransposeAggSemiJoin.INSTANCE)
.add(TransposeAggSemiJoinProject.INSTANCE)
.add(OrExpansion.INSTANCE)
.build();
public static final List<RuleFactory> PUSH_DOWN_FILTERS = ImmutableList.of(

View File

@ -15,15 +15,16 @@
// specific language governing permissions and limitations
// under the License.
package org.apache.doris.nereids.rules.exploration;
package org.apache.doris.nereids.rules.rewrite;
import org.apache.doris.common.Pair;
import org.apache.doris.nereids.CascadesContext;
import org.apache.doris.nereids.rules.Rule;
import org.apache.doris.nereids.rules.RuleType;
import org.apache.doris.nereids.rules.rewrite.PushDownExpressionsInHashCondition;
import org.apache.doris.nereids.rules.exploration.OneExplorationRuleFactory;
import org.apache.doris.nereids.trees.expressions.Alias;
import org.apache.doris.nereids.trees.expressions.Expression;
import org.apache.doris.nereids.trees.expressions.IsNull;
import org.apache.doris.nereids.trees.expressions.NamedExpression;
import org.apache.doris.nereids.trees.expressions.Not;
import org.apache.doris.nereids.trees.expressions.Slot;
@ -72,7 +73,7 @@ public class OrExpansion extends OneExplorationRuleFactory {
@Override
public Rule build() {
return logicalJoin().when(JoinUtils::shouldNestedLoopJoin)
return logicalJoin(any(), any()).when(JoinUtils::shouldNestedLoopJoin)
.when(join -> supportJoinType.contains(join.getJoinType())
&& ConnectContext.get().getSessionVariable().getEnablePipelineEngine())
.thenApply(ctx -> {
@ -82,7 +83,7 @@ public class OrExpansion extends OneExplorationRuleFactory {
//1. Try to split or conditions
Pair<List<Expression>, List<Expression>> hashOtherConditions = splitOrCondition(join);
if (hashOtherConditions == null) {
if (hashOtherConditions == null || hashOtherConditions.first.size() <= 1) {
return join;
}
@ -221,7 +222,11 @@ public class OrExpansion extends OneExplorationRuleFactory {
LogicalCTEProducer<? extends Plan> rightProducer) {
List<Expression> disjunctions = hashOtherConditions.first;
List<Expression> otherConditions = hashOtherConditions.second;
List<Expression> notExprs = disjunctions.stream().map(Not::new).collect(Collectors.toList());
// For null values, equalTo and not equalTo both return false
// To avoid it, we always return true when there is null
List<Expression> notExprs = disjunctions.stream()
.map(e -> ExpressionUtils.or(new Not(e), new IsNull(e)))
.collect(ImmutableList.toImmutableList());
List<Plan> joins = Lists.newArrayList();
for (int hashCondIdx = 0; hashCondIdx < disjunctions.size(); hashCondIdx++) {

View File

@ -367,7 +367,7 @@ public class FilterEstimation extends ExpressionVisitor<Statistics, EstimationCo
// 4. not A like XXX
colBuilder.setNumNulls(0);
Preconditions.checkArgument(
child instanceof EqualTo
child instanceof EqualPredicate
|| child instanceof InPredicate
|| child instanceof IsNull
|| child instanceof Like,