From c2c9eb0913f958a5a7dddb99c2278aa900d831ae Mon Sep 17 00:00:00 2001 From: "Mateusz \"Serafin\" Gajewski" Date: Wed, 1 Oct 2025 12:48:05 +0200 Subject: [PATCH 01/12] Do not allocate stats cache eagerly This will always allocate 32 elements even if the used cache is smaller --- .../src/main/java/io/trino/cost/CachingStatsProvider.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/trino-main/src/main/java/io/trino/cost/CachingStatsProvider.java b/core/trino-main/src/main/java/io/trino/cost/CachingStatsProvider.java index 4120872b3bd1..9ec5bf8bf404 100644 --- a/core/trino-main/src/main/java/io/trino/cost/CachingStatsProvider.java +++ b/core/trino-main/src/main/java/io/trino/cost/CachingStatsProvider.java @@ -42,7 +42,7 @@ public final class CachingStatsProvider private final TableStatsProvider tableStatsProvider; private final RuntimeInfoProvider runtimeInfoProvider; - private final Map cache = new IdentityHashMap<>(); + private final Map cache = new IdentityHashMap<>(0); public CachingStatsProvider(StatsCalculator statsCalculator, Session session, TableStatsProvider tableStatsProvider) { From bd27d2fa80b5c6917ab2baa229b521f89bc21f3b Mon Sep 17 00:00:00 2001 From: "Mateusz \"Serafin\" Gajewski" Date: Wed, 1 Oct 2025 13:11:39 +0200 Subject: [PATCH 02/12] Add toString to Capture(s) --- .../src/main/java/io/trino/matching/Capture.java | 10 ++++++++++ .../src/main/java/io/trino/matching/Captures.java | 12 ++++++++++++ 2 files changed, 22 insertions(+) diff --git a/lib/trino-matching/src/main/java/io/trino/matching/Capture.java b/lib/trino-matching/src/main/java/io/trino/matching/Capture.java index 6e8ccf8f18ec..13426a03ef9e 100644 --- a/lib/trino-matching/src/main/java/io/trino/matching/Capture.java +++ b/lib/trino-matching/src/main/java/io/trino/matching/Capture.java @@ -15,6 +15,8 @@ import java.util.concurrent.atomic.AtomicInteger; +import static com.google.common.base.MoreObjects.toStringHelper; + public class Capture { private static final AtomicInteger sequenceCounter = new AtomicInteger(); @@ -40,4 +42,12 @@ public String description() { return description; } + + @Override + public String toString() + { + return toStringHelper(this) + .add("description", description) + .toString(); + } } diff --git a/lib/trino-matching/src/main/java/io/trino/matching/Captures.java b/lib/trino-matching/src/main/java/io/trino/matching/Captures.java index 7880218ee042..ce68dddd3317 100644 --- a/lib/trino-matching/src/main/java/io/trino/matching/Captures.java +++ b/lib/trino-matching/src/main/java/io/trino/matching/Captures.java @@ -16,6 +16,8 @@ import java.util.NoSuchElementException; import java.util.Objects; +import static com.google.common.base.MoreObjects.toStringHelper; + public class Captures { private static final Captures NIL = new Captures(null, null, null); @@ -85,4 +87,14 @@ public int hashCode() result = 31 * result + (tail != null ? tail.hashCode() : 0); return result; } + + @Override + public String toString() + { + return toStringHelper(this) + .add("capture", capture) + .add("value", value) + .add("tail", tail) + .toString(); + } } From c4c764ec285c1649490cabc534c53281a752af12 Mon Sep 17 00:00:00 2001 From: "Mateusz \"Serafin\" Gajewski" Date: Wed, 1 Oct 2025 14:34:50 +0200 Subject: [PATCH 03/12] Convert Rule to record class --- .../sql/planner/iterative/IterativeOptimizer.java | 12 ++++++------ .../java/io/trino/sql/planner/iterative/Rule.java | 13 +++---------- .../sql/planner/iterative/rule/test/RuleAssert.java | 4 ++-- 3 files changed, 11 insertions(+), 18 deletions(-) diff --git a/core/trino-main/src/main/java/io/trino/sql/planner/iterative/IterativeOptimizer.java b/core/trino-main/src/main/java/io/trino/sql/planner/iterative/IterativeOptimizer.java index f368bb4e0790..20390e0a84a7 100644 --- a/core/trino-main/src/main/java/io/trino/sql/planner/iterative/IterativeOptimizer.java +++ b/core/trino-main/src/main/java/io/trino/sql/planner/iterative/IterativeOptimizer.java @@ -178,11 +178,11 @@ private boolean exploreNode(int group, Context context, Set changedP invoked = true; Rule.Result result = transform(node, rule, context); timeEnd = nanoTime(); - if (result.getTransformedPlan().isPresent()) { - changedPlanNodeIds.add(result.getTransformedPlan().get().getId()); + if (result.transformedPlan().isPresent()) { + changedPlanNodeIds.add(result.transformedPlan().get().getId()); } - if (result.getTransformedPlan().isPresent()) { - node = context.memo.replace(group, result.getTransformedPlan().get(), rule.getClass().getName()); + if (result.transformedPlan().isPresent()) { + node = context.memo.replace(group, result.transformedPlan().get(), rule.getClass().getName()); applied = true; done = false; @@ -226,7 +226,7 @@ private Rule.Result transform(PlanNode node, Rule rule, Context context) 0, false), PlanPrinter.textLogicalPlan( - result.getTransformedPlan().get(), + result.transformedPlan().get(), plannerContext.getMetadata(), plannerContext.getFunctionManager(), StatsAndCosts.empty(), @@ -243,7 +243,7 @@ private Rule.Result transform(PlanNode node, Rule rule, Context context) } stats.record(rule, duration, !result.isEmpty()); - if (result.getTransformedPlan().isPresent()) { + if (result.transformedPlan().isPresent()) { return result; } } diff --git a/core/trino-main/src/main/java/io/trino/sql/planner/iterative/Rule.java b/core/trino-main/src/main/java/io/trino/sql/planner/iterative/Rule.java index fba94f3cfd02..37937fe7255f 100644 --- a/core/trino-main/src/main/java/io/trino/sql/planner/iterative/Rule.java +++ b/core/trino-main/src/main/java/io/trino/sql/planner/iterative/Rule.java @@ -60,7 +60,7 @@ interface Context WarningCollector getWarningCollector(); } - final class Result + record Result(Optional transformedPlan) { private static final Result EMPTY = new Result(Optional.empty()); @@ -74,16 +74,9 @@ public static Result ofPlanNode(PlanNode transformedPlan) return new Result(Optional.of(transformedPlan)); } - private final Optional transformedPlan; - - private Result(Optional transformedPlan) - { - this.transformedPlan = requireNonNull(transformedPlan, "transformedPlan is null"); - } - - public Optional getTransformedPlan() + public Result { - return transformedPlan; + requireNonNull(transformedPlan, "transformedPlan is null"); } public boolean isEmpty() diff --git a/core/trino-main/src/test/java/io/trino/sql/planner/iterative/rule/test/RuleAssert.java b/core/trino-main/src/test/java/io/trino/sql/planner/iterative/rule/test/RuleAssert.java index 3214ae4a6971..2c8b54e80688 100644 --- a/core/trino-main/src/test/java/io/trino/sql/planner/iterative/rule/test/RuleAssert.java +++ b/core/trino-main/src/test/java/io/trino/sql/planner/iterative/rule/test/RuleAssert.java @@ -94,7 +94,7 @@ public void doesNotFire() """, rule, textLogicalPlan(plan, planTester.getPlannerContext().getMetadata(), planTester.getPlannerContext().getFunctionManager(), StatsAndCosts.empty(), session, 2, false), - textLogicalPlan(ruleApplication.result.getTransformedPlan().get(), planTester.getPlannerContext().getMetadata(), planTester.getPlannerContext().getFunctionManager(), StatsAndCosts.empty(), session, 2, false))); + textLogicalPlan(ruleApplication.result.transformedPlan().get(), planTester.getPlannerContext().getMetadata(), planTester.getPlannerContext().getFunctionManager(), StatsAndCosts.empty(), session, 2, false))); } } finally { @@ -253,7 +253,7 @@ private boolean wasRuleApplied() public PlanNode getTransformedPlan() { - return result.getTransformedPlan().orElseThrow(() -> new IllegalStateException("Rule did not produce transformed plan")); + return result.transformedPlan().orElseThrow(() -> new IllegalStateException("Rule did not produce transformed plan")); } } } From e0df2de0fa419f26c2a30d1d66bccd11f06e9288 Mon Sep 17 00:00:00 2001 From: "Mateusz \"Serafin\" Gajewski" Date: Wed, 1 Oct 2025 14:36:49 +0200 Subject: [PATCH 04/12] Merge two if branches --- .../io/trino/sql/planner/iterative/IterativeOptimizer.java | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/core/trino-main/src/main/java/io/trino/sql/planner/iterative/IterativeOptimizer.java b/core/trino-main/src/main/java/io/trino/sql/planner/iterative/IterativeOptimizer.java index 20390e0a84a7..30020f46b832 100644 --- a/core/trino-main/src/main/java/io/trino/sql/planner/iterative/IterativeOptimizer.java +++ b/core/trino-main/src/main/java/io/trino/sql/planner/iterative/IterativeOptimizer.java @@ -178,10 +178,8 @@ private boolean exploreNode(int group, Context context, Set changedP invoked = true; Rule.Result result = transform(node, rule, context); timeEnd = nanoTime(); - if (result.transformedPlan().isPresent()) { + if (!result.isEmpty()) { changedPlanNodeIds.add(result.transformedPlan().get().getId()); - } - if (result.transformedPlan().isPresent()) { node = context.memo.replace(group, result.transformedPlan().get(), rule.getClass().getName()); applied = true; From 676a2e8f2d5da07220565c382ef1ccd7172e7d55 Mon Sep 17 00:00:00 2001 From: "Mateusz \"Serafin\" Gajewski" Date: Wed, 1 Oct 2025 14:38:35 +0200 Subject: [PATCH 05/12] Add and use isPresent to Rule.Result --- .../io/trino/sql/planner/iterative/IterativeOptimizer.java | 4 ++-- .../src/main/java/io/trino/sql/planner/iterative/Rule.java | 5 +++++ 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/core/trino-main/src/main/java/io/trino/sql/planner/iterative/IterativeOptimizer.java b/core/trino-main/src/main/java/io/trino/sql/planner/iterative/IterativeOptimizer.java index 30020f46b832..0158cfbb21cf 100644 --- a/core/trino-main/src/main/java/io/trino/sql/planner/iterative/IterativeOptimizer.java +++ b/core/trino-main/src/main/java/io/trino/sql/planner/iterative/IterativeOptimizer.java @@ -178,7 +178,7 @@ private boolean exploreNode(int group, Context context, Set changedP invoked = true; Rule.Result result = transform(node, rule, context); timeEnd = nanoTime(); - if (!result.isEmpty()) { + if (result.isPresent()) { changedPlanNodeIds.add(result.transformedPlan().get().getId()); node = context.memo.replace(group, result.transformedPlan().get(), rule.getClass().getName()); @@ -241,7 +241,7 @@ private Rule.Result transform(PlanNode node, Rule rule, Context context) } stats.record(rule, duration, !result.isEmpty()); - if (result.transformedPlan().isPresent()) { + if (result.isPresent()) { return result; } } diff --git a/core/trino-main/src/main/java/io/trino/sql/planner/iterative/Rule.java b/core/trino-main/src/main/java/io/trino/sql/planner/iterative/Rule.java index 37937fe7255f..f4adb1336aad 100644 --- a/core/trino-main/src/main/java/io/trino/sql/planner/iterative/Rule.java +++ b/core/trino-main/src/main/java/io/trino/sql/planner/iterative/Rule.java @@ -83,5 +83,10 @@ public boolean isEmpty() { return transformedPlan.isEmpty(); } + + public boolean isPresent() + { + return transformedPlan.isPresent(); + } } } From 4fa60fb3cef03542390be9f21b28b334bad57d54 Mon Sep 17 00:00:00 2001 From: "Mateusz \"Serafin\" Gajewski" Date: Wed, 1 Oct 2025 14:41:52 +0200 Subject: [PATCH 06/12] Remove toAssignments collector and construct map using builder --- .../trino/sql/planner/plan/Assignments.java | 63 +++++-------------- 1 file changed, 16 insertions(+), 47 deletions(-) diff --git a/core/trino-main/src/main/java/io/trino/sql/planner/plan/Assignments.java b/core/trino-main/src/main/java/io/trino/sql/planner/plan/Assignments.java index 1aa78457c369..2352e79323b4 100644 --- a/core/trino-main/src/main/java/io/trino/sql/planner/plan/Assignments.java +++ b/core/trino-main/src/main/java/io/trino/sql/planner/plan/Assignments.java @@ -17,7 +17,6 @@ import com.fasterxml.jackson.annotation.JsonProperty; import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableMap; -import com.google.common.collect.Maps; import io.trino.sql.ir.Expression; import io.trino.sql.ir.Reference; import io.trino.sql.planner.Symbol; @@ -32,13 +31,12 @@ import java.util.function.BiConsumer; import java.util.function.Function; import java.util.function.Predicate; -import java.util.stream.Collector; import static com.google.common.base.Preconditions.checkArgument; import static java.util.Arrays.asList; import static java.util.Objects.requireNonNull; -public class Assignments +public record Assignments(Map assignments) { public static Builder builder() { @@ -79,7 +77,7 @@ public static Assignments of(Symbol symbol1, Expression expression1, Symbol symb public static Assignments of(Collection expressions, SymbolAllocator symbolAllocator) { - Assignments.Builder assignments = Assignments.builder(); + Builder assignments = Assignments.builder(); for (Expression expression : expressions) { assignments.put(symbolAllocator.newSymbol(expression), expression); @@ -88,8 +86,6 @@ public static Assignments of(Collection expressions, Symbo return assignments.build(); } - private final Map assignments; - @JsonCreator public Assignments(@JsonProperty("assignments") Map assignments) { @@ -109,9 +105,11 @@ public Map getMap() public Assignments rewrite(Function rewrite) { - return assignments.entrySet().stream() - .map(entry -> Maps.immutableEntry(entry.getKey(), rewrite.apply(entry.getValue()))) - .collect(toAssignments()); + ImmutableMap.Builder builder = ImmutableMap.builderWithExpectedSize(assignments.size()); + for (Entry entry : assignments.entrySet()) { + builder.put(entry.getKey(), rewrite.apply(entry.getValue())); + } + return new Assignments(builder.buildOrThrow()); } public Assignments filter(Collection symbols) @@ -121,9 +119,13 @@ public Assignments filter(Collection symbols) public Assignments filter(Predicate predicate) { - return assignments.entrySet().stream() - .filter(entry -> predicate.test(entry.getKey())) - .collect(toAssignments()); + ImmutableMap.Builder builder = ImmutableMap.builder(); + for (Entry entry : assignments.entrySet()) { + if (predicate.test(entry.getKey())) { + builder.put(entry.getKey(), entry.getValue()); + } + } + return new Assignments(builder.buildOrThrow()); } public boolean isIdentity(Symbol output) @@ -135,7 +137,7 @@ public boolean isIdentity(Symbol output) public boolean isIdentity() { - for (Map.Entry entry : assignments.entrySet()) { + for (Entry entry : assignments.entrySet()) { Expression expression = entry.getValue(); Symbol symbol = entry.getKey(); if (!(expression instanceof Reference reference && reference.name().equals(symbol.name()))) { @@ -145,18 +147,6 @@ public boolean isIdentity() return true; } - private Collector, Builder, Assignments> toAssignments() - { - return Collector.of( - Assignments::builder, - (builder, entry) -> builder.put(entry.getKey(), entry.getValue()), - (left, right) -> { - left.putAll(right.build()); - return left; - }, - Assignments.Builder::build); - } - public Collection getExpressions() { return assignments.values(); @@ -184,7 +174,7 @@ public int size() public boolean isEmpty() { - return size() == 0; + return assignments.isEmpty(); } public void forEach(BiConsumer consumer) @@ -192,27 +182,6 @@ public void forEach(BiConsumer consumer) assignments.forEach(consumer); } - @Override - public boolean equals(Object o) - { - if (this == o) { - return true; - } - if (o == null || getClass() != o.getClass()) { - return false; - } - - Assignments that = (Assignments) o; - - return assignments.equals(that.assignments); - } - - @Override - public int hashCode() - { - return assignments.hashCode(); - } - public static class Assignment { private final Symbol output; From 5945316cdbac8d4555b25727edcb2c8c43ce673a Mon Sep 17 00:00:00 2001 From: "Mateusz \"Serafin\" Gajewski" Date: Wed, 1 Oct 2025 14:43:39 +0200 Subject: [PATCH 07/12] Convert Assignments to a record class --- .../trino/sql/planner/plan/Assignments.java | 23 ++++--------------- .../planner/assertions/ExpressionMatcher.java | 2 +- 2 files changed, 6 insertions(+), 19 deletions(-) diff --git a/core/trino-main/src/main/java/io/trino/sql/planner/plan/Assignments.java b/core/trino-main/src/main/java/io/trino/sql/planner/plan/Assignments.java index 2352e79323b4..5cd68781426e 100644 --- a/core/trino-main/src/main/java/io/trino/sql/planner/plan/Assignments.java +++ b/core/trino-main/src/main/java/io/trino/sql/planner/plan/Assignments.java @@ -182,25 +182,12 @@ public void forEach(BiConsumer consumer) assignments.forEach(consumer); } - public static class Assignment + public record Assignment(Symbol output, Expression expression) { - private final Symbol output; - private final Expression expression; - - public Assignment(Symbol output, Expression expression) - { - this.output = requireNonNull(output, "output is null"); - this.expression = requireNonNull(expression, "expression is null"); - } - - public Symbol getOutput() - { - return output; - } - - public Expression getExpression() + public Assignment { - return expression; + requireNonNull(output, "output is null"); + requireNonNull(expression, "expression is null"); } } @@ -260,7 +247,7 @@ public Assignments build() public Builder add(Assignment assignment) { - put(assignment.getOutput(), assignment.getExpression()); + put(assignment.output(), assignment.expression()); return this; } } diff --git a/core/trino-main/src/test/java/io/trino/sql/planner/assertions/ExpressionMatcher.java b/core/trino-main/src/test/java/io/trino/sql/planner/assertions/ExpressionMatcher.java index 5ee85817ae78..47882374bde7 100644 --- a/core/trino-main/src/test/java/io/trino/sql/planner/assertions/ExpressionMatcher.java +++ b/core/trino-main/src/test/java/io/trino/sql/planner/assertions/ExpressionMatcher.java @@ -69,7 +69,7 @@ public Optional getAssignedSymbol(PlanNode node, Session session, Metada private static Map getAssignments(PlanNode node) { if (node instanceof ProjectNode projectNode) { - return projectNode.getAssignments().getMap(); + return projectNode.getAssignments().assignments(); } return null; } From 3bc47b1e9a3fd67f992bf861423b4e74ef22e91a Mon Sep 17 00:00:00 2001 From: "Mateusz \"Serafin\" Gajewski" Date: Wed, 1 Oct 2025 14:57:50 +0200 Subject: [PATCH 08/12] Remove redundant toMap method --- .../rule/ExtractDereferencesFromFilterAboveScan.java | 2 +- .../planner/iterative/rule/GatherAndMergeWindows.java | 2 +- .../iterative/rule/InlineProjectIntoFilter.java | 4 ++-- .../rule/PushDownDereferenceThroughFilter.java | 2 +- .../iterative/rule/PushDownDereferenceThroughJoin.java | 2 +- .../rule/PushDownDereferenceThroughProject.java | 2 +- .../rule/PushDownDereferenceThroughSemiJoin.java | 2 +- .../rule/PushDownDereferenceThroughUnnest.java | 2 +- .../PushDownDereferencesThroughAssignUniqueId.java | 2 +- .../rule/PushDownDereferencesThroughLimit.java | 2 +- .../rule/PushDownDereferencesThroughMarkDistinct.java | 2 +- .../rule/PushDownDereferencesThroughRowNumber.java | 2 +- .../rule/PushDownDereferencesThroughSort.java | 2 +- .../rule/PushDownDereferencesThroughTopN.java | 2 +- .../rule/PushDownDereferencesThroughTopNRanking.java | 2 +- .../rule/PushDownDereferencesThroughWindow.java | 2 +- .../iterative/rule/PushProjectionIntoTableScan.java | 2 +- .../trino/sql/planner/optimizations/AddExchanges.java | 2 +- .../sql/planner/optimizations/IndexJoinOptimizer.java | 2 +- .../sql/planner/optimizations/PredicatePushDown.java | 2 +- .../sql/planner/optimizations/PropertyDerivations.java | 4 ++-- .../optimizations/StreamPropertyDerivations.java | 2 +- .../java/io/trino/sql/planner/plan/Assignments.java | 10 ++-------- .../io/trino/sql/planner/planprinter/PlanPrinter.java | 2 +- .../io/trino/sql/planner/assertions/SymbolAliases.java | 2 +- 25 files changed, 28 insertions(+), 34 deletions(-) diff --git a/core/trino-main/src/main/java/io/trino/sql/planner/iterative/rule/ExtractDereferencesFromFilterAboveScan.java b/core/trino-main/src/main/java/io/trino/sql/planner/iterative/rule/ExtractDereferencesFromFilterAboveScan.java index 079b52700401..ef31aa41b84d 100644 --- a/core/trino-main/src/main/java/io/trino/sql/planner/iterative/rule/ExtractDereferencesFromFilterAboveScan.java +++ b/core/trino-main/src/main/java/io/trino/sql/planner/iterative/rule/ExtractDereferencesFromFilterAboveScan.java @@ -84,7 +84,7 @@ public Result apply(FilterNode node, Captures captures, Context context) } Assignments assignments = Assignments.of(dereferences, context.getSymbolAllocator()); - Map mappings = HashBiMap.create(assignments.getMap()) + Map mappings = HashBiMap.create(assignments.assignments()) .inverse() .entrySet().stream() .collect(toImmutableMap(Map.Entry::getKey, entry -> entry.getValue().toSymbolReference())); diff --git a/core/trino-main/src/main/java/io/trino/sql/planner/iterative/rule/GatherAndMergeWindows.java b/core/trino-main/src/main/java/io/trino/sql/planner/iterative/rule/GatherAndMergeWindows.java index 686c406d1c76..4082ae932411 100644 --- a/core/trino-main/src/main/java/io/trino/sql/planner/iterative/rule/GatherAndMergeWindows.java +++ b/core/trino-main/src/main/java/io/trino/sql/planner/iterative/rule/GatherAndMergeWindows.java @@ -139,7 +139,7 @@ protected static Optional pullWindowNodeAboveProjects( // The only kind of use of the output of the target that we can safely ignore is a simple identity propagation. // The target node, when hoisted above the projections, will provide the symbols directly. Map assignmentsWithoutTargetOutputIdentities = Maps.filterKeys( - project.getAssignments().getMap(), + project.getAssignments().assignments(), output -> !(project.getAssignments().isIdentity(output) && targetOutputs.contains(output))); if (targetInputs.stream().anyMatch(assignmentsWithoutTargetOutputIdentities::containsKey)) { diff --git a/core/trino-main/src/main/java/io/trino/sql/planner/iterative/rule/InlineProjectIntoFilter.java b/core/trino-main/src/main/java/io/trino/sql/planner/iterative/rule/InlineProjectIntoFilter.java index 7867e2fbe608..eea23f116dcd 100644 --- a/core/trino-main/src/main/java/io/trino/sql/planner/iterative/rule/InlineProjectIntoFilter.java +++ b/core/trino-main/src/main/java/io/trino/sql/planner/iterative/rule/InlineProjectIntoFilter.java @@ -164,9 +164,9 @@ public Result apply(FilterNode node, Captures captures, Context context) newAssignments.putAll(projectNode.getAssignments().filter(symbol -> !postFilterSymbols.contains(symbol))); Map outputAssignments = new HashMap<>(); - outputAssignments.putAll(Assignments.identity(node.getOutputSymbols()).getMap()); + outputAssignments.putAll(Assignments.identity(node.getOutputSymbols()).assignments()); // Restore inlined symbols. - outputAssignments.putAll(postFilterAssignments.getMap()); + outputAssignments.putAll(postFilterAssignments.assignments()); return Result.ofPlanNode(new ProjectNode( context.getIdAllocator().getNextId(), diff --git a/core/trino-main/src/main/java/io/trino/sql/planner/iterative/rule/PushDownDereferenceThroughFilter.java b/core/trino-main/src/main/java/io/trino/sql/planner/iterative/rule/PushDownDereferenceThroughFilter.java index 6e1946e162ed..0015b5fcb2fa 100644 --- a/core/trino-main/src/main/java/io/trino/sql/planner/iterative/rule/PushDownDereferenceThroughFilter.java +++ b/core/trino-main/src/main/java/io/trino/sql/planner/iterative/rule/PushDownDereferenceThroughFilter.java @@ -90,7 +90,7 @@ public Result apply(ProjectNode node, Captures captures, Rule.Context context) Assignments dereferenceAssignments = Assignments.of(dereferences, context.getSymbolAllocator()); // Rewrite project node assignments using new symbols for dereference expressions - Map mappings = HashBiMap.create(dereferenceAssignments.getMap()) + Map mappings = HashBiMap.create(dereferenceAssignments.assignments()) .inverse() .entrySet().stream() .collect(toImmutableMap(Map.Entry::getKey, entry -> entry.getValue().toSymbolReference())); diff --git a/core/trino-main/src/main/java/io/trino/sql/planner/iterative/rule/PushDownDereferenceThroughJoin.java b/core/trino-main/src/main/java/io/trino/sql/planner/iterative/rule/PushDownDereferenceThroughJoin.java index a9818e30707a..bad31aa32441 100644 --- a/core/trino-main/src/main/java/io/trino/sql/planner/iterative/rule/PushDownDereferenceThroughJoin.java +++ b/core/trino-main/src/main/java/io/trino/sql/planner/iterative/rule/PushDownDereferenceThroughJoin.java @@ -114,7 +114,7 @@ public Result apply(ProjectNode projectNode, Captures captures, Context context) Assignments dereferenceAssignments = Assignments.of(dereferences, context.getSymbolAllocator()); // Rewrite project node assignments using new symbols for dereference expressions - Map mappings = HashBiMap.create(dereferenceAssignments.getMap()) + Map mappings = HashBiMap.create(dereferenceAssignments.assignments()) .inverse() .entrySet().stream() .collect(toImmutableMap(Map.Entry::getKey, entry -> entry.getValue().toSymbolReference())); diff --git a/core/trino-main/src/main/java/io/trino/sql/planner/iterative/rule/PushDownDereferenceThroughProject.java b/core/trino-main/src/main/java/io/trino/sql/planner/iterative/rule/PushDownDereferenceThroughProject.java index 076054eada36..97ee2f9d1163 100644 --- a/core/trino-main/src/main/java/io/trino/sql/planner/iterative/rule/PushDownDereferenceThroughProject.java +++ b/core/trino-main/src/main/java/io/trino/sql/planner/iterative/rule/PushDownDereferenceThroughProject.java @@ -81,7 +81,7 @@ public Result apply(ProjectNode node, Captures captures, Context context) Assignments dereferenceAssignments = Assignments.of(dereferences, context.getSymbolAllocator()); // Rewrite project node assignments using new symbols for dereference expressions - Map mappings = HashBiMap.create(dereferenceAssignments.getMap()) + Map mappings = HashBiMap.create(dereferenceAssignments.assignments()) .inverse() .entrySet().stream() .collect(toImmutableMap(Map.Entry::getKey, entry -> entry.getValue().toSymbolReference())); diff --git a/core/trino-main/src/main/java/io/trino/sql/planner/iterative/rule/PushDownDereferenceThroughSemiJoin.java b/core/trino-main/src/main/java/io/trino/sql/planner/iterative/rule/PushDownDereferenceThroughSemiJoin.java index 0b5792fd1f34..db0054287271 100644 --- a/core/trino-main/src/main/java/io/trino/sql/planner/iterative/rule/PushDownDereferenceThroughSemiJoin.java +++ b/core/trino-main/src/main/java/io/trino/sql/planner/iterative/rule/PushDownDereferenceThroughSemiJoin.java @@ -94,7 +94,7 @@ public Result apply(ProjectNode projectNode, Captures captures, Context context) Assignments dereferenceAssignments = Assignments.of(dereferences, context.getSymbolAllocator()); // Rewrite project node assignments using new symbols for dereference expressions - Map mappings = HashBiMap.create(dereferenceAssignments.getMap()) + Map mappings = HashBiMap.create(dereferenceAssignments.assignments()) .inverse() .entrySet().stream() .collect(toImmutableMap(Map.Entry::getKey, entry -> entry.getValue().toSymbolReference())); diff --git a/core/trino-main/src/main/java/io/trino/sql/planner/iterative/rule/PushDownDereferenceThroughUnnest.java b/core/trino-main/src/main/java/io/trino/sql/planner/iterative/rule/PushDownDereferenceThroughUnnest.java index a5a4a003448f..e28806970a0f 100644 --- a/core/trino-main/src/main/java/io/trino/sql/planner/iterative/rule/PushDownDereferenceThroughUnnest.java +++ b/core/trino-main/src/main/java/io/trino/sql/planner/iterative/rule/PushDownDereferenceThroughUnnest.java @@ -90,7 +90,7 @@ public Result apply(ProjectNode projectNode, Captures captures, Context context) Assignments dereferenceAssignments = Assignments.of(dereferences, context.getSymbolAllocator()); // Rewrite project node assignments using new symbols for dereference expressions - Map mappings = HashBiMap.create(dereferenceAssignments.getMap()) + Map mappings = HashBiMap.create(dereferenceAssignments.assignments()) .inverse() .entrySet().stream() .collect(toImmutableMap(Map.Entry::getKey, entry -> entry.getValue().toSymbolReference())); diff --git a/core/trino-main/src/main/java/io/trino/sql/planner/iterative/rule/PushDownDereferencesThroughAssignUniqueId.java b/core/trino-main/src/main/java/io/trino/sql/planner/iterative/rule/PushDownDereferencesThroughAssignUniqueId.java index c40897f48c02..2658d65c2e80 100644 --- a/core/trino-main/src/main/java/io/trino/sql/planner/iterative/rule/PushDownDereferencesThroughAssignUniqueId.java +++ b/core/trino-main/src/main/java/io/trino/sql/planner/iterative/rule/PushDownDereferencesThroughAssignUniqueId.java @@ -82,7 +82,7 @@ public Result apply(ProjectNode projectNode, Captures captures, Context context) Assignments dereferenceAssignments = Assignments.of(dereferences, context.getSymbolAllocator()); // Rewrite project node assignments using new symbols for dereference expressions - Map mappings = HashBiMap.create(dereferenceAssignments.getMap()) + Map mappings = HashBiMap.create(dereferenceAssignments.assignments()) .inverse() .entrySet().stream() .collect(toImmutableMap(Map.Entry::getKey, entry -> entry.getValue().toSymbolReference())); diff --git a/core/trino-main/src/main/java/io/trino/sql/planner/iterative/rule/PushDownDereferencesThroughLimit.java b/core/trino-main/src/main/java/io/trino/sql/planner/iterative/rule/PushDownDereferencesThroughLimit.java index e248caa4e727..f2be16094c73 100644 --- a/core/trino-main/src/main/java/io/trino/sql/planner/iterative/rule/PushDownDereferencesThroughLimit.java +++ b/core/trino-main/src/main/java/io/trino/sql/planner/iterative/rule/PushDownDereferencesThroughLimit.java @@ -96,7 +96,7 @@ public Result apply(ProjectNode projectNode, Captures captures, Context context) Assignments dereferenceAssignments = Assignments.of(dereferences, context.getSymbolAllocator()); // Rewrite project node assignments using new symbols for dereference expressions - Map mappings = HashBiMap.create(dereferenceAssignments.getMap()) + Map mappings = HashBiMap.create(dereferenceAssignments.assignments()) .inverse() .entrySet().stream() .collect(toImmutableMap(Map.Entry::getKey, entry -> entry.getValue().toSymbolReference())); diff --git a/core/trino-main/src/main/java/io/trino/sql/planner/iterative/rule/PushDownDereferencesThroughMarkDistinct.java b/core/trino-main/src/main/java/io/trino/sql/planner/iterative/rule/PushDownDereferencesThroughMarkDistinct.java index 5d064f740658..449687fef3c3 100644 --- a/core/trino-main/src/main/java/io/trino/sql/planner/iterative/rule/PushDownDereferencesThroughMarkDistinct.java +++ b/core/trino-main/src/main/java/io/trino/sql/planner/iterative/rule/PushDownDereferencesThroughMarkDistinct.java @@ -91,7 +91,7 @@ public Result apply(ProjectNode projectNode, Captures captures, Context context) Assignments dereferenceAssignments = Assignments.of(dereferences, context.getSymbolAllocator()); // Rewrite project node assignments using new symbols for dereference expressions - Map mappings = HashBiMap.create(dereferenceAssignments.getMap()) + Map mappings = HashBiMap.create(dereferenceAssignments.assignments()) .inverse() .entrySet().stream() .collect(toImmutableMap(Map.Entry::getKey, entry -> entry.getValue().toSymbolReference())); diff --git a/core/trino-main/src/main/java/io/trino/sql/planner/iterative/rule/PushDownDereferencesThroughRowNumber.java b/core/trino-main/src/main/java/io/trino/sql/planner/iterative/rule/PushDownDereferencesThroughRowNumber.java index 6ca0e9f576f2..8ed4261241d6 100644 --- a/core/trino-main/src/main/java/io/trino/sql/planner/iterative/rule/PushDownDereferencesThroughRowNumber.java +++ b/core/trino-main/src/main/java/io/trino/sql/planner/iterative/rule/PushDownDereferencesThroughRowNumber.java @@ -90,7 +90,7 @@ public Result apply(ProjectNode projectNode, Captures captures, Context context) Assignments dereferenceAssignments = Assignments.of(dereferences, context.getSymbolAllocator()); // Rewrite project node assignments using new symbols for dereference expressions - Map mappings = HashBiMap.create(dereferenceAssignments.getMap()) + Map mappings = HashBiMap.create(dereferenceAssignments.assignments()) .inverse() .entrySet().stream() .collect(toImmutableMap(Map.Entry::getKey, entry -> entry.getValue().toSymbolReference())); diff --git a/core/trino-main/src/main/java/io/trino/sql/planner/iterative/rule/PushDownDereferencesThroughSort.java b/core/trino-main/src/main/java/io/trino/sql/planner/iterative/rule/PushDownDereferencesThroughSort.java index 705ce82b20d2..b2ded2b90a8c 100644 --- a/core/trino-main/src/main/java/io/trino/sql/planner/iterative/rule/PushDownDereferencesThroughSort.java +++ b/core/trino-main/src/main/java/io/trino/sql/planner/iterative/rule/PushDownDereferencesThroughSort.java @@ -90,7 +90,7 @@ public Result apply(ProjectNode projectNode, Captures captures, Context context) Assignments dereferenceAssignments = Assignments.of(dereferences, context.getSymbolAllocator()); // Rewrite project node assignments using new symbols for dereference expressions - Map mappings = HashBiMap.create(dereferenceAssignments.getMap()) + Map mappings = HashBiMap.create(dereferenceAssignments.assignments()) .inverse() .entrySet().stream() .collect(toImmutableMap(Map.Entry::getKey, entry -> entry.getValue().toSymbolReference())); diff --git a/core/trino-main/src/main/java/io/trino/sql/planner/iterative/rule/PushDownDereferencesThroughTopN.java b/core/trino-main/src/main/java/io/trino/sql/planner/iterative/rule/PushDownDereferencesThroughTopN.java index d9ae3eacadac..1f5f76168687 100644 --- a/core/trino-main/src/main/java/io/trino/sql/planner/iterative/rule/PushDownDereferencesThroughTopN.java +++ b/core/trino-main/src/main/java/io/trino/sql/planner/iterative/rule/PushDownDereferencesThroughTopN.java @@ -90,7 +90,7 @@ public Result apply(ProjectNode projectNode, Captures captures, Context context) Assignments dereferenceAssignments = Assignments.of(dereferences, context.getSymbolAllocator()); // Rewrite project node assignments using new symbols for dereference expressions - Map mappings = HashBiMap.create(dereferenceAssignments.getMap()) + Map mappings = HashBiMap.create(dereferenceAssignments.assignments()) .inverse() .entrySet().stream() .collect(toImmutableMap(Map.Entry::getKey, entry -> entry.getValue().toSymbolReference())); diff --git a/core/trino-main/src/main/java/io/trino/sql/planner/iterative/rule/PushDownDereferencesThroughTopNRanking.java b/core/trino-main/src/main/java/io/trino/sql/planner/iterative/rule/PushDownDereferencesThroughTopNRanking.java index 77f1a4294ad0..39ff030f9a25 100644 --- a/core/trino-main/src/main/java/io/trino/sql/planner/iterative/rule/PushDownDereferencesThroughTopNRanking.java +++ b/core/trino-main/src/main/java/io/trino/sql/planner/iterative/rule/PushDownDereferencesThroughTopNRanking.java @@ -98,7 +98,7 @@ public Result apply(ProjectNode projectNode, Captures captures, Context context) Assignments dereferenceAssignments = Assignments.of(dereferences, context.getSymbolAllocator()); // Rewrite project node assignments using new symbols for dereference expressions - Map mappings = HashBiMap.create(dereferenceAssignments.getMap()) + Map mappings = HashBiMap.create(dereferenceAssignments.assignments()) .inverse() .entrySet().stream() .collect(toImmutableMap(Map.Entry::getKey, entry -> entry.getValue().toSymbolReference())); diff --git a/core/trino-main/src/main/java/io/trino/sql/planner/iterative/rule/PushDownDereferencesThroughWindow.java b/core/trino-main/src/main/java/io/trino/sql/planner/iterative/rule/PushDownDereferencesThroughWindow.java index f84c894bb35e..d6d81f1888d8 100644 --- a/core/trino-main/src/main/java/io/trino/sql/planner/iterative/rule/PushDownDereferencesThroughWindow.java +++ b/core/trino-main/src/main/java/io/trino/sql/planner/iterative/rule/PushDownDereferencesThroughWindow.java @@ -109,7 +109,7 @@ public Result apply(ProjectNode projectNode, Captures captures, Context context) Assignments dereferenceAssignments = Assignments.of(dereferences, context.getSymbolAllocator()); // Rewrite project node assignments using new symbols for dereference expressions - Map mappings = HashBiMap.create(dereferenceAssignments.getMap()) + Map mappings = HashBiMap.create(dereferenceAssignments.assignments()) .inverse() .entrySet().stream() .collect(toImmutableMap(Map.Entry::getKey, entry -> entry.getValue().toSymbolReference())); diff --git a/core/trino-main/src/main/java/io/trino/sql/planner/iterative/rule/PushProjectionIntoTableScan.java b/core/trino-main/src/main/java/io/trino/sql/planner/iterative/rule/PushProjectionIntoTableScan.java index 19268062eb55..1b3396068c0c 100644 --- a/core/trino-main/src/main/java/io/trino/sql/planner/iterative/rule/PushProjectionIntoTableScan.java +++ b/core/trino-main/src/main/java/io/trino/sql/planner/iterative/rule/PushProjectionIntoTableScan.java @@ -99,7 +99,7 @@ public Result apply(ProjectNode project, Captures captures, Context context) // Extract translatable components from projection expressions. Prepare a mapping from these internal // expression nodes to corresponding ConnectorExpression translations. - Map, ConnectorExpression> partialTranslations = project.getAssignments().getMap().entrySet().stream() + Map, ConnectorExpression> partialTranslations = project.getAssignments().assignments().entrySet().stream() .flatMap(expression -> extractPartialTranslations( expression.getValue(), diff --git a/core/trino-main/src/main/java/io/trino/sql/planner/optimizations/AddExchanges.java b/core/trino-main/src/main/java/io/trino/sql/planner/optimizations/AddExchanges.java index cf8e85d3711f..0a0c8a55e625 100644 --- a/core/trino-main/src/main/java/io/trino/sql/planner/optimizations/AddExchanges.java +++ b/core/trino-main/src/main/java/io/trino/sql/planner/optimizations/AddExchanges.java @@ -1530,7 +1530,7 @@ private boolean isNodePartitionedOn(ActualProperties properties, Collection computeIdentityTranslations(Assignments assignments) { Map outputToInput = new HashMap<>(); - for (Map.Entry assignment : assignments.getMap().entrySet()) { + for (Map.Entry assignment : assignments.assignments().entrySet()) { if (assignment.getValue() instanceof Reference) { outputToInput.put(assignment.getKey(), Symbol.from(assignment.getValue())); } diff --git a/core/trino-main/src/main/java/io/trino/sql/planner/optimizations/IndexJoinOptimizer.java b/core/trino-main/src/main/java/io/trino/sql/planner/optimizations/IndexJoinOptimizer.java index 3a28ab728da4..4f81a4489a33 100644 --- a/core/trino-main/src/main/java/io/trino/sql/planner/optimizations/IndexJoinOptimizer.java +++ b/core/trino-main/src/main/java/io/trino/sql/planner/optimizations/IndexJoinOptimizer.java @@ -480,7 +480,7 @@ protected Map visitPlan(PlanNode node, Set lookupSymbols public Map visitProject(ProjectNode node, Set lookupSymbols) { // Map from output Symbols to source Symbols - Map directSymbolTranslationOutputMap = Maps.transformValues(Maps.filterValues(node.getAssignments().getMap(), Reference.class::isInstance), Symbol::from); + Map directSymbolTranslationOutputMap = Maps.transformValues(Maps.filterValues(node.getAssignments().assignments(), Reference.class::isInstance), Symbol::from); Map outputToSourceMap = lookupSymbols.stream() .filter(directSymbolTranslationOutputMap.keySet()::contains) .collect(toImmutableMap(identity(), directSymbolTranslationOutputMap::get)); diff --git a/core/trino-main/src/main/java/io/trino/sql/planner/optimizations/PredicatePushDown.java b/core/trino-main/src/main/java/io/trino/sql/planner/optimizations/PredicatePushDown.java index f66dc4d0fc83..4fd2c1e2a56e 100644 --- a/core/trino-main/src/main/java/io/trino/sql/planner/optimizations/PredicatePushDown.java +++ b/core/trino-main/src/main/java/io/trino/sql/planner/optimizations/PredicatePushDown.java @@ -296,7 +296,7 @@ public PlanNode visitProject(ProjectNode node, RewriteContext contex .collect(Collectors.partitioningBy(expression -> isInliningCandidate(expression, node))); List inlinedDeterministicConjuncts = inlineConjuncts.get(true).stream() - .map(entry -> inlineSymbols(node.getAssignments().getMap(), entry)) + .map(entry -> inlineSymbols(node.getAssignments().assignments(), entry)) .map(conjunct -> canonicalizeExpression(conjunct, plannerContext)) // normalize expressions to a form that unwrapCasts understands .map(conjunct -> unwrapCasts(session, plannerContext, conjunct)) .collect(Collectors.toList()); diff --git a/core/trino-main/src/main/java/io/trino/sql/planner/optimizations/PropertyDerivations.java b/core/trino-main/src/main/java/io/trino/sql/planner/optimizations/PropertyDerivations.java index c408eca3391e..8f64190b7512 100644 --- a/core/trino-main/src/main/java/io/trino/sql/planner/optimizations/PropertyDerivations.java +++ b/core/trino-main/src/main/java/io/trino/sql/planner/optimizations/PropertyDerivations.java @@ -761,9 +761,9 @@ public ActualProperties visitProject(ProjectNode node, List in { ActualProperties properties = Iterables.getOnlyElement(inputProperties); - Map identities = computeIdentityTranslations(node.getAssignments().getMap()); + Map identities = computeIdentityTranslations(node.getAssignments().assignments()); - ActualProperties translatedProperties = properties.translate(column -> Optional.ofNullable(identities.get(column)), expression -> rewriteExpression(node.getAssignments().getMap(), expression)); + ActualProperties translatedProperties = properties.translate(column -> Optional.ofNullable(identities.get(column)), expression -> rewriteExpression(node.getAssignments().assignments(), expression)); // Extract additional constants Map constants = new HashMap<>(); diff --git a/core/trino-main/src/main/java/io/trino/sql/planner/optimizations/StreamPropertyDerivations.java b/core/trino-main/src/main/java/io/trino/sql/planner/optimizations/StreamPropertyDerivations.java index f26d3bf01a4a..6884394b9f7d 100644 --- a/core/trino-main/src/main/java/io/trino/sql/planner/optimizations/StreamPropertyDerivations.java +++ b/core/trino-main/src/main/java/io/trino/sql/planner/optimizations/StreamPropertyDerivations.java @@ -405,7 +405,7 @@ public StreamProperties visitProject(ProjectNode node, List in StreamProperties properties = Iterables.getOnlyElement(inputProperties); // We can describe properties in terms of inputs that are projected unmodified (i.e., identity projections) - Map identities = computeIdentityTranslations(node.getAssignments().getMap()); + Map identities = computeIdentityTranslations(node.getAssignments().assignments()); return properties.translate(column -> Optional.ofNullable(identities.get(column))); } diff --git a/core/trino-main/src/main/java/io/trino/sql/planner/plan/Assignments.java b/core/trino-main/src/main/java/io/trino/sql/planner/plan/Assignments.java index 5cd68781426e..5dd76d35eb5e 100644 --- a/core/trino-main/src/main/java/io/trino/sql/planner/plan/Assignments.java +++ b/core/trino-main/src/main/java/io/trino/sql/planner/plan/Assignments.java @@ -36,7 +36,7 @@ import static java.util.Arrays.asList; import static java.util.Objects.requireNonNull; -public record Assignments(Map assignments) +public record Assignments(@JsonProperty("assignments") Map assignments) { public static Builder builder() { @@ -97,12 +97,6 @@ public List getOutputs() return ImmutableList.copyOf(assignments.keySet()); } - @JsonProperty("assignments") - public Map getMap() - { - return assignments; - } - public Assignments rewrite(Function rewrite) { ImmutableMap.Builder builder = ImmutableMap.builderWithExpectedSize(assignments.size()); @@ -197,7 +191,7 @@ public static class Builder public Builder putAll(Assignments assignments) { - return putAll(assignments.getMap()); + return putAll(assignments.assignments()); } public Builder putAll(Map assignments) diff --git a/core/trino-main/src/main/java/io/trino/sql/planner/planprinter/PlanPrinter.java b/core/trino-main/src/main/java/io/trino/sql/planner/planprinter/PlanPrinter.java index 73bb416e4404..d9c692d73b48 100644 --- a/core/trino-main/src/main/java/io/trino/sql/planner/planprinter/PlanPrinter.java +++ b/core/trino-main/src/main/java/io/trino/sql/planner/planprinter/PlanPrinter.java @@ -2007,7 +2007,7 @@ private Void processChildren(PlanNode node, Context context) private void printAssignments(NodeRepresentation nodeOutput, Assignments assignments) { - for (Entry entry : assignments.getMap().entrySet()) { + for (Entry entry : assignments.assignments().entrySet()) { if (entry.getValue() instanceof Reference && ((Reference) entry.getValue()).name().equals(entry.getKey().name())) { // skip identity assignments continue; diff --git a/core/trino-main/src/test/java/io/trino/sql/planner/assertions/SymbolAliases.java b/core/trino-main/src/test/java/io/trino/sql/planner/assertions/SymbolAliases.java index f7422481007d..9419c754888e 100644 --- a/core/trino-main/src/test/java/io/trino/sql/planner/assertions/SymbolAliases.java +++ b/core/trino-main/src/test/java/io/trino/sql/planner/assertions/SymbolAliases.java @@ -101,7 +101,7 @@ public Optional getOptional(String alias) private Map getUpdatedAssignments(Assignments assignments) { ImmutableMap.Builder mapUpdate = ImmutableMap.builder(); - for (Map.Entry assignment : assignments.getMap().entrySet()) { + for (Map.Entry assignment : assignments.assignments().entrySet()) { for (Map.Entry existingAlias : map.entrySet()) { if (assignment.getValue().equals(existingAlias.getValue())) { // Simple symbol rename From 823d2f1ea6900f151e8b6cb62251c9a50794687d Mon Sep 17 00:00:00 2001 From: "Mateusz \"Serafin\" Gajewski" Date: Wed, 1 Oct 2025 14:58:07 +0200 Subject: [PATCH 09/12] Inline variable --- .../src/main/java/io/trino/sql/planner/plan/Assignments.java | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/core/trino-main/src/main/java/io/trino/sql/planner/plan/Assignments.java b/core/trino-main/src/main/java/io/trino/sql/planner/plan/Assignments.java index 5dd76d35eb5e..86bb70fed34b 100644 --- a/core/trino-main/src/main/java/io/trino/sql/planner/plan/Assignments.java +++ b/core/trino-main/src/main/java/io/trino/sql/planner/plan/Assignments.java @@ -124,9 +124,7 @@ public Assignments filter(Predicate predicate) public boolean isIdentity(Symbol output) { - Expression expression = assignments.get(output); - - return expression instanceof Reference reference && reference.name().equals(output.name()); + return assignments.get(output) instanceof Reference reference && reference.name().equals(output.name()); } public boolean isIdentity() From 8c4fa30d33c3c4e6c7e6be6e4f1a13b6f9061d6f Mon Sep 17 00:00:00 2001 From: "Mateusz \"Serafin\" Gajewski" Date: Wed, 1 Oct 2025 15:00:07 +0200 Subject: [PATCH 10/12] Reorder methods --- .../java/io/trino/sql/planner/plan/Assignments.java | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/core/trino-main/src/main/java/io/trino/sql/planner/plan/Assignments.java b/core/trino-main/src/main/java/io/trino/sql/planner/plan/Assignments.java index 86bb70fed34b..70d2bdde28d7 100644 --- a/core/trino-main/src/main/java/io/trino/sql/planner/plan/Assignments.java +++ b/core/trino-main/src/main/java/io/trino/sql/planner/plan/Assignments.java @@ -218,6 +218,12 @@ public Builder put(Entry assignment) return this; } + public Builder add(Assignment assignment) + { + put(assignment.output(), assignment.expression()); + return this; + } + public Builder putIdentities(Iterable symbols) { for (Symbol symbol : symbols) { @@ -236,11 +242,5 @@ public Assignments build() { return new Assignments(assignments); } - - public Builder add(Assignment assignment) - { - put(assignment.output(), assignment.expression()); - return this; - } } } From e188b98318e76b0fe083da0c652c941345b02d8c Mon Sep 17 00:00:00 2001 From: "Mateusz \"Serafin\" Gajewski" Date: Wed, 1 Oct 2025 15:10:49 +0200 Subject: [PATCH 11/12] Replace duplicated method --- .../io/trino/sql/planner/ExpressionExtractor.java | 2 +- .../java/io/trino/sql/planner/QueryPlanner.java | 2 +- ...ecorrelateInnerUnnestWithGlobalAggregation.java | 2 +- ...DecorrelateLeftUnnestWithGlobalAggregation.java | 2 +- .../planner/iterative/rule/DecorrelateUnnest.java | 2 +- .../iterative/rule/GatherAndMergeWindows.java | 2 +- .../iterative/rule/InlineProjectIntoFilter.java | 2 +- .../planner/iterative/rule/InlineProjections.java | 2 +- .../rule/MergePatternRecognitionNodes.java | 2 +- .../rule/OptimizeDuplicateInsensitiveJoins.java | 2 +- .../rule/PreAggregateCaseAggregations.java | 4 ++-- .../iterative/rule/ProjectOffPushDownRule.java | 2 +- .../rule/PushDownDereferenceThroughFilter.java | 2 +- .../rule/PushDownDereferenceThroughJoin.java | 4 ++-- .../rule/PushDownDereferenceThroughProject.java | 2 +- .../rule/PushDownDereferenceThroughSemiJoin.java | 2 +- .../rule/PushDownDereferenceThroughUnnest.java | 4 ++-- .../PushDownDereferencesThroughAssignUniqueId.java | 2 +- .../rule/PushDownDereferencesThroughLimit.java | 2 +- .../PushDownDereferencesThroughMarkDistinct.java | 2 +- .../rule/PushDownDereferencesThroughRowNumber.java | 2 +- .../rule/PushDownDereferencesThroughSort.java | 2 +- .../rule/PushDownDereferencesThroughTopN.java | 2 +- .../PushDownDereferencesThroughTopNRanking.java | 2 +- .../rule/PushDownDereferencesThroughWindow.java | 2 +- .../iterative/rule/PushLimitThroughProject.java | 2 +- .../PushPredicateThroughProjectIntoRowNumber.java | 2 +- .../PushPredicateThroughProjectIntoWindow.java | 2 +- .../rule/PushProjectionThroughExchange.java | 2 +- .../iterative/rule/PushProjectionThroughJoin.java | 6 +++--- .../iterative/rule/PushProjectionThroughUnion.java | 2 +- .../iterative/rule/PushTopNThroughProject.java | 2 +- .../planner/optimizations/AddLocalExchanges.java | 2 +- .../optimizations/MetadataQueryOptimizer.java | 2 +- .../sql/planner/optimizations/SymbolMapper.java | 3 ++- .../optimizations/UnaliasSymbolReferences.java | 2 +- .../io/trino/sql/planner/plan/AggregationNode.java | 9 +++++---- .../io/trino/sql/planner/plan/Assignments.java | 14 ++++---------- .../io/trino/sql/planner/plan/ProjectNode.java | 2 +- .../sanity/ValidateDependenciesChecker.java | 2 +- .../io/trino/cost/TestAggregationStatsRule.java | 2 +- .../assertions/StrictAssignedSymbolsMatcher.java | 2 +- 42 files changed, 55 insertions(+), 59 deletions(-) diff --git a/core/trino-main/src/main/java/io/trino/sql/planner/ExpressionExtractor.java b/core/trino-main/src/main/java/io/trino/sql/planner/ExpressionExtractor.java index 04342961b649..593955a1fe86 100644 --- a/core/trino-main/src/main/java/io/trino/sql/planner/ExpressionExtractor.java +++ b/core/trino-main/src/main/java/io/trino/sql/planner/ExpressionExtractor.java @@ -110,7 +110,7 @@ public Void visitFilter(FilterNode node, Void context) @Override public Void visitProject(ProjectNode node, Void context) { - node.getAssignments().getExpressions().forEach(consumer); + node.getAssignments().expressions().forEach(consumer); return super.visitProject(node, context); } diff --git a/core/trino-main/src/main/java/io/trino/sql/planner/QueryPlanner.java b/core/trino-main/src/main/java/io/trino/sql/planner/QueryPlanner.java index 1c7e20ab8cdb..aa2aeb29580b 100644 --- a/core/trino-main/src/main/java/io/trino/sql/planner/QueryPlanner.java +++ b/core/trino-main/src/main/java/io/trino/sql/planner/QueryPlanner.java @@ -1301,7 +1301,7 @@ private PlanBuilder planAggregation(PlanBuilder subPlan, List> grou } } - ImmutableList.Builder groupingKeys = ImmutableList.builder(); + ImmutableSet.Builder groupingKeys = ImmutableSet.builder(); groupingSets.stream() .flatMap(List::stream) .distinct() diff --git a/core/trino-main/src/main/java/io/trino/sql/planner/iterative/rule/DecorrelateInnerUnnestWithGlobalAggregation.java b/core/trino-main/src/main/java/io/trino/sql/planner/iterative/rule/DecorrelateInnerUnnestWithGlobalAggregation.java index 1ad667da1f69..f7e2ad00bc77 100644 --- a/core/trino-main/src/main/java/io/trino/sql/planner/iterative/rule/DecorrelateInnerUnnestWithGlobalAggregation.java +++ b/core/trino-main/src/main/java/io/trino/sql/planner/iterative/rule/DecorrelateInnerUnnestWithGlobalAggregation.java @@ -261,7 +261,7 @@ private static boolean isSupportedUnnest(PlanNode node, List correlation PlanNode unnestSource = lookup.resolve(unnestNode.getSource()); Set correlationSymbols = ImmutableSet.copyOf(correlation); boolean basedOnCorrelation = correlationSymbols.containsAll(unnestSymbols) || - unnestSource instanceof ProjectNode projectNode && correlationSymbols.containsAll(SymbolsExtractor.extractUnique(projectNode.getAssignments().getExpressions())); + unnestSource instanceof ProjectNode projectNode && correlationSymbols.containsAll(SymbolsExtractor.extractUnique(projectNode.getAssignments().expressions())); return isScalar(unnestNode.getSource(), lookup) && unnestNode.getReplicateSymbols().isEmpty() && diff --git a/core/trino-main/src/main/java/io/trino/sql/planner/iterative/rule/DecorrelateLeftUnnestWithGlobalAggregation.java b/core/trino-main/src/main/java/io/trino/sql/planner/iterative/rule/DecorrelateLeftUnnestWithGlobalAggregation.java index 14aac2c8bfa7..acd30e49deec 100644 --- a/core/trino-main/src/main/java/io/trino/sql/planner/iterative/rule/DecorrelateLeftUnnestWithGlobalAggregation.java +++ b/core/trino-main/src/main/java/io/trino/sql/planner/iterative/rule/DecorrelateLeftUnnestWithGlobalAggregation.java @@ -217,7 +217,7 @@ private static boolean isSupportedUnnest(PlanNode node, List correlation .collect(toImmutableList()); PlanNode unnestSource = lookup.resolve(unnestNode.getSource()); boolean basedOnCorrelation = ImmutableSet.copyOf(correlation).containsAll(unnestSymbols) || - unnestSource instanceof ProjectNode projectNode && ImmutableSet.copyOf(correlation).containsAll(SymbolsExtractor.extractUnique(projectNode.getAssignments().getExpressions())); + unnestSource instanceof ProjectNode projectNode && ImmutableSet.copyOf(correlation).containsAll(SymbolsExtractor.extractUnique(projectNode.getAssignments().expressions())); return isScalar(unnestNode.getSource(), lookup) && unnestNode.getReplicateSymbols().isEmpty() && diff --git a/core/trino-main/src/main/java/io/trino/sql/planner/iterative/rule/DecorrelateUnnest.java b/core/trino-main/src/main/java/io/trino/sql/planner/iterative/rule/DecorrelateUnnest.java index 691cdf318829..c6be2a3a0cc9 100644 --- a/core/trino-main/src/main/java/io/trino/sql/planner/iterative/rule/DecorrelateUnnest.java +++ b/core/trino-main/src/main/java/io/trino/sql/planner/iterative/rule/DecorrelateUnnest.java @@ -296,7 +296,7 @@ private static boolean isSupportedUnnest(PlanNode node, List correlation .collect(toImmutableList()); PlanNode unnestSource = lookup.resolve(unnestNode.getSource()); boolean basedOnCorrelation = ImmutableSet.copyOf(correlation).containsAll(unnestSymbols) || - unnestSource instanceof ProjectNode projectNode && ImmutableSet.copyOf(correlation).containsAll(SymbolsExtractor.extractUnique(projectNode.getAssignments().getExpressions())); + unnestSource instanceof ProjectNode projectNode && ImmutableSet.copyOf(correlation).containsAll(SymbolsExtractor.extractUnique(projectNode.getAssignments().expressions())); return isScalar(unnestNode.getSource(), lookup) && unnestNode.getReplicateSymbols().isEmpty() && diff --git a/core/trino-main/src/main/java/io/trino/sql/planner/iterative/rule/GatherAndMergeWindows.java b/core/trino-main/src/main/java/io/trino/sql/planner/iterative/rule/GatherAndMergeWindows.java index 4082ae932411..524524e9c38e 100644 --- a/core/trino-main/src/main/java/io/trino/sql/planner/iterative/rule/GatherAndMergeWindows.java +++ b/core/trino-main/src/main/java/io/trino/sql/planner/iterative/rule/GatherAndMergeWindows.java @@ -152,7 +152,7 @@ protected static Optional pullWindowNodeAboveProjects( .putIdentities(targetInputs) .build(); - if (!newTargetChildOutputs.containsAll(SymbolsExtractor.extractUnique(newAssignments.getExpressions()))) { + if (!newTargetChildOutputs.containsAll(SymbolsExtractor.extractUnique(newAssignments.expressions()))) { // Projection uses an output of the target -- can't move the target above this projection. return Optional.empty(); } diff --git a/core/trino-main/src/main/java/io/trino/sql/planner/iterative/rule/InlineProjectIntoFilter.java b/core/trino-main/src/main/java/io/trino/sql/planner/iterative/rule/InlineProjectIntoFilter.java index eea23f116dcd..48aa18063290 100644 --- a/core/trino-main/src/main/java/io/trino/sql/planner/iterative/rule/InlineProjectIntoFilter.java +++ b/core/trino-main/src/main/java/io/trino/sql/planner/iterative/rule/InlineProjectIntoFilter.java @@ -159,7 +159,7 @@ public Result apply(FilterNode node, Captures captures, Context context) return Result.empty(); } - Set postFilterSymbols = postFilterAssignments.getSymbols(); + Set postFilterSymbols = postFilterAssignments.outputs(); // Remove inlined expressions from the underlying projection. newAssignments.putAll(projectNode.getAssignments().filter(symbol -> !postFilterSymbols.contains(symbol))); diff --git a/core/trino-main/src/main/java/io/trino/sql/planner/iterative/rule/InlineProjections.java b/core/trino-main/src/main/java/io/trino/sql/planner/iterative/rule/InlineProjections.java index 1ffd76b006a7..d3c89d2c1bc1 100644 --- a/core/trino-main/src/main/java/io/trino/sql/planner/iterative/rule/InlineProjections.java +++ b/core/trino-main/src/main/java/io/trino/sql/planner/iterative/rule/InlineProjections.java @@ -161,7 +161,7 @@ private static Set extractInliningTargets(ProjectNode parent, ProjectNod Set childOutputSet = ImmutableSet.copyOf(child.getOutputSymbols()); Map dependencies = parent.getAssignments() - .getExpressions().stream() + .expressions().stream() .flatMap(expression -> SymbolsExtractor.extractAll(expression).stream()) .filter(childOutputSet::contains) .collect(Collectors.groupingBy(Function.identity(), Collectors.counting())); diff --git a/core/trino-main/src/main/java/io/trino/sql/planner/iterative/rule/MergePatternRecognitionNodes.java b/core/trino-main/src/main/java/io/trino/sql/planner/iterative/rule/MergePatternRecognitionNodes.java index 6d3150415bec..3d71f2fad6e2 100644 --- a/core/trino-main/src/main/java/io/trino/sql/planner/iterative/rule/MergePatternRecognitionNodes.java +++ b/core/trino-main/src/main/java/io/trino/sql/planner/iterative/rule/MergePatternRecognitionNodes.java @@ -137,7 +137,7 @@ public Result apply(PatternRecognitionNode node, Captures captures, Context cont // put prerequisite assignments in the source of merged node, // and the remaining assignments on top of merged node Assignments remainingAssignments = project.getAssignments() - .filter(symbol -> !prerequisites.getSymbols().contains(symbol)); + .filter(symbol -> !prerequisites.outputs().contains(symbol)); merged = (PatternRecognitionNode) merged.replaceChildren(ImmutableList.of(new ProjectNode( context.getIdAllocator().getNextId(), diff --git a/core/trino-main/src/main/java/io/trino/sql/planner/iterative/rule/OptimizeDuplicateInsensitiveJoins.java b/core/trino-main/src/main/java/io/trino/sql/planner/iterative/rule/OptimizeDuplicateInsensitiveJoins.java index c3f3ebf6c466..9008c9498a2a 100644 --- a/core/trino-main/src/main/java/io/trino/sql/planner/iterative/rule/OptimizeDuplicateInsensitiveJoins.java +++ b/core/trino-main/src/main/java/io/trino/sql/planner/iterative/rule/OptimizeDuplicateInsensitiveJoins.java @@ -103,7 +103,7 @@ public Optional visitFilter(FilterNode node, Void context) @Override public Optional visitProject(ProjectNode node, Void context) { - boolean isDeterministic = node.getAssignments().getExpressions().stream() + boolean isDeterministic = node.getAssignments().expressions().stream() .allMatch(DeterminismEvaluator::isDeterministic); if (!isDeterministic) { // non-deterministic projections could be used in downstream filters which could diff --git a/core/trino-main/src/main/java/io/trino/sql/planner/iterative/rule/PreAggregateCaseAggregations.java b/core/trino-main/src/main/java/io/trino/sql/planner/iterative/rule/PreAggregateCaseAggregations.java index 0de5602456ce..d54d7cc3e5de 100644 --- a/core/trino-main/src/main/java/io/trino/sql/planner/iterative/rule/PreAggregateCaseAggregations.java +++ b/core/trino-main/src/main/java/io/trino/sql/planner/iterative/rule/PreAggregateCaseAggregations.java @@ -179,7 +179,7 @@ public Result apply(AggregationNode aggregationNode, Captures captures, Context context); AggregationNode preAggregation = createPreAggregation( preProjection, - preGroupingExpressions.getOutputs(), + preGroupingExpressions.outputs(), preAggregations, context); Map newProjectionSymbols = getNewProjectionSymbols(aggregations, context); @@ -247,7 +247,7 @@ private Map getNewProjectionSymbols(List groupingKeys, + Set groupingKeys, Map preAggregations, Context context) { diff --git a/core/trino-main/src/main/java/io/trino/sql/planner/iterative/rule/ProjectOffPushDownRule.java b/core/trino-main/src/main/java/io/trino/sql/planner/iterative/rule/ProjectOffPushDownRule.java index 07274390883c..21422f407b08 100644 --- a/core/trino-main/src/main/java/io/trino/sql/planner/iterative/rule/ProjectOffPushDownRule.java +++ b/core/trino-main/src/main/java/io/trino/sql/planner/iterative/rule/ProjectOffPushDownRule.java @@ -59,7 +59,7 @@ public Result apply(ProjectNode parent, Captures captures, Context context) { N targetNode = captures.get(targetCapture); - return pruneInputs(targetNode.getOutputSymbols(), parent.getAssignments().getExpressions()) + return pruneInputs(targetNode.getOutputSymbols(), parent.getAssignments().expressions()) .flatMap(prunedOutputs -> this.pushDownProjectOff(context, targetNode, prunedOutputs)) .map(newChild -> parent.replaceChildren(ImmutableList.of(newChild))) .map(Result::ofPlanNode) diff --git a/core/trino-main/src/main/java/io/trino/sql/planner/iterative/rule/PushDownDereferenceThroughFilter.java b/core/trino-main/src/main/java/io/trino/sql/planner/iterative/rule/PushDownDereferenceThroughFilter.java index 0015b5fcb2fa..abaa5584d70d 100644 --- a/core/trino-main/src/main/java/io/trino/sql/planner/iterative/rule/PushDownDereferenceThroughFilter.java +++ b/core/trino-main/src/main/java/io/trino/sql/planner/iterative/rule/PushDownDereferenceThroughFilter.java @@ -75,7 +75,7 @@ public Result apply(ProjectNode node, Captures captures, Rule.Context context) // Pushdown superset of dereference expressions from projections and filtering predicate List expressions = ImmutableList.builder() - .addAll(node.getAssignments().getExpressions()) + .addAll(node.getAssignments().expressions()) .add(filterNode.getPredicate()) .build(); diff --git a/core/trino-main/src/main/java/io/trino/sql/planner/iterative/rule/PushDownDereferenceThroughJoin.java b/core/trino-main/src/main/java/io/trino/sql/planner/iterative/rule/PushDownDereferenceThroughJoin.java index bad31aa32441..cd117652d802 100644 --- a/core/trino-main/src/main/java/io/trino/sql/planner/iterative/rule/PushDownDereferenceThroughJoin.java +++ b/core/trino-main/src/main/java/io/trino/sql/planner/iterative/rule/PushDownDereferenceThroughJoin.java @@ -90,7 +90,7 @@ public Result apply(ProjectNode projectNode, Captures captures, Context context) // Consider dereferences in projections and join filter for pushdown ImmutableList.Builder expressionsBuilder = ImmutableList.builder(); - expressionsBuilder.addAll(projectNode.getAssignments().getExpressions()); + expressionsBuilder.addAll(projectNode.getAssignments().expressions()); joinNode.getFilter().ifPresent(expressionsBuilder::add); Set dereferences = extractRowSubscripts(expressionsBuilder.build(), false); @@ -145,7 +145,7 @@ else if (joinNode.getRight().getOutputSymbols().contains(baseSymbol)) { PlanNode rightNode = createProjectNodeIfRequired(joinNode.getRight(), rightAssignments, context.getIdAllocator()); // Prepare new output symbols for join node - List referredSymbolsInAssignments = newAssignments.getExpressions().stream() + List referredSymbolsInAssignments = newAssignments.expressions().stream() .flatMap(expression -> extractAll(expression).stream()) .collect(toList()); diff --git a/core/trino-main/src/main/java/io/trino/sql/planner/iterative/rule/PushDownDereferenceThroughProject.java b/core/trino-main/src/main/java/io/trino/sql/planner/iterative/rule/PushDownDereferenceThroughProject.java index 97ee2f9d1163..8747619fd690 100644 --- a/core/trino-main/src/main/java/io/trino/sql/planner/iterative/rule/PushDownDereferenceThroughProject.java +++ b/core/trino-main/src/main/java/io/trino/sql/planner/iterative/rule/PushDownDereferenceThroughProject.java @@ -66,7 +66,7 @@ public Result apply(ProjectNode node, Captures captures, Context context) ProjectNode child = captures.get(CHILD); // Extract dereferences from project node assignments for pushdown - Set dereferences = extractRowSubscripts(node.getAssignments().getExpressions(), false); + Set dereferences = extractRowSubscripts(node.getAssignments().expressions(), false); // Exclude dereferences on symbols being synthesized within child dereferences = dereferences.stream() diff --git a/core/trino-main/src/main/java/io/trino/sql/planner/iterative/rule/PushDownDereferenceThroughSemiJoin.java b/core/trino-main/src/main/java/io/trino/sql/planner/iterative/rule/PushDownDereferenceThroughSemiJoin.java index db0054287271..b825a9d84825 100644 --- a/core/trino-main/src/main/java/io/trino/sql/planner/iterative/rule/PushDownDereferenceThroughSemiJoin.java +++ b/core/trino-main/src/main/java/io/trino/sql/planner/iterative/rule/PushDownDereferenceThroughSemiJoin.java @@ -78,7 +78,7 @@ public Result apply(ProjectNode projectNode, Captures captures, Context context) SemiJoinNode semiJoinNode = captures.get(CHILD); // Extract dereferences from project node assignments for pushdown - Set dereferences = extractRowSubscripts(projectNode.getAssignments().getExpressions(), false); + Set dereferences = extractRowSubscripts(projectNode.getAssignments().expressions(), false); // All dereferences can be assumed on the symbols coming from source, since filteringSource output is not propagated, // and semiJoinOutput is of type boolean. We exclude pushdown of dereferences on sourceJoinSymbol. diff --git a/core/trino-main/src/main/java/io/trino/sql/planner/iterative/rule/PushDownDereferenceThroughUnnest.java b/core/trino-main/src/main/java/io/trino/sql/planner/iterative/rule/PushDownDereferenceThroughUnnest.java index e28806970a0f..247ae276bf32 100644 --- a/core/trino-main/src/main/java/io/trino/sql/planner/iterative/rule/PushDownDereferenceThroughUnnest.java +++ b/core/trino-main/src/main/java/io/trino/sql/planner/iterative/rule/PushDownDereferenceThroughUnnest.java @@ -75,7 +75,7 @@ public Result apply(ProjectNode projectNode, Captures captures, Context context) UnnestNode unnestNode = captures.get(CHILD); // Extract dereferences for pushdown from project node's assignments - Set dereferences = extractRowSubscripts(projectNode.getAssignments().getExpressions(), false); + Set dereferences = extractRowSubscripts(projectNode.getAssignments().expressions(), false); // Only retain dereferences on replicate symbols dereferences = dereferences.stream() @@ -114,7 +114,7 @@ public Result apply(ProjectNode projectNode, Captures captures, Context context) source, ImmutableList.builder() .addAll(unnestNode.getReplicateSymbols()) - .addAll(dereferenceAssignments.getSymbols()) + .addAll(dereferenceAssignments.outputs()) .build(), unnestNode.getMappings(), unnestNode.getOrdinalitySymbol(), diff --git a/core/trino-main/src/main/java/io/trino/sql/planner/iterative/rule/PushDownDereferencesThroughAssignUniqueId.java b/core/trino-main/src/main/java/io/trino/sql/planner/iterative/rule/PushDownDereferencesThroughAssignUniqueId.java index 2658d65c2e80..90d90bcb2dd9 100644 --- a/core/trino-main/src/main/java/io/trino/sql/planner/iterative/rule/PushDownDereferencesThroughAssignUniqueId.java +++ b/core/trino-main/src/main/java/io/trino/sql/planner/iterative/rule/PushDownDereferencesThroughAssignUniqueId.java @@ -70,7 +70,7 @@ public Result apply(ProjectNode projectNode, Captures captures, Context context) AssignUniqueId assignUniqueId = captures.get(CHILD); // Extract dereferences from project node assignments for pushdown - Set dereferences = extractRowSubscripts(projectNode.getAssignments().getExpressions(), false); + Set dereferences = extractRowSubscripts(projectNode.getAssignments().expressions(), false); // We do not need to filter dereferences on idColumn symbol since it is supposed to be of BIGINT type. diff --git a/core/trino-main/src/main/java/io/trino/sql/planner/iterative/rule/PushDownDereferencesThroughLimit.java b/core/trino-main/src/main/java/io/trino/sql/planner/iterative/rule/PushDownDereferencesThroughLimit.java index f2be16094c73..d04ca70bb738 100644 --- a/core/trino-main/src/main/java/io/trino/sql/planner/iterative/rule/PushDownDereferencesThroughLimit.java +++ b/core/trino-main/src/main/java/io/trino/sql/planner/iterative/rule/PushDownDereferencesThroughLimit.java @@ -75,7 +75,7 @@ public Result apply(ProjectNode projectNode, Captures captures, Context context) LimitNode limitNode = captures.get(CHILD); // Extract dereferences from project node assignments for pushdown - Set dereferences = extractRowSubscripts(projectNode.getAssignments().getExpressions(), false); + Set dereferences = extractRowSubscripts(projectNode.getAssignments().expressions(), false); // Exclude dereferences on symbols being used in tiesResolvingScheme and requiresPreSortedInputs Set excludedSymbols = ImmutableSet.builder() diff --git a/core/trino-main/src/main/java/io/trino/sql/planner/iterative/rule/PushDownDereferencesThroughMarkDistinct.java b/core/trino-main/src/main/java/io/trino/sql/planner/iterative/rule/PushDownDereferencesThroughMarkDistinct.java index 449687fef3c3..79561e6dcd64 100644 --- a/core/trino-main/src/main/java/io/trino/sql/planner/iterative/rule/PushDownDereferencesThroughMarkDistinct.java +++ b/core/trino-main/src/main/java/io/trino/sql/planner/iterative/rule/PushDownDereferencesThroughMarkDistinct.java @@ -75,7 +75,7 @@ public Result apply(ProjectNode projectNode, Captures captures, Context context) MarkDistinctNode markDistinctNode = captures.get(CHILD); // Extract dereferences from project node assignments for pushdown - Set dereferences = extractRowSubscripts(projectNode.getAssignments().getExpressions(), false); + Set dereferences = extractRowSubscripts(projectNode.getAssignments().expressions(), false); // Exclude dereferences on distinct symbols being used in markDistinctNode. We do not need to filter // dereferences on markerSymbol since it is supposed to be of boolean type. diff --git a/core/trino-main/src/main/java/io/trino/sql/planner/iterative/rule/PushDownDereferencesThroughRowNumber.java b/core/trino-main/src/main/java/io/trino/sql/planner/iterative/rule/PushDownDereferencesThroughRowNumber.java index 8ed4261241d6..5cadb82631cf 100644 --- a/core/trino-main/src/main/java/io/trino/sql/planner/iterative/rule/PushDownDereferencesThroughRowNumber.java +++ b/core/trino-main/src/main/java/io/trino/sql/planner/iterative/rule/PushDownDereferencesThroughRowNumber.java @@ -75,7 +75,7 @@ public Result apply(ProjectNode projectNode, Captures captures, Context context) RowNumberNode rowNumberNode = captures.get(CHILD); // Extract dereferences from project node assignments for pushdown - Set dereferences = extractRowSubscripts(projectNode.getAssignments().getExpressions(), false); + Set dereferences = extractRowSubscripts(projectNode.getAssignments().expressions(), false); // Exclude dereferences on symbols being used in partitionBy dereferences = dereferences.stream() diff --git a/core/trino-main/src/main/java/io/trino/sql/planner/iterative/rule/PushDownDereferencesThroughSort.java b/core/trino-main/src/main/java/io/trino/sql/planner/iterative/rule/PushDownDereferencesThroughSort.java index b2ded2b90a8c..2b4d20cb61b1 100644 --- a/core/trino-main/src/main/java/io/trino/sql/planner/iterative/rule/PushDownDereferencesThroughSort.java +++ b/core/trino-main/src/main/java/io/trino/sql/planner/iterative/rule/PushDownDereferencesThroughSort.java @@ -75,7 +75,7 @@ public Result apply(ProjectNode projectNode, Captures captures, Context context) SortNode sortNode = captures.get(CHILD); // Extract dereferences from project node assignments for pushdown - Set dereferences = extractRowSubscripts(projectNode.getAssignments().getExpressions(), false); + Set dereferences = extractRowSubscripts(projectNode.getAssignments().expressions(), false); // Exclude dereferences on symbols used in ordering scheme to avoid replication of data dereferences = dereferences.stream() diff --git a/core/trino-main/src/main/java/io/trino/sql/planner/iterative/rule/PushDownDereferencesThroughTopN.java b/core/trino-main/src/main/java/io/trino/sql/planner/iterative/rule/PushDownDereferencesThroughTopN.java index 1f5f76168687..0ea0712f99c9 100644 --- a/core/trino-main/src/main/java/io/trino/sql/planner/iterative/rule/PushDownDereferencesThroughTopN.java +++ b/core/trino-main/src/main/java/io/trino/sql/planner/iterative/rule/PushDownDereferencesThroughTopN.java @@ -75,7 +75,7 @@ public Result apply(ProjectNode projectNode, Captures captures, Context context) TopNNode topNNode = captures.get(CHILD); // Extract dereferences from project node assignments for pushdown - Set dereferences = extractRowSubscripts(projectNode.getAssignments().getExpressions(), false); + Set dereferences = extractRowSubscripts(projectNode.getAssignments().expressions(), false); // Exclude dereferences on symbols being used in orderBy dereferences = dereferences.stream() diff --git a/core/trino-main/src/main/java/io/trino/sql/planner/iterative/rule/PushDownDereferencesThroughTopNRanking.java b/core/trino-main/src/main/java/io/trino/sql/planner/iterative/rule/PushDownDereferencesThroughTopNRanking.java index 39ff030f9a25..ba310e5028a7 100644 --- a/core/trino-main/src/main/java/io/trino/sql/planner/iterative/rule/PushDownDereferencesThroughTopNRanking.java +++ b/core/trino-main/src/main/java/io/trino/sql/planner/iterative/rule/PushDownDereferencesThroughTopNRanking.java @@ -78,7 +78,7 @@ public Result apply(ProjectNode projectNode, Captures captures, Context context) TopNRankingNode topNRankingNode = captures.get(CHILD); // Extract dereferences from project node assignments for pushdown - Set dereferences = extractRowSubscripts(projectNode.getAssignments().getExpressions(), false); + Set dereferences = extractRowSubscripts(projectNode.getAssignments().expressions(), false); // Exclude dereferences on symbols being used in partitionBy and orderBy DataOrganizationSpecification specification = topNRankingNode.getSpecification(); diff --git a/core/trino-main/src/main/java/io/trino/sql/planner/iterative/rule/PushDownDereferencesThroughWindow.java b/core/trino-main/src/main/java/io/trino/sql/planner/iterative/rule/PushDownDereferencesThroughWindow.java index d6d81f1888d8..f2df38dc8276 100644 --- a/core/trino-main/src/main/java/io/trino/sql/planner/iterative/rule/PushDownDereferencesThroughWindow.java +++ b/core/trino-main/src/main/java/io/trino/sql/planner/iterative/rule/PushDownDereferencesThroughWindow.java @@ -81,7 +81,7 @@ public Result apply(ProjectNode projectNode, Captures captures, Context context) // Extract dereferences for pushdown Set dereferences = extractRowSubscripts( ImmutableList.builder() - .addAll(projectNode.getAssignments().getExpressions()) + .addAll(projectNode.getAssignments().expressions()) // also include dereference projections used in window functions .addAll(windowNode.getWindowFunctions().values().stream() .flatMap(function -> function.getArguments().stream()) diff --git a/core/trino-main/src/main/java/io/trino/sql/planner/iterative/rule/PushLimitThroughProject.java b/core/trino-main/src/main/java/io/trino/sql/planner/iterative/rule/PushLimitThroughProject.java index f40a2d798e4e..f924b1b869c6 100644 --- a/core/trino-main/src/main/java/io/trino/sql/planner/iterative/rule/PushLimitThroughProject.java +++ b/core/trino-main/src/main/java/io/trino/sql/planner/iterative/rule/PushLimitThroughProject.java @@ -63,7 +63,7 @@ public Result apply(LimitNode parent, Captures captures, Context context) // Do not push down if the projection is made up of symbol references and exclusive dereferences. This prevents // undoing of PushDownDereferencesThroughLimit. We still push limit in the case of overlapping dereferences since // it enables PushDownDereferencesThroughLimit rule to push optimal dereferences. - Set projections = ImmutableSet.copyOf(projectNode.getAssignments().getExpressions()); + Set projections = ImmutableSet.copyOf(projectNode.getAssignments().expressions()); if (!extractRowSubscripts(projections, false).isEmpty() && exclusiveDereferences(projections)) { return Result.empty(); diff --git a/core/trino-main/src/main/java/io/trino/sql/planner/iterative/rule/PushPredicateThroughProjectIntoRowNumber.java b/core/trino-main/src/main/java/io/trino/sql/planner/iterative/rule/PushPredicateThroughProjectIntoRowNumber.java index ac2a56acc5ea..92b158673f04 100644 --- a/core/trino-main/src/main/java/io/trino/sql/planner/iterative/rule/PushPredicateThroughProjectIntoRowNumber.java +++ b/core/trino-main/src/main/java/io/trino/sql/planner/iterative/rule/PushPredicateThroughProjectIntoRowNumber.java @@ -102,7 +102,7 @@ public Result apply(FilterNode filter, Captures captures, Context context) RowNumberNode rowNumber = captures.get(ROW_NUMBER); Symbol rowNumberSymbol = rowNumber.getRowNumberSymbol(); - if (!project.getAssignments().getSymbols().contains(rowNumberSymbol)) { + if (!project.getAssignments().outputs().contains(rowNumberSymbol)) { return Result.empty(); } diff --git a/core/trino-main/src/main/java/io/trino/sql/planner/iterative/rule/PushPredicateThroughProjectIntoWindow.java b/core/trino-main/src/main/java/io/trino/sql/planner/iterative/rule/PushPredicateThroughProjectIntoWindow.java index 68af444a0823..b4715f108cec 100644 --- a/core/trino-main/src/main/java/io/trino/sql/planner/iterative/rule/PushPredicateThroughProjectIntoWindow.java +++ b/core/trino-main/src/main/java/io/trino/sql/planner/iterative/rule/PushPredicateThroughProjectIntoWindow.java @@ -113,7 +113,7 @@ public Result apply(FilterNode filter, Captures captures, Context context) WindowNode window = captures.get(WINDOW); Symbol rankingSymbol = getOnlyElement(window.getWindowFunctions().keySet()); - if (!project.getAssignments().getSymbols().contains(rankingSymbol)) { + if (!project.getAssignments().outputs().contains(rankingSymbol)) { return Result.empty(); } diff --git a/core/trino-main/src/main/java/io/trino/sql/planner/iterative/rule/PushProjectionThroughExchange.java b/core/trino-main/src/main/java/io/trino/sql/planner/iterative/rule/PushProjectionThroughExchange.java index ecc4ce3dfc1d..b8f9a8010d01 100644 --- a/core/trino-main/src/main/java/io/trino/sql/planner/iterative/rule/PushProjectionThroughExchange.java +++ b/core/trino-main/src/main/java/io/trino/sql/planner/iterative/rule/PushProjectionThroughExchange.java @@ -178,7 +178,7 @@ public Result apply(ProjectNode project, Captures captures, Context context) private static boolean isSymbolToSymbolProjection(ProjectNode project) { - return project.getAssignments().getExpressions().stream().allMatch(Reference.class::isInstance); + return project.getAssignments().expressions().stream().allMatch(Reference.class::isInstance); } private static Map mapExchangeOutputToInput(ExchangeNode exchange, int sourceIndex) diff --git a/core/trino-main/src/main/java/io/trino/sql/planner/iterative/rule/PushProjectionThroughJoin.java b/core/trino-main/src/main/java/io/trino/sql/planner/iterative/rule/PushProjectionThroughJoin.java index 661dec12e149..6644a669addc 100644 --- a/core/trino-main/src/main/java/io/trino/sql/planner/iterative/rule/PushProjectionThroughJoin.java +++ b/core/trino-main/src/main/java/io/trino/sql/planner/iterative/rule/PushProjectionThroughJoin.java @@ -48,7 +48,7 @@ public static Optional pushProjectionThroughJoin( Lookup lookup, PlanNodeIdAllocator planNodeIdAllocator) { - if (!projectNode.getAssignments().getExpressions().stream().allMatch(DeterminismEvaluator::isDeterministic)) { + if (!projectNode.getAssignments().expressions().stream().allMatch(DeterminismEvaluator::isDeterministic)) { return Optional.empty(); } @@ -97,10 +97,10 @@ else if (rightChild.getOutputSymbols().containsAll(symbols)) { Assignments leftAssignments = leftAssignmentsBuilder.build(); Assignments rightAssignments = rightAssignmentsBuilder.build(); - List leftOutputSymbols = leftAssignments.getOutputs().stream() + List leftOutputSymbols = leftAssignments.outputs().stream() .filter(ImmutableSet.copyOf(projectNode.getOutputSymbols())::contains) .collect(toImmutableList()); - List rightOutputSymbols = rightAssignments.getOutputs().stream() + List rightOutputSymbols = rightAssignments.outputs().stream() .filter(ImmutableSet.copyOf(projectNode.getOutputSymbols())::contains) .collect(toImmutableList()); diff --git a/core/trino-main/src/main/java/io/trino/sql/planner/iterative/rule/PushProjectionThroughUnion.java b/core/trino-main/src/main/java/io/trino/sql/planner/iterative/rule/PushProjectionThroughUnion.java index 699b696eff7d..76755a928001 100644 --- a/core/trino-main/src/main/java/io/trino/sql/planner/iterative/rule/PushProjectionThroughUnion.java +++ b/core/trino-main/src/main/java/io/trino/sql/planner/iterative/rule/PushProjectionThroughUnion.java @@ -90,7 +90,7 @@ public Result apply(ProjectNode parent, Captures captures, Context context) private static boolean nonTrivialProjection(ProjectNode project) { return !project.getAssignments() - .getExpressions().stream() + .expressions().stream() .allMatch(Reference.class::isInstance); } } diff --git a/core/trino-main/src/main/java/io/trino/sql/planner/iterative/rule/PushTopNThroughProject.java b/core/trino-main/src/main/java/io/trino/sql/planner/iterative/rule/PushTopNThroughProject.java index 2157f26c9036..77014d2c8b0f 100644 --- a/core/trino-main/src/main/java/io/trino/sql/planner/iterative/rule/PushTopNThroughProject.java +++ b/core/trino-main/src/main/java/io/trino/sql/planner/iterative/rule/PushTopNThroughProject.java @@ -79,7 +79,7 @@ public Result apply(TopNNode parent, Captures captures, Context context) // Do not push down if the projection is made up of symbol references and exclusive dereferences. This prevents // undoing of PushDownDereferencesThroughTopN. We still push topN in the case of overlapping dereferences since // it enables PushDownDereferencesThroughTopN rule to push optimal dereferences. - Set projections = ImmutableSet.copyOf(projectNode.getAssignments().getExpressions()); + Set projections = ImmutableSet.copyOf(projectNode.getAssignments().expressions()); if (!extractRowSubscripts(projections, false).isEmpty() && exclusiveDereferences(projections)) { return Result.empty(); diff --git a/core/trino-main/src/main/java/io/trino/sql/planner/optimizations/AddLocalExchanges.java b/core/trino-main/src/main/java/io/trino/sql/planner/optimizations/AddLocalExchanges.java index 2860f28d5e98..0433d544eab3 100644 --- a/core/trino-main/src/main/java/io/trino/sql/planner/optimizations/AddLocalExchanges.java +++ b/core/trino-main/src/main/java/io/trino/sql/planner/optimizations/AddLocalExchanges.java @@ -183,7 +183,7 @@ public PlanWithProperties visitProject(ProjectNode node, StreamPreferredProperti { // Special handling for trivial projections. Applies to identity and renaming projections, and constants // It might be extended to handle other low-cost projections. - if (node.getAssignments().getExpressions().stream().allMatch(expression -> expression instanceof Reference || expression instanceof Constant constant && constant.value() != null)) { + if (node.getAssignments().expressions().stream().allMatch(expression -> expression instanceof Reference || expression instanceof Constant constant && constant.value() != null)) { if (parentPreferences.isSingleStreamPreferred()) { // Do not enforce gathering exchange below project: // - if project's source is single stream, no exchanges will be added around project, diff --git a/core/trino-main/src/main/java/io/trino/sql/planner/optimizations/MetadataQueryOptimizer.java b/core/trino-main/src/main/java/io/trino/sql/planner/optimizations/MetadataQueryOptimizer.java index 37a4fcbf394e..906683e83105 100644 --- a/core/trino-main/src/main/java/io/trino/sql/planner/optimizations/MetadataQueryOptimizer.java +++ b/core/trino-main/src/main/java/io/trino/sql/planner/optimizations/MetadataQueryOptimizer.java @@ -195,7 +195,7 @@ private Optional findTableScan(PlanNode source) } else if (source instanceof ProjectNode project) { // verify projections are deterministic - if (!Iterables.all(project.getAssignments().getExpressions(), DeterminismEvaluator::isDeterministic)) { + if (!Iterables.all(project.getAssignments().expressions(), DeterminismEvaluator::isDeterministic)) { return Optional.empty(); } source = project.getSource(); diff --git a/core/trino-main/src/main/java/io/trino/sql/planner/optimizations/SymbolMapper.java b/core/trino-main/src/main/java/io/trino/sql/planner/optimizations/SymbolMapper.java index 406b1412c327..afde19899a81 100644 --- a/core/trino-main/src/main/java/io/trino/sql/planner/optimizations/SymbolMapper.java +++ b/core/trino-main/src/main/java/io/trino/sql/planner/optimizations/SymbolMapper.java @@ -58,6 +58,7 @@ import io.trino.sql.planner.rowpattern.ValuePointer; import io.trino.sql.planner.rowpattern.ir.IrLabel; +import java.util.Collection; import java.util.HashSet; import java.util.LinkedHashMap; import java.util.LinkedHashSet; @@ -140,7 +141,7 @@ public List map(List symbols) .collect(toImmutableList()); } - public List mapAndDistinct(List symbols) + public List mapAndDistinct(Collection symbols) { return symbols.stream() .map(this::map) diff --git a/core/trino-main/src/main/java/io/trino/sql/planner/optimizations/UnaliasSymbolReferences.java b/core/trino-main/src/main/java/io/trino/sql/planner/optimizations/UnaliasSymbolReferences.java index 00160c2ae78e..81cc1c2fa47c 100644 --- a/core/trino-main/src/main/java/io/trino/sql/planner/optimizations/UnaliasSymbolReferences.java +++ b/core/trino-main/src/main/java/io/trino/sql/planner/optimizations/UnaliasSymbolReferences.java @@ -847,7 +847,7 @@ public PlanAndMappings visitProject(ProjectNode node, UnaliasContext context) // Those symbols are supposed to represent constant semantics throughout the plan. Assignments assignments = node.getAssignments(); - Set newlyAssignedSymbols = assignments.filter(output -> !assignments.isIdentity(output)).getSymbols(); + Set newlyAssignedSymbols = assignments.filter(output -> !assignments.isIdentity(output)).outputs(); Set symbolsInSourceMapping = ImmutableSet.builder() .addAll(rewrittenSource.getMappings().keySet()) .addAll(rewrittenSource.getMappings().values()) diff --git a/core/trino-main/src/main/java/io/trino/sql/planner/plan/AggregationNode.java b/core/trino-main/src/main/java/io/trino/sql/planner/plan/AggregationNode.java index e8c7c4af5083..633942cc2247 100644 --- a/core/trino-main/src/main/java/io/trino/sql/planner/plan/AggregationNode.java +++ b/core/trino-main/src/main/java/io/trino/sql/planner/plan/AggregationNode.java @@ -31,6 +31,7 @@ import io.trino.sql.planner.Symbol; import io.trino.type.FunctionType; +import java.util.Collection; import java.util.List; import java.util.Map; import java.util.Objects; @@ -292,10 +293,10 @@ public boolean isStreamable() public static GroupingSetDescriptor globalAggregation() { - return singleGroupingSet(ImmutableList.of()); + return singleGroupingSet(ImmutableSet.of()); } - public static GroupingSetDescriptor singleGroupingSet(List groupingKeys) + public static GroupingSetDescriptor singleGroupingSet(Collection groupingKeys) { Set globalGroupingSets; if (groupingKeys.isEmpty()) { @@ -308,7 +309,7 @@ public static GroupingSetDescriptor singleGroupingSet(List groupingKeys) return new GroupingSetDescriptor(groupingKeys, 1, globalGroupingSets); } - public static GroupingSetDescriptor groupingSets(List groupingKeys, int groupingSetCount, Set globalGroupingSets) + public static GroupingSetDescriptor groupingSets(Collection groupingKeys, int groupingSetCount, Set globalGroupingSets) { return new GroupingSetDescriptor(groupingKeys, groupingSetCount, globalGroupingSets); } @@ -321,7 +322,7 @@ public static class GroupingSetDescriptor @JsonCreator public GroupingSetDescriptor( - @JsonProperty("groupingKeys") List groupingKeys, + @JsonProperty("groupingKeys") Collection groupingKeys, @JsonProperty("groupingSetCount") int groupingSetCount, @JsonProperty("globalGroupingSets") Set globalGroupingSets) { diff --git a/core/trino-main/src/main/java/io/trino/sql/planner/plan/Assignments.java b/core/trino-main/src/main/java/io/trino/sql/planner/plan/Assignments.java index 70d2bdde28d7..b48d82897ac2 100644 --- a/core/trino-main/src/main/java/io/trino/sql/planner/plan/Assignments.java +++ b/core/trino-main/src/main/java/io/trino/sql/planner/plan/Assignments.java @@ -15,8 +15,8 @@ import com.fasterxml.jackson.annotation.JsonCreator; import com.fasterxml.jackson.annotation.JsonProperty; -import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableMap; +import com.google.common.collect.ImmutableSet; import io.trino.sql.ir.Expression; import io.trino.sql.ir.Reference; import io.trino.sql.planner.Symbol; @@ -24,7 +24,6 @@ import java.util.Collection; import java.util.LinkedHashMap; -import java.util.List; import java.util.Map; import java.util.Map.Entry; import java.util.Set; @@ -92,9 +91,9 @@ public Assignments(@JsonProperty("assignments") Map assignme this.assignments = ImmutableMap.copyOf(requireNonNull(assignments, "assignments is null")); } - public List getOutputs() + public Set outputs() { - return ImmutableList.copyOf(assignments.keySet()); + return ImmutableSet.copyOf(assignments.keySet()); } public Assignments rewrite(Function rewrite) @@ -139,16 +138,11 @@ public boolean isIdentity() return true; } - public Collection getExpressions() + public Collection expressions() { return assignments.values(); } - public Set getSymbols() - { - return assignments.keySet(); - } - public Set> entrySet() { return assignments.entrySet(); diff --git a/core/trino-main/src/main/java/io/trino/sql/planner/plan/ProjectNode.java b/core/trino-main/src/main/java/io/trino/sql/planner/plan/ProjectNode.java index 853a5cf53abd..47b15a5d59e1 100644 --- a/core/trino-main/src/main/java/io/trino/sql/planner/plan/ProjectNode.java +++ b/core/trino-main/src/main/java/io/trino/sql/planner/plan/ProjectNode.java @@ -49,7 +49,7 @@ public ProjectNode(@JsonProperty("id") PlanNodeId id, @Override public List getOutputSymbols() { - return assignments.getOutputs(); + return ImmutableList.copyOf(assignments.outputs()); } @JsonProperty diff --git a/core/trino-main/src/main/java/io/trino/sql/planner/sanity/ValidateDependenciesChecker.java b/core/trino-main/src/main/java/io/trino/sql/planner/sanity/ValidateDependenciesChecker.java index c224979db597..9d6f1ccde763 100644 --- a/core/trino-main/src/main/java/io/trino/sql/planner/sanity/ValidateDependenciesChecker.java +++ b/core/trino-main/src/main/java/io/trino/sql/planner/sanity/ValidateDependenciesChecker.java @@ -448,7 +448,7 @@ public Void visitProject(ProjectNode node, Set boundSymbols) source.accept(this, boundSymbols); // visit child Set inputs = createInputs(source, boundSymbols); - for (Expression expression : node.getAssignments().getExpressions()) { + for (Expression expression : node.getAssignments().expressions()) { Set dependencies = extractUnique(expression); checkDependencies(inputs, dependencies, "Invalid node. Expression dependencies (%s) not in source plan output (%s)", dependencies, inputs); } diff --git a/core/trino-main/src/test/java/io/trino/cost/TestAggregationStatsRule.java b/core/trino-main/src/test/java/io/trino/cost/TestAggregationStatsRule.java index 016640833702..8e9276f58a55 100644 --- a/core/trino-main/src/test/java/io/trino/cost/TestAggregationStatsRule.java +++ b/core/trino-main/src/test/java/io/trino/cost/TestAggregationStatsRule.java @@ -176,7 +176,7 @@ public void testAggregationWithMoreGroupingSets() .aggregation(ab -> ab .addAggregation(pb.symbol("count_on_x", BIGINT), aggregation("count", ImmutableList.of(new Reference(BIGINT, "x"))), ImmutableList.of(BIGINT)) .addAggregation(pb.symbol("sum", BIGINT), aggregation("sum", ImmutableList.of(new Reference(BIGINT, "x"))), ImmutableList.of(BIGINT)) - .groupingSets(new AggregationNode.GroupingSetDescriptor(ImmutableList.of(pb.symbol("y"), pb.symbol("z")), 3, ImmutableSet.of(0))) + .groupingSets(new AggregationNode.GroupingSetDescriptor(ImmutableSet.of(pb.symbol("y"), pb.symbol("z")), 3, ImmutableSet.of(0))) .source(pb.values(pb.symbol("x", BIGINT), pb.symbol("y", BIGINT), pb.symbol("z", BIGINT))))) .withSourceStats(PlanNodeStatsEstimate.builder() .setOutputRowCount(100) diff --git a/core/trino-main/src/test/java/io/trino/sql/planner/assertions/StrictAssignedSymbolsMatcher.java b/core/trino-main/src/test/java/io/trino/sql/planner/assertions/StrictAssignedSymbolsMatcher.java index 45369671341c..63c2349c2e73 100644 --- a/core/trino-main/src/test/java/io/trino/sql/planner/assertions/StrictAssignedSymbolsMatcher.java +++ b/core/trino-main/src/test/java/io/trino/sql/planner/assertions/StrictAssignedSymbolsMatcher.java @@ -58,7 +58,7 @@ protected Set getExpectedSymbols(PlanNode node, Session session, Metadat public static Function> actualAssignments() { - return node -> ((ProjectNode) node).getAssignments().getSymbols(); + return node -> ((ProjectNode) node).getAssignments().outputs(); } public static Function> actualSubqueryAssignments() From 8723a23b7ce67f61495cb58d83ff3ae81c1a069d Mon Sep 17 00:00:00 2001 From: "Mateusz \"Serafin\" Gajewski" Date: Wed, 1 Oct 2025 15:32:46 +0200 Subject: [PATCH 12/12] Use initial empty cache map --- .../src/main/java/io/trino/cost/CachingCostProvider.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/trino-main/src/main/java/io/trino/cost/CachingCostProvider.java b/core/trino-main/src/main/java/io/trino/cost/CachingCostProvider.java index 7abcc9342f31..cc4900a8cdfa 100644 --- a/core/trino-main/src/main/java/io/trino/cost/CachingCostProvider.java +++ b/core/trino-main/src/main/java/io/trino/cost/CachingCostProvider.java @@ -38,7 +38,7 @@ public class CachingCostProvider private final Optional memo; private final Session session; - private final Map cache = new IdentityHashMap<>(); + private final Map cache = new IdentityHashMap<>(0); public CachingCostProvider(CostCalculator costCalculator, StatsProvider statsProvider, Session session) {