package foundation.dao; import java.util.HashSet; import java.util.Set; import foundation.json.IJSONProvider; import foundation.json.IJSONWriter; import foundation.persist.NamedSQL; import foundation.server.config.Configer; import foundation.server.config.DBaseType; import foundation.variant.provider.DataEvent; import foundation.variant.provider.IVariantsProvider; import foundation.variant.provider.VariantProviderType; public class Page implements IVariantsProvider, IJSONProvider { public static String ProviderName = "page"; public static Set VariantNames; public static int Default_Page_Size; private DBaseType dbaseType; private int pageSize; private int recordCount; private int pageNo; private boolean empty; static { VariantNames = new HashSet(); VariantNames.add("pagesize"); VariantNames.add("recordcount"); VariantNames.add("pageno"); VariantNames.add("beginno"); VariantNames.add(NamedSQL.Param_Page_limit); VariantNames.add(NamedSQL.Param_Page_RowNo); Default_Page_Size = Configer.getInt("PageDefaultSize", 20); } public Page() { this(null); } public Page(DBaseType dbaseType) { if (dbaseType == null) { dbaseType = DBaseType.getMain(); } this.pageSize = Default_Page_Size; this.pageNo = 1; this.recordCount = -1; this.empty = false; this.dbaseType = dbaseType; } public int getBeginRecordNo() { int recordNo = pageSize * (pageNo - 1) + 1; //? if (recordCount >= 0) { recordNo = Math.min(recordCount, recordNo); } return recordNo; } public int getBeginRecordNo_1() { int recordNo = getBeginRecordNo(); return Math.max(recordNo - 1, 0); } public int getEndRecordNo() { int recordNo = pageSize * pageNo; if (recordCount < 0) { return recordNo; } return Math.min(recordNo, recordCount); } public int getPageSize() { return pageSize; } public int getPageNo() { return pageNo; } public int getRecordCount() { return recordCount; } public int getPageCount() { return (int)Math.ceil(recordCount * 1.0d / pageSize); } public void setRecordCount(int count) { this.recordCount = count; } public void setPageSize(Integer value) { if (value == null) { return; } if (value <= 0) { return; } pageSize = value; } public void setPageNo(Integer value) { if (value == null) { return; } if (value <= 0) { return; } this.pageNo = value; } public void set(String name, String value) { name = name.toLowerCase(); if ("pageno".equals(name)) { setPageNo(Integer.parseInt(value)); } else if ("pagesize".equals(name)) { setPageSize(Integer.parseInt(value)); } } public String toString() { StringBuilder result = new StringBuilder(); result.append("size=").append(pageSize).append(","); result.append("recordCount=").append(recordCount).append(","); result.append("pageNo=").append(pageNo); return result.toString(); } public boolean next() { //1. 如果没有总条数,直接页数增加 if (recordCount < 0) { pageNo++; return true; } //2. 如果有总条数,根据总条数计算页数增加 int pageCount = getPageCount(); if (pageNo < pageCount) { pageNo++; return true; } return false; } public void setEmpty(boolean empty) { this.empty = empty; } public boolean isEmpty() { return empty; } public String toSQLString() { //1. MYSQL if (dbaseType.isMySQL()) { return " limit " + getBeginRecordNo_1() + ", " + pageSize; } //2. SQLServer if (dbaseType.isSQLServer()) { return " offset " + getBeginRecordNo_1() + " rows fetch next " + pageSize + " rows only"; } // //3. Oracle // if (dbaseType.isOracle()) { // return " and rownum between " + getBeginRecordNo() + " and " + getEndRecordNo(); // } return ""; } @Override public String getProviderName() { return ProviderName; } @Override public VariantProviderType getProviderType() { return VariantProviderType.Transiant; } @Override public Set getVariantNames() { return VariantNames; } @Override public boolean containsVariant(String name) { if (name == null) { return false; } name = name.toLowerCase(); return VariantNames.contains(name); } @Override public Object getVariantValue(DataEvent dataEvent, String name) { if ("pageSize".equalsIgnoreCase(name)) { return pageSize; } else if ("recordCount".equalsIgnoreCase(name)) { return recordCount; } else if ("pageNo".equalsIgnoreCase(name)) { return pageNo; } else if ("beginNo".equalsIgnoreCase(name)) { int beginNo = getBeginRecordNo_1(); return beginNo; } else if ("endNo".equalsIgnoreCase(name)) { int endNo = getEndRecordNo(); return endNo; } else if (NamedSQL.Param_Page_limit.equalsIgnoreCase(name)) { return toSQLString(); } else if (NamedSQL.Param_Page_RowNo.equalsIgnoreCase(name)) { return toSQLString(); } return null; } @Override public void writeJSON(IJSONWriter writer) { writer.beginObject(); writeJSONBody(writer); writer.endObject(); } public void writeJSONBody(IJSONWriter writer) { writer.write("recordcount", getRecordCount()); writer.write("pagecount", getPageCount()); writer.write("pagesize", getPageSize()); writer.write("pageno", getPageNo()); } }