/*
* Copyright (C) 2010---2014 星星(wuweixing)<349446658@qq.com>
*
* This file is part of Wabacus
*
* Wabacus is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package com.wabacus.system.dataset.select.report;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import com.wabacus.config.component.application.report.AbsReportDataPojo;
import com.wabacus.config.component.application.report.ReportDataSetBean;
import com.wabacus.config.component.application.report.ReportDataSetValueBean;
import com.wabacus.system.assistant.ReportAssistant;
import com.wabacus.system.component.application.report.abstractreport.AbsReportType;
public class VerticalReportDataSet extends AbsReportDataSetType
{
public VerticalReportDataSet(AbsReportType reportTypeObj)
{
super(reportTypeObj);
}
public List<AbsReportDataPojo> loadReportAllRowDatas(boolean isLoadAllDataMandatory)
{
boolean isLazyLoadReportData=rbean.isLazyLoadReportData(rrequest);
if((!cdb.isLoadAllReportData()&&cdb.getRefreshNavigateInfoType()<=0&&!isLoadAllDataMandatory)||(cdb.isLoadAllReportData()&&isLazyLoadReportData))
{//当前加载分页报表数据,且需要加载记录数,如果本次是加载所有数据,但是延迟加载,则也要加载记录数,因为后面在分批加载时要判断当前要从哪个<dataset/>中另载数据
loadReportDataRecordcount();
if(cdb.getRecordcount()==0) return null;
}
List<Map<String,Object>> lstOneDatasetValueDataTmp;//一个<value/>加载的数据集合
List<AbsReportDataPojo> lstDataResult=new ArrayList<AbsReportDataPojo>();
List<AbsReportDataPojo> lstOneDatasetData=new ArrayList<AbsReportDataPojo>();//一个<dataset/>加载的所有数据
int pagesize=-1, startNum=-1;
if(!cdb.isLoadAllReportData()&&!isLoadAllDataMandatory)
{
pagesize=cdb.getPagesize();
startNum=(cdb.getFinalPageno()-1)*pagesize;
}else if(cdb.isLoadAllReportData()&&isLazyLoadReportData)
{
pagesize=Integer.MAX_VALUE;
startNum=0;
}
int maxrecordcount=cdb.getMaxrecordcount();
if(maxrecordcount<=0) maxrecordcount=-1;
int prevDatasetDisplayedTotalRowcount=0;//到上一个数据集为止显示的记录总数,这样可以决定要在循环的本数据集中要显示的起止记录号
outer: for(ReportDataSetBean dsbeanTmp:rbean.getSbean().getLstDatasetBeans())
{//逐个<dataset/>查询记录
int maxDisplayedTotalRowCountThisDataset=0;//记录本<dataset/>中在翻到本页时各子<value/>数据集显示的最大记录数
for(ReportDataSetValueBean dsvbeanTmp:dsbeanTmp.getLstValueBeans())
{
if((lstOneDatasetData.size()==0)&&dsvbeanTmp.isDependentDataSet()) continue;
int startRownum=-1,endRownum=-1;
if(startNum>=0&&!dsvbeanTmp.isDependentDataSet())
{
int[] tmp=calStartEndRownumForPartDataset(dsvbeanTmp,prevDatasetDisplayedTotalRowcount,maxDisplayedTotalRowCountThisDataset,
startNum,pagesize);
maxDisplayedTotalRowCountThisDataset=tmp[0];
startRownum=tmp[1];
endRownum=tmp[2];
cdb.setStartRownumOfDsvbean(dsvbeanTmp,startRownum);
cdb.setEndRownumOfDsvbean(dsvbeanTmp,endRownum);
if(startRownum<0||endRownum<=startRownum) continue;
}
if(!isLazyLoadReportData)
{//不是延迟加载,则加载报表数据
lstOneDatasetValueDataTmp=dsvbeanTmp.getProvider().getDataSet(rrequest,lstOneDatasetData,startRownum,endRownum);
if(lstOneDatasetValueDataTmp==null||lstOneDatasetValueDataTmp.size()==0) continue;
if(dsvbeanTmp.isDependentDataSet())
{
parseDependentReportData(dsvbeanTmp,lstOneDatasetValueDataTmp,lstOneDatasetData);
}else if(cdb.isLoadAllReportData()||isLoadAllDataMandatory)
{
copyListDataToLstResultsData(dsvbeanTmp,lstOneDatasetValueDataTmp,lstOneDatasetData,maxrecordcount);
}else
{
copyListDataToLstResultsData(dsvbeanTmp,lstOneDatasetValueDataTmp,lstOneDatasetData,cdb.getPagesize());
}
}
}
if(!isLoadAllDataMandatory)
{
cdb.setStartRownumOfDsbean(dsbeanTmp,prevDatasetDisplayedTotalRowcount);
if(startNum>=0)
{//加载分页显示报表的数据,或者延迟加载所有数据
prevDatasetDisplayedTotalRowcount+=maxDisplayedTotalRowCountThisDataset;//累加上本<dataset/>显示的总记录数
}else
{
prevDatasetDisplayedTotalRowcount+=lstOneDatasetData.size();
}
cdb.setEndRownumOfDsbean(dsbeanTmp,prevDatasetDisplayedTotalRowcount);
}
for(AbsReportDataPojo dataObjTmp:lstOneDatasetData)
{
dataObjTmp.setLstAllDataObjs(lstDataResult);
lstDataResult.add(dataObjTmp);
if(pagesize>0)
{
if(lstDataResult.size()==pagesize||(maxrecordcount>0&&startNum+lstDataResult.size()==maxrecordcount)) break outer;
}else if(maxrecordcount>0&&lstDataResult.size()==maxrecordcount)
{//已经显示了指定的最大记录数
break outer;
}
}
lstOneDatasetData.clear();
}
return lstDataResult;
}
private void loadReportDataRecordcount()
{
if(cdb.getRefreshNavigateInfoType()<0)
{
for(ReportDataSetBean dsbeanTmp:rbean.getSbean().getLstDatasetBeans())
{
int recordcount=0;
for(ReportDataSetValueBean dsvbeanTmp:dsbeanTmp.getLstValueBeans())
{
if(dsvbeanTmp.isDependentDataSet()) continue;
int recordcntTmp=dsvbeanTmp.getProvider().getRecordcount(rrequest);
cdb.addRecordcount(dsvbeanTmp.getGuid(),recordcntTmp);
if(recordcntTmp>recordcount) recordcount=recordcntTmp;
}
cdb.setRecordcount(cdb.getRecordcount()+recordcount);
}
}
if(cdb.getPagesize()>0)
{
cdb.setPagecount(ReportAssistant.getInstance().calPageCount(cdb.getPagesize(),cdb.getRecordcount()));
}
}
private int[] calStartEndRownumForPartDataset(ReportDataSetValueBean dsvbean,int prevDatasetDisplayedTotalRowcount,
int maxDisplayedTotalRowCountThisDataset,int startNum,int pagesize)
{
int startRownum=0,endRownum=0;//本<value/>数据集要显示的起止记录号
int myrecordcnt=cdb.getRecordcountOfDataset(dsvbean.getGuid());
if(myrecordcnt>0)
{
if(prevDatasetDisplayedTotalRowcount+myrecordcnt<startNum)
{
if(myrecordcnt>maxDisplayedTotalRowCountThisDataset) maxDisplayedTotalRowCountThisDataset=myrecordcnt;
}else
{
if(startNum>prevDatasetDisplayedTotalRowcount)
{//如果本次显示的起始记录号大于前面所有数据集显示的总记录数,则说明本数据集在前面页也有显示(否则前面页的记录数不够)
startRownum=startNum-prevDatasetDisplayedTotalRowcount;
}
int pagesizelocal=pagesize;
if(prevDatasetDisplayedTotalRowcount>startNum)
{
pagesizelocal=startNum+pagesize-prevDatasetDisplayedTotalRowcount;
}
if(startRownum+pagesizelocal>myrecordcnt) pagesizelocal=myrecordcnt-startRownum;//这个数据集在本页没有这么多记录显示,则取出实际能显示的记录数做为显示记录数
endRownum=startRownum+pagesizelocal;
if(endRownum>maxDisplayedTotalRowCountThisDataset) maxDisplayedTotalRowCountThisDataset=endRownum;
}
}
return new int[] { maxDisplayedTotalRowCountThisDataset, startRownum, endRownum};
}
public List<AbsReportDataPojo> loadLazyReportDatas(int startRownum,int endRownum)
{
List<AbsReportDataPojo> lstDataResult=new ArrayList<AbsReportDataPojo>();
List<AbsReportDataPojo> lstOneDatasetData=new ArrayList<AbsReportDataPojo>();//一个<dataset/>加载的所有数据
List<Map<String,Object>> lstOneDatasetValueDataTmp;//一个<value/>加载的数据集合
int maxrecordcount=cdb.getMaxrecordcount();
if(maxrecordcount>0&&maxrecordcount<endRownum) endRownum=maxrecordcount;
if(endRownum<=startRownum) return lstDataResult;
int dataCount=endRownum-startRownum;
int dsStartRownum, dsEndRownum;
outer: for(ReportDataSetBean dsbeanTmp:rbean.getSbean().getLstDatasetBeans())
{//逐个<dataset/>查询记录
if(cdb.getEndRownumOfDsbean(dsbeanTmp)<=startRownum) continue;
if(cdb.getStartRownumOfDsbean(dsbeanTmp)>=endRownum) break;
dsStartRownum=startRownum-cdb.getStartRownumOfDsbean(dsbeanTmp);
dsEndRownum=endRownum-cdb.getStartRownumOfDsbean(dsbeanTmp);
for(ReportDataSetValueBean dsvbeanTmp:dsbeanTmp.getLstValueBeans())
{
if((lstOneDatasetData.size()==0)&&dsvbeanTmp.isDependentDataSet()) continue;//如果当前数据集不是独立数据集,且被依赖的父数据集没有数据,则此子数据集也不需显示
if(dsvbeanTmp.isDependentDataSet())
{
dsStartRownum=-1;
dsEndRownum=-1;
}
lstOneDatasetValueDataTmp=dsvbeanTmp.getProvider().getDataSet(rrequest,lstOneDatasetData,dsStartRownum,dsEndRownum);
if(lstOneDatasetValueDataTmp==null||lstOneDatasetValueDataTmp.size()==0) continue;
if(dsvbeanTmp.isDependentDataSet())
{
parseDependentReportData(dsvbeanTmp,lstOneDatasetValueDataTmp,lstOneDatasetData);
}else
{
copyListDataToLstResultsData(dsvbeanTmp,lstOneDatasetValueDataTmp,lstOneDatasetData,dataCount);
}
}
for(AbsReportDataPojo dataObjTmp:lstOneDatasetData)
{
dataObjTmp.setLstAllDataObjs(lstDataResult);
lstDataResult.add(dataObjTmp);
if(lstDataResult.size()==dataCount) break outer;
}
lstOneDatasetData.clear();
}
return lstDataResult;
}
}