Package org.h2.expression.analysis
Class DataAnalysisOperation
java.lang.Object
org.h2.expression.Expression
org.h2.expression.analysis.DataAnalysisOperation
- Direct Known Subclasses:
AbstractAggregate
,WindowFunction
A base class for data analysis operations such as aggregates and window
functions.
-
Field Summary
FieldsModifier and TypeFieldDescriptionprivate int
private int
protected Window
OVER clauseprotected SortOrder
Sort order for OVERprotected final Select
SELECTstatic final int
Group stage, used for explicit or implicit GROUP BY operation.static final int
Reset stage.static final int
Window processing stage.Fields inherited from class org.h2.expression.Expression
AUTO_PARENTHESES, MAP_IN_AGGREGATE, MAP_IN_WINDOW, MAP_INITIAL, WITH_PARENTHESES, WITHOUT_PARENTHESES
Fields inherited from interface org.h2.util.HasSQL
ADD_PLAN_INFORMATION, DEFAULT_SQL_FLAGS, NO_CASTS, QUOTE_ONLY_WHEN_REQUIRED, REPLACE_LOBS_FOR_TRACE, TRACE_SQL_FLAGS
-
Constructor Summary
Constructors -
Method Summary
Modifier and TypeMethodDescriptionprotected StringBuilder
appendTailConditions
(StringBuilder builder, int sqlFlags, boolean forceOrderBy) Used to create SQL for the OVER and FILTER clauses.private void
checkOrderBy
(WindowFrameUnits units, int orderBySize) protected abstract Object
Create aggregate data object specific to the subclass.protected static SortOrder
createOrder
(SessionLocal session, ArrayList<QueryOrderBy> orderBy, int offset) Create sort order.protected abstract Value
getAggregatedValue
(SessionLocal session, Object aggregateData) Returns aggregated value.protected Object
getGroupData
(SelectGroups groupData, boolean ifExists) Get the aggregate group data object from the collector object.protected abstract int
Returns the number of expressions, excluding OVER clause.private int
Returns the number of window frame expressions.private Value
getOrderedResult
(SessionLocal session, SelectGroups groupData, PartitionData partition, Object data) protected abstract void
getOrderedResultLoop
(SessionLocal session, HashMap<Integer, Value> result, ArrayList<Value[]> ordered, int rowIdColumn) Returns result of this window function or window aggregate.protected SortOrder
Returns the sort order for OVER clause.getValue
(SessionLocal session) Return the resulting value for the current row.protected Object
getWindowData
(SessionLocal session, SelectGroups groupData, boolean forOrderBy) Get the aggregate data for a window clause.private Value
getWindowResult
(SessionLocal session, SelectGroups groupData) Returns result of this window function or window aggregate.abstract boolean
Checks whether this expression is an aggregate function.boolean
isEverything
(ExpressionVisitor visitor) Check if this expression and all sub-expressions can fulfill a criteria.final void
mapColumns
(ColumnResolver resolver, int level, int state) Map the columns of the resolver to expression columns.protected void
mapColumnsAnalysis
(ColumnResolver resolver, int level, int innerState) Map the columns of the resolver to expression columns.optimize
(SessionLocal session) Try to optimize the expression.protected abstract void
rememberExpressions
(SessionLocal session, Value[] array) Stores current values of expressions into the specified array.void
setEvaluatable
(TableFilter tableFilter, boolean b) Tell the expression columns whether the table filter can return values now.void
setOverCondition
(Window over) Sets the OVER condition.final void
updateAggregate
(SessionLocal session, int stage) Update an aggregate value.protected abstract void
updateAggregate
(SessionLocal session, SelectGroups groupData, int groupRowId) Update a row of an aggregate.protected void
updateGroupAggregates
(SessionLocal session, int stage) Invoked when processing group stage of grouped window queries to update arguments of this aggregate.protected void
updateOrderedAggregate
(SessionLocal session, SelectGroups groupData, int groupRowId, ArrayList<QueryOrderBy> orderBy) Update a row of an ordered aggregate.Methods inherited from class org.h2.expression.Expression
addFilterConditions, createIndexConditions, getAlias, getBooleanValue, getColumnName, getColumnNameForView, getCost, getEnclosedSQL, getNonAliasExpression, getNotIfPossible, getNullable, getSchemaName, getSQL, getSQL, getSQL, getSQL, getSubexpression, getSubexpressionCount, getTableAlias, getTableName, getType, getUnenclosedSQL, getWhenSQL, getWhenValue, isConstant, isIdentity, isNullConstant, isValueSet, isWhenConditionOperand, needParentheses, optimizeCondition, toString, writeExpressions, writeExpressions
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, wait
Methods inherited from interface org.h2.util.HasSQL
getTraceSQL
-
Field Details
-
STAGE_RESET
public static final int STAGE_RESETReset stage. Used to reset internal data to its initial state.- See Also:
-
STAGE_GROUP
public static final int STAGE_GROUPGroup stage, used for explicit or implicit GROUP BY operation.- See Also:
-
STAGE_WINDOW
public static final int STAGE_WINDOWWindow processing stage.- See Also:
-
select
SELECT -
over
OVER clause -
overOrderBySort
Sort order for OVER -
numFrameExpressions
private int numFrameExpressions -
lastGroupRowId
private int lastGroupRowId
-
-
Constructor Details
-
DataAnalysisOperation
-
-
Method Details
-
createOrder
protected static SortOrder createOrder(SessionLocal session, ArrayList<QueryOrderBy> orderBy, int offset) Create sort order.- Parameters:
session
- database sessionorderBy
- array of order by expressionsoffset
- index offset- Returns:
- the SortOrder
-
setOverCondition
Sets the OVER condition.- Parameters:
over
- OVER condition
-
isAggregate
public abstract boolean isAggregate()Checks whether this expression is an aggregate function.- Returns:
- true if this is an aggregate function (including aggregates with OVER clause), false if this is a window function
-
getOverOrderBySort
Returns the sort order for OVER clause.- Returns:
- the sort order for OVER clause
-
mapColumns
Description copied from class:Expression
Map the columns of the resolver to expression columns.- Specified by:
mapColumns
in classExpression
- Parameters:
resolver
- the column resolverlevel
- the subquery nesting levelstate
- current state for nesting checks, initial value isExpression.MAP_INITIAL
-
mapColumnsAnalysis
Map the columns of the resolver to expression columns.- Parameters:
resolver
- the column resolverlevel
- the subquery nesting levelinnerState
- one of the Expression MAP_IN_* values
-
optimize
Description copied from class:Expression
Try to optimize the expression.- Specified by:
optimize
in classExpression
- Parameters:
session
- the session- Returns:
- the optimized expression
-
checkOrderBy
-
setEvaluatable
Description copied from class:Expression
Tell the expression columns whether the table filter can return values now. This is used when optimizing the query.- Specified by:
setEvaluatable
in classExpression
- Parameters:
tableFilter
- the table filterb
- true if the table filter can return value
-
updateAggregate
Description copied from class:Expression
Update an aggregate value. This method is called at statement execution time. It is usually called once for each row, but if the expression is used multiple times (for example in the column list, and as part of the HAVING expression) it is called multiple times - the row counter needs to be used to make sure the internal state is only updated once.- Specified by:
updateAggregate
in classExpression
- Parameters:
session
- the sessionstage
- select stage
-
updateAggregate
protected abstract void updateAggregate(SessionLocal session, SelectGroups groupData, int groupRowId) Update a row of an aggregate.- Parameters:
session
- the database sessiongroupData
- data for the aggregate groupgroupRowId
- row id of group
-
updateGroupAggregates
Invoked when processing group stage of grouped window queries to update arguments of this aggregate.- Parameters:
session
- the sessionstage
- select stage
-
getNumExpressions
protected abstract int getNumExpressions()Returns the number of expressions, excluding OVER clause.- Returns:
- the number of expressions
-
getNumFrameExpressions
private int getNumFrameExpressions()Returns the number of window frame expressions.- Returns:
- the number of window frame expressions
-
rememberExpressions
Stores current values of expressions into the specified array.- Parameters:
session
- the sessionarray
- array to store values of expressions
-
getWindowData
Get the aggregate data for a window clause.- Parameters:
session
- database sessiongroupData
- aggregate group dataforOrderBy
- true if this is for ORDER BY- Returns:
- the aggregate data object, specific to each kind of aggregate.
-
getGroupData
Get the aggregate group data object from the collector object.- Parameters:
groupData
- the collector objectifExists
- if true, return null if object not found, if false, return new object if nothing found- Returns:
- group data object
-
createAggregateData
Create aggregate data object specific to the subclass.- Returns:
- aggregate-specific data object.
-
isEverything
Description copied from class:Expression
Check if this expression and all sub-expressions can fulfill a criteria. If any part returns false, the result is false.- Specified by:
isEverything
in classExpression
- Parameters:
visitor
- the visitor- Returns:
- if the criteria can be fulfilled
-
getValue
Description copied from class:Expression
Return the resulting value for the current row.- Specified by:
getValue
in classExpression
- Parameters:
session
- the session- Returns:
- the result
-
getWindowResult
Returns result of this window function or window aggregate. This method is not used for plain aggregates.- Parameters:
session
- the sessiongroupData
- the group data- Returns:
- result of this function
-
getAggregatedValue
Returns aggregated value.- Parameters:
session
- the sessionaggregateData
- the aggregate data- Returns:
- aggregated value.
-
updateOrderedAggregate
protected void updateOrderedAggregate(SessionLocal session, SelectGroups groupData, int groupRowId, ArrayList<QueryOrderBy> orderBy) Update a row of an ordered aggregate.- Parameters:
session
- the database sessiongroupData
- data for the aggregate groupgroupRowId
- row id of grouporderBy
- list of order by expressions
-
getOrderedResult
private Value getOrderedResult(SessionLocal session, SelectGroups groupData, PartitionData partition, Object data) -
getOrderedResultLoop
protected abstract void getOrderedResultLoop(SessionLocal session, HashMap<Integer, Value> result, ArrayList<Value[]> ordered, int rowIdColumn) Returns result of this window function or window aggregate. This method may not be called on window aggregate without window order clause.- Parameters:
session
- the sessionresult
- the map to append result toordered
- ordered datarowIdColumn
- the index of row id value
-
appendTailConditions
protected StringBuilder appendTailConditions(StringBuilder builder, int sqlFlags, boolean forceOrderBy) Used to create SQL for the OVER and FILTER clauses.- Parameters:
builder
- string buildersqlFlags
- formatting flagsforceOrderBy
- whether synthetic ORDER BY clause should be generated when it is missing- Returns:
- the builder object
-