|
|||||||||
PREV CLASS NEXT CLASS | FRAMES NO FRAMES | ||||||||
SUMMARY: NESTED | FIELD | CONSTR | METHOD | DETAIL: FIELD | CONSTR | METHOD |
java.lang.Object org.eigenbase.rex.RexProgramBuilder
public class RexProgramBuilder
Workspace for constructing a RexProgram
.
RexProgramBuilder is necessary because a RexProgram
is immutable.
(The String
class has the same problem: it is immutable, so they
introduced StringBuffer
.)
RexProgramBuilder
Nested Class Summary | |
---|---|
private class |
RexProgramBuilder.RegisterInputShuttle
Shuttle which walks over an expression, registering each sub-expression. |
private class |
RexProgramBuilder.RegisterMidputShuttle
Extension to RexProgramBuilder.RegisterInputShuttle which allows expressions to be
in terms of inputs or previous common sub-expressions. |
private class |
RexProgramBuilder.RegisterOutputShuttle
Shuttle which walks over an expression, registering each sub-expression. |
private class |
RexProgramBuilder.RegisterShuttle
|
private class |
RexProgramBuilder.UpdateRefShuttle
Shuttle which rewires RexLocalRef using a list of updated
references |
private class |
RexProgramBuilder.UsageVisitor
Visitor which marks which expressions are used. |
Field Summary | |
---|---|
private RexLocalRef |
conditionRef
|
private List<RexNode> |
exprList
|
private Map<String,RexLocalRef> |
exprMap
|
private RelDataType |
inputRowType
|
private List<RexLocalRef> |
localRefList
|
private List<String> |
projectNameList
|
private List<RexLocalRef> |
projectRefList
|
private RexBuilder |
rexBuilder
|
private boolean |
validating
|
Constructor Summary | |
---|---|
|
RexProgramBuilder(RelDataType inputRowType,
RexBuilder rexBuilder)
Creates a program-builder. |
private |
RexProgramBuilder(RexBuilder rexBuilder,
RelDataType inputRowType,
List<RexNode> exprList,
List<RexLocalRef> projectRefList,
RexLocalRef conditionRef,
RelDataType outputRowType)
Creates a program builder with the same contents as a program. |
Method Summary | |
---|---|
private void |
add(List<RexNode> exprList,
List<RexLocalRef> projectRefList,
RexLocalRef conditionRef,
RelDataType outputRowType,
RexShuttle shuttle,
boolean updateRefs)
Adds a set of expressions, projections and filters, applying a shuttle first. |
void |
addCondition(RexNode expr)
Sets the condition of the program. |
RexLocalRef |
addExpr(RexNode expr)
Adds an expression to the list of common expressions, and returns a reference to the expression. |
void |
addIdentity()
Adds a project item for every input field. |
RexLocalRef |
addProject(int at,
int ordinal,
String name)
Adds a projection based upon the index th expression at a
given position. |
RexLocalRef |
addProject(int at,
RexNode expr,
String name)
Adds a project expression to the program at a given position. |
RexLocalRef |
addProject(int ordinal,
String name)
Adds a projection based upon the index th expression. |
RexLocalRef |
addProject(RexNode expr,
String name)
Adds a project expression to the program. |
private static boolean |
assertionsAreEnabled()
Returns whether assertions are enabled in this class. |
void |
clearProjects()
Removes all project items. |
static RexProgramBuilder |
create(RexBuilder rexBuilder,
RelDataType inputRowType,
List<RexNode> exprList,
List<RexLocalRef> projectRefList,
RexLocalRef conditionRef,
RelDataType outputRowType)
Creates a program builder with the same contents as a program. |
static RexProgramBuilder |
create(RexBuilder rexBuilder,
RelDataType inputRowType,
List<RexNode> exprList,
List<RexLocalRef> projectRefList,
RexLocalRef conditionRef,
RelDataType outputRowType,
RexShuttle shuttle,
boolean updateRefs)
Creates a program builder with the same contents as a program, applying a shuttle first. |
void |
eliminateUnused()
Eliminate unused expressions. |
static RexProgramBuilder |
forProgram(RexProgram program,
RexBuilder rexBuilder)
Creates a program builder and initializes it from an existing program. |
private void |
generateMissingNames()
|
RelDataType |
getInputRowType()
Returns the rowtype of the input to the program |
RexProgram |
getProgram()
Converts the state of the program builder to an immutable program. |
List<RexLocalRef> |
getProjectList()
Returns the list of project expressions. |
RexLocalRef |
makeInputRef(int index)
Creates a reference to a given input field |
static RexProgram |
mergePrograms(RexProgram topProgram,
RexProgram bottomProgram,
RexBuilder rexBuilder)
Merges two programs together. |
RexLocalRef |
registerInput(RexNode expr)
Registers an expression in the list of common sub-expressions, and returns a reference to that expression. |
private RexLocalRef |
registerInternal(RexNode expr,
boolean force)
Registers an expression in the list of common sub-expressions, and returns a reference to that expression. |
RexLocalRef |
registerOutput(RexNode expr)
Converts an expression expressed in terms of the outputs of this program into an expression expressed in terms of the inputs, registers it in the list of common sub-expressions, and returns a reference to that expression. |
private List<RexLocalRef> |
registerProjectsAndCondition(RexProgram program)
|
private void |
validate(RexNode expr,
int fieldOrdinal)
|
Methods inherited from class java.lang.Object |
---|
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait |
Field Detail |
---|
private final RexBuilder rexBuilder
private final RelDataType inputRowType
private final List<RexNode> exprList
private final Map<String,RexLocalRef> exprMap
private final List<RexLocalRef> localRefList
private final List<RexLocalRef> projectRefList
private final List<String> projectNameList
private RexLocalRef conditionRef
private boolean validating
Constructor Detail |
---|
public RexProgramBuilder(RelDataType inputRowType, RexBuilder rexBuilder)
private RexProgramBuilder(RexBuilder rexBuilder, RelDataType inputRowType, List<RexNode> exprList, List<RexLocalRef> projectRefList, RexLocalRef conditionRef, RelDataType outputRowType)
rexBuilder
- Rex builderinputRowType
- Input row typeexprList
- Common expressionsprojectRefList
- ProjectionsconditionRef
- Condition, or nulloutputRowType
- Output row typeMethod Detail |
---|
private static boolean assertionsAreEnabled()
private void validate(RexNode expr, int fieldOrdinal)
public RexLocalRef addProject(RexNode expr, String name)
The expression specified in terms of the input fields. If not, call
registerOutput(RexNode)
first.
expr
- Expression to addname
- Name of field in output row type; if null, a unique name will
be generated when the program is created
public RexLocalRef addProject(int ordinal, String name)
index
th expression.
ordinal
- Index of expression to projectname
-
public RexLocalRef addProject(int at, RexNode expr, String name)
The expression specified in terms of the input fields. If not, call
registerOutput(RexNode)
first.
at
- Position in project list to add expressionexpr
- Expression to addname
- Name of field in output row type; if null, a unique name will
be generated when the program is created
public RexLocalRef addProject(int at, int ordinal, String name)
index
th expression at a
given position.
at
- Position in project list to add expressionordinal
- Index of expression to projectname
-
public void addCondition(RexNode expr)
registerOutput(RexNode)
first.
public RexLocalRef registerInput(RexNode expr)
public RexLocalRef registerOutput(RexNode expr)
expr
- Expression to registerprivate RexLocalRef registerInternal(RexNode expr, boolean force)
If an equivalent sub-expression already exists, creates another
expression only if force
is true.
expr
- Expression to registerforce
- Whether to create a new sub-expression if an equivalent
sub-expression exists.public RexLocalRef addExpr(RexNode expr)
expr
- Expression
public RexProgram getProgram()
It is OK to call this method, modify the program specification (by adding projections, and so forth), and call this method again.
private void generateMissingNames()
public static RexProgramBuilder forProgram(RexProgram program, RexBuilder rexBuilder)
Calling getProgram()
immediately after creation will return a
program equivalent (in terms of external behavior) to the existing
program.
The existing program will not be changed. (It cannot: programs are immutable.)
program
- Existing programrexBuilder
- Rex builder
public static RexProgramBuilder create(RexBuilder rexBuilder, RelDataType inputRowType, List<RexNode> exprList, List<RexLocalRef> projectRefList, RexLocalRef conditionRef, RelDataType outputRowType)
rexBuilder
- Rex builderinputRowType
- Input row typeexprList
- Common expressionsprojectRefList
- ProjectionsconditionRef
- Condition, or nulloutputRowType
- Output row type
public static RexProgramBuilder create(RexBuilder rexBuilder, RelDataType inputRowType, List<RexNode> exprList, List<RexLocalRef> projectRefList, RexLocalRef conditionRef, RelDataType outputRowType, RexShuttle shuttle, boolean updateRefs)
TODO: Refactor the above create method in terms of this one.
rexBuilder
- Rex builderinputRowType
- Input row typeexprList
- Common expressionsprojectRefList
- ProjectionsconditionRef
- Condition, or nulloutputRowType
- Output row typeshuttle
- Shuttle to apply to each expression before adding it to
the program builderupdateRefs
- Whether to update references that changes as a result
of rewrites made by the shuttle
private void add(List<RexNode> exprList, List<RexLocalRef> projectRefList, RexLocalRef conditionRef, RelDataType outputRowType, RexShuttle shuttle, boolean updateRefs)
exprList
- Common expressionsprojectRefList
- ProjectionsconditionRef
- Condition, or nulloutputRowType
- Output row typeshuttle
- Shuttle to apply to each expression before adding it to
the program builderupdateRefs
- Whether to update references that changes as a result
of rewrites made by the shuttlepublic void eliminateUnused()
public static RexProgram mergePrograms(RexProgram topProgram, RexProgram bottomProgram, RexBuilder rexBuilder)
All expressions become common sub-expressions. For example, the query
SELECT x + 1 AS p, x + y AS q FROM (
SELECT a + b AS x, c AS y
FROM t
WHERE c = 6)
would be represented as the programs
Calc: Projects={$2, $3}, Condition=null, Exprs={$0, $1, $0 + 1, $0 + $1}) Calc( Projects={$3, $2}, Condition={$4} Exprs={$0, $1, $2, $0 + $1, $2 = 6}
The merged program is
Calc( Projects={$4, $5} Condition=$6 Exprs={0: $0 // a 1: $1 // b 2: $2 // c 3: ($0 + $1) // x = a + b 4: ($3 + 1) // p = x + 1 5: ($3 + $2) // q = x + y 6: ($2 = 6) // c = 6
Another example:
SELECT * FROM ( SELECT a + b AS x, c AS y FROM t WHERE c = 6) WHERE x = 5becomes
SELECT a + b AS x, c AS y FROM t WHERE c = 6 AND (a + b) = 5
topProgram
- Top program. Its expressions are in terms of the
outputs of the bottom program.bottomProgram
- Bottom program. Its expressions are in terms of the
result fields of the relational expression's inputrexBuilder
-
private List<RexLocalRef> registerProjectsAndCondition(RexProgram program)
public void clearProjects()
public void addIdentity()
You cannot call this method if there are other project items.
public RexLocalRef makeInputRef(int index)
index
- Ordinal of input field, must be less than the number of
fields in the input type
public RelDataType getInputRowType()
public List<RexLocalRef> getProjectList()
|
|||||||||
PREV CLASS NEXT CLASS | FRAMES NO FRAMES | ||||||||
SUMMARY: NESTED | FIELD | CONSTR | METHOD | DETAIL: FIELD | CONSTR | METHOD |