924060929 commented on code in PR #47608:
URL: https://github.com/apache/doris/pull/47608#discussion_r1981340800
##########
fe/fe-core/src/main/java/org/apache/doris/nereids/rules/expression/rules/OneListPartitionEvaluator.java:
##########
@@ -58,23 +64,71 @@ public K getPartitionIdent() {
@Override
public List<Map<Slot, PartitionSlotInput>> getOnePartitionInputs() {
+ if (partitionSlots.size() == 1) {
+ // fast path
+ return getInputsByOneSlot();
+ } else {
+ // slow path
+ return getInputsByMultiSlots();
+ }
+ }
+
+ private List<Map<Slot, PartitionSlotInput>> getInputsByOneSlot() {
+ ImmutableList.Builder<Map<Slot, PartitionSlotInput>> inputs
+ =
ImmutableList.builderWithExpectedSize(partitionItem.getItems().size());
+ Slot slot = partitionSlots.get(0);
+ for (PartitionKey item : partitionItem.getItems()) {
+ LiteralExpr legacy = item.getKeys().get(0);
+ inputs.add(ImmutableMap.of(
+ slot,
+ new PartitionSlotInput(Literal.fromLegacyLiteral(legacy,
legacy.getType()), ImmutableMap.of()))
+ );
+ }
+ return inputs.build();
+ }
+
+ private List<Map<Slot, PartitionSlotInput>> getInputsByMultiSlots() {
return partitionItem.getItems().stream()
- .map(keys -> {
- List<Literal> literals = keys.getKeys()
- .stream()
- .map(literal -> Literal.fromLegacyLiteral(literal,
literal.getType()))
- .collect(ImmutableList.toImmutableList());
-
- return IntStream.range(0, partitionSlots.size())
- .mapToObj(index -> {
- Slot partitionSlot = partitionSlots.get(index);
- // partitionSlot will be replaced to this literal
- Literal literal = literals.get(index);
- // list partition don't need to compute the slot's
range,
- // so we pass through an empty map
- return Pair.of(partitionSlot, new
PartitionSlotInput(literal, ImmutableMap.of()));
- }).collect(ImmutableMap.toImmutableMap(Pair::key,
Pair::value));
- }).collect(ImmutableList.toImmutableList());
+ .map(keys -> {
+ List<Literal> literals = keys.getKeys()
+ .stream()
+ .map(literal -> Literal.fromLegacyLiteral(literal,
literal.getType()))
+ .collect(ImmutableList.toImmutableList());
+
+ return IntStream.range(0, partitionSlots.size())
+ .mapToObj(index -> {
+ Slot partitionSlot = partitionSlots.get(index);
+ // partitionSlot will be replaced to this
literal
+ Literal literal = literals.get(index);
+ // list partition don't need to compute the
slot's range,
+ // so we pass through an empty map
+ return Pair.of(partitionSlot, new
PartitionSlotInput(literal, ImmutableMap.of()));
+ }).collect(ImmutableMap.toImmutableMap(Pair::key,
Pair::value));
+ }).collect(ImmutableList.toImmutableList());
+ }
+
+ @Override
+ public Expression visitInPredicate(InPredicate inPredicate, Map<Slot,
PartitionSlotInput> context) {
+ if (!inPredicate.optionsAreLiterals()) {
+ return super.visitInPredicate(inPredicate, context);
+ }
+
+ if (inPredicate.optionsContainsNullLiteral()) {
Review Comment:
> why return NullLiteral?
the result of `column in (xxx, null)` is null
--
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
To unsubscribe, e-mail: [email protected]
For queries about this service, please contact Infrastructure at:
[email protected]
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]