org.apache.derby.impl.sql.compile
Class ProjectRestrictNode

java.lang.Object
  extended by org.apache.derby.impl.sql.compile.QueryTreeNode
      extended by org.apache.derby.impl.sql.compile.ResultSetNode
          extended by org.apache.derby.impl.sql.compile.FromTable
              extended by org.apache.derby.impl.sql.compile.SingleChildResultSetNode
                  extended by org.apache.derby.impl.sql.compile.ProjectRestrictNode
All Implemented Interfaces:
Optimizable, Visitable

public class ProjectRestrictNode
extends SingleChildResultSetNode

A ProjectRestrictNode represents a result set for any of the basic DML operations: SELECT, INSERT, UPDATE, and DELETE. For INSERT with a VALUES clause, restriction will be null. For both INSERT and UPDATE, the resultColumns in the selectList will contain the names of the columns being inserted into or updated. NOTE: A ProjectRestrictNode extends FromTable since it can exist in a FromList.


Field Summary
private  boolean accessPathConsidered
           
private  boolean accessPathModified
           
private  boolean childResultOptimized
           
(package private)  ValueNode constantRestriction
          Constant expressions to be evaluated here.
private  boolean getTableNumberHere
           
private  boolean materialize
           
(package private)  SubqueryList projectSubquerys
          List of subqueries in projection
 ValueNode restriction
          The ValueNode for the restriction to be evaluated here.
 PredicateList restrictionList
          Restriction as a PredicateList
(package private)  SubqueryList restrictSubquerys
          List of subqueries in restriction
 
Fields inherited from class org.apache.derby.impl.sql.compile.SingleChildResultSetNode
childResult, hasTrulyTheBestAccessPath
 
Fields inherited from class org.apache.derby.impl.sql.compile.FromTable
ADD_PLAN, bestAccessPath, bestCostEstimate, bestSortAvoidancePath, correlationName, corrTableName, currentAccessPath, hashKeyColumns, initialCapacity, level, LOAD_PLAN, loadFactor, maxCapacity, origTableName, REMOVE_PLAN, tableNumber, tableProperties, trulyTheBestAccessPath, userSpecifiedJoinStrategy
 
Fields inherited from class org.apache.derby.impl.sql.compile.ResultSetNode
costEstimate, cursorTargetTable, finalCostEstimate, insertSource, optimizer, referencedTableMap, resultColumns, resultSetNumber, scratchCostEstimate, statementResultSet
 
Fields inherited from class org.apache.derby.impl.sql.compile.QueryTreeNode
AUTOINCREMENT_CREATE_MODIFY, AUTOINCREMENT_INC_INDEX, AUTOINCREMENT_IS_AUTOINCREMENT_INDEX, AUTOINCREMENT_START_INDEX, isPrivilegeCollectionRequired
 
Constructor Summary
ProjectRestrictNode()
           
 
Method Summary
(package private)  void acceptChildren(Visitor v)
          Accept the visitor for all visitable children of this node.
 ResultSetNode addNewPredicate(Predicate predicate)
          Add a new predicate to the list.
 ResultSetNode considerMaterialization(JBitSet outerTables)
          Consider materialization for this ResultSet tree if it is valid and cost effective (It is not valid if incorrect results would be returned.)
 boolean considerSortAvoidancePath()
          Check whether this optimizable's sort avoidance path should be considered.
 ResultSetNode ensurePredicateList(int numTables)
          Ensure that the top of the RSN tree has a PredicateList.
 boolean feasibleJoinStrategy(OptimizablePredicateList predList, Optimizer optimizer)
          Is the current proposed join strategy for this optimizable feasible given the predicate list?
 boolean flattenableInFromSubquery(FromList fromList)
          Evaluate whether or not the subquery in a FromSubquery is flattenable.
 void generate(ActivationClassBuilder acb, MethodBuilder mb)
          For joins, the tree will be (nodes are left out if the clauses are empty): ProjectRestrictResultSet -- for the having and the select list SortResultSet -- for the group by list ProjectRestrictResultSet -- for the where and the select list (if no group or having) the result set for the fromList
