Skip to content

Commit

Permalink
Revert "[opt](Nereids) partition predicate large or to min-max (apach…
Browse files Browse the repository at this point in the history
  • Loading branch information
starocean999 authored and Doris-Extras committed Dec 14, 2023
1 parent c70980e commit 9d9428c
Show file tree
Hide file tree
Showing 4 changed files with 0 additions and 176 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -1861,8 +1861,4 @@ private static int getTimeZoneSplitPos(String arg) {
}
return split + 1;
}

public double getDouble() {
return (year * 10000 + month * 100 + day) * 1000000L + hour * 10000 + minute * 100 + second;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -17,11 +17,9 @@

package org.apache.doris.nereids.rules.expression.rules;

import org.apache.doris.analysis.LiteralExpr;
import org.apache.doris.catalog.ListPartitionItem;
import org.apache.doris.catalog.PartitionInfo;
import org.apache.doris.catalog.PartitionItem;
import org.apache.doris.catalog.PartitionKey;
import org.apache.doris.catalog.RangePartitionItem;
import org.apache.doris.nereids.CascadesContext;
import org.apache.doris.nereids.trees.expressions.Cast;
Expand Down Expand Up @@ -118,12 +116,6 @@ public static List<Long> prune(List<Slot> partitionSlots, Expression partitionPr
PartitionTableType partitionTableType) {
partitionPredicate = TryEliminateUninterestedPredicates.rewrite(
partitionPredicate, ImmutableSet.copyOf(partitionSlots), cascadesContext);
if (cascadesContext.getConnectContext().getSessionVariable().inToMinmaxParitionRewriteThreshold > 0
&& canRewriteToMinMax(idToPartitions)) {
double rangeLength = totalRangeLength(idToPartitions);
partitionPredicate = rewritePartitionPredicateForRangePartition(
partitionPredicate, rangeLength, cascadesContext);
}

List<OnePartitionEvaluator> evaluators = idToPartitions.entrySet()
.stream()
Expand All @@ -136,85 +128,6 @@ && canRewriteToMinMax(idToPartitions)) {
return partitionPruner.prune();
}

private static boolean isRangePartition(Map<Long, PartitionItem> idToPartitions) {
if (idToPartitions.isEmpty()) {
return false;
}
PartitionItem item = idToPartitions.values().iterator().next();
return item instanceof RangePartitionItem;
}

private static boolean canRewriteToMinMax(Map<Long, PartitionItem> idToPartitions) {
if (isRangePartition(idToPartitions)) {
RangePartitionItem item = (RangePartitionItem) idToPartitions.values().iterator().next();
if (item == null) {
return false;
}
PartitionKey k1 = item.getItems().upperEndpoint();
if (k1.getKeys().size() != 1) {
return false; // multi keys or hive keys
}
LiteralExpr bound = k1.getKeys().get(0);
if (bound instanceof org.apache.doris.analysis.DateLiteral) {
return true;
}
}
return false;
}

private static double getUpperBoundFromRangePartitionItem(RangePartitionItem item) {
org.apache.doris.analysis.DateLiteral d1 =
(org.apache.doris.analysis.DateLiteral) item.getItems().upperEndpoint().getKeys().get(0);
return d1.getDouble();
}

private static double getLowerBoundFromRangePartitionItem(RangePartitionItem item) {
org.apache.doris.analysis.DateLiteral d1 =
(org.apache.doris.analysis.DateLiteral) item.getItems().lowerEndpoint().getKeys().get(0);
return d1.getDouble();
}

// for range partition, total range is from the end of the first partition to the beginning of the last partition
private static double totalRangeLength(Map<Long, PartitionItem> idToPartitions) {
if (idToPartitions.size() == 1) {
Long id = idToPartitions.keySet().iterator().next();
RangePartitionItem item = (RangePartitionItem) idToPartitions.get(id);
double d1 = getUpperBoundFromRangePartitionItem(item);
double d2 = getLowerBoundFromRangePartitionItem(item);
return Math.max(1, d1 - d2);
}

Long id = idToPartitions.keySet().iterator().next();
RangePartitionItem firstItem = (RangePartitionItem) idToPartitions.get(id);
RangePartitionItem lastItem = firstItem;
double min = getLowerBoundFromRangePartitionItem(firstItem);
double max = getUpperBoundFromRangePartitionItem(lastItem);
for (Long pid : idToPartitions.keySet()) {
RangePartitionItem item = (RangePartitionItem) idToPartitions.get(pid);
double lower = getLowerBoundFromRangePartitionItem(item);
if (lower < min) {
min = lower;
firstItem = item;
} else {
double upper = getUpperBoundFromRangePartitionItem(item);
if (upper > max) {
max = upper;
lastItem = item;
}
}
}
double endOfFirstItem = getUpperBoundFromRangePartitionItem(firstItem);
double beginOfLastItem = getLowerBoundFromRangePartitionItem(lastItem);
return Math.max(1, beginOfLastItem - endOfFirstItem);
}

private static Expression rewritePartitionPredicateForRangePartition(Expression partitionPredicate, double range,
CascadesContext ctx) {
partitionPredicate = OrToIn.INSTANCE.rewrite(partitionPredicate, null);
RewriteRangePartitionPredicate rewriter = new RewriteRangePartitionPredicate(range);
return partitionPredicate.accept(rewriter, ctx);
}

/**
* convert partition item to partition evaluator
*/
Expand Down

This file was deleted.

Original file line number Diff line number Diff line change
Expand Up @@ -1136,9 +1136,6 @@ public void setMaxJoinNumberOfReorder(int maxJoinNumberOfReorder) {
@VariableMgr.VarAttr(name = ENABLE_UNIQUE_KEY_PARTIAL_UPDATE, needForward = true)
public boolean enableUniqueKeyPartialUpdate = false;

@VariableMgr.VarAttr(name = "in_to_minmax_parition_rewrite_threshold", needForward = true)
public double inToMinmaxParitionRewriteThreshold = 0.2;

// If this fe is in fuzzy mode, then will use initFuzzyModeVariables to generate some variables,
// not the default value set in the code.
public void initFuzzyModeVariables() {
Expand Down

0 comments on commit 9d9428c

Please sign in to comment.