Class RelOptPredicateList


public class RelOptPredicateList extends Object
Predicates that are known to hold in the output of a particular relational expression.

Pulled up predicates (field pulledUpPredicates are predicates that apply to every row output by the relational expression. They are inferred from the input relational expression(s) and the relational operator.

For example, if you apply Filter(x > 1) to a relational expression that has a predicate y < 10 then the pulled up predicates for the Filter are [y < 10, x > 1].

Inferred predicates only apply to joins. If there there is a predicate on the left input to a join, and that predicate is over columns used in the join condition, then a predicate can be inferred on the right input to the join. (And vice versa.)

For example, in the query

FROM emp
JOIN dept ON emp.deptno = dept.deptno WHERE emp.gender = 'F' AND emp.deptno < 10
we have
  • left: Filter(Scan(EMP), deptno < 10, predicates: [deptno < 10]
  • right: Scan(DEPT), predicates: []
  • join: Join(left, right, emp.deptno = dept.deptno, leftInferredPredicates: [], rightInferredPredicates: [deptno < 10], pulledUpPredicates: [emp.gender = 'F', emp.deptno < 10, emp.deptno = dept.deptno, dept.deptno < 10]

Note that the predicate from the left input appears in rightInferredPredicates. Predicates from several sources appear in pulledUpPredicates.

  • Field Details

    • EMPTY

      public static final RelOptPredicateList EMPTY
    • pulledUpPredicates

      public final<RexNode> pulledUpPredicates
      Predicates that can be pulled up from the relational expression and its inputs.
    • leftInferredPredicates

      public final<RexNode> leftInferredPredicates
      Predicates that were inferred from the right input. Empty if the relational expression is not a join.
    • rightInferredPredicates

      public final<RexNode> rightInferredPredicates
      Predicates that were inferred from the left input. Empty if the relational expression is not a join.
    • constantMap

      public final<RexNode,RexNode> constantMap
      A map of each (e, constant) pair that occurs within pulledUpPredicates.
  • Method Details

    • of

      public static RelOptPredicateList of(RexBuilder rexBuilder, Iterable<RexNode> pulledUpPredicates)
      Creates a RelOptPredicateList with only pulled-up predicates, no inferred predicates.

      Use this for relational expressions other than joins.

      pulledUpPredicates - Predicates that apply to the rows returned by the relational expression
    • isEmpty

      public static boolean isEmpty(@Nullable RelOptPredicateList value)
      Returns true if given predicate list is empty.
      value - input predicate list
      true if all the predicates are empty or if the argument is null
    • of

      public static RelOptPredicateList of(RexBuilder rexBuilder, Iterable<RexNode> pulledUpPredicates, Iterable<RexNode> leftInferredPredicates, Iterable<RexNode> rightInferredPredicates)
      Creates a RelOptPredicateList for a join.
      rexBuilder - Rex builder
      pulledUpPredicates - Predicates that apply to the rows returned by the relational expression
      leftInferredPredicates - Predicates that were inferred from the right input
      rightInferredPredicates - Predicates that were inferred from the left input
    • toString

      public String toString()
      toString in class Object
    • union

      public RelOptPredicateList union(RexBuilder rexBuilder, RelOptPredicateList list)
    • shift

      public RelOptPredicateList shift(RexBuilder rexBuilder, int offset)
    • isEffectivelyNotNull

      public boolean isEffectivelyNotNull(RexNode e)
      Returns whether an expression is effectively NOT NULL due to an e IS NOT NULL condition in this predicate list.