private  void generateMinion(ExpressionClassBuilder acb, MethodBuilder mb, boolean genChildResultSet)
          Logic shared by generate() and generateResultSet().
 void generateNOPProjectRestrict()
          Bypass the generation of this No-Op ProjectRestrict, and just generate its child result set.
 void generateResultSet(ExpressionClassBuilder acb, MethodBuilder mb)
          General logic shared by Core compilation.
 AccessPath getBestAccessPath()
          Get the best access path for this Optimizable.
 AccessPath getBestSortAvoidancePath()
          Get the best sort-avoidance path for this Optimizable.
 CostEstimate getCostEstimate()
          Get the CostEstimate for this ProjectRestrictNode.
 AccessPath getCurrentAccessPath()
          Get the current access path under consideration for this Optimizable
 CostEstimate getFinalCostEstimate()
          Get the final CostEstimate for this ProjectRestrictNode.
protected  FromTable getFromTableByName(java.lang.String name, java.lang.String schemaName, boolean exactMatch)
          Determine whether or not the specified name is an exposed name in the current query block.
(package private)  PredicateList getRestrictionList()
          Return the restriction list from this node.
 int getTableNumber()
          Get this Optimizable's table number
 AccessPath getTrulyTheBestAccessPath()
          Get the best access path overall for this Optimizable.
(package private)  java.lang.String getUserSpecifiedJoinStrategy()
          Return the user specified join strategy, if any for this table.
 void init(java.lang.Object childResult, java.lang.Object projection, java.lang.Object restriction, java.lang.Object restrictionList, java.lang.Object projectSubquerys, java.lang.Object restrictSubquerys, java.lang.Object tableProperties)
          Initializer for a ProjectRestrictNode.
(package private)  boolean isPossibleDistinctScan(java.util.Set distinctColumns)
          Is it possible to do a distinct scan on this ResultSet tree.
 boolean legalJoinOrder(JBitSet assignedTableMap)
          Can this Optimizable appear at the current location in the join order.
(package private)  void markForDistinctScan()
          Mark the underlying scan as a distinct scan.
 Optimizable modifyAccessPath(JBitSet outerTables)
          Modify the access path for this Optimizable, as necessary.
 boolean nextAccessPath(Optimizer optimizer, OptimizablePredicateList predList, RowOrdering rowOrdering)
          Choose the next access path to evaluate for this Optimizable.
(package private)  boolean nopProjectRestrict()
          Determine whether this ProjectRestrict does anything.
 ResultSetNode optimize(DataDictionary dataDictionary, PredicateList predicates, double outerRows)
          Optimize this ProjectRestrictNode.
 CostEstimate optimizeIt(Optimizer optimizer, OptimizablePredicateList predList, CostEstimate outerCost, RowOrdering rowOrdering)
          Choose the best access path for this Optimizable.
 ResultSetNode preprocess(int numTables, GroupByList gbl, FromList fromList)
          Put a ProjectRestrictNode on top of each FromTable in the FromList.
(package private)  void printRememberingBestAccessPath(int planType, AccessPath bestPath)
           
 void printSubNodes(int depth)
          Prints the sub-nodes of this object.
 void pullOptPredicates(OptimizablePredicateList optimizablePredicates)
          Pull all the OptimizablePredicates from this Optimizable and put them in the given OptimizablePredicateList.
 void pushExpressions(PredicateList predicateList)
          Push expressions down to the first ResultSetNode which can do expression evaluation and has the same referenced table map.
(package private)  void pushOffsetFetchFirst(ValueNode offset, ValueNode fetchFirst)
          Push down the offset and fetch first parameters, if any, to the underlying child result set.
 boolean pushOptPredicate(OptimizablePredicate optimizablePredicate)
          Push an OptimizablePredicate down, if this node accepts it.
(package private)  void pushOrderByList(OrderByList orderByList)
          Push the order by list down from InsertNode into its child result set so that the optimizer has all of the information that it needs to consider sort avoidance.
 void rememberAsBest(int planType, Optimizer optimizer)
          Remember the current access path as the best one (so far).
 void rememberSortAvoidancePath()
          Mark this optimizable so that its sort avoidance path will be considered.
private  Optimizable replaceWithHashTableNode()
          This method creates a HashTableNode between the PRN and it's child when the optimizer chooses hash join on an arbitrary (non-FBT) result set tree.
 void setRefActionInfo(long fkIndexConglomId, int[] fkColArray, java.lang.String parentResultSetId, boolean dependentScan)
          set the Information gathered from the parent table that is required to peform a referential action on dependent table.
 void setRestriction(ValueNode restriction)
           
 void startOptimizing(Optimizer optimizer, RowOrdering rowOrdering)
          Begin the optimization process for this Optimizable.
 double uniqueJoin(OptimizablePredicateList predList)
          Does this optimizable have a uniqueness condition on the given predicate list, and if so, how many unique keys will be returned per scan.
 int updateTargetLockMode()
          Get the lock mode for the target of an update statement (a delete or update).
 void verifyProperties(DataDictionary dDictionary)
          Verify that the Properties list with optimizer overrides, if specified, is valid
 
