Class SetOpToFilterRule

All Implemented Interfaces:
TransformationRule

@Enclosing public class SetOpToFilterRule extends RelRule<SetOpToFilterRule.Config> implements TransformationRule
Rule that replaces SetOp operator with Filter when both inputs are from the same source with only filter conditions differing. For nested filters, the rule CoreRules.FILTER_MERGE should be used prior to invoking this one.

Example:

UNION

 SELECT mgr, comm FROM emp WHERE mgr = 12
 UNION
 SELECT mgr, comm FROM emp WHERE comm = 5

 is rewritten to

 SELECT DISTINCT mgr, comm FROM emp
 WHERE mgr = 12 OR comm = 5
 

UNION with multiple inputs

 SELECT deptno FROM emp WHERE deptno = 12
 UNION
 SELECT deptno FROM dept WHERE deptno = 5
 UNION
 SELECT deptno FROM emp WHERE deptno = 6
 UNION
 SELECT deptno FROM dept WHERE deptno = 10

 is rewritten to

 SELECT deptno FROM emp WHERE deptno = 12 OR deptno = 6
 UNION
 SELECT deptno FROM dept WHERE deptno = 5 OR deptno = 10
 

INTERSECT

 SELECT mgr, comm FROM emp WHERE mgr = 12
 INTERSECT
 SELECT mgr, comm FROM emp WHERE comm = 5

 is rewritten to

 SELECT DISTINCT mgr, comm FROM emp
 WHERE mgr = 12 AND comm = 5
 

EXCEPT

 SELECT mgr, comm FROM emp WHERE mgr = 12
 EXCEPT
 SELECT mgr, comm FROM emp WHERE comm = 5

 is rewritten to

 SELECT DISTINCT mgr, comm FROM emp
 WHERE mgr = 12 AND NOT(comm = 5)