org.h2.command.dml

## Class SelectGroups

- java.lang.Object
- - org.h2.command.dml.SelectGroups

    public abstract class SelectGroups
    extends java.lang.Object

Grouped data for aggregates.

Call sequence:

- `reset()`.
- For each source row `nextSource()` should be invoked.
- `done()`.
- `next()` is invoked inside a loop until it returns null.

Call sequence for lazy group sorted result:

- `resetLazy()` (not required before the first execution).
- For each source group `nextLazyGroup()` should be invoked.
- For each source row `nextLazyRow()` should be invoked. Each group can have one or more rows.

### Method Summary

Methods
`void` `done()` Invoked after all source rows are evaluated.
`java.util.ArrayList<Expression>` `expressions()` Gets the query's column list, including invisible expressions such as order by expressions.
`java.lang.Object` `getCurrentGroupExprData(Expression expr)` Get the group-by data for the current group and the passed in expression.
`int` `getCurrentGroupRowId()` Returns identity of the current row.
`static SelectGroups` `getInstance(Session session, java.util.ArrayList<Expression> expressions, boolean isGroupQuery, int[] groupIndex)` Creates new instance of grouped data.
`PartitionData` `getWindowExprData(DataAnalysisOperation expr, Value partitionKey)` Get the window data for the specified expression.
`boolean` `isCurrentGroup()` Is there currently a group-by active.
`abstract ValueRow` `next()` Returns the key of the next group.
`void` `nextLazyGroup()` Moves group data to the next group in lazy mode.
`void` `nextLazyRow()` Moves group data to the next row in lazy mode.
`abstract void` `nextSource()` Invoked for each source row to evaluate group key and setup all necessary data for aggregates.
`void` `remove()` Removes the data for the current key.
`void` `reset()` Resets this group data for reuse.
`void` `resetLazy()` Resets this group data for reuse in lazy mode.
`void` `setCurrentGroupExprData(Expression expr, java.lang.Object obj)` Set the group-by data for the current group and the passed in expression.
`void` `setWindowExprData(DataAnalysisOperation expr, Value partitionKey, PartitionData obj)` Set the window data for the specified expression.

### Methods inherited from class java.lang.Object

`clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait`

### Method Detail

#### getInstance

    public static SelectGroups getInstance(Session session,
                           java.util.ArrayList<Expression> expressions,
                           boolean isGroupQuery,
                           int[] groupIndex)

Creates new instance of grouped data.

Parameters:
  `session` - the session
  `expressions` - the expressions
  `isGroupQuery` - is this query is a group query
  `groupIndex` - the indexes of group expressions, or null
Returns:
  new instance of the grouped data.

#### isCurrentGroup

    public boolean isCurrentGroup()

Is there currently a group-by active.

Returns:
  `true` if there is currently a group-by active, otherwise returns `false`.

#### getCurrentGroupExprData

    public final java.lang.Object getCurrentGroupExprData(Expression expr)

Get the group-by data for the current group and the passed in expression.

Parameters:
  `expr` - expression
Returns:
  expression data or null

#### setCurrentGroupExprData

    public final void setCurrentGroupExprData(Expression expr,
                               java.lang.Object obj)

Set the group-by data for the current group and the passed in expression.

Parameters:
  `expr` - expression
  `obj` - expression data to set

#### getWindowExprData

    public final PartitionData getWindowExprData(DataAnalysisOperation expr,
                                  Value partitionKey)

Get the window data for the specified expression.

Parameters:
  `expr` - expression
  `partitionKey` - a key of partition
Returns:
  expression data or null

#### setWindowExprData

    public final void setWindowExprData(DataAnalysisOperation expr,
                         Value partitionKey,
                         PartitionData obj)

Set the window data for the specified expression.

Parameters:
  `expr` - expression
  `partitionKey` - a key of partition
  `obj` - window expression data to set

#### getCurrentGroupRowId

    public int getCurrentGroupRowId()

Returns identity of the current row. Used by aggregates to check whether they already processed this row or not.

Returns:
  identity of the current row

#### reset

    public void reset()

Resets this group data for reuse.

#### nextSource

    public abstract void nextSource()

Invoked for each source row to evaluate group key and setup all necessary data for aggregates.

#### done

    public void done()

Invoked after all source rows are evaluated.

#### next

    public abstract ValueRow next()

Returns the key of the next group.

Returns:
  the key of the next group, or null

#### remove

    public void remove()

Removes the data for the current key.

See Also:
  `next()`

#### resetLazy

    public void resetLazy()

Resets this group data for reuse in lazy mode.

#### nextLazyGroup

    public void nextLazyGroup()

Moves group data to the next group in lazy mode.

#### nextLazyRow

    public void nextLazyRow()

Moves group data to the next row in lazy mode.

#### expressions

    public java.util.ArrayList<Expression> expressions()

Gets the query's column list, including invisible expressions such as order by expressions.

Returns:
  Expressions.