Class TransformCorrelatedGroupedAggregationWithProjection

java.lang.Object
io.trino.sql.planner.iterative.rule.TransformCorrelatedGroupedAggregationWithProjection
All Implemented Interfaces:
Rule<CorrelatedJoinNode>

public class TransformCorrelatedGroupedAggregationWithProjection extends Object implements Rule<CorrelatedJoinNode>
This rule decorrelates a correlated subquery of INNER correlated join with: - single grouped aggregation, or - grouped aggregation over distinct operator (grouped aggregation with no aggregation assignments), in case when the distinct operator cannot be de-correlated by PlanNodeDecorrelator

In the case of single aggregation, it transforms:

 - CorrelatedJoin INNER (correlation: [c], filter: true, output: a, count, agg)
      - Input (a, c)
      - Project (x invalid input: '<'- f(count), y invalid input: '<'- f'(agg))
           - Aggregation (group by b)
             count invalid input: '<'- count(*)
             agg invalid input: '<'- agg(d)
                - Source (b, d) with correlated filter (b > c)
 
Into:
 - Project (a invalid input: '<'- a, x invalid input: '<'- f(count), y invalid input: '<'- f'(agg))
      - Aggregation (group by [a, c, unique, b])
        count invalid input: '<'- count(*)
        agg invalid input: '<'- agg(d)
           - INNER join (filter: b > c)
                - UniqueId (unique)
                     - Input (a, c)
                - Source (b, d) decorrelated
 

In the case of grouped aggregation over distinct operator, it transforms:

 - CorrelatedJoin INNER (correlation: [c], filter: true, output: a, count, agg)
      - Input (a, c)
      - Project (x invalid input: '<'- f(count), y invalid input: '<'- f'(agg))
           - Aggregation (group by b)
             count invalid input: '<'- count(*)
             agg invalid input: '<'- agg(b)
                - Aggregation "distinct operator" group by [b]
                     - Source (b) with correlated filter (b > c)
 
Into:
 - Project (a invalid input: '<'- a, x invalid input: '<'- f(count), y invalid input: '<'- f'(agg))
      - Aggregation (group by [a, c, unique, b])
        count invalid input: '<'- count(*)
        agg invalid input: '<'- agg(b)
           - Aggregation "distinct operator" group by [a, c, unique, b]
                - INNER join (filter: b > c)
                     - UniqueId (unique)
                          - Input (a, c)
                     - Source (b) decorrelated