Class IntersectToDistinctRule

All Implemented Interfaces:
TransformationRule

@Enclosing public class IntersectToDistinctRule extends RelRule<IntersectToDistinctRule.Config> implements TransformationRule
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: