[
https://issues.apache.org/jira/browse/IGNITE-23335?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
]
Maksim Zhuravkov updated IGNITE-23335:
--------------------------------------
Description:
`Accumulator` stores aggregation state, we should extract this state making
`Accumulator` pure functions.
Current accumulator (except methods that return result types).
{code:java}
public interface Accumulator {
void add(Object... args);
Object end();
{code}
DoubleAvg example:
{code:java}
public static class DoubleAvg implements Accumulator {
public static final Supplier<Accumulator> FACTORY = DoubleAvg::new;
private double sum;
private long cnt;
/** {@inheritDoc} */
@Override
public void add(Object... args) {
Double in = (Double) args[0];
if (in == null) {
return;
}
sum += in;
cnt++;
}
/** {@inheritDoc} */
@Override
public Object end() {
return cnt > 0 ? sum / cnt : null;
}
{code}
New accumulator interface:
{code:java}
public interface Accumulator {
void add(AccumulatorsState state, Object[] args);
void end(AccumulatorsState state, AccumulatorsState result);
// methods that return rel data types
{code}
Aggregate should be stored in aggregate operators (HashAggregateNode, ). We
should also move DistinctAccumulator (AVG(DISTINCT x) to HashAggregateNode
was:
`Accumulator` stores aggregation state, we should extract this state making
`Accumulator` pure functions.
Current accumulator (except methods that return result types).
{code:java}
public interface Accumulator {
void add(Object... args);
Object end();
{code}
DoubleAvg example:
{code:java}
public static class DoubleAvg implements Accumulator {
public static final Supplier<Accumulator> FACTORY = DoubleAvg::new;
private double sum;
private long cnt;
/** {@inheritDoc} */
@Override
public void add(Object... args) {
Double in = (Double) args[0];
if (in == null) {
return;
}
sum += in;
cnt++;
}
/** {@inheritDoc} */
@Override
public Object end() {
return cnt > 0 ? sum / cnt : null;
}
{code}
New accumulator interface:
{code:java}
public interface Accumulator {
void add(AccumulatorsState state, Object[] args);
void end(AccumulatorsState state, AccumulatorsState result);
{code}
Aggregate should be stored in aggregate operators (HashAggregateNode, ). We
should also move DistinctAccumulator (AVG(DISTINCT x) to HashAggregateNode
> Sql. Do not store aggregation state in Accumulators
> ---------------------------------------------------
>
> Key: IGNITE-23335
> URL: https://issues.apache.org/jira/browse/IGNITE-23335
> Project: Ignite
> Issue Type: Improvement
> Components: sql
> Reporter: Maksim Zhuravkov
> Assignee: Maksim Zhuravkov
> Priority: Major
> Labels: ignite-3
>
> `Accumulator` stores aggregation state, we should extract this state making
> `Accumulator` pure functions.
> Current accumulator (except methods that return result types).
> {code:java}
> public interface Accumulator {
> void add(Object... args);
> Object end();
> {code}
> DoubleAvg example:
> {code:java}
> public static class DoubleAvg implements Accumulator {
> public static final Supplier<Accumulator> FACTORY = DoubleAvg::new;
> private double sum;
> private long cnt;
> /** {@inheritDoc} */
> @Override
> public void add(Object... args) {
> Double in = (Double) args[0];
> if (in == null) {
> return;
> }
> sum += in;
> cnt++;
> }
> /** {@inheritDoc} */
> @Override
> public Object end() {
> return cnt > 0 ? sum / cnt : null;
> }
> {code}
> New accumulator interface:
> {code:java}
> public interface Accumulator {
> void add(AccumulatorsState state, Object[] args);
> void end(AccumulatorsState state, AccumulatorsState result);
>
> // methods that return rel data types
> {code}
> Aggregate should be stored in aggregate operators (HashAggregateNode, ). We
> should also move DistinctAccumulator (AVG(DISTINCT x) to HashAggregateNode
--
This message was sent by Atlassian Jira
(v8.20.10#820010)