cherry-pick #38897 to branch-2.1
This commit is contained in:
@ -409,17 +409,8 @@ public class OneRangePartitionEvaluator
|
||||
@Override
|
||||
public EvaluateRangeResult visitAnd(And and, EvaluateRangeInput context) {
|
||||
EvaluateRangeResult result = evaluateChildrenThenThis(and, context);
|
||||
|
||||
result = mergeRanges(result.result, result.childrenResult.get(0), result.childrenResult.get(1),
|
||||
(leftRange, rightRange) -> {
|
||||
if (leftRange == null) {
|
||||
return rightRange;
|
||||
}
|
||||
if (rightRange == null) {
|
||||
return leftRange;
|
||||
}
|
||||
return leftRange.intersect(rightRange);
|
||||
});
|
||||
(leftRange, rightRange) -> leftRange.intersect(rightRange));
|
||||
|
||||
result = returnFalseIfExistEmptyRange(result);
|
||||
if (result.result.equals(BooleanLiteral.FALSE)) {
|
||||
@ -435,18 +426,20 @@ public class OneRangePartitionEvaluator
|
||||
@Override
|
||||
public EvaluateRangeResult visitOr(Or or, EvaluateRangeInput context) {
|
||||
EvaluateRangeResult result = evaluateChildrenThenThis(or, context);
|
||||
|
||||
if (result.result.equals(BooleanLiteral.FALSE)) {
|
||||
return result;
|
||||
} else if (result.childrenResult.get(0).result.equals(BooleanLiteral.FALSE)) {
|
||||
// false or a<1 -> return range a<1
|
||||
return new EvaluateRangeResult(result.result, result.childrenResult.get(1).columnRanges,
|
||||
result.childrenResult);
|
||||
} else if (result.childrenResult.get(1).result.equals(BooleanLiteral.FALSE)) {
|
||||
// a<1 or false -> return range a<1
|
||||
return new EvaluateRangeResult(result.result, result.childrenResult.get(0).columnRanges,
|
||||
result.childrenResult);
|
||||
}
|
||||
result = mergeRanges(result.result, result.childrenResult.get(0), result.childrenResult.get(1),
|
||||
(leftRange, rightRange) -> {
|
||||
if (leftRange == null) {
|
||||
return rightRange;
|
||||
}
|
||||
if (rightRange == null) {
|
||||
return leftRange;
|
||||
}
|
||||
return leftRange.union(rightRange);
|
||||
});
|
||||
return removeEmptyRange(result);
|
||||
(leftRange, rightRange) -> leftRange.union(rightRange));
|
||||
return returnFalseIfExistEmptyRange(result);
|
||||
}
|
||||
|
||||
@Override
|
||||
@ -596,7 +589,9 @@ public class OneRangePartitionEvaluator
|
||||
.build();
|
||||
|
||||
Map<Expression, ColumnRange> mergedRange = exprs.stream()
|
||||
.map(expr -> Pair.of(expr, mergeFunction.apply(leftRanges.get(expr), rightRanges.get(expr))))
|
||||
.map(expr -> Pair.of(expr, mergeFunction.apply(
|
||||
leftRanges.containsKey(expr) ? leftRanges.get(expr) : rangeMap.get(expr),
|
||||
rightRanges.containsKey(expr) ? rightRanges.get(expr) : rangeMap.get(expr))))
|
||||
.collect(ImmutableMap.toImmutableMap(Pair::key, Pair::value));
|
||||
return new EvaluateRangeResult(originResult, mergedRange, ImmutableList.of(left, right));
|
||||
}
|
||||
@ -821,17 +816,6 @@ public class OneRangePartitionEvaluator
|
||||
return onePartitionInputs;
|
||||
}
|
||||
|
||||
private EvaluateRangeResult removeEmptyRange(EvaluateRangeResult result) {
|
||||
ImmutableMap.Builder<Expression, ColumnRange> builder = ImmutableMap.builder();
|
||||
for (Map.Entry<Expression, ColumnRange> entry : result.columnRanges.entrySet()) {
|
||||
if (entry.getValue().isEmptyRange()) {
|
||||
continue;
|
||||
}
|
||||
builder.put(entry);
|
||||
}
|
||||
return new EvaluateRangeResult(result.result, builder.build(), result.childrenResult);
|
||||
}
|
||||
|
||||
private EvaluateRangeResult computeMonotonicFunctionRange(EvaluateRangeResult result) {
|
||||
Monotonic func = (Monotonic) result.result;
|
||||
if (rangeMap.containsKey(func)) {
|
||||
|
||||
Reference in New Issue
Block a user