From 1e44a4b145606eff7cb75fe7f1daeb95f04c8c9c Mon Sep 17 00:00:00 2001 From: starocean999 <40539150+starocean999@users.noreply.github.com> Date: Sun, 24 Dec 2023 21:42:03 +0800 Subject: [PATCH] [opt](nereids) convert or to inpredicate and optimize inpredicate partition prune (#28316) --- .../expression/rules/OneRangePartitionEvaluator.java | 11 ++++++----- .../rules/expression/rules/PartitionPruner.java | 1 + 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/expression/rules/OneRangePartitionEvaluator.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/expression/rules/OneRangePartitionEvaluator.java index 3e08404d0b..e6c2d92c8e 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/expression/rules/OneRangePartitionEvaluator.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/expression/rules/OneRangePartitionEvaluator.java @@ -396,11 +396,12 @@ public class OneRangePartitionEvaluator if (inPredicate.getCompareExpr() instanceof Slot && inPredicate.getOptions().stream().allMatch(Literal.class::isInstance)) { Slot slot = (Slot) inPredicate.getCompareExpr(); - ColumnRange unionLiteralRange = inPredicate.getOptions() - .stream() - .map(Literal.class::cast) - .map(ColumnRange::singleton) - .reduce(ColumnRange.empty(), ColumnRange::union); + ColumnRange unionLiteralRange = ColumnRange.empty(); + ColumnRange slotRange = result.childrenResult.get(0).columnRanges.get(slot); + for (Expression expr : inPredicate.getOptions()) { + unionLiteralRange = unionLiteralRange.union( + slotRange.intersect(ColumnRange.singleton((Literal) expr))); + } Map slotRanges = result.childrenResult.get(0).columnRanges; result = intersectSlotRange(result, slotRanges, slot, unionLiteralRange); } diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/expression/rules/PartitionPruner.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/expression/rules/PartitionPruner.java index cb4137ba5b..6089cf31a6 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/expression/rules/PartitionPruner.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/expression/rules/PartitionPruner.java @@ -113,6 +113,7 @@ public class PartitionPruner extends DefaultExpressionRewriter { partitionTableType)) .collect(ImmutableList.toImmutableList()); + partitionPredicate = OrToIn.INSTANCE.rewrite(partitionPredicate, null); PartitionPruner partitionPruner = new PartitionPruner(evaluators, partitionPredicate); //TODO: we keep default partition because it's too hard to prune it, we return false in canPrune(). return partitionPruner.prune();