package org.quaere.operations; import org.quaere.QueryEngine; import org.quaere.Queryable; import org.quaere.dsl.AggregateOperatorBuilder; import org.quaere.dsl.AggregateOperatorBuilderImpl; import org.quaere.expressions.*; import org.quaere.objects.ObjectQueryEngine; import java.util.Arrays; /** * @author mh14 @ jexp.de * @since 11.11.2007 02:02:38 (c) 2007 jexp.de */ public class DefaultOperations { public static Statement createMethodCallStatement(final Identifier leftSourceIdentifier, final String operation, final Expression... parameters) { return new Statement(leftSourceIdentifier, new MethodCall(new Identifier(operation), parameters)); } public static Statement createMethodCallStatement(final Expression leftExpression, final String operation, final Expression... parameters) { return new Statement(leftExpression, new MethodCall(new Identifier(operation), parameters)); } public static Statement createMethodCallStatement(final Identifier leftSourceIdentifier, final DefaultOperation operation, final Expression... parameters) { return createMethodCallStatement(leftSourceIdentifier, operation.operationName(), parameters); } public static Statement createMethodCallStatement(final Expression leftExpression, final DefaultOperation operation, final Expression... parameters) { return createMethodCallStatement(leftExpression, operation.operationName(), parameters); } public static <R> QueryEngine createEngineAndAddSource(final Identifier sourceIdentifier, final Queryable<R> source) { QueryEngine queryEngine = source.createQueryEngine(); if (queryEngine instanceof ObjectQueryEngine) { ObjectQueryEngine asObjectQueryEngine = (ObjectQueryEngine) queryEngine; asObjectQueryEngine.addSource(sourceIdentifier, source); } return queryEngine; } protected static <T> QueryEngine createEngineAndSetSources(final Identifier leftSourceIdentifier, final Queryable<T> leftHandSide, final Identifier rightSourceIdentifier, final Queryable<T> rightHandSide) { QueryEngine queryEngine = leftHandSide.createQueryEngine(); if (queryEngine instanceof ObjectQueryEngine) { ObjectQueryEngine asObjectQueryEngine = (ObjectQueryEngine) queryEngine; asObjectQueryEngine.addSource(leftSourceIdentifier, leftHandSide); asObjectQueryEngine.addSource(rightSourceIdentifier, rightHandSide); } return queryEngine; } public static <T> Iterable<T> executeTwoParamOperation(final Queryable<T> leftHandSide, final DefaultOperation operation, final Queryable<T> rightHandSide) { return executeTwoParamOperation(leftHandSide, operation.operationName(), rightHandSide); } public static <T> Iterable<T> executeTwoParamOperation(final Queryable<T> leftHandSide, final String operation, final Queryable<T> rightHandSide) { Identifier leftSourceIdentifier = Identifier.createUniqueIdentfier(); Identifier rightSourceIdentifier = Identifier.createUniqueIdentfier(); Statement query = createMethodCallStatement(leftSourceIdentifier, operation, new Statement(rightSourceIdentifier)); QueryEngine queryEngine = createEngineAndSetSources(leftSourceIdentifier, leftHandSide, rightSourceIdentifier, rightHandSide); return queryEngine.evaluate(query); } public static <T> Iterable<T> executeSingleParamOperation(final String operation, final Queryable<T> source) { Identifier sourceIdentifier = Identifier.createUniqueIdentfier(); Statement query = createMethodCallStatement(sourceIdentifier, operation); QueryEngine queryEngine = createEngineAndAddSource(sourceIdentifier, source); return queryEngine.evaluate(query); } public static <T> Iterable<T> executeSingleParamOperation(final DefaultOperation operation, final Queryable<T> source) { return executeSingleParamOperation(operation.operationName(), source); } public static NewExpression createDefaultNewExpression(final Property... properties) { return new NewExpression((Class<?>) null, Arrays.asList(properties)); } public static NewExpression creatDefaultNewExpresion(Class<?> clazz, Property[] properties) { return new NewExpression(clazz, Arrays.asList(properties)); } public static <R> AggregateOperatorBuilder<R> createAggregateOperationBuilder(String accumulationIdentifier, String anonymousIdentifier) { return new AggregateOperatorBuilderImpl<R>(new Identifier(accumulationIdentifier), new Identifier(anonymousIdentifier)); } }