Optimizable
, Visitable
HalfOuterJoinNode
class JoinNode extends TableOperatorNode
ResultSetNode.QueryExpressionClauses
Modifier and Type | Field | Description |
---|---|---|
(package private) java.util.List<AggregateNode> |
aggregates |
|
(package private) static int |
CROSSJOIN |
|
protected boolean |
flattenableJoin |
|
(package private) static int |
FULLOUTERJOIN |
|
(package private) static int |
INNERJOIN |
|
(package private) ValueNode |
joinClause |
|
(package private) boolean |
joinClauseNormalized |
|
(package private) java.util.Properties |
joinOrderStrategyProperties |
|
(package private) PredicateList |
joinPredicates |
|
(package private) static int |
LEFTOUTERJOIN |
|
private PredicateList |
leftPredicateList |
|
private boolean |
naturalJoin |
If this flag is true, this node represents a natural join.
|
private boolean |
optimized |
|
(package private) static int |
RIGHTOUTERJOIN |
|
private PredicateList |
rightPredicateList |
|
(package private) SubqueryList |
subqueryList |
|
(package private) static int |
UNIONJOIN |
|
(package private) ResultColumnList |
usingClause |
ADD_PLAN, bestAccessPath, bestCostEstimate, bestSortAvoidancePath, correlationName, corrTableName, currentAccessPath, hashKeyColumns, initialCapacity, level, LOAD_PLAN, loadFactor, maxCapacity, origTableName, REMOVE_PLAN, tableNumber, tableProperties, trulyTheBestAccessPath, userSpecifiedJoinStrategy
AUTOINCREMENT_CREATE_MODIFY, AUTOINCREMENT_CYCLE, AUTOINCREMENT_INC_INDEX, AUTOINCREMENT_IS_AUTOINCREMENT_INDEX, AUTOINCREMENT_START_INDEX
leftOptimizer, leftResultSet, rightOptimizer, rightResultSet
Constructor | Description |
---|---|
JoinNode(ResultSetNode leftResult,
ResultSetNode rightResult,
ValueNode onClause,
ResultColumnList usingClause,
ResultColumnList selectList,
java.util.Properties tableProperties,
java.util.Properties joinOrderStrategyProperties,
ContextManager cm) |
Constructor for a JoinNode.
|
Modifier and Type | Method | Description |
---|---|---|
(package private) void |
acceptChildren(Visitor v) |
Accept the visitor for all visitable children of this node.
|
(package private) int |
addOuterJoinArguments(ActivationClassBuilder acb,
MethodBuilder mb) |
Generate and add any arguments specifict to outer joins.
|
protected void |
adjustNumberOfRowsReturned(CostEstimate costEstimate) |
Some types of joins (e.g. outer joins) will return a different
number of rows than is predicted by optimizeIt() in JoinNode.
|
ValueNode |
bindExpression(ValueNode expression,
boolean useLeftChild,
boolean useRightChild,
java.lang.String expressionType) |
Bind an expression against the child tables of the JoinNode.
|
void |
bindExpressions(FromList fromListParam) |
Bind the expressions under this node.
|
(package private) void |
bindResultColumns(TableDescriptor targetTableDescriptor,
FromVTI targetVTI,
ResultColumnList targetColumnList,
DMLStatementNode statement,
FromList fromListParam) |
Bind the result columns for this ResultSetNode to a base table.
|
(package private) void |
bindResultColumns(FromList fromListParam) |
Bind the result columns of this ResultSetNode when there is no
base table to bind them to.
|
private void |
buildRCL() |
Build the RCL for this node.
|
private void |
deferredBindExpressions(FromList fromListParam) |
|
private static java.util.List<java.lang.String> |
extractColumnNames(ResultColumnList rcl) |
Extract all the column names from a result column list.
|
(package private) FromList |
flatten(ResultColumnList rcl,
PredicateList outerPList,
SubqueryList sql,
GroupByList gbl,
ValueNode havingClause) |
Flatten this JoinNode into the outer query block.
|
(package private) 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
|
(package private) void |
generateCore(ActivationClassBuilder acb,
MethodBuilder mb,
int joinType) |
Generate the code for a qualified join node.
|
(package private) void |
generateCore(ActivationClassBuilder acb,
MethodBuilder mb,
int joinType,
ValueNode joinClause,
SubqueryList subquerys) |
Do the generation work for the join node hierarchy.
|
(package private) ResultColumnList |
getAllResultColumns(TableName allTableName) |
Return a ResultColumnList with all of the columns in this table.
|
private ResultColumnList |
getAllResultColumnsNoUsing(TableName allTableName) |
Return a ResultColumnList with all of the columns in this table.
|
private ResultColumnList |
getCommonColumnsForNaturalJoin() |
Generate a result column list with all the column names that appear on
both sides of the join operator.
|
(package private) CostEstimate |
getFinalCostEstimate() |
Get the final CostEstimate for this FromTable.
|
private int |
getJoinArguments(ActivationClassBuilder acb,
MethodBuilder mb,
ValueNode joinClause) |
Get the arguments to the join result set.
|
protected PredicateList |
getLeftPredicateList() |
|
(package private) ResultSetNode |
getLogicalLeftResultSet() |
Return the logical left result set for this qualified
join node.
|
(package private) ResultSetNode |
getLogicalRightResultSet() |
Return the logical right result set for this qualified
join node.
|
(package private) ResultColumn |
getMatchingColumn(ColumnReference columnReference) |
Try to find a ResultColumn in the table represented by this FromTable
that matches the name in the given ColumnReference.
|
protected int |
getNumJoinArguments() |
Return the number of arguments to the join result set.
|
protected PredicateList |
getRightPredicateList() |
|
private void |
grabJoinPredicates(PredicateList outerPredicateList) |
|
(package private) boolean |
isFlattenableJoinNode() |
Is this FromTable a JoinNode which can be flattened into
the parents FromList.
|
(package private) boolean |
isOrderedOn(ColumnReference[] crs,
boolean permuteOrdering,
java.util.List<FromBaseTable> fbtHolder) |
Return whether or not the underlying ResultSet tree
is ordered on the specified columns.
|
(package private) static java.lang.String |
joinTypeToString(int joinType) |
Convert the joinType to a string.
|
(package private) boolean |
LOJ_reorderable(int numTables) |
Currently we don't reordering any outer join w/ inner joins.
|
(package private) JBitSet |
LOJgetReferencedTables(int numTables) |
|
FromList |
makeFromList(boolean useLeftChild,
boolean useRightChild) |
Make a FromList for binding
|
Optimizable |
modifyAccessPath(JBitSet outerTables) |
Modify the access path for this Optimizable, as necessary.
|
(package private) void |
normExpressions() |
Put the expression trees in conjunctive normal form
|
(package private) void |
notFlattenableJoin() |
Mark this node and its children as not being a flattenable join.
|
(package private) void |
oneRowRightSide(ActivationClassBuilder acb,
MethodBuilder mb) |
|
CostEstimate |
optimizeIt(Optimizer optimizer,
OptimizablePredicateList predList,
CostEstimate outerCost,
RowOrdering rowOrdering) |
Choose the best access path for this Optimizable.
|
(package private) ResultSetNode |
preprocess(int numTables,
GroupByList gbl,
FromList fromList) |
Put a ProjectRestrictNode on top of each FromTable in the FromList.
|
(package private) void |
printSubNodes(int depth) |
Prints the sub-nodes of this object.
|
(package private) void |
projectResultColumns() |
Find the unreferenced result columns and project them out.
|
(package private) void |
pushExpressions(PredicateList outerPredicateList) |
Push expressions down to the first ResultSetNode which can do expression
evaluation and has the same referenced table map.
|
protected void |
pushExpressionsToLeft(PredicateList outerPredicateList) |
|
private void |
pushExpressionsToRight(PredicateList outerPredicateList) |
|
boolean |
pushOptPredicate(OptimizablePredicate optimizablePredicate) |
Push an OptimizablePredicate down, if this node accepts it.
|
(package private) void |
setAggregates(java.util.List<AggregateNode> aggregates) |
|
(package private) void |
setNaturalJoin() |
Flag this as a natural join so that an implicit USING clause will
be generated in the bind phase.
|
(package private) void |
setSubqueryList(SubqueryList subqueryList) |
|
(package private) FromTable |
transformOuterJoins(ValueNode predicateTree,
int numTables) |
Transform any Outer Join into an Inner Join where applicable.
|
(package private) int |
updateTargetLockMode() |
Get the lock mode for the target of an update statement
(a delete or update).
|
assignCostEstimate, canBeOrdered, columnsAreUpdatable, considerSortAvoidancePath, convertAbsoluteToRelativeColumnPosition, cursorTargetTable, estimateCost, feasibleJoinStrategy, fillInReferencedTableMap, forUpdate, getBaseTableName, getBestAccessPath, getBestSortAvoidancePath, getCorrelationName, getCostEstimate, getCurrentAccessPath, getLevel, getMergeTableID, getName, getNumColumnsReturned, getOrigTableName, getProperties, getResultColumnsForList, getSchemaDescriptor, getSchemaDescriptor, getScratchCostEstimate, getTableDescriptor, getTableName, getTableNumber, getTrulyTheBestAccessPath, getUserSpecifiedJoinStrategy, hashKeyColumns, hasLargeObjectColumns, hasTableNumber, initAccessPaths, initialCapacity, isBaseTable, isCoveringIndex, isJoinColumnForRightOuterJoin, isMaterializable, isOneRowScan, isTargetTable, legalJoinOrder, loadFactor, markUpdatableByCursor, maxCapacity, memoryUsageOK, nextAccessPath, optimizeSubqueries, pullOptPredicates, rememberAsBest, rememberJoinStrategyAsBest, rememberSortAvoidancePath, resetJoinStrategies, setCostEstimateCost, setHashKeyColumns, setMergeTableID, setOrigTableName, setProperties, setTableNumber, startOptimizing, supportsMultipleInstantiations, tellRowOrderingAboutConstantColumns, uniqueJoin
clone, equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, wait
getDataDictionary, getOptimizerTracer, getReferencedTableMap, getResultSetNumber, optimizerTracingIsOn
accept, addTag, addUDTUsagePriv, addUDTUsagePriv, bindOffsetFetch, bindRowMultiSet, bindUserCatalogType, bindUserType, checkReliability, checkReliability, convertDefaultNode, copyTagsFrom, createTypeDependency, debugFlush, debugPrint, disablePrivilegeCollection, formatNodeString, generateAuthorizeCheck, getBeginOffset, getClassFactory, getCompilerContext, getContext, getContextManager, getDataDictionary, getDependencyManager, getEndOffset, getExecutionFactory, getGenericConstantActionFactory, getIntProperty, getLanguageConnectionContext, getLongProperty, getNullNode, getOffsetOrderedNodes, getOptimizerFactory, getOptimizerTracer, getParameterTypes, getSchemaDescriptor, getSchemaDescriptor, getStatementType, getTableDescriptor, getTypeCompiler, getUDTDesc, isAtomic, isPrivilegeCollectionRequired, isSessionSchema, isSessionSchema, makeConstantAction, makeTableName, makeTableName, nodeHeader, optimizerTracingIsOn, orReliability, parseSearchCondition, parseStatement, printLabel, resolveTableToSynonym, setBeginOffset, setEndOffset, setRefActionInfo, stackPrint, taggedWith, treePrint, treePrint, verifyClassExist
addNewPredicate, assignResultSetNumber, bindTargetExpressions, changeAccessPath, columnTypesAndLengthsMatch, considerMaterialization, enhanceRCLForInsert, ensurePredicateList, flattenableInFromSubquery, generateNormalizationResultSet, generateResultSet, genProjectRestrict, genProjectRestrict, genProjectRestrictForReordering, getCandidateFinalCostEstimate, getCostEstimate, getCursorTargetTable, getFromList, getNewCostEstimate, getOptimizer, getOptimizerImpl, getRCLForInsert, getReferencedTableMap, getResultColumns, getResultSetNumber, getScratchCostEstimate, isCursorTargetTable, isInsertSource, isNotExists, isOneRowResultSet, isPossibleDistinctScan, isStatementResultSet, isUpdatableCursor, makeResultDescription, makeResultDescriptors, markAsCursorTargetTable, markForDistinctScan, markStatementResultSet, modifyAccessPaths, notCursorTargetTable, numDistinctAggregates, parseDefault, performMaterialization, printQueryExpressionSuffixClauses, pushOffsetFetchFirst, pushOrderByList, pushQueryExpressionSuffix, rejectXMLValues, renameGeneratedResultNames, replaceOrForbidDefaults, returnsAtMostOneRow, setCandidateFinalCostEstimate, setCostEstimate, setCursorTargetTable, setInsertSource, setOptimizer, setReferencedTableMap, setResultColumns, setResultSetNumber, setResultToBooleanTrueNode, setScratchCostEstimate, setTableConstructorTypes, subqueryReferencesTarget, verifySelectStarSubquery
adjustForSortElimination, adjustForSortElimination, bindExpressionsWithTables, bindNonVTITables, bindUntypedNullsToResultColumns, bindVTITables, decrementLevel, getExposedName, getFromTableByName, getLeftmostResultSet, getLeftResultSet, getRightResultSet, modifyAccessPaths, needsSpecialRCLBinding, optimize, optimizeSource, referencesSessionSchema, referencesTarget, rejectParameters, setLeftmostResultSet, setLevel, setNestedInParens, setReferencedColumns, toString, updateBestPlanMap, verifyProperties
accept, addTag, taggedWith
static final int INNERJOIN
static final int CROSSJOIN
static final int LEFTOUTERJOIN
static final int RIGHTOUTERJOIN
static final int FULLOUTERJOIN
static final int UNIONJOIN
private boolean naturalJoin
private boolean optimized
private PredicateList leftPredicateList
private PredicateList rightPredicateList
protected boolean flattenableJoin
java.util.List<AggregateNode> aggregates
SubqueryList subqueryList
ValueNode joinClause
boolean joinClauseNormalized
PredicateList joinPredicates
ResultColumnList usingClause
java.util.Properties joinOrderStrategyProperties
JoinNode(ResultSetNode leftResult, ResultSetNode rightResult, ValueNode onClause, ResultColumnList usingClause, ResultColumnList selectList, java.util.Properties tableProperties, java.util.Properties joinOrderStrategyProperties, ContextManager cm) throws StandardException
leftResult
- The ResultSetNode on the left side of this joinrightResult
- The ResultSetNode on the right side of this joinonClause
- The ON clauseusingClause
- The USING clauseselectList
- The result column list for the jointableProperties
- Properties list associated with the tablejoinOrderStrategyProperties
- User provided optimizer overridescm
- The context managerStandardException
- Thrown on errorpublic CostEstimate optimizeIt(Optimizer optimizer, OptimizablePredicateList predList, CostEstimate outerCost, RowOrdering rowOrdering) throws StandardException
Optimizable
optimizeIt
in interface Optimizable
optimizeIt
in class FromTable
optimizer
- Optimizer to use.predList
- The predicate list to optimize againstouterCost
- 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.StandardException
- Thrown on errorOptimizable.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)
public boolean pushOptPredicate(OptimizablePredicate optimizablePredicate) throws StandardException
Optimizable
pushOptPredicate
in interface Optimizable
pushOptPredicate
in class FromTable
optimizablePredicate
- OptimizablePredicate to push down.StandardException
- Thrown on errorOptimizable.pushOptPredicate(org.apache.derby.iapi.sql.compile.OptimizablePredicate)
public Optimizable modifyAccessPath(JBitSet outerTables) throws StandardException
Optimizable
modifyAccessPath
in interface Optimizable
modifyAccessPath
in class TableOperatorNode
outerTables
- Bit map of the tables that are outer to this one
in the join order.StandardException
- Thrown on errorOptimizable.modifyAccessPath(org.apache.derby.iapi.util.JBitSet)
protected void adjustNumberOfRowsReturned(CostEstimate costEstimate)
ResultColumnList getAllResultColumns(TableName allTableName) throws StandardException
getAllResultColumns
in class ResultSetNode
allTableName
- The qualifier on the "*"StandardException
- Thrown on errorprivate ResultColumnList getAllResultColumnsNoUsing(TableName allTableName) throws StandardException
allTableName
- The qualifier on the "*"StandardException
- Thrown on errorResultColumn getMatchingColumn(ColumnReference columnReference) throws StandardException
getMatchingColumn
in class ResultSetNode
columnReference
- The columnReference whose name we're looking
for in the given table.StandardException
- Thrown on errorpublic void bindExpressions(FromList fromListParam) throws StandardException
bindExpressions
in class TableOperatorNode
fromListParam
- FromList to use/append to.StandardException
- Thrown on errorvoid bindResultColumns(FromList fromListParam) throws StandardException
bindResultColumns
in class TableOperatorNode
fromListParam
- FromList to use/append to.StandardException
- Thrown on errorvoid bindResultColumns(TableDescriptor targetTableDescriptor, FromVTI targetVTI, ResultColumnList targetColumnList, DMLStatementNode statement, FromList fromListParam) throws StandardException
bindResultColumns
in class TableOperatorNode
targetTableDescriptor
- The TableDescriptor for the table being
updated or inserted intotargetColumnList
- For INSERT statements, the user
does not have to supply column
names (for example, "insert into t
values (1,2,3)". When this
parameter is null, it means that
the user did not supply column
names, and so the binding should
be done based on order. When it
is not null, it means do the binding
by name, not position.statement
- Calling DMLStatementNode (Insert or Update)fromListParam
- FromList to use/append to.StandardException
- Thrown on errorprivate void buildRCL() throws StandardException
StandardException
- Thrown on errorprivate void deferredBindExpressions(FromList fromListParam) throws StandardException
StandardException
public ValueNode bindExpression(ValueNode expression, boolean useLeftChild, boolean useRightChild, java.lang.String expressionType) throws StandardException
StandardException
public FromList makeFromList(boolean useLeftChild, boolean useRightChild) throws StandardException
StandardException
private ResultColumnList getCommonColumnsForNaturalJoin() throws StandardException
StandardException
- on errorprivate static java.util.List<java.lang.String> extractColumnNames(ResultColumnList rcl)
rcl
- the result column list to extract the names fromResultSetNode preprocess(int numTables, GroupByList gbl, FromList fromList) throws StandardException
preprocess
in class TableOperatorNode
numTables
- Number of tables in the DML Statementgbl
- The group by list, if anyfromList
- The from list, if anyStandardException
- Thrown on errorvoid projectResultColumns() throws StandardException
projectResultColumns
in class TableOperatorNode
StandardException
void normExpressions() throws StandardException
StandardException
- Thrown on errorvoid pushExpressions(PredicateList outerPredicateList) throws StandardException
pushExpressions
in class FromTable
outerPredicateList
- The PredicateList from the outer RS.StandardException
- Thrown on errorprotected void pushExpressionsToLeft(PredicateList outerPredicateList) throws StandardException
StandardException
private void pushExpressionsToRight(PredicateList outerPredicateList) throws StandardException
StandardException
private void grabJoinPredicates(PredicateList outerPredicateList) throws StandardException
StandardException
FromList flatten(ResultColumnList rcl, PredicateList outerPList, SubqueryList sql, GroupByList gbl, ValueNode havingClause) throws StandardException
flatten
in class FromTable
rcl
- The RCL from the outer queryouterPList
- PredicateList to append wherePredicates to.sql
- The SubqueryList from the outer querygbl
- The group by list, if anyhavingClause
- The HAVING clause, if anyStandardException
- Thrown on errorboolean LOJ_reorderable(int numTables) throws StandardException
LOJ_reorderable
in class FromTable
StandardException
FromTable transformOuterJoins(ValueNode predicateTree, int numTables) throws StandardException
transformOuterJoins
in class FromTable
predicateTree
- The predicate tree for the query blockStandardException
- Thrown on errorvoid generate(ActivationClassBuilder acb, MethodBuilder mb) throws StandardException
generate
in class QueryTreeNode
acb
- The ActivationClassBuilder for the class being builtmb
- The method for the generated code to go intoStandardException
- Thrown on errorvoid generateCore(ActivationClassBuilder acb, MethodBuilder mb, int joinType) throws StandardException
StandardException
- Thrown on errorvoid generateCore(ActivationClassBuilder acb, MethodBuilder mb, int joinType, ValueNode joinClause, SubqueryList subquerys) throws StandardException
acb
- The ActivationClassBuildermb
- the method the code is to go intojoinType
- The join typejoinClause
- The join clause, if anysubquerys
- The list of subqueries in the join clause, if anyStandardException
- Thrown on errorprivate int getJoinArguments(ActivationClassBuilder acb, MethodBuilder mb, ValueNode joinClause) throws StandardException
acb
- The ActivationClassBuilder for the class we're building.mb
- the method the generated code is going intojoinClause
- The join clause, if anyStandardException
- Thrown on errorCostEstimate getFinalCostEstimate() throws StandardException
FromTable
getFinalCostEstimate
in class FromTable
StandardException
Get the final CostEstimate for this JoinNode.
void oneRowRightSide(ActivationClassBuilder acb, MethodBuilder mb) throws StandardException
StandardException
protected int getNumJoinArguments()
int addOuterJoinArguments(ActivationClassBuilder acb, MethodBuilder mb) throws StandardException
acb
- The ActivationClassBuildermb
- the method the generated code is to go into
return The number of args addedStandardException
- Thrown on errorstatic java.lang.String joinTypeToString(int joinType)
joinType
- The joinType as an int.protected PredicateList getLeftPredicateList() throws StandardException
StandardException
protected PredicateList getRightPredicateList() throws StandardException
StandardException
int updateTargetLockMode()
updateTargetLockMode
in class ResultSetNode
TransactionController
void notFlattenableJoin()
notFlattenableJoin
in class ResultSetNode
boolean isFlattenableJoinNode()
isFlattenableJoinNode
in class FromTable
boolean isOrderedOn(ColumnReference[] crs, boolean permuteOrdering, java.util.List<FromBaseTable> fbtHolder) throws StandardException
isOrderedOn
in class ResultSetNode
crs
- The specified ColumnReference[]permuteOrdering
- Whether or not the order of the CRs in the array can be permutedfbtHolder
- List that is to be filled with the FromBaseTableStandardException
- Thrown on errorvoid printSubNodes(int depth)
printSubNodes
in class TableOperatorNode
depth
- The depth of this node in the treevoid setSubqueryList(SubqueryList subqueryList)
void setAggregates(java.util.List<AggregateNode> aggregates)
void setNaturalJoin()
ResultSetNode getLogicalLeftResultSet()
ResultSetNode getLogicalRightResultSet()
void acceptChildren(Visitor v) throws StandardException
acceptChildren
in class TableOperatorNode
v
- the visitorStandardException
- on errorJBitSet LOJgetReferencedTables(int numTables) throws StandardException
LOJgetReferencedTables
in class ResultSetNode
StandardException
Apache Derby V10.14 Internals - Copyright © 2004,2018 The Apache Software Foundation. All Rights Reserved.