Methods inherited from class org.apache.derby.impl.sql.compile.SingleChildResultSetNode
adjustForSortElimination, adjustForSortElimination, changeAccessPath, decrementLevel, forUpdate, getChildResult, init, initAccessPaths, isNotExists, isOneRowResultSet, isOrderedOn, modifyAccessPaths, referencesSessionSchema, referencesTarget, reflectionNeededForProjection, setChildResult, setLevel, subqueryReferencesTarget, updateBestPlanMap
 
Methods inherited from class org.apache.derby.impl.sql.compile.FromTable
assignCostEstimate, canBeOrdered, convertAbsoluteToRelativeColumnPosition, cursorTargetTable, estimateCost, fillInReferencedTableMap, flatten, getBaseTableName, getCorrelationName, getCostEstimate, getExposedName, getLevel, getName, getNumColumnsReturned, getOrigTableName, getProperties, getResultColumnsForList, getSchemaDescriptor, getSchemaDescriptor, getScratchCostEstimate, getTableDescriptor, getTableName, hashKeyColumns, hasTableNumber, initialCapacity, isBaseTable, isCoveringIndex, isFlattenableJoinNode, isMaterializable, isOneRowScan, isTargetTable, loadFactor, LOJ_reorderable, markUpdatableByCursor, maxCapacity, memoryUsageOK, needsSpecialRCLBinding, optimizeSubqueries, rememberJoinStrategyAsBest, resetJoinStrategies, setCostEstimate, setHashKeyColumns, setOrigTableName, setProperties, setTableNumber, supportsMultipleInstantiations, tellRowOrderingAboutConstantColumns, toString, transformOuterJoins
 
Methods inherited from class org.apache.derby.impl.sql.compile.ResultSetNode
assignResultSetNumber, bindExpressions, bindExpressionsWithTables, bindNonVTITables, bindResultColumns, bindResultColumns, bindTargetExpressions, bindUntypedNullsToResultColumns, bindVTITables, columnTypesAndLengthsMatch, disablePrivilegeCollection, enhanceRCLForInsert, generateNormalizationResultSet, genProjectRestrict, genProjectRestrict, genProjectRestrictForReordering, getAllResultColumns, getCursorTargetTable, getFromList, getMatchingColumn, getNewCostEstimate, getOptimizer, getOptimizerImpl, getRCLForInsert, getReferencedTableMap, getResultColumns, getResultSetNumber, isUpdatableCursor, LOJgetReferencedTables, makeResultDescription, makeResultDescriptors, markAsCursorTargetTable, markStatementResultSet, modifyAccessPaths, notCursorTargetTable, notFlattenableJoin, numDistinctAggregates, parseDefault, performMaterialization, projectResultColumns, rejectParameters, rejectXMLValues, renameGeneratedResultNames, replaceOrForbidDefaults, returnsAtMostOneRow, setInsertSource, setReferencedTableMap, setResultColumns, setResultToBooleanTrueNode, setTableConstructorTypes, verifySelectStarSubquery
 
Methods inherited from class org.apache.derby.impl.sql.compile.QueryTreeNode
accept, bindOffsetFetch, bindRowMultiSet, bindUserType, checkReliability, checkReliability, convertDefaultNode, createTypeDependency, debugFlush, debugPrint, formatNodeString, foundString, generateAuthorizeCheck, getBeginOffset, getClassFactory, getCompilerContext, getContextManager, getCursorInfo, getDataDictionary, getDependencyManager, getEndOffset, getExecutionFactory, getGenericConstantActionFactory, getIntProperty, getLanguageConnectionContext, getNodeFactory, getNodeType, getNullNode, getParameterTypes, getRowEstimate, getSchemaDescriptor, getSchemaDescriptor, getStatementType, getTableDescriptor, getTypeCompiler, init, init, init, init, init, init, init, init, init, init, init, init, isAtomic, isInstanceOf, isPrivilegeCollectionRequired, isSessionSchema, isSessionSchema, makeConstantAction, makeTableName, makeTableName, nodeHeader, orReliability, parseStatement, printLabel, resolveTableToSynonym, setBeginOffset, setContextManager, setEndOffset, setNodeType, stackPrint, treePrint, treePrint, verifyClassExist
 
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, wait
 
