/*
// This software is subject to the terms of the Eclipse Public License v1.0
// Agreement, available at the following URL:
// http://www.eclipse.org/legal/epl-v10.html.
// You must accept the terms of that agreement to use this software.
//
// Copyright (C) 2003-2005 Julian Hyde
// Copyright (C) 2005-2012 Pentaho
// All Rights Reserved.
*/
package mondrian.olap;
import mondrian.calc.Calc;
import mondrian.calc.TupleList;
import mondrian.spi.Dialect.Datatype;
import mondrian.spi.SegmentBody;
import java.util.List;
/**
* Describes an aggregation operator, such as "sum" or "count".
*
* @see FunDef
* @see Evaluator
*
* @author jhyde$
* @since Jul 9, 2003$
*/
public interface Aggregator {
/**
* Returns the aggregator used to combine sub-totals into a grand-total.
*
* @return aggregator used to combine sub-totals into a grand-total
*/
Aggregator getRollup();
/**
* Applies this aggregator to an expression over a set of members and
* returns the result.
*
* @param evaluator Evaluation context
* @param members List of members, not null
* @param calc Expression to evaluate
*
* @return result of applying this aggregator to a set of members/tuples
*/
Object aggregate(Evaluator evaluator, TupleList members, Calc calc);
/**
* Tells Mondrian if this aggregator can perform fast aggregation
* using only the raw data of a given object type. This will
* determine if Mondrian will attempt to perform in-memory rollups
* on raw segment data by invoking {@link #aggregate}.
*
* <p>This is only invoked for rollup operations.
*
* @param datatype The datatype of the object we would like to rollup.
* @return Whether this aggregator supports fast aggregation
*/
boolean supportsFastAggregates(Datatype datatype);
/**
* Applies this aggregator over a raw list of objects for a rollup
* operation. This is useful when the values are already resolved
* and we are dealing with a raw {@link SegmentBody} object.
*
* <p>Only gets called if
* {@link #supportsFastAggregates(mondrian.spi.Dialect.Datatype)} is true.
*
* <p>This is only invoked for rollup operations.
*
* @param rawData An array of values in its raw form, to be aggregated.
* @return A rolled up value of the raw data.
* if the object type is not supported.
*/
Object aggregate(List<Object> rawData, Datatype datatype);
}
// End Aggregator.java