Class HashAggregationOperator

java.lang.Object
org.elasticsearch.compute.operator.HashAggregationOperator
All Implemented Interfaces:
Closeable, AutoCloseable, Operator, Releasable
Direct Known Subclasses:
TimeSeriesAggregationOperator, TimeSeriesCollapseOperator

public class HashAggregationOperator extends Object implements Operator
Aggregates input Pages into many output rows, grouping by some values.

Receives input pages until we call finish(), telling it there are no more pages. Each aggregation is an instance of GroupingAggregatorFunction.

For

| STATS MIN(discovered), MAX(discovered) BY class
this'd look like:

Before first page:
                                    ┌─────────────────┬─────────────────┬──────────┐
                                    │ MIN(discovered) │ MAX(discovered) │ class    │
                                    ├─────────────────┼─────────────────┼──────────┤
                                    └─────────────────┴─────────────────┴──────────┘

First page:
┌──────┬──────────┬────────────┐    ┌─────────────────┬─────────────────┬──────────┐
│  ref │ class    │ discovered │    │ MIN(discovered) │ MAX(discovered) │ class    │
├──────┼──────────┼────────────┤    ├─────────────────┼─────────────────┼──────────┤
│  079 │ Euclid   │ 1988-01-01 │ -> │ 1988-01-01      │ 1993-01-01      │ Euclid   │
│  173 │ Euclid   │ 1993-01-01 │    │ 1967-01-01      │ 1967-01-01      │ Keter    │
│ 1313 │ Keter    │ 1967-01-01 │    │ 1991-01-01      │ 1991-01-01      │ Safe     │
│ 1981 │ Safe     │ 1991-01-01 │    └─────────────────┴─────────────────┴──────────┘
└──────┴──────────┴────────────┘

Second page:
┌──────┬──────────┬────────────┐    ┌─────────────────┬─────────────────┬──────────┐
│  ref │ class    │ discovered │    │ MIN(discovered) │ MAX(discovered) │ class    │
├──────┼──────────┼────────────┤    ├─────────────────┼─────────────────┼──────────┤
│ 2317 │ Keter    │ 1922-01-01 │ -> │ 1988-01-01      │ 2010-01-01      │ Euclid   │
│ 2639 │ Euclid   │ 2010-01-01 │    │ 1922-01-01      │ 2016-04-28      │ Keter    │
│ 2935 │ Keter    │ 2016-04-28 │    │ 1991-01-01      │ 1991-01-01      │ Safe     │
│ 3000 │ Thaumiel │ 1971-01-01 │    │ 1971-01-01      │ 1971-01-01      │ Thaumiel │
└──────┴──────────┴────────────┘    └─────────────────┴─────────────────┴──────────┘

Third page:
┌──────┬──────────┬────────────┐    ┌─────────────────┬─────────────────┬──────────┐
│  ref │ class    │ discovered │    │ MIN(discovered) │ MAX(discovered) │ class    │
├──────┼──────────┼────────────┤    ├─────────────────┼─────────────────┼──────────┤
│ 3001 │ Euclid   │ 2000-01-02 │ -> │ 1988-01-01      │ 2010-01-01      │ Euclid   │
│ 4999 │ Keter    │ 1998-11-27 │    │ 1922-01-01      │ 2016-04-28      │ Keter    │
│ 5000 │ Safe     │ 2020-12-04 │    │ 1991-01-01      │ 2020-12-04      │ Safe     │
└──────┴──────────┴────────────┘    │ 1971-01-01      │ 1971-01-01      │ Thaumiel │
                                    └─────────────────┴─────────────────┴──────────┘

finish():
                                    ┌─────────────────┬─────────────────┬──────────┐
                                    │ MIN(discovered) │ MAX(discovered) │ class    │
                                    ├─────────────────┼─────────────────┼──────────┤
                                    │ 1988-01-01      │ 2010-01-01      │ Euclid   │
                                    │ 1922-01-01      │ 2016-04-28      │ Keter    │
                                    │ 1991-01-01      │ 2020-12-04      │ Safe     │
                                    │ 1971-01-01      │ 1971-01-01      │ Thaumiel │
                                    └─────────────────┴─────────────────┴──────────┘

