Package org.h2.expression.analysis
Class DataAnalysisOperation
- java.lang.Object
-
- org.h2.expression.Expression
-
- org.h2.expression.analysis.DataAnalysisOperation
-
- Direct Known Subclasses:
AbstractAggregate
,WindowFunction
public abstract class DataAnalysisOperation extends Expression
A base class for data analysis operations such as aggregates and window functions.
-
-
Field Summary
Fields Modifier and Type Field Description private int
lastGroupRowId
private int
numFrameExpressions
protected Window
over
OVER clauseprotected SortOrder
overOrderBySort
Sort order for OVERprotected Select
select
SELECTstatic int
STAGE_GROUP
Group stage, used for explicit or implicit GROUP BY operation.static int
STAGE_RESET
Reset stage.static int
STAGE_WINDOW
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 Modifier Constructor Description protected
DataAnalysisOperation(Select select)
-
Method Summary
All Methods Static Methods Instance Methods Abstract Methods Concrete Methods Modifier and Type Method Description protected java.lang.StringBuilder
appendTailConditions(java.lang.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 java.lang.Object
createAggregateData()
Create aggregate data object specific to the subclass.protected static SortOrder
createOrder(SessionLocal session, java.util.ArrayList<QueryOrderBy> orderBy, int offset)
Create sort order.protected abstract Value
getAggregatedValue(SessionLocal session, java.lang.Object aggregateData)
Returns aggregated value.protected java.lang.Object
getGroupData(SelectGroups groupData, boolean ifExists)
Get the aggregate group data object from the collector object.protected abstract int
getNumExpressions()
Returns the number of expressions, excluding OVER clause.private int
getNumFrameExpressions()
Returns the number of window frame expressions.private Value
getOrderedResult(SessionLocal session, SelectGroups groupData, PartitionData partition, java.lang.Object data)
protected abstract void
getOrderedResultLoop(SessionLocal session, java.util.HashMap<java.lang.Integer,Value> result, java.util.ArrayList<Value[]> ordered, int rowIdColumn)
Returns result of this window function or window aggregate.protected SortOrder
getOverOrderBySort()
Returns the sort order for OVER clause.Value
getValue(SessionLocal session)
Return the resulting value for the current row.protected java.lang.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
isAggregate()
Checks whether this expression is an aggregate function.boolean
isEverything(ExpressionVisitor visitor)
Check if this expression and all sub-expressions can fulfill a criteria.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.Expression
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.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, java.util.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 Detail
-
STAGE_RESET
public static final int STAGE_RESET
Reset stage. Used to reset internal data to its initial state.- See Also:
- Constant Field Values
-
STAGE_GROUP
public static final int STAGE_GROUP
Group stage, used for explicit or implicit GROUP BY operation.- See Also:
- Constant Field Values
-
STAGE_WINDOW
public static final int STAGE_WINDOW
Window processing stage.- See Also:
- Constant Field Values
-
select
protected final Select select
SELECT
-
over
protected Window over
OVER clause
-
overOrderBySort
protected SortOrder overOrderBySort
Sort order for OVER
-
numFrameExpressions
private int numFrameExpressions
-
lastGroupRowId
private int lastGroupRowId
-
-
Constructor Detail
-
DataAnalysisOperation
protected DataAnalysisOperation(Select select)
-
-
Method Detail
-
createOrder
protected static SortOrder createOrder(SessionLocal session, java.util.ArrayList<QueryOrderBy> orderBy, int offset)
Create sort order.- Parameters:
session
- database sessionorderBy
- array of order by expressionsoffset
- index offset- Returns:
- the SortOrder
-
setOverCondition
public void setOverCondition(Window over)
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
protected SortOrder getOverOrderBySort()
Returns the sort order for OVER clause.- Returns:
- the sort order for OVER clause
-
mapColumns
public final void mapColumns(ColumnResolver resolver, int level, int state)
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
protected void mapColumnsAnalysis(ColumnResolver resolver, int level, int innerState)
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
public Expression optimize(SessionLocal session)
Description copied from class:Expression
Try to optimize the expression.- Specified by:
optimize
in classExpression
- Parameters:
session
- the session- Returns:
- the optimized expression
-
checkOrderBy
private void checkOrderBy(WindowFrameUnits units, int orderBySize)
-
setEvaluatable
public void setEvaluatable(TableFilter tableFilter, boolean b)
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
public final void updateAggregate(SessionLocal session, int stage)
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
protected void updateGroupAggregates(SessionLocal session, int stage)
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
protected abstract void rememberExpressions(SessionLocal session, Value[] array)
Stores current values of expressions into the specified array.- Parameters:
session
- the sessionarray
- array to store values of expressions
-
getWindowData
protected java.lang.Object getWindowData(SessionLocal session, SelectGroups groupData, boolean forOrderBy)
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
protected java.lang.Object getGroupData(SelectGroups groupData, boolean ifExists)
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
protected abstract java.lang.Object createAggregateData()
Create aggregate data object specific to the subclass.- Returns:
- aggregate-specific data object.
-
isEverything
public boolean isEverything(ExpressionVisitor visitor)
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
public Value getValue(SessionLocal session)
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
private Value getWindowResult(SessionLocal session, SelectGroups groupData)
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
protected abstract Value getAggregatedValue(SessionLocal session, java.lang.Object aggregateData)
Returns aggregated value.- Parameters:
session
- the sessionaggregateData
- the aggregate data- Returns:
- aggregated value.
-
updateOrderedAggregate
protected void updateOrderedAggregate(SessionLocal session, SelectGroups groupData, int groupRowId, java.util.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, java.lang.Object data)
-
getOrderedResultLoop
protected abstract void getOrderedResultLoop(SessionLocal session, java.util.HashMap<java.lang.Integer,Value> result, java.util.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 java.lang.StringBuilder appendTailConditions(java.lang.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
-
-