net.sf.farrago.query
Class FennelToIteratorConverter
java.lang.Object
org.eigenbase.rel.AbstractRelNode
org.eigenbase.rel.SingleRel
org.eigenbase.rel.convert.ConverterRelImpl
net.sf.farrago.query.FennelToIteratorConverter
- All Implemented Interfaces:
- Cloneable, JavaRel, ConverterRel, RelNode
public class FennelToIteratorConverter
- extends ConverterRelImpl
- implements JavaRel, ConverterRel
FennelToIteratorConverter is a Converter from the Fennel calling convention
to the iterator calling convention
.
Every FennelToIteratorConverter exists in one of two locations. Location 1
means the converter is one of N roots of a sequence of JavaRels that are read
by FarragoResultSetIterator or FarragoResultSetTupleIter. Location 2 means
the converter is one of the N roots of a sequence of JavaRels that are
converted back to Fennel convention by an IteratorToFennelConverter. These
locations are handled differently:
- When in location 1, it generates Iterator convention code that reads from
its child FennelRel, blocking when the FennelRel has no data. (This is
identical to the behavior for old-style iterators.)
- When in location 2, it generates Iterator convention code that reads from
its child FennelRel, but returns
TupleIter.NoDataReason.UNDERFLOW
when the FennelRel
has no data. In addition, the generated code is not encapsulated in a method
and returned to the caller of implement(JavaRelImplementor)
. Instead
it's registered with the FarragoRelImplementor
for later compilation.
In addition, the stream def generated for child FennelRels is stored for
later use by IteratorToFennelConverter.
REVIEW: SWZ 3/7/2006: It would be nice if this could be split into two
converters. One for Location 1 and another for Location 2. This would
simplify the code and make it easier to understand. Not sure if the planner
can handle two converters from Fennel to Iterator that need to be used under
different circumstances, though.
- Version:
- $Id: //open/dev/farrago/src/net/sf/farrago/query/FennelToIteratorConverter.java#42 $
- Author:
- John V. Sichi
Methods inherited from class org.eigenbase.rel.AbstractRelNode |
cloneTraits, collectVariablesSet, collectVariablesUsed, computeDigest, getChildExps, getCluster, getCollationList, getConvention, getCorrelVariable, getDescription, getDigest, getExpectedInputRowType, getId, getInput, getOrCreateCorrelVariable, getQuery, getRelTypeName, getRowType, getTable, getTraits, getVariablesStopped, inheritTraitsFrom, isAccessTo, isValid, onRegister, recomputeDigest, registerCorrelVariable, setCorrelVariable, toString |
Methods inherited from interface org.eigenbase.rel.RelNode |
childrenAccept, collectVariablesSet, collectVariablesUsed, computeSelfCost, explain, getChildExps, getCluster, getCollationList, getConvention, getCorrelVariable, getDescription, getDigest, getExpectedInputRowType, getId, getInput, getInputs, getOrCreateCorrelVariable, getQuery, getRelTypeName, getRows, getRowType, getTable, getTraits, getVariablesStopped, isAccessTo, isDistinct, isValid, onRegister, recomputeDigest, registerCorrelVariable, replaceInput, setCorrelVariable |
Methods inherited from interface org.eigenbase.rel.RelNode |
childrenAccept, collectVariablesSet, collectVariablesUsed, computeSelfCost, explain, getChildExps, getCluster, getCollationList, getConvention, getCorrelVariable, getDescription, getDigest, getExpectedInputRowType, getId, getInput, getInputs, getOrCreateCorrelVariable, getQuery, getRelTypeName, getRows, getRowType, getTable, getTraits, getVariablesStopped, isAccessTo, isDistinct, isValid, onRegister, recomputeDigest, registerCorrelVariable, replaceInput, setCorrelVariable |
Rule
public static final ConverterRule Rule
- The singleton rule which uses a
FennelToIteratorConverter
to
convert a RelNode
from FennelRel.FENNEL_EXEC_CONVENTION
convention to CallingConvention.ITERATOR
convention.
FennelToIteratorConverter
public FennelToIteratorConverter(RelOptCluster cluster,
RelNode child)
- Creates a new FennelToIteratorConverter object.
- Parameters:
cluster
- RelOptCluster for this relchild
- input rel producing rows in Fennel TupleStream
representation
clone
public FennelToIteratorConverter clone()
- Description copied from interface:
RelNode
- Clones this RelNode.
Traits of the RelNode must be explicitly cloned, using AbstractRelNode.inheritTraitsFrom(AbstractRelNode)
, as the RelNode may
have traits of which it has no knowledge. Example implementation:
public MyRelNode clone()
{
MyRelNode clone = new MyRelNode(...);
clone.inheritTraitsFrom(this);
return clone;
}
N.B.: This method must be overridden whenever an existing,
concrete RelNode is extended. Otherwise, calling clone() will produce a
differently typed RelNode, resulting in invalid or incorrect query plans.
- Specified by:
clone
in interface RelNode
- Specified by:
clone
in class AbstractRelNode
- Returns:
- a clone of this RelNode
implement
public ParseTree implement(JavaRelImplementor implementor)
- Description copied from interface:
JavaRel
- Creates a plan for this expression according to a calling convention.
- Specified by:
implement
in interface JavaRel
- Parameters:
implementor
- implementor
childToStreamDef
protected FemExecutionStreamDef childToStreamDef(FennelRelImplementor implementor)
- Converts the child relational expression (which is in Fennel convention)
into a
FemExecutionStreamDef
.
Derived classes may override this method.
- Parameters:
implementor
- Context for the implementation process
- Returns:
- stream definition
isTransformerInput
protected boolean isTransformerInput(JavaRelImplementor implementor)
- Determines whether this FennelToIteratorConverter is an input to a
FarragoTransform. In other words, is one of the ancestors to this rel an
IteratorToFennelConverter (without an intervening FarragoJavaUdxRel).
- Parameters:
implementor
- implementor in use
- Returns:
- true if this rel is an input to a FarragoTransform, false
otherwise
registerChildWithAncestor
protected final void registerChildWithAncestor(JavaRelImplementor implementor,
FemExecutionStreamDef streamDef,
boolean implicit)
register
public static void register(RelOptPlanner planner)
- Registers this relational expression and rule(s) with the planner, as per
AbstractRelNode.register(org.eigenbase.relopt.RelOptPlanner)
.
- Parameters:
planner
- Planner