Methods inherited from interface org.apache.derby.iapi.sql.compile.Optimizable
getDataDictionary, getReferencedTableMap, getResultSetNumber
 

Field Detail

restriction

public ValueNode restriction
The ValueNode for the restriction to be evaluated here.


constantRestriction

ValueNode constantRestriction
Constant expressions to be evaluated here.


restrictionList

public PredicateList restrictionList
Restriction as a PredicateList


projectSubquerys

SubqueryList projectSubquerys
List of subqueries in projection


restrictSubquerys

SubqueryList restrictSubquerys
List of subqueries in restriction


accessPathModified

private boolean accessPathModified

accessPathConsidered

private boolean accessPathConsidered

childResultOptimized

private boolean childResultOptimized

materialize

private boolean materialize

getTableNumberHere

private boolean getTableNumberHere
Constructor Detail

ProjectRestrictNode

public ProjectRestrictNode()
Method Detail

init

public void init(java.lang.Object childResult,
                 java.lang.Object projection,
                 java.lang.Object restriction,
                 java.lang.Object restrictionList,
                 java.lang.Object projectSubquerys,
                 java.lang.Object restrictSubquerys,
                 java.lang.Object tableProperties)
Initializer for a ProjectRestrictNode.

Overrides:
init in class QueryTreeNode
Parameters:
childResult - The child ResultSetNode
projection - The result column list for the projection
restriction - An expression representing the restriction to be evaluated here.
restrictionList - Restriction as a PredicateList
projectSubquerys - List of subqueries in the projection
restrictSubquerys - List of subqueries in the restriction
tableProperties - Properties list associated with the table

nextAccessPath

public boolean nextAccessPath(Optimizer optimizer,
                              OptimizablePredicateList predList,
                              RowOrdering rowOrdering)
                       throws StandardException
Description copied from interface: Optimizable
Choose the next access path to evaluate for this Optimizable.

Specified by:
nextAccessPath in interface Optimizable
Overrides:
nextAccessPath in class FromTable
Parameters:
optimizer - Optimizer to use.
predList - The predicate list for this optimizable. The optimizer always passes null, and it is up to the optimizable object to pass along its own predicate list, if appropriate, when delegating this method.
rowOrdering - The row ordering for all the outer tables in the join order. This method will add the ordering of the next access path to the given RowOrdering.
Returns:
true means another access path was chosen, false means no more access paths to evaluate.
Throws:
StandardException - Thrown on error
See Also:
Optimizable.nextAccessPath(org.apache.derby.iapi.sql.compile.Optimizer, org.apache.derby.iapi.sql.compile.OptimizablePredicateList, org.apache.derby.iapi.sql.compile.RowOrdering)

rememberAsBest

public void rememberAsBest(int planType,
                           Optimizer optimizer)
                    throws StandardException
Description copied from interface: Optimizable
Remember the current access path as the best one (so far).

Specified by:
rememberAsBest in interface Optimizable
Overrides:
rememberAsBest in class FromTable
Parameters:
planType - The type of plan (one of Optimizer.NORMAL_PLAN or Optimizer.SORT_AVOIDANCE_PLAN)
optimizer - The OptimizerImpl that is telling this Optimizable to remember its current path as "truly the best".
Throws:
StandardException - Thrown on error
See Also:
Optimizable.rememberAsBest(int, org.apache.derby.iapi.sql.compile.Optimizer)

printRememberingBestAccessPath

void printRememberingBestAccessPath(int planType,
                                    AccessPath bestPath)

startOptimizing

public void startOptimizing(Optimizer optimizer,
                            RowOrdering rowOrdering)
Description copied from interface: Optimizable
Begin the optimization process for this Optimizable. This can be called many times for an Optimizable while optimizing a query - it will typically be called every time the Optimizable is placed in a potential join order.

Specified by:
startOptimizing in interface Optimizable
Overrides:
startOptimizing in class FromTable
See Also:
Optimizable.startOptimizing(org.apache.derby.iapi.sql.compile.Optimizer, org.apache.derby.iapi.sql.compile.RowOrdering)

getTableNumber

public int getTableNumber()
Description copied from interface: Optimizable
Get this Optimizable's table number

Specified by:
getTableNumber in interface Optimizable
Overrides:
getTableNumber in class FromTable
See Also:
Optimizable.getTableNumber()

optimizeIt

