Class DataAnalysisOperation

java.lang.Object
org.h2.expression.Expression
org.h2.expression.analysis.DataAnalysisOperation
All Implemented Interfaces:
HasSQL, Typed
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 Details

    • STAGE_RESET

      public static final int STAGE_RESET
      Reset stage. Used to reset internal data to its initial state.
      See Also:
    • STAGE_GROUP

      public static final int STAGE_GROUP
      Group stage, used for explicit or implicit GROUP BY operation.
      See Also:
    • STAGE_WINDOW

      public static final int STAGE_WINDOW
      Window processing stage.
      See Also:
    • 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 Details

    • DataAnalysisOperation

      protected DataAnalysisOperation(Select select)
  • Method Details

    • createOrder

      protected static SortOrder createOrder(SessionLocal session, ArrayList<QueryOrderBy> orderBy, int offset)
      Create sort order.
      Parameters:
      session - database session
      orderBy - array of order by expressions
      offset - 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 class Expression
      Parameters:
      resolver - the column resolver
      level - the subquery nesting level
      state - current state for nesting checks, initial value is Expression.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 resolver
      level - the subquery nesting level
      innerState - 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 class Expression
      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 class Expression
      Parameters:
      tableFilter - the table filter
      b - 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 class Expression
      Parameters:
      session - the session
      stage - select stage
    • updateAggregate

      protected abstract void updateAggregate(SessionLocal session, SelectGroups groupData, int groupRowId)
      Update a row of an aggregate.
      Parameters:
      session - the database session
      groupData - data for the aggregate group
      groupRowId - 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 session
      stage - 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 session
      array - array to store values of expressions
    • getWindowData

      protected Object getWindowData(SessionLocal session, SelectGroups groupData, boolean forOrderBy)
      Get the aggregate data for a window clause.
      Parameters:
      session - database session
      groupData - aggregate group data
      forOrderBy - true if this is for ORDER BY
      Returns:
      the aggregate data object, specific to each kind of aggregate.
    • getGroupData

      protected Object getGroupData(SelectGroups groupData, boolean ifExists)
      Get the aggregate group data object from the collector object.
      Parameters:
      groupData - the collector object
      ifExists - if true, return null if object not found, if false, return new object if nothing found
      Returns:
      group data object
    • createAggregateData

      protected abstract 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 class Expression
      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 class Expression
      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 session
      groupData - the group data
      Returns:
      result of this function
    • getAggregatedValue

      protected abstract Value getAggregatedValue(SessionLocal session, Object aggregateData)
      Returns aggregated value.
      Parameters:
      session - the session
      aggregateData - 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 session
      groupData - data for the aggregate group
      groupRowId - row id of group
      orderBy - 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 session
      result - the map to append result to
      ordered - ordered data
      rowIdColumn - 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 builder
      sqlFlags - formatting flags
      forceOrderBy - whether synthetic ORDER BY clause should be generated when it is missing
      Returns:
      the builder object