org.eigenbase.rel.rules
Class NestedLoopsJoinRule

java.lang.Object
  extended by org.eigenbase.relopt.RelOptRule
      extended by org.eigenbase.rel.rules.NestedLoopsJoinRule

public class NestedLoopsJoinRule
extends RelOptRule

Rule which converts a JoinRel into a CorrelatorRel, which can then be implemented using nested loops.

For example,

select * from emp join dept on emp.deptno = dept.deptno
becomes a CorrelatorRel which restarts TableAccessRel("DEPT") for each row read from TableAccessRel("EMP").

This rule is not applicable if for certain types of outer join. For example,

select * from emp right join dept on emp.deptno = dept.deptno
would require emitting a NULL emp row if a certain department contained no employees, and CorrelatorRel cannot do that.

Version:
$Id: //open/dev/farrago/src/org/eigenbase/rel/rules/NestedLoopsJoinRule.java#6 $
Author:
jhyde

Field Summary
static NestedLoopsJoinRule instance
           
 
Fields inherited from class org.eigenbase.relopt.RelOptRule
ANY, description, operands
 
Constructor Summary
private NestedLoopsJoinRule()
          Private constructor; use singleton instance.
 
Method Summary
 boolean matches(RelOptRuleCall call)
          Returns whether this rule could possibly match the given operands.
 void onMatch(RelOptRuleCall call)
          Receives notification about a rule match.
 
Methods inherited from class org.eigenbase.relopt.RelOptRule
convert, equals, equals, getOperand, getOperands, getOutConvention, getOutTrait, hashCode, mergeTraitsAndConvert, mergeTraitsAndConvert, toString
 
Methods inherited from class java.lang.Object
clone, finalize, getClass, notify, notifyAll, wait, wait, wait
 

Field Detail

instance

public static final NestedLoopsJoinRule instance
Constructor Detail

NestedLoopsJoinRule

private NestedLoopsJoinRule()
Private constructor; use singleton instance.

Method Detail

matches

public boolean matches(RelOptRuleCall call)
Description copied from class: RelOptRule
Returns whether this rule could possibly match the given operands.

This method is an opportunity to apply side-conditions to a rule. The RelOptPlanner calls this method after matching all operands of the rule, and before calling RelOptRule.onMatch(RelOptRuleCall).

In implementations of RelOptPlanner which may queue up a matched RelOptRuleCall for a long time before calling RelOptRule.onMatch(RelOptRuleCall), this method is beneficial because it allows the planner to discard rules earlier in the process.

The default implementation of this method returns true. It is acceptable for any implementation of this method to give a false positives, that is, to say that the rule matches the operands but have RelOptRule.onMatch(RelOptRuleCall) subsequently not generate any successors.

The following script is useful to identify rules which commonly produce no successors. You should override this method for these rules:

awk '
 /Apply rule/ {rule=$4; ruleCount[rule]++;}
 /generated 0 successors/ {ruleMiss[rule]++;}
 END {
   printf "%-30s %s %s\n", "Rule", "Fire", "Miss";
   for (i in ruleCount) {
     printf "%-30s %5d %5d\n", i, ruleCount[i], ruleMiss[i];
   }
 } ' FarragoTrace.log

Overrides:
matches in class RelOptRule
Parameters:
call - Rule call which has been determined to match all operands of this rule
Returns:
whether this RelOptRule matches a given RelOptRuleCall

onMatch

public void onMatch(RelOptRuleCall call)
Description copied from class: RelOptRule
Receives notification about a rule match. At the time that this method is called, call.rels holds the set of relational expressions which match the operands to the rule; call.rels[0] is the root expression.

Typically a rule would check that the nodes are valid matches, creates a new expression, then calls back RelOptRuleCall.transformTo(org.eigenbase.rel.RelNode) to register the expression.

Specified by:
onMatch in class RelOptRule
Parameters:
call - Rule call
See Also:
RelOptRule.matches(RelOptRuleCall)