public CostEstimate optimizeIt(Optimizer optimizer,
                               OptimizablePredicateList predList,
                               CostEstimate outerCost,
                               RowOrdering rowOrdering)
                        throws StandardException
Description copied from interface: Optimizable
Choose the best access path for this Optimizable.

Specified by:
optimizeIt in interface Optimizable
Overrides:
optimizeIt in class FromTable
Parameters:
optimizer - Optimizer to use.
predList - The predicate list to optimize against
outerCost - The CostEstimate for the outer tables in the join order, telling how many times this Optimizable will be scanned.
rowOrdering - The row ordering for all the tables in the join order, including this one.
Returns:
The optimizer's estimated cost of the best access path.
Throws:
StandardException - Thrown on error
See Also:
Optimizable.optimizeIt(org.apache.derby.iapi.sql.compile.Optimizer, org.apache.derby.iapi.sql.compile.OptimizablePredicateList, org.apache.derby.iapi.sql.compile.CostEstimate, org.apache.derby.iapi.sql.compile.RowOrdering)

feasibleJoinStrategy

public boolean feasibleJoinStrategy(OptimizablePredicateList predList,
                                    Optimizer optimizer)
                             throws StandardException
Description copied from interface: Optimizable
Is the current proposed join strategy for this optimizable feasible given the predicate list?

Specified by:
feasibleJoinStrategy in interface Optimizable
Overrides:
feasibleJoinStrategy in class FromTable
Parameters:
predList - The predicate list that has been pushed down to this optimizable
optimizer - The optimizer to use.
Returns:
true means feasible
Throws:
StandardException - Thrown on error
See Also:
Optimizable.feasibleJoinStrategy(org.apache.derby.iapi.sql.compile.OptimizablePredicateList, org.apache.derby.iapi.sql.compile.Optimizer)

getCurrentAccessPath

public AccessPath getCurrentAccessPath()
Description copied from interface: Optimizable
Get the current access path under consideration for this Optimizable

Specified by:
getCurrentAccessPath in interface Optimizable
Overrides:
getCurrentAccessPath in class FromTable
See Also:
Optimizable.getCurrentAccessPath()

getBestAccessPath

public AccessPath getBestAccessPath()
Description copied from interface: Optimizable
Get the best access path for this Optimizable.

Specified by:
getBestAccessPath in interface Optimizable
Overrides:
getBestAccessPath in class FromTable
See Also:
Optimizable.getBestAccessPath()

getBestSortAvoidancePath

public AccessPath getBestSortAvoidancePath()
Description copied from interface: Optimizable
Get the best sort-avoidance path for this Optimizable.

Specified by:
getBestSortAvoidancePath in interface Optimizable
Overrides:
getBestSortAvoidancePath in class FromTable
See Also:
Optimizable.getBestSortAvoidancePath()

getTrulyTheBestAccessPath

public AccessPath getTrulyTheBestAccessPath()
Description copied from interface: Optimizable
Get the best access path overall for this Optimizable.

Specified by:
getTrulyTheBestAccessPath in interface Optimizable
Overrides:
getTrulyTheBestAccessPath in class SingleChildResultSetNode
See Also:
Optimizable.getTrulyTheBestAccessPath()

rememberSortAvoidancePath

public void rememberSortAvoidancePath()
Description copied from interface: Optimizable
Mark this optimizable so that its sort avoidance path will be considered.

Specified by:
rememberSortAvoidancePath in interface Optimizable
Overrides:
rememberSortAvoidancePath in class FromTable
See Also:
Optimizable.rememberSortAvoidancePath()

considerSortAvoidancePath

public boolean considerSortAvoidancePath()
Description copied from interface: Optimizable
Check whether this optimizable's sort avoidance path should be considered.

Specified by:
considerSortAvoidancePath in interface Optimizable
Overrides:
considerSortAvoidancePath in class FromTable
See Also:
Optimizable.considerSortAvoidancePath()

pushOptPredicate

public boolean pushOptPredicate(OptimizablePredicate optimizablePredicate)
                         throws StandardException
Description copied from interface: Optimizable
Push an OptimizablePredicate down, if this node accepts it.

Specified by:
pushOptPredicate in interface Optimizable
Overrides:
pushOptPredicate in class FromTable
Parameters:
optimizablePredicate - OptimizablePredicate to push down.
Returns:
Whether or not the predicate was pushed down.
Throws:
StandardException - Thrown on error
See Also:
Optimizable.pushOptPredicate(org.apache.derby.iapi.sql.compile.OptimizablePredicate)

