package foundation.data.object; import java.util.HashSet; import java.util.Set; import foundation.persist.NamedSQL; import foundation.persist.source.NamedDataSource; import foundation.server.config.DBaseType; import foundation.variant.provider.DataEvent; import foundation.variant.provider.IVariantsProvider; import foundation.variant.provider.VariantProviderType; public class BatchCounter implements IVariantsProvider { public static String ProviderName = "BatchCounter"; public static Set VariantNames; private NamedDataSource dataSource; private int total; private int begin; private int batch; static { VariantNames = new HashSet(); VariantNames.add("pagesize"); VariantNames.add("recordcount"); VariantNames.add("beginno"); VariantNames.add(NamedSQL.Param_Page_limit); VariantNames.add(NamedSQL.Param_Page_RowNo); } public BatchCounter(int total, int batch) { this(NamedDataSource.getInstance(), total, batch); } public BatchCounter(NamedDataSource dataSource, int total, int batch) { this.total = total; this.begin = 0; this.batch = batch; this.dataSource = dataSource; } public void step(int step) { begin = begin + step; } public String getLimitSQL() { DBaseType type = dataSource.getDBaseType(); //1. MYSQL if (type.isMySQL()) { return " limit " + begin + ", " + batch; } //2. SQLServer if (type.isSQLServer()) { return " offset " + begin + " rows fetch next " + batch + " rows only"; } // //3. Oracle // if (type.isOracle()) { // return " rowno >" + begin + " and rowno <= " + (begin + batch); // } return ""; } public int getBatch() { return batch; } @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 batch; } else if ("recordCount".equalsIgnoreCase(name)) { return total; } else if ("beginNo".equalsIgnoreCase(name)) { return begin; } else if ("endNo".equalsIgnoreCase(name)) { return begin + batch; } else if (NamedSQL.Param_Page_limit.equalsIgnoreCase(name)) { return getLimitSQL(); } else if (NamedSQL.Param_Page_RowNo.equalsIgnoreCase(name)) { return getLimitSQL(); } return null; } }