package org.quaere.dsl; import org.quaere.Queryable; import org.quaere.QueryEngine; import org.quaere.objects.ObjectQueryEngine; import org.quaere.expressions.Identifier; import org.quaere.expressions.Expression; import org.quaere.expressions.Statement; import org.quaere.expressions.MethodCall; import java.util.Arrays; import java.util.ArrayList; public class ElementOperatorBuilderImpl implements ElementOperatorBuilder, ElementOperatorArgumentDefinitionBuilder, ElementOperatorWhereClauseBuilder, ElementOperatorWhereClauseOrIndexerArgumentBuilder { private final String operator; private Queryable source; private Identifier anonymousIdentifier; private Identifier indexerIdentifier; public ElementOperatorBuilderImpl(String operator) { this.operator = operator; } public <T> ElementOperatorArgumentDefinitionBuilder in(Queryable<T> source) { this.source = source; return this; } public ElementOperatorWhereClauseOrIndexerArgumentBuilder as(String anonymousIdentifier) { this.anonymousIdentifier = new Identifier(anonymousIdentifier); return this; } public ElementOperatorWhereClauseBuilder withIndexer(String indexerIdentifier) { this.indexerIdentifier = new Identifier(indexerIdentifier); return this; } public Object where(String predicate) { return where(LiteralExpression.parse(predicate)); } public Object where(Expression predicate) { QueryEngine queryEngine = source.createQueryEngine(); Identifier sourceIdentifier = Identifier.createUniqueIdentfier(); Statement query = new Statement( Arrays.<Expression>asList( sourceIdentifier, new MethodCall( new Identifier(operator), new ArrayList<Expression>(0), anonymousIdentifier, indexerIdentifier, predicate ) ) ); if (queryEngine instanceof ObjectQueryEngine) { ObjectQueryEngine asObjectQueryEngine = (ObjectQueryEngine) queryEngine; asObjectQueryEngine.addSource(sourceIdentifier, source); } return queryEngine.evaluate(query); } }