Class ExpandDisjunctionForTableRule

All Implemented Interfaces:
TransformationRule

@Enclosing public class ExpandDisjunctionForTableRule extends RelRule<ExpandDisjunctionForTableRule.Config> implements TransformationRule
Rule to expand disjunction for single table in condition of a Filter or Join, It makes sense to make this optimization part of the predicate pushdown. For example:

 select t1.name from t1, t2
 where t1.id = t2.id
 and (
  (t1.id > 20 and t2.height < 50)
  or
  (t1.weight < 200 and t2.sales > 100)
 )
 

we can expand to obtain the condition


 select t1.name from t1, t2
 where t1.id = t2.id
 and (
  (t1.id > 20 and t2.height < 50)
  or
  (t1.weight < 200 and t2.sales > 100)
 )
 and (t1.id > 20 or t1.weight < 200)
 and (t2.height < 50 or t2.sales > 100)
 

new generated predicates are redundant, but they could be pushed down to scan operator of t1/t2 and reduce the cardinality.

Note: This rule should only be applied once and it should be used before CoreRules.FILTER_INTO_JOIN and CoreRules.JOIN_CONDITION_PUSH. In order to avoid it interacting with other expression-related rules and causing an infinite loop, it is recommended to use it alone in HepPlanner first, and then do predicate pushdown.

See Also: