|
|||||||||
PREV CLASS NEXT CLASS | FRAMES NO FRAMES | ||||||||
SUMMARY: NESTED | FIELD | CONSTR | METHOD | DETAIL: FIELD | CONSTR | METHOD |
java.lang.Object org.eigenbase.rel.rules.PushProjector
public class PushProjector
PushProjector is a utility class used to perform operations used in push projection rules.
Pushing is particularly interesting in the case of join, because there are multiple inputs. Generally an expression can be pushed down to a particular input if it depends upon no other inputs. If it can be pushed down to both sides, it is pushed down to the left.
Sometimes an expression needs to be split before it can be pushed down. To flag that an expression cannot be split, specify a rule that it must be preserved. Such an expression will be pushed down intact to one of the inputs, or not pushed down at all.
Nested Class Summary | |
---|---|
static interface |
PushProjector.ExprCondition
A functor that replies true or false for a given expression. |
private class |
PushProjector.InputSpecialOpFinder
Visitor which builds a bitmap of the inputs used by an expressions, as well as locating expressions corresponding to special operators. |
static class |
PushProjector.OperatorExprCondition
An expression condition that evaluates to true if the expression is a call to one of a set of operators. |
private class |
PushProjector.RefAndExprConverter
Walks an expression tree, replacing input refs with new values to reflect projection and converting special expressions to field references. |
Field Summary | |
---|---|
(package private) BitSet |
childBitmap
Bitmap containing the fields in the RelNode that the projection is being pushed past, if the RelNode is not a join. |
(package private) RelDataTypeField[] |
childFields
Fields from the RelNode that the projection is being pushed past |
(package private) List<RexNode> |
childPreserveExprs
Expressions referenced in the projection/filter that should be preserved. |
private RelNode |
childRel
|
(package private) int |
nChildFields
Number of fields in the RelNode that the projection is being pushed past |
(package private) int |
nFields
Number of fields in the RelNode that the projection is being pushed past, if the RelNode is not a join. |
(package private) int |
nFieldsRight
Number of fields in the right hand side of a join, in the case where the projection is being pushed past a join. |
(package private) int |
nProject
Number of fields being projected. |
(package private) int |
nRightProject
Number of fields being projected from the right hand side of a join, in the case where the projection is being pushed past a join. |
private int |
nSysFields
Number of system fields. |
(package private) int |
nSystemProject
Number of system fields being projected. |
private RexNode |
origFilter
|
private ProjectRel |
origProj
|
(package private) RexNode[] |
origProjExprs
Original projection expressions |
private PushProjector.ExprCondition |
preserveExprCondition
|
(package private) BitSet |
projRefs
Bitmap containing the references in the original projection |
(package private) RexBuilder |
rexBuilder
Rex builder used to create new expressions. |
(package private) BitSet |
rightBitmap
Bitmap containing the fields in the right hand side of a join, in the case where the projection is being pushed past a join. |
(package private) List<RexNode> |
rightPreserveExprs
Expressions referenced in the projection/filter that should be preserved, corresponding to expressions on the right hand side of the join, if the projection is being pushed past a join. |
Constructor Summary | |
---|---|
PushProjector(ProjectRel origProj,
RexNode origFilter,
RelNode childRel,
PushProjector.ExprCondition preserveExprCondition)
Creates a PushProjector object for pushing projects past a RelNode. |
Method Summary | |
---|---|
ProjectRel |
convertProject(RexNode defaultExpr)
Decomposes a projection to the input references referenced by a projection and a filter, either of which is optional. |
RexNode |
convertRefsAndExprs(RexNode rex,
RelDataTypeField[] destFields,
int[] adjustments)
Clones an expression tree and walks through it, adjusting each RexInputRef index by some amount, and converting expressions that need to be preserved to field references. |
ProjectRel |
createNewProject(RelNode projChild,
int[] adjustments)
Creates a new projection based on the original projection, adjusting all input refs using an adjustment array passed in. |
ProjectRel |
createProjectRefsAndExprs(RelNode projChild,
boolean adjust,
boolean rightSide)
Creates a projection based on the inputs specified in a bitmap and the expressions that need to be preserved. |
int[] |
getAdjustments()
Determines how much each input reference needs to be adjusted as a result of projection |
boolean |
locateAllRefs()
Locates all references found in either the projection expressions a filter, as well as references to expressions that should be preserved. |
Methods inherited from class java.lang.Object |
---|
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait |
Field Detail |
---|
private final ProjectRel origProj
private final RexNode origFilter
private final RelNode childRel
private final PushProjector.ExprCondition preserveExprCondition
final RexNode[] origProjExprs
final RelDataTypeField[] childFields
final int nChildFields
final BitSet projRefs
final BitSet childBitmap
BitSet rightBitmap
final int nFields
The identity
nChildFields == nSysFields + nFields + nFieldsRight
holds. nFields
does not include nSysFields
.
The output of a join looks like this:
The output of a single-input rel looks like this:| nSysFields | nFields | nFieldsRight |
| nSysFields | nFields |
final int nFieldsRight
private final int nSysFields
final List<RexNode> childPreserveExprs
final List<RexNode> rightPreserveExprs
int nSystemProject
int nProject
int nRightProject
final RexBuilder rexBuilder
Constructor Detail |
---|
public PushProjector(ProjectRel origProj, RexNode origFilter, RelNode childRel, PushProjector.ExprCondition preserveExprCondition)
origProj
- the original projection that is being pushed; may be null
if the projection is implied as a result of a projection having been
trivially removedorigFilter
- the filter that the projection must also be pushed
past, if applicablechildRel
- the RelNode that the projection is being pushed pastpreserveExprCondition
- condition for whether an expression should
be preserved in the projectionMethod Detail |
---|
public ProjectRel convertProject(RexNode defaultExpr)
Creates a projection containing all input references as well as preserving any special expressions. Converts the original projection and/or filter to reference the new projection. Then, finally puts on top, a final projection corresponding to the original projection.
defaultExpr
- expression to be used in the projection if no fields
or special columns are selected
public boolean locateAllRefs()
public ProjectRel createProjectRefsAndExprs(RelNode projChild, boolean adjust, boolean rightSide)
projChild
- child that the projection will be created on top ofadjust
- if true, need to create new projection expressions;
otherwise, the existing ones are reusedrightSide
- if true, creating a projection for the right hand side
of a join
public int[] getAdjustments()
public RexNode convertRefsAndExprs(RexNode rex, RelDataTypeField[] destFields, int[] adjustments)
rex
- the expressiondestFields
- fields that the new expressions will be referencingadjustments
- the amount each input reference index needs to be
adjusted by
public ProjectRel createNewProject(RelNode projChild, int[] adjustments)
projChild
- child of the new projectadjustments
- array indicating how much each input reference should
be adjusted by
|
|||||||||
PREV CLASS NEXT CLASS | FRAMES NO FRAMES | ||||||||
SUMMARY: NESTED | FIELD | CONSTR | METHOD | DETAIL: FIELD | CONSTR | METHOD |