Class TransformCorrelatedGlobalAggregationWithoutProjection

  • All Implemented Interfaces:
    Rule<CorrelatedJoinNode>

    public class TransformCorrelatedGlobalAggregationWithoutProjection
    extends Object
    implements Rule<CorrelatedJoinNode>
    This rule decorrelates a correlated subquery with: - single global aggregation, or - global aggregation over distinct operator (grouped aggregation with no aggregation assignments) It is similar to TransformCorrelatedGlobalAggregationWithProjection rule, but does not support projection over aggregation in the subquery

    In the case of single aggregation, it transforms:

     - CorrelatedJoin LEFT or INNER (correlation: [c], filter: true, output: a, count, agg)
          - Input (a, c)
          - Aggregation global
            count <- count(*)
            agg <- agg(b)
               - Source (b) with correlated filter (b > c)
     
    Into:
     - Project (a <- a, count <- count, agg <- 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, count, agg)
          - Input (a, c)
          - Aggregation global
            count <- count(*)
            agg <- agg(b)
               - Aggregation "distinct operator" group by [b]
                    - Source (b) with correlated filter (b > c)
     
    Into:
     - Project (a <- a, count <- count, agg <- 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