/*
 * Copyright 2004-2019 H2 Group. Multiple-Licensed under the MPL 2.0,
 * and the EPL 1.0 (http://h2database.com/html/license.html).
 * Initial Developer: H2 Group
 */
package org.h2.expression.aggregate;

import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.Iterator;
import java.util.TreeSet;

import org.h2.api.ErrorCode;
import org.h2.engine.Database;
import org.h2.message.DbException;
import org.h2.value.Value;
import org.h2.value.ValueNull;

Data stored while calculating an aggregate that needs collecting of all values or a distinct aggregate.

NULL values are not collected. getValue(Database, int) method returns null. Use getArray() for instances of this class instead.

/** * Data stored while calculating an aggregate that needs collecting of all * values or a distinct aggregate. * * <p> * NULL values are not collected. {@link #getValue(Database, int)} * method returns {@code null}. Use {@link #getArray()} for instances of this * class instead. * </p> */
class AggregateDataCollecting extends AggregateData implements Iterable<Value> { private final boolean distinct; Collection<Value> values; private Value shared;
Creates new instance of data for collecting aggregates.
Params:
  • distinct – if distinct is used
/** * Creates new instance of data for collecting aggregates. * * @param distinct if distinct is used */
AggregateDataCollecting(boolean distinct) { this.distinct = distinct; } @Override void add(Database database, Value v) { if (v == ValueNull.INSTANCE) { return; } Collection<Value> c = values; if (c == null) { values = c = distinct ? new TreeSet<>(database.getCompareMode()) : new ArrayList<Value>(); } c.add(v); } @Override Value getValue(Database database, int dataType) { return null; }
Returns the count of values.
Returns:the count of values
/** * Returns the count of values. * * @return the count of values */
int getCount() { return values != null ? values.size() : 0; }
Returns array with values or null.
Returns:array with values or null
/** * Returns array with values or {@code null}. * * @return array with values or {@code null} */
Value[] getArray() { Collection<Value> values = this.values; if (values == null) { return null; } return values.toArray(new Value[0]); } @Override public Iterator<Value> iterator() { return values != null ? values.iterator() : Collections.<Value>emptyIterator(); }
Sets value of a shared argument.
Params:
  • shared – the shared value
/** * Sets value of a shared argument. * * @param shared the shared value */
void setSharedArgument(Value shared) { if (this.shared == null) { this.shared = shared; } else if (!this.shared.equals(shared)) { throw DbException.get(ErrorCode.INVALID_VALUE_2, "Inverse distribution function argument", this.shared.getTraceSQL() + "<>" + shared.getTraceSQL()); } }
Returns value of a shared argument.
Returns:value of a shared argument
/** * Returns value of a shared argument. * * @return value of a shared argument */
Value getSharedArgument() { return shared; } }