package squill.query;
import static java.util.Arrays.asList;
import java.util.ArrayList;
import java.util.List;
import squill.db.TypedSQLException;
import squill.format.Sql92Format;
import squill.query.orderby.OrderByElement;
import squill.query.select.SelectExpression;
import squill.tree.QueryPartHandler;
import squill.tree.TreeTraverser;
public class SelectPart implements QueryPart {
private final List<SelectExpression<?>> selectList = new ArrayList<SelectExpression<?>>();
private final QueryContext ctx;
public SelectPart(QueryContext ctx) {
this.ctx = ctx;
}
public void addSelects(final SelectExpression<?>...selects) {
selectList.addAll(asList(selects));
setQueryContext(ctx);
}
public String getDefaultSql() {
return "SELECT " + squill.util.StringUtil.join(selectList, Sql92Format.GET_SELECT_SQL, ", ");
}
public <T> T traverse(final QueryPartHandler<T> handler, final T collectingParameter) {
handler.handle(this, collectingParameter);
final TreeTraverser traverser=new TreeTraverser();
for (SelectExpression<?> selectExpression : selectList) {
traverser.traverse(selectExpression,handler, collectingParameter);
}
return collectingParameter;
}
public List<SelectExpression<?>> getSelectList() {
return selectList;
}
public void checkOrderByOccurrence(final OrderByElement<?> orderby) {
final List<SelectExpression<?>> selectList = getSelectList();
if (orderby.isMustOccurInSelect() && !selectList.contains(orderby.getSelectExpr())) {
throw new TypedSQLException("Orderby expression '" + orderby.getSelectExpr().getDefaultSql() + "' not found in select!");
}
}
public List<Object> getSqlArguments() {
List<Object> result = new ArrayList<Object>();
for (SelectExpression<?> expr : selectList) {
result.addAll(expr.getSqlArguments());
}
return result;
}
public void setQueryContext(QueryContext ctx) {
for (SelectExpression<?> expr : selectList) {
expr.setQueryContext(ctx);
}
}
}