Class IntersectToDistinctRule


  • public class IntersectToDistinctRule
    extends RelOptRule
    Planner rule that translates a distinct Intersect (all = false) into a group of operators composed of Union, Aggregate, etc.

    Rewrite: (GB-Union All-GB)-GB-UDTF (on all attributes)

    Example

    Query: R1 Intersect All R2

    R3 = GB(R1 on all attributes, count(*) as c)
    union all
    GB(R2 on all attributes, count(*) as c)

    R4 = GB(R3 on all attributes, count(c) as cnt, min(c) as m)

    Note that we do not need min(c) in intersect distinct.

    R5 = Filter(cnt == #branch)

    If it is intersect all then

    R6 = UDTF (R5) which will explode the tuples based on min(c)
    R7 = Project(R6 on all attributes)

    Else

    R6 = Proj(R5 on all attributes)

    See Also:
    UnionToDistinctRule