Hbase分页工具类
—— Ivan / iu软件 (www.iusofts.com)
效果如下:
package com.iusoft.hadoop.hbase.utils;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.servlet.http.HttpServletRequest;
import net.sf.json.JSONObject;
import org.apache.commons.lang.StringUtils;
import com.ws.sys.core.utils.ConvertUtil;
import com.ws.sys.core.utils.JsonUtil;
/**
* @ClassName: 分页类(HbasePage.java)
*
* @Description: 用于Hbase分页,每十页(即100条)保存一个rowkey于rowkeyMap中,results用于保存查询结果的rowkey
*
* @Date: 2014-7-2 21:40
* @Author Ivan
* @Version 1.0
*/
public class HbasePage {
/* 每页多少记录 */
private int numPerPage = 10;
/* 当前页码 */
private int pageNum = 1;
/* 页数限制 */
private int pageLimit = 10;
/* 最大页数 */
private int maxPageNum;
/* 分页结果集(只保存rowkey) */
private List<String> results = new ArrayList<String>();
/* rowkeyMap 保存每10页的开始key(100的整数倍) */
private Map<String,String> rowKeyMap=null;
/* 分页导航字符串 */
private String navigation = "";
/**
* 创建分页
* @param oldPageNum 点击前页码
* @param pageNum 当前页码
* @param rowKeyMap 保存每10页开始rowkey的Map
*/
public HbasePage(int pageNum,String rowKeyMap) {
this.pageNum = pageNum;
if(StringUtils.isNotBlank(rowKeyMap)){
JSONObject object=JSONObject.fromObject(rowKeyMap);
if(object!=null){
this.rowKeyMap=object;
}
}else{
this.rowKeyMap=new HashMap<String, String>();
}
}
/**
* 创建分页
* @param request
*/
public HbasePage(HttpServletRequest request) {
int pageNum = ConvertUtil.getInteger(request.getParameter("pageNum"));
this.pageNum= pageNum != 0 ? pageNum : 1;
String rowKeyMap=request.getParameter("rowKeyMap");
if(StringUtils.isNotBlank(rowKeyMap)){
JSONObject object=JSONObject.fromObject(rowKeyMap);
if(object!=null){
this.rowKeyMap=object;
}
}
}
/**
* 当前页码处理
* @param pageNum
*/
public void setPageNum() {
if (this.pageNum > this.maxPageNum&&this.maxPageNum!=0) {
this.pageNum = this.maxPageNum;
} else if (this.pageNum < 1) {
this.pageNum = 1;
}
}
/**
* 得到当前页码
*
* @return
*/
public int getPageNum() {
return this.pageNum;
}
/**
* 获得开始索引值
*
* @return
*/
public int getStartIndex() {
return (this.pageNum - 1) * this.numPerPage;
}
/**
* 是否有上一页
*
* @return
*/
public boolean hasPrevious() {
return this.pageNum > 1;
}
/**
* 是否有下一页
*
* @return
*/
public boolean hasNext() {
return this.pageNum < this.pageLimit;
}
/**
* 是否第一页
*
* @return
*/
public boolean isFirst() {
return this.pageNum == 1;
}
/**
* 获得上一页
*
* @return
*/
public int getPrevious() {
if (this.pageNum - 1 <= 1) {
return 1;
} else {
return this.pageNum - 1;
}
}
/**
* 获得下一页
*
* @return
*/
public int getNext() {
if (this.pageNum + 1 >= this.maxPageNum&&this.maxPageNum!=0) {
return this.maxPageNum;
} else {
return this.pageNum + 1;
}
}
/**
* 是否最后一页
*
* @return
*/
public boolean isLast() {
return this.pageNum >= this.maxPageNum;
}
public String getNavigation() {
return this.navigation;
}
/**
* 生成分页Html代码
* @param navigation
*/
public void setNavigation() {
if(pageNum==1&&results.size()==0){
return;
}
StringBuffer sb = new StringBuffer();
sb.append("<input type=\"hidden\" name=\"rowKeyMap\" value='"+JsonUtil.toJson(rowKeyMap)+"'>");
int i=1;
if(pageNum>6){
i=pageNum-5;
sb.append("<a href=\"javascript:pageGo('1');\" ><strong>首页</strong></a> ");
}
if(pageNum>1){
sb.append("<a href=\"javascript:pageGo('" + this.getPrevious() + "');\" ><strong>上一页</strong></a> ");
}
int maxI=0;
if(maxPageNum!=0){
//maxI=results.size()/10+i-1;
maxI=maxPageNum;
}else{
maxI=pageLimit+i-1;
}
for (; i <= maxI; i++) {
if(i==pageNum){
sb.append("<strong>" + i
+ "</strong> ");
}else{
sb.append("<a href=\"javascript:pageGo('" + i + "');\" ><strong>" + i
+ "</strong></a> ");
}
}
sb.append("<a href=\"javascript:pageGo('" + this.getNext() + "');\" ><strong>下一页</strong></a> ");
this.navigation = sb.toString();
}
/**
* 获得分页结果
*
* @return
*/
public List<String> getResults() {
int i=1;
if(pageNum>6){
i=(pageNum-5)%10;
}
int index=(pageNum-i)%10*10;
i=index;
List<String> list=new ArrayList<String>();
if(results!=null&&results.size()>0){
for (; i < index+10&&results.size()>i; i++) {
list.add(results.get(i));
}
}
return list;
}
/**
* 设置分页结果
*
*/
public void setResults(List<String> results) {
this.results = results;
setRowKeyMap();
setMaxPageNum();
setPageNum();
setNavigation();
}
/**
* 获取数据查询所需要的 开始rowkey
* @return
*/
public String getStartKey(){
//从 用‘100整数倍的rowkey’作为‘开始rowkey’所查询出的参考数据中 找出当前页码所需要的‘开始rowkey’
int i=0;
if(pageNum>6){
i=(pageNum-6)%10;
}
int index=i*10;
String value="";
if(results.size()>index){
value=results.get(index);
}
return value;
}
/**
* 获取RowKeyMap
* @return
*/
public Map<String, String> getRowKeyMap() {
return rowKeyMap;
}
/**
* 根据集合数据自动为rowkeyMap赋值
*/
public void setRowKeyMap() {
if(rowKeyMap==null){
rowKeyMap=new HashMap<String, String>();
if(pageNum==1&&results.size()>0){
rowKeyMap.put("0", results.get(0));//总查询‘开始rowkey’
}
}else{
if(pageNum==1&&results.size()>0){
rowKeyMap.put("0", results.get(0));//总查询‘开始rowkey’
}
//if(((pageNum/10+1)*10-2)/5%2!=0){//判断数据集是否存在‘100的整数倍’
if(pageNum%10>6){//判断数据集是否存在‘100的整数倍’
int index=5*10+(10-pageNum%10+1)*10;//取数据集中 ‘100的整数倍’所在的下标
if(results.size()>index){//判断数据集中的数据量是否大于 ‘100的整数倍’所在的下标
rowKeyMap.put((pageNum/10+1)*10+"", results.get(index));//保存 ‘100的整数倍’数据的rowkey(作为下100数据[下10页]的‘开始rowkey’)
}
}else if(pageNum%10==0){
int index=60;
if(results.size()>index){//判断数据集中的数据量是否大于 ‘100的整数倍’所在的下标
rowKeyMap.put(pageNum+"", results.get(index));//保存 ‘100的整数倍’数据的rowkey(作为下100数据[下10页]的‘开始rowkey’)
}
}
}
}
/**
* 获取当前页码所需要的 前置rowkey
* @return
*/
public String getRowKey(){
//取当前页所需要的‘100的整数倍’的rowkey
String key=((pageNum-6)/10)*10+"";
String value=rowKeyMap.get(key);
return value;
}
/**
* 计算末页页码
*/
public void setMaxPageNum(){
int i=1;
if(pageNum>6){
i=pageNum-5;
}
i--;
if(results.size()<100){
maxPageNum=i+results.size()/10+1;
}
}
public int getNumPerPage() {
return this.numPerPage;
}
public void setNumPerPage(int numPerPage) {
this.numPerPage = numPerPage;
}
}