pullOptPredicates

public void pullOptPredicates(OptimizablePredicateList optimizablePredicates)
                       throws StandardException
Description copied from interface: Optimizable
Pull all the OptimizablePredicates from this Optimizable and put them in the given OptimizablePredicateList.

Specified by:
pullOptPredicates in interface Optimizable
Overrides:
pullOptPredicates in class SingleChildResultSetNode
Parameters:
optimizablePredicates - The list to put the pulled predicates in.
Throws:
StandardException - Thrown on error
See Also:
Optimizable.pullOptPredicates(org.apache.derby.iapi.sql.compile.OptimizablePredicateList)

modifyAccessPath

public Optimizable modifyAccessPath(JBitSet outerTables)
                             throws StandardException
Description copied from interface: Optimizable
Modify the access path for this Optimizable, as necessary. This includes things like adding a result set to translate from index rows to base rows

Specified by:
modifyAccessPath in interface Optimizable
Overrides:
modifyAccessPath in class FromTable
Parameters:
outerTables - Bit map of the tables that are outer to this one in the join order.
Returns:
The (potentially new) Optimizable at the top of the tree.
Throws:
StandardException - Thrown on error
See Also:
Optimizable.modifyAccessPath(org.apache.derby.iapi.util.JBitSet)

replaceWithHashTableNode

private Optimizable replaceWithHashTableNode()
                                      throws StandardException
This method creates a HashTableNode between the PRN and it's child when the optimizer chooses hash join on an arbitrary (non-FBT) result set tree. We divide up the restriction list into 3 parts and distribute those parts as described below.

Returns:
The new (same) top of our result set tree.
Throws:
StandardException - Thrown on error

verifyProperties

public void verifyProperties(DataDictionary dDictionary)
                      throws StandardException
Description copied from interface: Optimizable
Verify that the Properties list with optimizer overrides, if specified, is valid

Specified by:
verifyProperties in interface Optimizable
Overrides:
verifyProperties in class FromTable
Parameters:
dDictionary - The DataDictionary to use.
Throws:
StandardException - Thrown on error
See Also:
Optimizable.verifyProperties(org.apache.derby.iapi.sql.dictionary.DataDictionary)

legalJoinOrder

public boolean legalJoinOrder(JBitSet assignedTableMap)
Description copied from interface: Optimizable
Can this Optimizable appear at the current location in the join order. In other words, have the Optimizable's dependencies been satisfied?

Specified by:
legalJoinOrder in interface Optimizable
Overrides:
legalJoinOrder in class FromTable
Parameters:
assignedTableMap - The tables that have been placed so far in the join order.
Returns:
Where or not this Optimizable can appear at the current location in the join order.
See Also:
Optimizable.legalJoinOrder(org.apache.derby.iapi.util.JBitSet)

uniqueJoin

public double uniqueJoin(OptimizablePredicateList predList)
                  throws StandardException
Description copied from interface: Optimizable
Does this optimizable have a uniqueness condition on the given predicate list, and if so, how many unique keys will be returned per scan.

Specified by:
uniqueJoin in interface Optimizable
Overrides:
uniqueJoin in class FromTable
Parameters:
predList - The predicate list to check
Returns:
<= 0 means there is no uniqueness condition > 0 means there is a uniqueness condition, and the return value is the number of rows per scan.
Throws:
StandardException - Thrown on error
See Also:
Optimizable.uniqueJoin(org.apache.derby.iapi.sql.compile.OptimizablePredicateList)

getRestrictionList

PredicateList getRestrictionList()
Return the restriction list from this node.

Returns:
The restriction list from this node.

getUserSpecifiedJoinStrategy

java.lang.String getUserSpecifiedJoinStrategy()
Return the user specified join strategy, if any for this table.

Overrides:
getUserSpecifiedJoinStrategy in class FromTable
Returns:
The user specified join strategy, if any for this table.

printSubNodes

public void printSubNodes(int depth)
Prints the sub-nodes of this object. See QueryTreeNode.java for how tree printing is supposed to work.

Overrides:
printSubNodes in class SingleChildResultSetNode
Parameters:
depth - The depth of this node in the tree

preprocess

public ResultSetNode preprocess(int numTables,
                                GroupByList gbl,
                                FromList fromList)
                         throws StandardException
