Package org.apache.calcite.linq4j.tree
Class BlockBuilder
- java.lang.Object
-
- org.apache.calcite.linq4j.tree.BlockBuilder
-
public class BlockBuilder extends Object
Builder forBlockStatement.Has methods that help ensure that variable names are unique.
-
-
Nested Class Summary
Nested Classes Modifier and Type Class Description private static classBlockBuilder.InlineVariableVisitorInline Variable Visitor.private static classBlockBuilder.SlotHolds the number of times a declaration was used.private static classBlockBuilder.SubstituteVariableVisitorSubstitute Variable Visitor.private static classBlockBuilder.UseCounterUse counter.
-
Field Summary
Fields Modifier and Type Field Description (package private) Map<Expression,DeclarationStatement>expressionForReuseContains final-fine-to-reuse-declarations.private static ShuttleOPTIMIZE_SHUTTLEprivate booleanoptimizingprivate BlockBuilderparent(package private) List<Statement>statements(package private) Set<String>variables
-
Constructor Summary
Constructors Constructor Description BlockBuilder()Creates a non-optimizing BlockBuilder.BlockBuilder(boolean optimizing)Creates a BlockBuilder.BlockBuilder(boolean optimizing, BlockBuilder parent)Creates a BlockBuilder.
-
Method Summary
All Methods Instance Methods Concrete Methods Modifier and Type Method Description voidadd(Expression expression)voidadd(Statement statement)protected voidaddExpressionForReuse(DeclarationStatement decl)Expressionappend(String name, BlockStatement block)Appends a block to a list of statements and returns an expression (possibly a variable) that represents the result of the newly added block.Expressionappend(String name, BlockStatement block, boolean optimize)Appends an expression to a list of statements, optionally optimizing it to a variable if it is used more than once.Expressionappend(String name, Expression expression)Appends an expression to a list of statements, and returns an expression (possibly a variable) that represents the result of the newly added block.Expressionappend(String name, Expression expression, boolean optimize)Appends an expression to a list of statements, optionally optimizing if the expression is used more than once.BlockBuilderappend(Expression expression)private Expressionappend_(String name, Expression expression, boolean optimize)ExpressionappendIfNotNull(String name, Expression expression)Appends an expression to a list of statements, if it is not null.voidclear()Clears this BlockBuilder.protected ShuttlecreateFinishingOptimizeShuttle()Creates a final optimization shuttle.protected ShuttlecreateOptimizeShuttle()Creates a shuttle that will be used during block optimization.DeclarationStatementgetComputedExpression(Expression expr)Returns the reference to ParameterExpression if given expression was already computed and stored to local variablebooleanhasVariable(String name)private booleanisCostly(DeclarationStatement decl)protected booleanisSafeForReuse(DeclarationStatement decl)protected booleanisSimpleExpression(Expression expr)Checks if expression is simple enough to always inline at zero cost.StringnewName(String suggestion)Creates a name for a new variable, unique within this block.private StringnewName(String suggestion, boolean optimize)Creates a name for a new variable, unique within this block, controlling whether the variable can be inlined later.private ExpressionnormalizeDeclaration(DeclarationStatement decl)Prepares declaration for inlining: adds castprivate booleanoptimize(Shuttle optimizer, boolean performInline)Optimizes the list of statements.BlockStatementtoBlock()Returns a block consisting of the current list of statements.
-
-
-
Field Detail
-
expressionForReuse
final Map<Expression,DeclarationStatement> expressionForReuse
Contains final-fine-to-reuse-declarations. An entry to this map is added when adding final declaration of a statement with optimize=true parameter.
-
optimizing
private final boolean optimizing
-
parent
private final BlockBuilder parent
-
OPTIMIZE_SHUTTLE
private static final Shuttle OPTIMIZE_SHUTTLE
-
-
Constructor Detail
-
BlockBuilder
public BlockBuilder()
Creates a non-optimizing BlockBuilder.
-
BlockBuilder
public BlockBuilder(boolean optimizing)
Creates a BlockBuilder.- Parameters:
optimizing- Whether to eliminate common sub-expressions
-
BlockBuilder
public BlockBuilder(boolean optimizing, BlockBuilder parent)Creates a BlockBuilder.- Parameters:
optimizing- Whether to eliminate common sub-expressions
-
-
Method Detail
-
clear
public void clear()
Clears this BlockBuilder.
-
append
public Expression append(String name, BlockStatement block)
Appends a block to a list of statements and returns an expression (possibly a variable) that represents the result of the newly added block.
-
append
public Expression append(String name, BlockStatement block, boolean optimize)
Appends an expression to a list of statements, optionally optimizing it to a variable if it is used more than once.- Parameters:
name- Suggested variable nameblock- Expressionoptimize- Whether to try to optimize by assigning the expression to a variable. Do not do this if the expression has side-effects or a time-dependent value.
-
append
public Expression append(String name, Expression expression)
Appends an expression to a list of statements, and returns an expression (possibly a variable) that represents the result of the newly added block.
-
appendIfNotNull
public Expression appendIfNotNull(String name, Expression expression)
Appends an expression to a list of statements, if it is not null.
-
append
public Expression append(String name, Expression expression, boolean optimize)
Appends an expression to a list of statements, optionally optimizing if the expression is used more than once.
-
append_
private Expression append_(String name, Expression expression, boolean optimize)
-
isSimpleExpression
protected boolean isSimpleExpression(Expression expr)
Checks if expression is simple enough to always inline at zero cost.- Parameters:
expr- expression to test- Returns:
- true when given expression is safe to always inline
-
isSafeForReuse
protected boolean isSafeForReuse(DeclarationStatement decl)
-
addExpressionForReuse
protected void addExpressionForReuse(DeclarationStatement decl)
-
isCostly
private boolean isCostly(DeclarationStatement decl)
-
normalizeDeclaration
private Expression normalizeDeclaration(DeclarationStatement decl)
Prepares declaration for inlining: adds cast- Parameters:
decl- inlining candidate- Returns:
- normalized expression
-
getComputedExpression
public DeclarationStatement getComputedExpression(Expression expr)
Returns the reference to ParameterExpression if given expression was already computed and stored to local variable- Parameters:
expr- expression to test- Returns:
- existing ParameterExpression or null
-
add
public void add(Statement statement)
-
add
public void add(Expression expression)
-
toBlock
public BlockStatement toBlock()
Returns a block consisting of the current list of statements.
-
optimize
private boolean optimize(Shuttle optimizer, boolean performInline)
Optimizes the list of statements. If an expression is used only once, it is inlined.- Returns:
- whether any optimizations were made
-
createOptimizeShuttle
protected Shuttle createOptimizeShuttle()
Creates a shuttle that will be used during block optimization. Sub-classes might provide more specific optimizations (e.g. partial evaluation).- Returns:
- shuttle used to optimize the statements when converting to block
-
createFinishingOptimizeShuttle
protected Shuttle createFinishingOptimizeShuttle()
Creates a final optimization shuttle. Typically, the visitor will factor out constant expressions.- Returns:
- shuttle that is used to finalize the optimization
-
newName
private String newName(String suggestion, boolean optimize)
Creates a name for a new variable, unique within this block, controlling whether the variable can be inlined later.
-
newName
public String newName(String suggestion)
Creates a name for a new variable, unique within this block.
-
hasVariable
public boolean hasVariable(String name)
-
append
public BlockBuilder append(Expression expression)
-
-