Class TransformCorrelatedGlobalAggregationWithProjection

  • All Implemented Interfaces:
    Rule<CorrelatedJoinNode>

    public class TransformCorrelatedGlobalAggregationWithProjection
    extends Object
    implements Rule<CorrelatedJoinNode>
    This rule decorrelates a correlated subquery of LEFT or INNER correlated join with: - single global aggregation, or - global aggregation over distinct operator (grouped aggregation with no aggregation assignments)

    In the case of single aggregation, it transforms:

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

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

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