Aggregations can also filter which rows they receive using FilteredGroupingAggregatorFunction. In ESQL that looks like:

| STATS min3 = MIN(discovered) WHERE LENGTH(ref) == 3,
        max3 = MAX(discovered) WHERE LENGTH(ref) == 3,
        min4 = MIN(discovered) WHERE LENGTH(ref) == 4
     BY class
this'd look like:

Before first page:
                                    ┌────────────┬────────────┬────────────┬──────────┐
                                    │ min3       │ max3       │ min4       │ class    │
                                    ├────────────┼────────────┼────────────┼──────────┤
                                    └────────────┴────────────┴────────────┴──────────┘

First page:
┌──────┬──────────┬────────────┐    ┌────────────┬────────────┬────────────┬──────────┐
│  ref │ class    │ discovered │    │ min3       │ max3       │ min4       │ class    │
├──────┼──────────┼────────────┤    ├────────────┼────────────┼────────────┼──────────┤
│  079 │ Euclid   │ 1988-01-01 │ -> │ 1988-01-01 │ 1993-01-01 │ null       │ Euclid   │
│  173 │ Euclid   │ 1993-01-01 │    │ null       │ null       │ 1967-01-01 │ Keter    │
│ 1313 │ Keter    │ 1967-01-01 │    │ null       │ null       │ 1991-01-01 │ Safe     │
│ 1981 │ Safe     │ 1991-01-01 │    └────────────┴────────────┴────────────┴──────────┘
└──────┴──────────┴────────────┘

Second page:
┌──────┬──────────┬────────────┐    ┌────────────┬────────────┬────────────┬──────────┐
│  ref │ class    │ discovered │    │ min3       │ max3       │ min4       │ class    │
├──────┼──────────┼────────────┤    ├────────────┼────────────┼────────────┼──────────┤
│ 2317 │ Keter    │ 1922-01-01 │ -> │ 1988-01-01 │ 1993-01-01 │ 2010-01-01 │ Euclid   │
│ 2639 │ Euclid   │ 2010-01-01 │    │ null       │ null       │ 1922-01-01 │ Keter    │
│ 2935 │ Keter    │ 2016-04-28 │    │ null       │ null       │ 1991-01-01 │ Safe     │
│ 3000 │ Thaumiel │ 1971-01-01 │    │ null       │ null       │ 1971-01-01 │ Thaumiel │
└──────┴──────────┴────────────┘    └────────────┴────────────┴────────────┴──────────┘

Third page:
┌──────┬──────────┬────────────┐    ┌────────────┬────────────┬────────────┬──────────┐
│  ref │ class    │ discovered │    │ min3       │ max3       │ min4       │ class    │
├──────┼──────────┼────────────┤    ├────────────┼────────────┼────────────┼──────────┤
│ 3001 │ Euclid   │ 2000-01-02 │ -> │ 1988-01-01 │ 1993-01-01 │ 2000-01-02 │ Euclid   │
│ 4999 │ Keter    │ 1998-11-27 │    │ null       │ null       │ 1922-01-01 │ Keter    │
│ 5000 │ Safe     │ 2020-12-04 │    │ null       │ null       │ 1991-01-01 │ Safe     │
└──────┴──────────┴────────────┘    │ null       │ null       │ 1971-01-01 │ Thaumiel │
                                    └────────────┴────────────┴────────────┴──────────┘

finish():
                                    ┌────────────┬────────────┬────────────┬──────────┐
                                    │ min3       │ max3       │ min4       │ class    │
                                    ├────────────┼────────────┼────────────┼──────────┤
                                    │ 1988-01-01 │ 1993-01-01 │ 2000-01-02 │ Euclid   │
                                    │ null       │ null       │ 1922-01-01 │ Keter    │
                                    │ null       │ null       │ 1991-01-01 │ Safe     │
                                    │ null       │ null       │ 1971-01-01 │ Thaumiel │
                                    └────────────┴────────────┴────────────┴──────────┘