package org.quaere.dsl; import org.quaere.expressions.Expression; import org.quaere.expressions.Identifier; import org.quaere.expressions.Statement; import org.quaere.expressions.JoinClause; import org.quaere.Queryable; import org.quaere.QueryableIterable; import java.util.Arrays; public class JoinClauseBuilderImpl<R> implements JoinClauseBuilder<R>, JoinOnClauseBuilder<R>, JoinOnEqualsClauseBuilder<R> { private final QueryExpressionBuilderImpl<R> parentBuilder; private final Identifier currentIdentifier; private Expression onExpression; public JoinClauseBuilderImpl(QueryExpressionBuilderImpl<R> parentBuilder, Identifier identifier) { this.parentBuilder = parentBuilder; currentIdentifier = identifier; } public <T> JoinOnClauseBuilder<R> in(T[] source) { return in(Arrays.asList(source)); } public <T> JoinOnClauseBuilder<R> in(Iterable<T> source) { return in(new QueryableIterable<T>(source)); } public <T> JoinOnClauseBuilder<R> in(Queryable<T> source) { parentBuilder.sources.put(currentIdentifier, source); return this; } public JoinOnClauseBuilder<R> in(String expression) { throw new RuntimeException("JoinClauseBuilderImpl.in is not implemented"); } public JoinOnEqualsClauseBuilder<R> on(String onExpression) { return on(LiteralExpression.parse(onExpression)); } public JoinOnEqualsClauseBuilder<R> on(Expression onExpression) { this.onExpression = onExpression; return this; } public QueryContinuationOrQueryBodyBuilder<R> equals(String equalsExpression) { return equals(LiteralExpression.parse(equalsExpression)); } public QueryContinuationOrQueryBodyBuilder<R> equals(Expression equalsExpression) { JoinClause joinClause = new JoinClause( currentIdentifier, new Statement( Arrays.<Expression>asList( parentBuilder.sources.get(currentIdentifier).getSourceIdentifier(currentIdentifier) ) ), onExpression, equalsExpression, null ); parentBuilder.queryBodyClauses.add(joinClause); return parentBuilder; } }