Put a ProjectRestrictNode on top of each FromTable in the FromList. ColumnReferences must continue to point to the same ResultColumn, so that ResultColumn must percolate up to the new PRN. However, that ResultColumn will point to a new expression, a VirtualColumnNode, which points to the FromTable and the ResultColumn that is the source for the ColumnReference. (The new PRN will have the original of the ResultColumnList and the ResultColumns from that list. The FromTable will get shallow copies of the ResultColumnList and its ResultColumns. ResultColumn.expression will remain at the FromTable, with the PRN getting a new VirtualColumnNode for each ResultColumn.expression.) We then project out the non-referenced columns. If there are no referenced columns, then the PRN's ResultColumnList will consist of a single ResultColumn whose expression is 1.

Overrides:
preprocess in class SingleChildResultSetNode
Parameters:
numTables - Number of tables in the DML Statement
gbl - The group by list, if any
fromList - The from list, if any
Returns:
The generated ProjectRestrictNode atop the original FromTable.
Throws:
StandardException - Thrown on error

pushExpressions

public void pushExpressions(PredicateList predicateList)
                     throws StandardException
Push expressions down to the first ResultSetNode which can do expression evaluation and has the same referenced table map. RESOLVE - This means only pushing down single table expressions to ProjectRestrictNodes today. Once we have a better understanding of how the optimizer will work, we can push down join clauses.

Overrides:
pushExpressions in class SingleChildResultSetNode
Parameters:
predicateList - The PredicateList.
Throws:
StandardException - Thrown on error

addNewPredicate

public ResultSetNode addNewPredicate(Predicate predicate)
                              throws StandardException
Add a new predicate to the list. This is useful when doing subquery transformations, when we build a new predicate with the left side of the subquery operator and the subquery's result column.

Overrides:
addNewPredicate in class SingleChildResultSetNode
Parameters:
predicate - The predicate to add
Returns:
ResultSetNode The new top of the tree.
Throws:
StandardException - Thrown on error

flattenableInFromSubquery

public boolean flattenableInFromSubquery(FromList fromList)
Evaluate whether or not the subquery in a FromSubquery is flattenable. Currently, a FSqry is flattenable if all of the following are true: o Subquery is a SelectNode. o It contains no top level subqueries. (RESOLVE - we can relax this) o It does not contain a group by or having clause o It does not contain aggregates.

Overrides:
flattenableInFromSubquery in class SingleChildResultSetNode
Parameters:
fromList - The outer from list
Returns:
boolean Whether or not the FromSubquery is flattenable.

ensurePredicateList

public ResultSetNode ensurePredicateList(int numTables)
                                  throws StandardException
Ensure that the top of the RSN tree has a PredicateList.

Overrides:
ensurePredicateList in class SingleChildResultSetNode
Parameters:
numTables - The number of tables in the query.
Returns:
ResultSetNode A RSN tree with a node which has a PredicateList on top.
Throws:
StandardException - Thrown on error

optimize

public ResultSetNode optimize(DataDictionary dataDictionary,
                              PredicateList predicates,
                              double outerRows)
                       throws StandardException
Optimize this ProjectRestrictNode.

Overrides:
optimize in class SingleChildResultSetNode
Parameters:
dataDictionary - The DataDictionary to use for optimization
predicates - The PredicateList to optimize. This should be a join predicate.
outerRows - The number of outer joining rows
Returns:
ResultSetNode The top of the optimized subtree
Throws:
StandardException - Thrown on error

getCostEstimate

public CostEstimate getCostEstimate()
Get the CostEstimate for this ProjectRestrictNode.

Overrides:
getCostEstimate in class ResultSetNode
Returns:
The CostEstimate for this ProjectRestrictNode, which is the cost estimate for the child node.

getFinalCostEstimate

public CostEstimate getFinalCostEstimate()
                                  throws StandardException
Get the final CostEstimate for this ProjectRestrictNode.

Overrides:
getFinalCostEstimate in class SingleChildResultSetNode
Returns:
The final CostEstimate for this ProjectRestrictNode, which is the final cost estimate for the child node.
Throws:
StandardException

generate

public void generate(ActivationClassBuilder acb,
                     MethodBuilder mb)
              throws StandardException
For joins, the tree will be (nodes are left out if the clauses are empty): ProjectRestrictResultSet -- for the having and the select list SortResultSet -- for the group by list ProjectRestrictResultSet -- for the where and the select list (if no group or having) the result set for the fromList

Overrides:
generate in class QueryTreeNode
Parameters:
acb - The ActivationClassBuilder for the class being built
mb - The method for the generated code to go into
Throws:
StandardException - Thrown on error

