package org.quaere; import org.quaere.dsl.*; import org.quaere.expressions.*; import org.quaere.operations.*; import static org.quaere.operations.DefaultOperations.*; import java.util.Arrays; import java.util.List; public class DSL { public static <R> FromClauseBuilder<R> from(final String identifier) { QueryExpressionBuilderImpl<R> queryExpressionBuilder = new QueryExpressionBuilderImpl<R>(); return queryExpressionBuilder.from(identifier); } // Expressions // eq public static BinaryExpression eq(String leftHandSide, String rightHandSide) { return BinaryExpression.equal(LiteralExpression.parse(leftHandSide), LiteralExpression.parse(rightHandSide)); } public static BinaryExpression eq(String leftHandSide, Comparable<Integer> rightHandSide) { return BinaryExpression.equal(LiteralExpression.parse(leftHandSide), new Constant(rightHandSide, rightHandSide.getClass())); } public static BinaryExpression eq(Comparable leftHandSide, String rightHandSide) { return BinaryExpression.equal(new Constant(leftHandSide, leftHandSide.getClass()), LiteralExpression.parse(rightHandSide)); } // ne public static BinaryExpression ne(String leftHandSide, String rightHandSide) { return BinaryExpression.notEqual(LiteralExpression.parse(leftHandSide), LiteralExpression.parse(rightHandSide)); } public static BinaryExpression ne(String leftHandSide, Comparable<Integer> rightHandSide) { return BinaryExpression.notEqual(LiteralExpression.parse(leftHandSide), new Constant(rightHandSide, rightHandSide.getClass())); } public static BinaryExpression ne(Comparable leftHandSide, String rightHandSide) { return BinaryExpression.notEqual(new Constant(leftHandSide, leftHandSide.getClass()), LiteralExpression.parse(rightHandSide)); } // le public static BinaryExpression le(String leftHandSide, String rightHandSide) { return BinaryExpression.lessThanOrEqual(LiteralExpression.parse(leftHandSide), LiteralExpression.parse(rightHandSide)); } public static BinaryExpression le(String leftHandSide, Comparable rightHandSide) { return BinaryExpression.lessThanOrEqual(LiteralExpression.parse(leftHandSide), new Constant(rightHandSide, rightHandSide.getClass())); } public static BinaryExpression le(Comparable leftHandSide, String rightHandSide) { return BinaryExpression.lessThanOrEqual(new Constant(leftHandSide, leftHandSide.getClass()), LiteralExpression.parse(rightHandSide)); } // lt public static BinaryExpression lt(String leftHandSide, String rightHandSide) { return BinaryExpression.lessThan(LiteralExpression.parse(leftHandSide), LiteralExpression.parse(rightHandSide)); } public static BinaryExpression lt(String leftHandSide, Comparable rightHandSide) { return BinaryExpression.lessThan(LiteralExpression.parse(leftHandSide), new Constant(rightHandSide, rightHandSide.getClass())); } public static BinaryExpression lt(Comparable leftHandSide, String rightHandSide) { return BinaryExpression.lessThan(new Constant(leftHandSide, leftHandSide.getClass()), LiteralExpression.parse(rightHandSide)); } // ge public static BinaryExpression ge(String leftHandSide, String rightHandSide) { return BinaryExpression.greaterThanOrEqual(LiteralExpression.parse(leftHandSide), LiteralExpression.parse(rightHandSide)); } public static BinaryExpression ge(String leftHandSide, Comparable rightHandSide) { return BinaryExpression.greaterThanOrEqual(LiteralExpression.parse(leftHandSide), new Constant(rightHandSide, rightHandSide.getClass())); } public static BinaryExpression ge(Comparable leftHandSide, String rightHandSide) { return BinaryExpression.greaterThanOrEqual(new Constant(leftHandSide, leftHandSide.getClass()), LiteralExpression.parse(rightHandSide)); } // gt public static BinaryExpression gt(String leftHandSide, String rightHandSide) { return BinaryExpression.greaterThan(LiteralExpression.parse(leftHandSide), LiteralExpression.parse(rightHandSide)); } public static BinaryExpression gt(String leftHandSide, Comparable rightHandSide) { return BinaryExpression.greaterThan(LiteralExpression.parse(leftHandSide), new Constant(rightHandSide, rightHandSide.getClass())); } public static BinaryExpression gt(Comparable leftHandSide, String rightHandSide) { return BinaryExpression.greaterThan(new Constant(leftHandSide, leftHandSide.getClass()), LiteralExpression.parse(rightHandSide)); } public static NewExpression create(Property... properties) { return createDefaultNewExpression(properties); } public static NewExpression create(Class<?> clazz, Property... properties) { return creatDefaultNewExpresion(clazz, properties); } public static Property property(String expression) { return PropertyOperation.createPropertyFromStringExpression(expression); } public static Property property(String propertyName, String expression) { return PropertyOperation.createProperty(propertyName, expression); } public static Property property(String propertyName, Expression expression) { return PropertyOperation.createProperty(propertyName, expression); } public static <R> Property property(String propertyName, QueryContinuationOrQueryBodyBuilder<R> subquery) { return PropertyOperation.createSubQueryProperty(propertyName, subquery); } // Aggregation operators public static Statement count(String expression) { return count(LiteralExpression.parse(expression)); } public static Statement count(Expression expression) { return createMethodCallStatement(expression, DefaultOperation.COUNT); } public static InOperation count = AggregateOperation.COUNT; public static Statement sum(String expression) { return sum(LiteralExpression.parse(expression)); } public static Statement sum(Expression expression) { return createMethodCallStatement(expression, DefaultOperation.SUM); } public static OfOperation sum = AggregateOperation.SUM; public static InOperation min = AggregateOperation.MIN; public static InOperation max = AggregateOperation.MAX; public static InOperation avg = AggregateOperation.AVG; public static <R> AggregateOperatorBuilder<R> aggregate(String accumulationIdentifier, String anonymousIdentifier) { return createAggregateOperationBuilder(accumulationIdentifier, anonymousIdentifier); } // Conversion operators public static <T> T[] asArray(T[] tArray, Iterable<T> source) { return CollectionOperations.asArray(tArray, source); } public static <T> T[] asArray(Iterable<T> source) { return CollectionOperations.asArray(source); } public static <T> List<T> asList(Iterable<?> iterable) { return CollectionOperations.asList(iterable); } public static <T> Iterable<T> ofClass(Class<T> clazz, Object... source) { return CollectionOperations.ofClass(clazz, Arrays.asList(source)); } public static <T> Iterable<T> ofClass(Class<T> clazz, Iterable<?> source) { return CollectionOperations.ofClass(clazz, source); } // Ordering operators public static <T> Iterable<T> reverse(Iterable<T> sequence) { return CollectionOperations.reverse(sequence); } public static final AnyOperation any = new AnyOperation(); // Partitioning operators public static PartitioningOperatorBuilder take(int count) { return new PartitioningOperatorBuilderImpl(PartitionOperator.take, count); } public static PartitionWhenOperatorBuilder take(String anonymousIdentifier) { return new PartitionWhenOperatorBuilderImpl(PartitionOperator.takeWhile, anonymousIdentifier); } public static PartitioningOperatorBuilder skip(int count) { return new PartitioningOperatorBuilderImpl(PartitionOperator.skip, count); } public static PartitionWhenOperatorBuilder skip(String anonymousIdentifier) { return new PartitionWhenOperatorBuilderImpl(PartitionOperator.skipWhile, anonymousIdentifier); } // Set operators public static <T> Iterable<T> distinct(T[] source) { return distinct(Arrays.asList(source)); } public static <T> Iterable<T> distinct(Iterable<T> source) { return distinct(new QueryableIterable<T>(source)); } public static <T> Iterable<T> distinct(Queryable<T> source) { return executeSingleParamOperation(DefaultOperation.DISTINCT, source); } public static <T> Iterable<T> union(T[] leftHandSide, T[] rightHandSide) { return union(Arrays.asList(leftHandSide), Arrays.asList(rightHandSide)); } public static <T> Iterable<T> union(Iterable<T> leftHandSide, Iterable<T> rightHandSide) { return union(new QueryableIterable<T>(leftHandSide), new QueryableIterable<T>(rightHandSide)); } public static <T> Iterable<T> union(Queryable<T> leftHandSide, Queryable<T> rightHandSide) { return executeTwoParamOperation(leftHandSide, DefaultOperation.UNION, rightHandSide); } public static <T> Iterable<T> intersect(T[] leftHandSide, T[] rightHandSide) { return intersect(Arrays.asList(leftHandSide), Arrays.asList(rightHandSide)); } public static <T> Iterable<T> intersect(Iterable<T> leftHandSide, Iterable<T> rightHandSide) { return intersect(new QueryableIterable<T>(leftHandSide), new QueryableIterable<T>(rightHandSide)); } public static <T> Iterable<T> intersect(Queryable<T> leftHandSide, Queryable<T> rightHandSide) { return executeTwoParamOperation(leftHandSide, DefaultOperation.INTERSECT, rightHandSide); } public static <T> Iterable<T> except(T[] leftHandSide, T[] rightHandSide) { return except(Arrays.asList(leftHandSide), Arrays.asList(rightHandSide)); } public static <T> Iterable<T> except(Iterable<T> leftHandSide, Iterable<T> rightHandSide) { return except(new QueryableIterable<T>(leftHandSide), new QueryableIterable<T>(rightHandSide)); } public static <T> Iterable<T> except(Queryable<T> leftHandSide, Queryable<T> rightHandSide) { return executeTwoParamOperation(leftHandSide, DefaultOperation.EXCEPT, rightHandSide); } // Element operators public static <R> R first(R[] source) { return FirstOperationImpl.firstFromArray(source); } // NOTE: This method is a facade for the typed firstXxx methods to enable the module to be built with Eclipse. @SuppressWarnings({"RedundantTypeArguments", "unchecked"}) public static <R> R first(Object source) { return FirstOperationImpl.<R>first(source); } public static FirstOperation first = FirstOperationImpl.FIRST; // Generators public static <T extends Number> Iterable<T> range(T from, T to) { return new NumberRange<T>(from, to); } public static Iterable<Character> range(char from, char to) { return new CharacterRange(from, to); } public static <T> Iterable<T> repeater(T value, int repititions) { return new Repeater<T>(value, repititions); } }