package org.quaere.dsl;
import org.quaere.Queryable;
import org.quaere.QueryableIterable;
import org.quaere.QueryEngine;
import org.quaere.objects.ObjectQueryEngine;
import org.quaere.expressions.*;
import java.util.Arrays;
import java.util.List;
import java.util.ArrayList;
public class PartitionWhenOperatorBuilderImpl implements PartitionWhenOperatorBuilder, PartitionWhenOperatorWhenClauseBuilder {
private String operator;
private Queryable source;
private Identifier anonymousIdentifier;
private Identifier indexerIdentifier;
public PartitionWhenOperatorBuilderImpl(PartitionOperator operator, String anonymousIdentifier) {
this(operator.operationName(), anonymousIdentifier);
}
public PartitionWhenOperatorBuilderImpl(String operator, String anonymousIdentifier) {
this.operator = operator;
this.anonymousIdentifier = new Identifier(anonymousIdentifier);
}
public <T> PartitionWhenOperatorWhenClauseBuilder from(T[] source) {
return from(Arrays.asList(source));
}
public <T> PartitionWhenOperatorWhenClauseBuilder from(Iterable<T> source) {
return from(new QueryableIterable<T>(source));
}
public <T> PartitionWhenOperatorWhenClauseBuilder from(Queryable<T> source) {
this.source = source;
return this;
}
public PartitionWhenOperatorWhenClauseBuilder from(QueryBodyBuilder<?> query) {
return evaluateQuery(query);
}
public PartitionWhenOperatorBuilder withIndexer(String indexerIdentifer) {
this.indexerIdentifier = new Identifier(indexerIdentifer);
return this;
}
public <T> PartitionWhenOperatorWhenClauseBuilder in(T[] source) {
return in(Arrays.asList(source));
}
public <T> PartitionWhenOperatorWhenClauseBuilder in(Iterable<T> source) {
return in(new QueryableIterable<T>(source));
}
public <T> PartitionWhenOperatorWhenClauseBuilder in(Queryable<T> source) {
this.source = source;
return this;
}
public PartitionWhenOperatorWhenClauseBuilder in(QueryBodyBuilder<?> query) {
return evaluateQuery(query);
}
public <T> Iterable<T> when(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);
}
private <T> PartitionWhenOperatorWhenClauseBuilder evaluateQuery(QueryBodyBuilder<?> query) {
List<T> elms = new ArrayList<T>();
for (final Object element : query) {
elms.add((T) element);
}
return from(elms);
}
}