package jef.database;
import java.nio.channels.IllegalSelectorException;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.List;
import java.util.Map;
import jef.database.dialect.type.ResultSetAccessor;
import jef.database.jdbc.result.ResultSetContainer;
import jef.database.meta.Reference;
import jef.database.query.ConditionQuery;
import jef.database.query.JoinElement;
public final class QueryOption implements Cloneable {
public static final QueryOption DEFAULT=new QueryOption();
public static QueryOption DEFAULT_MAX1;
static{
ORMConfig bean=ORMConfig.getInstance();
DEFAULT.fetchSize=bean.getGlobalFetchSize();
DEFAULT.queryTimeout=bean.getSelectTimeout();
DEFAULT.maxResult=bean.getGlobalMaxResults();
DEFAULT.cacheResultset=bean.isCacheResultset();
try {
DEFAULT_MAX1=(QueryOption) DEFAULT.clone();
} catch (CloneNotSupportedException e) {
e.printStackTrace();
}
DEFAULT_MAX1.maxResult=2;
DEFAULT_MAX1.fetchSize=0;
}
private Map<String,ResultSetAccessor> mapper;
private int maxResult;
private int fetchSize;
private int queryTimeout;
boolean holdResult;
boolean cacheResultset;
private transient ResultSetContainer rs;
ResultSetContainer getRs() {
return rs;
}
void setRs(ResultSetContainer rs) {
this.rs = rs;
}
private QueryOption(){
}
/**
* As sometimes , make sure the result has one rows.
* @param queryObj
* @return
*/
public static QueryOption createMax1Option(ConditionQuery queryObj){
int queryTimeout=queryObj.getQueryTimeout();
String tableName=null;
if(queryObj instanceof JoinElement){
tableName=(String)((JoinElement)queryObj).getAttribute(JoinElement.CUSTOM_TABLE_NAME);
}
if(queryTimeout>0 || tableName!=null){
QueryOption op;
try {
op = (QueryOption) DEFAULT_MAX1.clone();
} catch (CloneNotSupportedException e) {
throw new IllegalSelectorException();//never happens
}
op.queryTimeout=queryTimeout;
return op;
}else{
return DEFAULT_MAX1;
}
}
public static QueryOption createFrom(ConditionQuery queryObj){
QueryOption op=createOption();
int maxResult=queryObj.getMaxResult();
if(maxResult>0)
op.maxResult=maxResult;
int fetchSize=queryObj.getFetchSize();
if(fetchSize>0)
op.fetchSize=fetchSize;
int queryTimeout=queryObj.getQueryTimeout();
if(queryTimeout>0)
op.queryTimeout=queryTimeout;
return op;
}
public static QueryOption createOption(){
try {
return (QueryOption) DEFAULT.clone();
} catch (CloneNotSupportedException e) {
throw new IllegalSelectorException();//never happens
}
}
public int getFetchSize() {
return fetchSize;
}
public int getMaxResult() {
return maxResult;
}
public int getQueryTimeout() {
return queryTimeout;
}
public void setFetchSize(int fetchSize) {
this.fetchSize = fetchSize;
}
public void setQueryTimeout(int queryTimeout) {
this.queryTimeout = queryTimeout;
}
public void setMaxResult(int maxResult) {
this.maxResult = maxResult;
}
public void setCacheResultset(boolean cacheResultset) {
this.cacheResultset = cacheResultset;
}
/**
* 设置max,fetchSize, queryTimeout等参数
* @param psmt
* @throws SQLException
*/
void setSizeFor(Statement psmt) throws SQLException {
int maxResult=this.maxResult;
if (maxResult > 0)
psmt.setMaxRows(maxResult);
int fetchSize=this.fetchSize;
if (fetchSize > 0) {
psmt.setFetchSize(fetchSize);
}
psmt.setQueryTimeout(queryTimeout);
}
public Map<String, ResultSetAccessor> getMapper() {
return mapper;
}
public void setMapper(Map<String, ResultSetAccessor> mapper) {
this.mapper = mapper;
}
public String toString(){
return maxResult+"/fetch:"+fetchSize+"/timeout:"+queryTimeout;
}
List<Reference> skipReference;
}