package models.query;
import com.avaje.ebean.ExpressionList;
import com.avaje.ebean.Junction;
import play.db.ebean.Model;
import java.util.LinkedList;
import java.util.List;
/**
* Created with IntelliJ IDEA.
* User: guym
* Date: 6/20/13
* Time: 12:27 AM
*/
public abstract class QueryConf<T extends QueryConf.Criteria, M extends Model> {
public int maxRows;
public List<T> criterias = new LinkedList<T>();
public QueryConf setMaxRows(int maxRows) {
this.maxRows = maxRows;
return this;
}
public T criteria(){
T inst = newCriteria();
inst.setQueryConf(this);
criterias.add(inst);
return inst;
}
abstract protected void applyCriteria( T criteria, Junction<M> conjunction );
public ExpressionList<M> find( ){
return apply( getFinder().where() );
}
abstract public Model.Finder<Long,M> getFinder();
public ExpressionList<M> apply( ExpressionList<M> where ){
Junction<M> disjunction = where.disjunction();
for (T criteria : criterias) {
Junction<M> conjunction = disjunction.conjunction();
applyCriteria( criteria, conjunction );
}
if ( maxRows > 0 ){
where.setMaxRows( maxRows );
}
return where;
}
protected abstract T newCriteria();
public abstract class Criteria{
private QueryConf<T,M> conf;
public void setQueryConf(QueryConf<T,M> conf) {
this.conf = conf;
}
public QueryConf<T,M> done(){
return conf;
}
}
}