package org.quaere.operations; import org.quaere.Convert; import org.quaere.QueryEngine; import org.quaere.Queryable; import org.quaere.QueryableIterable; import org.quaere.dsl.AggregationOperatorBuilder; import org.quaere.dsl.AggregationOperatorBuilderImpl; import org.quaere.expressions.Identifier; import org.quaere.expressions.Statement; import org.quaere.objects.ObjectQueryEngine; import java.util.Arrays; /** * @author mh14 @ jexp.de * @since 11.11.2007 01:08:49 (c) 2007 jexp.de */ public class AggregateOperation implements InOperation, OfOperation { private final DefaultOperation operation; public static final OfOperation SUM = new AggregateOperation(DefaultOperation.SUM); public static final InOperation MIN = new AggregateOperation(DefaultOperation.MIN); public static final InOperation COUNT = new AggregateOperation(DefaultOperation.COUNT); public static final InOperation MAX = new AggregateOperation(DefaultOperation.MAX); public static final InOperation AVG = new AggregateOperation(DefaultOperation.AVERAGE); public AggregateOperation(final DefaultOperation operation) { this.operation = operation; } public <T> Double of(T[] source) { return of(Double.class, source); } public <R, T> R of(Class<R> toClass, T[] source) { return of(toClass, Arrays.asList(source)); } public <T> Double of(Iterable<T> source) { return of(Double.class, source); } public <R, T> R of(Class<R> toClass, Iterable<T> source) { return of(toClass, new QueryableIterable<T>(source)); } public <T> Double of(Queryable<T> source) { return of(Double.class, source); } public <R, T> R of(Class<R> toClass, Queryable<T> source) { Identifier sourceIdentifier = Identifier.createUniqueIdentfier(); Statement query = DefaultOperations.createMethodCallStatement(sourceIdentifier, operationName()); QueryEngine queryEngine = source.createQueryEngine(); handleObjectsQuerySource(queryEngine, sourceIdentifier, source); return (R) Convert.toType(queryEngine.evaluate(query), toClass); } protected <T> void handleObjectsQuerySource(final QueryEngine queryEngine, final Identifier sourceIdentifier, final Queryable<T> source) { if (queryEngine instanceof ObjectQueryEngine) { ObjectQueryEngine asObjectQueryEngine = (ObjectQueryEngine) queryEngine; asObjectQueryEngine.addSource(sourceIdentifier, source); } } protected String operationName() { return operation.operationName(); } public String toString() { return operationName(); } public <R> AggregationOperatorBuilder<R> qualify(String anonymousIdentifier) { return new AggregationOperatorBuilderImpl<R>(operationName(), new Identifier(anonymousIdentifier)); } // Delegation for InInterface public <T> Double in(T[] source) { return of(source); } public <R, T> R in(Class<R> toClass, T[] source) { return of(toClass, source); } public <T> Double in(Iterable<T> source) { return of(source); } public <R, T> R in(Class<R> toClass, Iterable<T> source) { return of(toClass, source); } public <T> Double in(Queryable<T> source) { return of(source); } public <R, T> R in(Class<R> toClass, Queryable<T> source) { return of(toClass, source); } }