package ameba.db.ebean.filter;
import ameba.db.dsl.ExprApplier;
import ameba.db.ebean.filter.CommonExprTransformer.DistinctExpression;
import ameba.db.ebean.filter.CommonExprTransformer.HavingExpression;
import ameba.db.ebean.filter.CommonExprTransformer.TextExpression;
import io.ebean.Expression;
import io.ebean.ExpressionList;
import io.ebean.Query;
import io.ebeaninternal.server.expression.AbstractTextExpression;
/**
* <p>WhereExprApplier class.</p>
*
* @author icode
*
*/
public class WhereExprApplier<O> implements ExprApplier<Expression> {
private ExpressionList<O> expressionList;
/**
* <p>Constructor for WhereExprApplier.</p>
*
* @param expressions a {@link io.ebean.ExpressionList} object.
*/
public WhereExprApplier(ExpressionList<O> expressions) {
this.expressionList = expressions;
}
/**
* <p>create.</p>
*
* @param expressions a {@link io.ebean.ExpressionList} object.
* @param <O> a O object.
* @return a {@link ameba.db.ebean.filter.WhereExprApplier} object.
*/
public static <O> WhereExprApplier<O> create(ExpressionList<O> expressions) {
return new WhereExprApplier<>(expressions);
}
/** {@inheritDoc} */
@Override
@SuppressWarnings("unchecked")
public void apply(Expression expr) {
if (expr instanceof HavingExpression) {
ExpressionList having = expressionList.query().having();
((HavingExpression) expr).getExpressionList().forEach(having::add);
return;
} else if (expr instanceof TextExpression) {
TextExpression expression = (TextExpression) expr;
ExpressionList et = expressionList.query().text();
expression.getExpressionList().forEach(et::add);
return;
} else if (expr instanceof DistinctExpression) {
expressionList.setDistinct(((DistinctExpression) expr).distinct);
return;
} else if (expr instanceof AbstractTextExpression) {
expressionList.setUseDocStore(true);
} else if (expr instanceof FilterExpression) {
FilterExpression filter = (FilterExpression) expr;
Query query = expressionList.query();
query.filterMany(filter.getPath()).addAll(filter);
return;
}
expressionList.add(expr);
}
}