[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:
@ -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)
|
||||
)
|
||||
|
||||
@ -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(
|
||||
|
||||
@ -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++) {
|
||||
@ -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,
|
||||
|
||||
Reference in New Issue
Block a user