generateResultSet

public void generateResultSet(ExpressionClassBuilder acb,
                              MethodBuilder mb)
                       throws StandardException
General logic shared by Core compilation.

Overrides:
generateResultSet in class ResultSetNode
Parameters:
acb - The ExpressionClassBuilder for the class being built
mb - The method the expression will go into
Throws:
StandardException - Thrown on error

generateMinion

private void generateMinion(ExpressionClassBuilder acb,
                            MethodBuilder mb,
                            boolean genChildResultSet)
                     throws StandardException
Logic shared by generate() and generateResultSet().

Parameters:
acb - The ExpressionClassBuilder for the class being built
mb - The method the expression will go into
Throws:
StandardException - Thrown on error

nopProjectRestrict

boolean nopProjectRestrict()
Determine whether this ProjectRestrict does anything. If it doesn't filter out any rows or columns, it's a No-Op.

Returns:
true if this ProjectRestrict is a No-Op.

generateNOPProjectRestrict

public void generateNOPProjectRestrict()
                                throws StandardException
Bypass the generation of this No-Op ProjectRestrict, and just generate its child result set.

Throws:
StandardException - Thrown on error

considerMaterialization

public ResultSetNode considerMaterialization(JBitSet outerTables)
                                      throws StandardException
Consider materialization for this ResultSet tree if it is valid and cost effective (It is not valid if incorrect results would be returned.)

Overrides:
considerMaterialization in class ResultSetNode
Returns:
Top of the new/same ResultSet tree.
Throws:
StandardException - Thrown on error

getFromTableByName

protected FromTable getFromTableByName(java.lang.String name,
                                       java.lang.String schemaName,
                                       boolean exactMatch)
                                throws StandardException
Determine whether or not the specified name is an exposed name in the current query block.

Overrides:
getFromTableByName in class SingleChildResultSetNode
Parameters:
name - The specified name to search for as an exposed name.
schemaName - Schema name, if non-null.
exactMatch - Whether or not we need an exact match on specified schema and table names or match on table id.
Returns:
The FromTable, if any, with the exposed name.
Throws:
StandardException - Thrown on error

updateTargetLockMode

public int updateTargetLockMode()
Get the lock mode for the target of an update statement (a delete or update). The update mode will always be row for CurrentOfNodes. It will be table if there is no where clause.

Overrides:
updateTargetLockMode in class SingleChildResultSetNode
Returns:
The lock mode
See Also:
TransactionController

isPossibleDistinctScan

boolean isPossibleDistinctScan(java.util.Set distinctColumns)
Is it possible to do a distinct scan on this ResultSet tree. (See SelectNode for the criteria.)

Overrides:
isPossibleDistinctScan in class ResultSetNode
Parameters:
distinctColumns - the set of distinct columns
Returns:
Whether or not it is possible to do a distinct scan on this ResultSet tree.

markForDistinctScan

void markForDistinctScan()
Mark the underlying scan as a distinct scan.

Overrides:
markForDistinctScan in class ResultSetNode

acceptChildren

void acceptChildren(Visitor v)
              throws StandardException
Accept the visitor for all visitable children of this node.

Overrides:
acceptChildren in class SingleChildResultSetNode
Parameters:
v - the visitor
Throws:
StandardException - on error

setRefActionInfo

public void setRefActionInfo(long fkIndexConglomId,
                             int[] fkColArray,
                             java.lang.String parentResultSetId,
                             boolean dependentScan)
set the Information gathered from the parent table that is required to peform a referential action on dependent table.

Overrides:
setRefActionInfo in class QueryTreeNode

setRestriction

public void setRestriction(ValueNode restriction)

pushOrderByList

void pushOrderByList(OrderByList orderByList)
Push the order by list down from InsertNode into its child result set so that the optimizer has all of the information that it needs to consider sort avoidance.

Overrides:
pushOrderByList in class ResultSetNode
Parameters:
orderByList - The order by list

pushOffsetFetchFirst

void pushOffsetFetchFirst(ValueNode offset,
                          ValueNode fetchFirst)
Push down the offset and fetch first parameters, if any, to the underlying child result set.

Overrides:
pushOffsetFetchFirst in class ResultSetNode
Parameters:
offset - the OFFSET, if any
fetchFirst - the OFFSET FIRST, if any

Built on Thu 2012-03-29 21:53:33+0000, from revision ???

Apache Derby V10.6 Internals - Copyright © 2004,2007 The Apache Software Foundation. All Rights Reserved.