package jef.database;
import java.sql.SQLException;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import jef.database.meta.AbstractRefField;
import jef.database.meta.Reference;
import jef.database.query.ConditionQuery;
import jef.database.query.JoinElement;
import jef.database.query.Query;
import jef.database.wrapper.clause.CountClause;
import jef.tools.ArrayUtils;
import jef.tools.Assert;
import jef.tools.PageInfo;
import jef.tools.PageLimit;
final public class PagingIteratorObjImpl<T> extends PagingIterator<T> {
private ConditionQuery queryObj; // 1 使用API查询的情况
private Session db;
/**
* 是否外连接获取
*
* @return
*/
public boolean isRefQuery() {
return transformer.isLoadVsOne();
}
/**
* 设置是否用外连接获取级联字段
*
* @param refQuery
*/
public void setRefQuery(boolean refQuery) {
transformer.setLoadVsOne(refQuery);
}
/**
* 返回结果是否填充 OneToMany,ManyToMany的属性(需要多次查询)
*
* @return
*/
public boolean isFillVsNField() {
return transformer.isLoadVsMany();
}
/**
* 设置返回结果是否填充 OneToMany,ManyToMany的属性(需要多次查询)
*
* @param fillVsNField
*/
public void setFillVsNField(boolean fillVsNField) {
transformer.setLoadVsMany(fillVsNField);
}
/*
* 从查询对象构造
*/
PagingIteratorObjImpl(IQueryableEntity query, int pageSize, Session db) {
this(query.getQuery(), pageSize, db);
}
/*
* 从Query对象构造
*/
PagingIteratorObjImpl(ConditionQuery query, int pageSize, Session db) {
Assert.notNull(query);
this.queryObj = query;
this.transformer = query.getResultTransformer();
Assert.notNull(transformer.getResultClazz());
this.db = db;
page = new PageInfo();
page.setRowsPerPage(pageSize);
}
private long getTotal(ConditionQuery j) throws SQLException {
CountClause countResult = db.selectp.toCountSql(j);
return db.selectp.processCount(db, countResult);
}
/*
* 处理由dataobject作为查询条件的查询处理
*/
@SuppressWarnings({ "unchecked", "rawtypes" })
protected List<T> doQuery(boolean pageFlag) throws SQLException {
calcPage();
List<T> result;
QueryOption option;
if (queryObj instanceof JoinElement) {
option = QueryOption.createFrom((JoinElement) queryObj);
} else {
option = QueryOption.DEFAULT;
}
PageLimit range = page.getCurrentRecordRange();
if (range.getStart() == 1 && range.getEnd() >= page.getTotal()) {
range = null;
}
if (queryObj instanceof Query<?>) {
Query q = (Query) queryObj;
result = db.typedSelect(q, pageFlag ? range : null, option);
} else {
result = db.innerSelect(queryObj, pageFlag ? range : null, null, option);
}
if (result.isEmpty()) {
recordEmpty();
}
return result;
}
@SuppressWarnings("unchecked")
@Override
protected long doCount() throws SQLException {
if (queryObj instanceof Query<?>) {
Query<?> query = (Query<?>) queryObj;
Map<Reference, List<AbstractRefField>> map;
if (isRefQuery() && query.isCascadeViaOuterJoin()) {
map = DbUtils.getMergeAsOuterJoinRef(query);
} else {
map = Collections.EMPTY_MAP;
}
JoinElement j = (Query<?>) queryObj;
if (query.getOtherQueryProvider().length > 0 || !map.isEmpty()) {// 检查补充外部链接
// 拼装出带连接的查询请求
j = DbUtils.getJoin(query, map, ArrayUtils.asList(query.getOtherQueryProvider()), null);
}
long total = getTotal(j);
page.setTotal(total);
return total;
} else {
long total = getTotal(queryObj);
page.setTotal(total);
return total;
}
}
}