|
|||||||||
PREV CLASS NEXT CLASS | FRAMES NO FRAMES | ||||||||
SUMMARY: NESTED | FIELD | CONSTR | METHOD | DETAIL: FIELD | CONSTR | METHOD |
java.lang.Objectorg.apache.derby.impl.sql.compile.QueryTreeNode
org.apache.derby.impl.sql.compile.ResultSetNode
org.apache.derby.impl.sql.compile.FromTable
org.apache.derby.impl.sql.compile.SingleChildResultSetNode
org.apache.derby.impl.sql.compile.GroupByNode
public class GroupByNode
A GroupByNode represents a result set for a grouping operation on a select. Note that this includes a SELECT with aggregates and no grouping columns (in which case the select list is null) It has the same description as its input result set.
For the most part, it simply delegates operations to its bottomPRSet, which is currently expected to be a ProjectRestrictResultSet generated for a SelectNode.
NOTE: A GroupByNode extends FromTable since it can exist in a FromList.
There is a lot of room for optimizations here:
Nested Class Summary | |
---|---|
private static class |
GroupByNode.ExpressionSorter
Comparator class for GROUP BY expression substitution. |
Field Summary | |
---|---|
private boolean |
addDistinctAggregate
|
private int |
addDistinctAggregateColumnNum
|
private AggregatorInfoList |
aggInfo
Information that is used at execution time to process aggregates. |
(package private) java.util.Vector |
aggregateVector
The list of all aggregates in the query block that contains this group by. |
(package private) GroupByList |
groupingList
The GROUP BY list |
private ValueNode |
havingClause
|
private SubqueryList |
havingSubquerys
|
private boolean |
isInSortedOrder
|
(package private) FromTable |
parent
The parent to the GroupByNode. |
private boolean |
singleInputRowOptimization
|
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 | |
---|---|
GroupByNode()
|
Method Summary | |
---|---|
private void |
addAggregateColumns()
In the query rewrite involving aggregates, add the columns for aggregation. |
private void |
addAggregates()
Add the extra result columns required by the aggregates to the result list. |
private void |
addDistinctAggregatesToOrderBy()
Add any distinct aggregates to the order by list. |
private void |
addNewColumnsForAggregation()
Add a whole slew of columns needed for aggregation. |
private void |
addNewPRNode()
Add a new PR node for aggregation. |
private java.util.ArrayList |
addUnAggColumns()
In the query rewrite for group by, add the columns on which we are doing the group by. |
(package private) void |
considerPostOptimizeOptimizations(boolean selectHasPredicates)
Consider any optimizations after the optimizer has chosen a plan. |
CostEstimate |
estimateCost(OptimizablePredicateList predList,
ConglomerateDescriptor cd,
CostEstimate outerCost,
Optimizer optimizer,
RowOrdering rowOrdering)
Estimate the cost of scanning this Optimizable using the given predicate list with the given conglomerate. |
boolean |
flattenableInFromSubquery(FromList fromList)
Evaluate whether or not the subquery in a FromSubquery is flattenable. |
void |
generate(ActivationClassBuilder acb,
MethodBuilder mb)
generate the sort result set operating over the source resultset. |
private void |
genGroupedAggregateResultSet(ActivationClassBuilder acb,
MethodBuilder mb)
Generate the code to evaluate grouped aggregates. |
private void |
genScalarAggregateResultSet(ActivationClassBuilder acb,
MethodBuilder mb)
Generate the code to evaluate scalar aggregates. |
private ResultColumn |
getColumnReference(ResultColumn targetRC,
DataDictionary dd)
Method for creating a new result column referencing the one passed in. |
(package private) boolean |
getIsInSortedOrder()
Get whether or not the source is in sorted order. |
FromTable |
getParent()
Return the parent node to this one, if there is one. |
void |
init(java.lang.Object bottomPR,
java.lang.Object groupingList,
java.lang.Object aggregateVector,
java.lang.Object havingClause,
java.lang.Object havingSubquerys,
java.lang.Object tableProperties,
java.lang.Object nestingLevel)
Intializer for a GroupByNode. |
boolean |
isOneRowResultSet()
Return whether or not the underlying ResultSet tree will return a single row, at most. |
(package private) ResultColumnDescriptor[] |
makeResultDescriptors()
|
ResultSetNode |
optimize(DataDictionary dataDictionary,
PredicateList predicates,
double outerRows)
Optimize this GroupByNode. |
CostEstimate |
optimizeIt(Optimizer optimizer,
OptimizablePredicateList predList,
CostEstimate outerCost,
RowOrdering rowOrdering)
Choose the best access path for this Optimizable. |
void |
printSubNodes(int depth)
Prints the sub-nodes of this object. |
boolean |
pushOptPredicate(OptimizablePredicate optimizablePredicate)
Push an OptimizablePredicate down, if this node accepts it. |
java.lang.String |
toString()
Convert this object to a String. |
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 |
---|
GroupByList groupingList
java.util.Vector aggregateVector
private AggregatorInfoList aggInfo
FromTable parent
private boolean addDistinctAggregate
private boolean singleInputRowOptimization
private int addDistinctAggregateColumnNum
private boolean isInSortedOrder
private ValueNode havingClause
private SubqueryList havingSubquerys
Constructor Detail |
---|
public GroupByNode()
Method Detail |
---|
public void init(java.lang.Object bottomPR, java.lang.Object groupingList, java.lang.Object aggregateVector, java.lang.Object havingClause, java.lang.Object havingSubquerys, java.lang.Object tableProperties, java.lang.Object nestingLevel) throws StandardException
init
in class QueryTreeNode
bottomPR
- The child FromTablegroupingList
- The groupingListaggregateVector
- The vector of aggregates from
the query block. Since aggregation is done
at the same time as grouping, we need them
here.havingClause
- The having clause.havingSubquerys
- subqueries in the having clause.tableProperties
- Properties list associated with the tablenestingLevel
- nestingLevel of this group by node. This is used for
error checking of group by queries with having clause.
StandardException
- Thrown on errorboolean getIsInSortedOrder()
private void addAggregates() throws StandardException
standard
- exception
StandardException
private void addDistinctAggregatesToOrderBy()
private void addNewPRNode() throws StandardException
standard
- exception
StandardException
private java.util.ArrayList addUnAggColumns() throws StandardException
StandardException
addNewColumnsForAggregation()
private void addNewColumnsForAggregation() throws StandardException
At this point this is invoked, we have the following tree:
For each ColumnReference in PR RCL
For a query like,
select c1, sum(c2), max(c3) from t1 group by c1;the query tree ends up looking like this:
ProjectRestrictNode RCL -> (ptr to GBN(column[0]), ptr to GBN(column[1]), ptr to GBN(column[4])) | GroupByNode RCL->(C1, SUM(C2),The RCL of the GroupByNode contains all the unagg (or grouping columns) followed by 3 RC's for each aggregate in this order: the final computed aggregate value, the aggregate input and the aggregator function., , MAX(C3), , ) | ProjectRestrict RCL->(C1, C2, C3) | FromBaseTable
The Aggregator function puts the results in the first of the 3 RC's and the PR resultset in turn picks up the value from there.
The notation (ptr to GBN(column[0])) basically means that it is a pointer to the 0th RC in the RCL of the GroupByNode.
The addition of these unagg and agg columns to the GroupByNode and to the PRN is performed in addUnAggColumns and addAggregateColumns.
Note that that addition of the GroupByNode is done after the query is optimized (in SelectNode#modifyAccessPaths) which means a fair amount of patching up is needed to account for generated group by columns.
standard
- exception
StandardException
private void addAggregateColumns() throws StandardException
StandardException
addNewColumnsForAggregation()
public FromTable getParent()
public 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 CostEstimate estimateCost(OptimizablePredicateList predList, ConglomerateDescriptor cd, CostEstimate outerCost, Optimizer optimizer, RowOrdering rowOrdering) throws StandardException
Optimizable
estimateCost
in interface Optimizable
estimateCost
in class FromTable
predList
- The predicate list to optimize againstcd
- The conglomerate descriptor to get the cost ofouterCost
- The estimated cost of the part of the plan outer
to this optimizable.optimizer
- The optimizer to use to help estimate the costrowOrdering
- The row ordering for all the tables in the
join order, including this one.
StandardException
- Thrown on errorOptimizable.estimateCost(org.apache.derby.iapi.sql.compile.OptimizablePredicateList, org.apache.derby.iapi.sql.dictionary.ConglomerateDescriptor, org.apache.derby.iapi.sql.compile.CostEstimate, org.apache.derby.iapi.sql.compile.Optimizer, 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 java.lang.String toString()
toString
in class FromTable
public void printSubNodes(int depth)
printSubNodes
in class SingleChildResultSetNode
depth
- The depth of this node in the treepublic boolean flattenableInFromSubquery(FromList fromList)
flattenableInFromSubquery
in class SingleChildResultSetNode
fromList
- The outer from list
public ResultSetNode optimize(DataDictionary dataDictionary, PredicateList predicates, double outerRows) throws StandardException
optimize
in class SingleChildResultSetNode
dataDictionary
- The DataDictionary to use for optimizationpredicates
- The PredicateList to optimize. This should
be a join predicate.outerRows
- The number of outer joining rows
StandardException
- Thrown on errorResultColumnDescriptor[] makeResultDescriptors()
makeResultDescriptors
in class ResultSetNode
public boolean isOneRowResultSet() throws StandardException
isOneRowResultSet
in class SingleChildResultSetNode
StandardException
- Thrown on errorpublic void 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 into
StandardException
- Thrown on errorprivate void genScalarAggregateResultSet(ActivationClassBuilder acb, MethodBuilder mb)
private void genGroupedAggregateResultSet(ActivationClassBuilder acb, MethodBuilder mb) throws StandardException
StandardException
private ResultColumn getColumnReference(ResultColumn targetRC, DataDictionary dd) throws StandardException
targetRC
- the sourcedd
-
StandardException
- on errorvoid considerPostOptimizeOptimizations(boolean selectHasPredicates) throws StandardException
selectHasPredicates
- true if SELECT containing this
vector/scalar aggregate has a restriction
StandardException
- on error
|
Built on Thu 2011-03-10 11:54:14+0000, from revision ??? | ||||||||
PREV CLASS NEXT CLASS | FRAMES NO FRAMES | ||||||||
SUMMARY: NESTED | FIELD | CONSTR | METHOD | DETAIL: FIELD | CONSTR | METHOD |