package com.ycsoft.report.query.treequery;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import com.ycsoft.commons.exception.ReportException;
import com.ycsoft.report.bean.RepColumn;
import com.ycsoft.report.bean.RepHead;
import com.ycsoft.report.commons.FileObjectInputStream;
import com.ycsoft.report.commons.FileObjectOutputStream;
import com.ycsoft.report.commons.ReportConstants;
import com.ycsoft.report.dto.InitQueryDto;
import com.ycsoft.report.query.QueryManage;
import com.ycsoft.report.query.QueryManageImpl;
import com.ycsoft.report.query.QueryResult;
import com.ycsoft.report.query.QueryResultCommon;
import com.ycsoft.report.query.tree.QManyNode;
import com.ycsoft.report.query.tree.QManyTree;
/**
* 列可扩展的查询结果集
* @author new
*/
public class QueryResultQuiee extends QueryResultCommon {
public QueryResultQuiee(InitQueryDto qdto) throws ReportException {
super(qdto);
// TODO Auto-generated constructor stub
}
// 查询列属性
class QueryRsmd {
public String OlapType = null;
public String super_id = null;// 当前设置的最高级的id
public DimKey super_dimkey;// 当前设置的最高级dim_key
public String super_desc;
public DimKey dimkey;
public String ID = null;
public String name = null;
public double total=0.0;
}
public void QueryResultOlap111(InitQueryDto initQueryDto) throws ReportException {
FileObjectInputStream foi = null;// 读文件
FileObjectOutputStream foo = null;// 写文件
try {
// 声明了一颗树
QManyTree<List<Double>> qManyTree = new QManyTree<List<Double>>();
this.query_id = initQueryDto.getQuery_id();
this.database = ReportConstants.DATABASETYPE_HISTROY;
QueryManage qm = new QueryManageImpl();
QueryResult queryresult = qm.get(initQueryDto.getHistory_query_id());
this.rep_id=queryresult.getRepId();
foo = new FileObjectOutputStream(ReportConstants.REP_TEMP_TXT+ initQueryDto.getQuery_id());
foi = new FileObjectInputStream(ReportConstants.REP_TEMP_TXT+ queryresult.getQueryId());
List<QueryRsmd> qrlist = this.getQueryRsmdList(initQueryDto);// 设置属性列
// 查询头保存
saveHead(foi, foo, qrlist);
List<String> list = null;
while ((list = (List<String>) foi.readObject()) != null
&& foi.getRowIndex() <= queryresult.getRowSize()) {
// 根节点
QManyNode<List<Double>> node = qManyTree.getRoot();
// 获取需要sum的数据列
List<Double> datalist = new ArrayList<Double>();
for (int i = 0; i < qrlist.size(); i++) {
QueryRsmd qr = qrlist.get(i);
if (qr.OlapType.equals(ReportConstants.OLAP_TYPE_TOTAL)) {
Double d = Double.valueOf(list.get(i));
datalist.add(d);
}
}
// 生成树
for (int i = 0; i < qrlist.size(); i++) {
QueryRsmd qr = qrlist.get(i);
DimKey dimkey = qr.dimkey;
qr.ID = list.get(i);
qr.name = qr.dimkey.getName(qr.ID);
// 取对应最高级的dimkey的ID,Name
while (dimkey != qr.super_dimkey) {
dimkey = DimKeyContainer.getDimKey(dimkey.getPkey());
if (dimkey == null)
break;
qr.ID = DimKeyContainer.getDimKey(dimkey.getSkey())
.getPid(qr.ID);
qr.name = dimkey.getName(qr.ID);
}
// 不计算和页面选择不一致的ID代表的行
if (qr.super_id != null && !"".equals(qr.super_id)
&& !qr.super_id.equals(qr.ID))
break;
if (i + 1 < qrlist.size()
&& qrlist.get(i).OlapType
.equals(ReportConstants.OLAP_TYPE_EXTEND)
&& qrlist.get(i + 1).OlapType
.equals(ReportConstants.OLAP_TYPE_EXTEND))
// 下一个属性还是扩展属性时
node = node
.addChild(new QueryData(qr.ID, qr.name, null));
else {// 下一个属性不是扩展属性时,记录数据列,并退出循环
node.addChild(new QueryData(qr.ID, qr.name, datalist));
break;
}
}
}
//把统计内容保存到文件
iteratorTreeToFile(foo, qManyTree.getRoot(),qrlist);
// 把最后合计项写入文件
foo.writeObject(getTail(qrlist));
// 去掉查询头那一行
this.rows = foo.size() - 1;
} catch (IOException e) {
throw new ReportException(e);
} catch (ClassNotFoundException e) {
throw new ReportException(e);
} catch (Exception e) {
throw new ReportException("system_error:", e);
} finally {
try {
if (foi != null)
foi.close();
} catch (Exception e) {
}
try {
if (foo != null)
foo.close();
} catch (Exception e) {
}
}
}
/**
* 把树写入文件 递归遍历到树叶,然后通过树叶查找上级,生成一个完整List保存到文件
*
* @param foo
* @param treeNode
* @throws IOException
* @throws ReportException
*/
public void iteratorTreeToFile(FileObjectOutputStream foo,
QManyNode<List<Double>> treeNode,List<QueryRsmd> qrlist) throws IOException,
ReportException {
if (treeNode == null)
throw new ReportException("root_treeNode is null");
for (QManyNode<List<Double>> index : treeNode.getChildList()) {
if (!index.isLeaf())
iteratorTreeToFile(foo, index,qrlist);
else {
List<String> list = new ArrayList<String>();
for (int i = index.getNodeData().getData().size() - 1, j=qrlist.size()-1; i >= 0&&j>=0; i--,j--){
Double d=index.getNodeData().getData().get(i);
qrlist.get(j).total=qrlist.get(j).total+d;
list.add(d.toString());
}
list.add(index.getNodeData().getName());
list.add(index.getNodeData().getKey());
QManyNode<List<Double>> parentNode = index.getParentNode();
while (parentNode != null && parentNode.getNodeData() != null) {
list.add(parentNode.getNodeData().getName());
list.add(parentNode.getNodeData().getKey());
parentNode = parentNode.getParentNode();
}
List<String> write = new ArrayList<String>(list.size());
for (int i = list.size() - 1; i >= 0; i--) {
write.add(list.get(i));
}
foo.writeObject(write);
}
}
}
/**
* 设置列属性
*
* @param initQueryDto
* @return
*/
private List<QueryRsmd> getQueryRsmdList(InitQueryDto initQueryDto) {
List<QueryRsmd> qrlist = new ArrayList<QueryRsmd>();
for (int i = 0; i < initQueryDto.getColumnlist().size(); i++) {
RepColumn column = initQueryDto.getColumnlist().get(i);
QueryRsmd qr = new QueryRsmd();
qr.OlapType = column.getOlap_type();
if (column.getOlap_type().equals(ReportConstants.OLAP_TYPE_EXTEND)) {
qr.super_id = column.getDim_id_select();
qr.super_dimkey = DimKeyContainer.getDimKey(column
.getDim_key_select());
qr.dimkey = DimKeyContainer.getDimKey(column.getDim_key());
}
qrlist.add(qr);
}
return qrlist;
}
/**
* 重置查询头
*
* @param foi
* @param foo
* @param qrlist
* @throws ClassNotFoundException
* @throws IOException
*/
private void saveHead(FileObjectInputStream foi,
FileObjectOutputStream foo, List<QueryRsmd> qrlist)
throws IOException, ClassNotFoundException {
List<List<RepHead>> headlist = new ArrayList<List<RepHead>>();
//原查询头,报表定义配置或默认的
List<List<RepHead>> historylist = (List<List<RepHead>>) foi.readObject();
for (int i = 0; i < historylist.size(); i++) {
List<RepHead> list = historylist.get(i);
List<RepHead> headrow = new ArrayList<RepHead>();
for (RepHead rephead : list) {
QueryRsmd qr = qrlist.get(rephead.getCol_seq());
if (qr.OlapType.equals(ReportConstants.OLAP_TYPE_EXTEND)) {
rephead.setOlap_type(ReportConstants.OLAP_TYPE_EXTEND);
headrow.add(rephead);
// ID对应显示列
RepHead showrephead = new RepHead();
if (i == 0){
DimKey dimkey=qr.dimkey;
qr.super_desc=dimkey.getDesc();
while (dimkey != qr.super_dimkey) {
dimkey = DimKeyContainer.getDimKey(dimkey.getPkey());
if (dimkey == null)
break;
qr.super_desc=dimkey.getDesc();
}
showrephead.setCol_desc(qr.super_desc);
}
showrephead.setCol_length(rephead.getCol_length());
headrow.add(showrephead);
} else {
headrow.add(rephead);
}
}
headlist.add(headrow);
}
foo.writeObject(headlist);
}
private List<String> getTail(List<QueryRsmd> qrlist){
List<String> taillist = new ArrayList<String>();
for (QueryRsmd qr : qrlist) {
if (qr.OlapType.equals(ReportConstants.OLAP_TYPE_TOTAL))
taillist.add(String.valueOf(qr.total));
else{
taillist.add("");
taillist.add("");
}
}
return taillist;
}
}