package com.ycsoft.report.query;
import java.lang.reflect.Type;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import com.google.gson.reflect.TypeToken;
import com.ycsoft.commons.exception.ReportException;
import com.ycsoft.commons.helper.JsonHelper;
import com.ycsoft.commons.helper.StringHelper;
import com.ycsoft.daos.core.JDBCException;
import com.ycsoft.report.bean.RepMyCube;
import com.ycsoft.report.bean.RepQueryLog;
import com.ycsoft.report.commons.FileObjectOutputStream;
import com.ycsoft.report.commons.ReportConstants;
import com.ycsoft.report.dao.config.RepGroupDao;
import com.ycsoft.report.dao.config.RepHeadDao;
import com.ycsoft.report.dao.config.RepMyCubeDao;
import com.ycsoft.report.dao.config.RepQueryLogDao;
import com.ycsoft.report.dao.config.RepSqlDao;
import com.ycsoft.report.dao.config.RepTotalDao;
import com.ycsoft.report.dao.redis.JedisDao;
import com.ycsoft.report.dto.InitQueryDto;
import com.ycsoft.report.query.cube.CubeExec;
import com.ycsoft.report.query.cube.CubeHeadCell;
import com.ycsoft.report.query.cube.detail.CubeDetail;
import com.ycsoft.report.query.cube.impl.CubeManage;
import com.ycsoft.report.query.cube.impl.MyCube;
import com.ycsoft.report.query.cube.showclass.cellwarn.MeaWarn;
import com.ycsoft.report.query.key.QueryKey;
import com.ycsoft.report.query.key.Impl.ConKeyValue;
import com.ycsoft.report.query.redis.QueryResultOlapRedis;
import com.ycsoft.report.query.sql.AnalyseMemoryKey;
import com.ycsoft.report.query.sql.AnalyseSqlFactory;
import com.ycsoft.report.query.sql.QuerySql;
import com.ycsoft.report.query.treequery.DimKeyContainer;
public class QueryManageImpl implements QueryManage {
private CubeManage cubeManage;
private RepMyCubeDao repMyCubeDao;
private RepQueryLogDao repQueryLogDao;
private CubeDetail cubeDetail;
private QueryKey queryKey;
private RepHeadDao repHeadDao;
private RepTotalDao repTotalDao;
private RepGroupDao repGroupDao;
private RepSqlDao repSqlDao;
private QuerySql querySql;
private JedisDao jedisDao;
/**
* 创建cube的查询
* @param initQueryDto
* @param optr_id
* @return
* @throws ReportException
*/
private QueryResult createQueryResultOlap(InitQueryDto initQueryDto,String optr_id) throws ReportException{
try {
if(StringHelper.isNotEmpty(initQueryDto.getCache_query_id())){
//存在缓存则设置新的查询id
initQueryDto.setQuery_id(repQueryLogDao.findSequence().toString());
}
//QueryResultOlap olap=new QueryResultOlap(initQueryDto.getQuery_id(),initQueryDto,initQueryDto.getSql(),initQueryDto.getCache_query_id());
QueryResultOlap olap=new QueryResultOlapRedis(initQueryDto.getQuery_id(),initQueryDto,initQueryDto.getSql(),initQueryDto.getCache_query_id(),this.jedisDao);
//查询有效模板
RepMyCube repmycube=repMyCubeDao.queryDefaultShowCube(initQueryDto.getRep_id(), optr_id);
if(repmycube==null){
CubeExec cube=cubeManage.getCube(initQueryDto.getRep_id());
if(cube==null) throw new ReportException("cube no config!");
cube.execute(olap);
}else{
//使用模板初始化cube
MyCube mycube=JsonHelper.toObject(repmycube.getCube_json(), MyCube.class);
CubeExec cube=cubeManage.createCube(initQueryDto.getRep_id(),mycube);
cube.execute(olap);
//值警戒
List<MeaWarn> warnlist=null;
if(StringHelper.isNotEmpty(repmycube.getWarn_json())){
Type type = new TypeToken<List<MeaWarn>>(){}.getType();
warnlist=JsonHelper.toList(repmycube.getWarn_json(), type);
olap.setMeawarns(warnlist);
}
}
return olap;
}catch(ReportException e){
throw e;
} catch (Exception e) {
throw new ReportException("error",e);
}
}
/**
* 创建cube明细查询
* @param initQueryDto
* @param optr_id
* @return
* @throws ReportException
*/
private QueryResult createQueryCubeDetail(InitQueryDto initQueryDto) throws ReportException{
try{
if(StringHelper.isEmpty(initQueryDto.getHistory_query_id()))
throw new ReportException("cube_detail:cube_query_id is null");
RepQueryLog log= repQueryLogDao.getRepQuerLog(initQueryDto.getHistory_query_id());
if(log==null)
throw new ReportException("cube_detail:cube_query_id is not right");
//报表合计项目
initQueryDto.setTotals(repTotalDao.findTotals(initQueryDto.getRep_id()));
String cube_sql=initQueryDto.getSql();
//主报表cube的使用的查询条件
if(StringHelper.isNotEmpty(log.getKeylist())){
Map<String,String> valuemap= queryKey.toValueMap(log.getKeylist());
List<ConKeyValue> keylist=new ArrayList<ConKeyValue>();
Iterator<String> it=valuemap.keySet().iterator();
while(it.hasNext()){
ConKeyValue o=new ConKeyValue();
String key=it.next();
o.setKey(key);
o.setValue(valuemap.get(key));
keylist.add(o);
}
cube_sql=new AnalyseSqlFactory(cube_sql).getAnaSql(keylist);
}
//headcell处理过程
List<CubeHeadCell> cells=new ArrayList<CubeHeadCell>();
cells.addAll(initQueryDto.getHeaddatacells());
QueryResultOlap olap=(QueryResultOlap) this.get(initQueryDto.getHistory_query_id());
List<ConKeyValue> keylist =cubeDetail.createCubeDetailKeys(olap.getCube(),cells);
cube_sql=new AnalyseSqlFactory(cube_sql).getCubeDetail(keylist);
initQueryDto.setSql(cube_sql);
return new QueryResultCommon(initQueryDto);
}catch(JDBCException e){
throw new ReportException(e,e.getSQL());
} catch (ReportException e) {
throw e;
}
}
/**
* 通用报表初始化查询处理
* @param initQueryDto
* @return
* @throws ReportException
*/
private QueryResult createCommonQuery(InitQueryDto initQueryDto) throws ReportException{
try{
initQueryDto.setHeadlist(repHeadDao.getRepHeadList(initQueryDto.getRep_id()));
//合计项目设置
initQueryDto.setTotals(repTotalDao.findTotals(initQueryDto.getRep_id()));
//分组小计设置
initQueryDto.setGroup(repGroupDao.findColumnName(initQueryDto.getRep_id()));
return new QueryResultCommon(initQueryDto);
} catch (JDBCException e) {
throw new ReportException(e,e.getSQL());
} catch (ReportException e) {
throw e;
}
}
/**
* sql提取转换组装
* @param initQueryDto
* @return
* @throws ReportException
*/
private String translateSql(InitQueryDto initQueryDto) throws ReportException{
try {
String sql = repSqlDao.getSql(initQueryDto.getRep_id());
sql=querySql.translateTemplateKey(sql);
//内存列转换
sql=AnalyseMemoryKey.translateColumnToKey(sql);
//组装sql
sql=new AnalyseSqlFactory(sql).getAnaSql(initQueryDto.getKeyvaluelist());
return sql;
} catch (JDBCException e) {
throw new ReportException(e,e.getSQL());
}
}
//private Map<String,String>
public RepQueryLog initQuery(InitQueryDto initQueryDto,RepQueryLog repQueryLog,String optr_id)
throws ReportException {
try{
QueryResult qr = QueryContainer.getRepQuery(initQueryDto.getQuery_id());
if (qr == null) {
initQueryDto.setSql(translateSql(initQueryDto));
if(initQueryDto.getRep_type().equals(ReportConstants.REP_TYPE_OLAP)){
qr=createQueryResultOlap(initQueryDto,optr_id);
//cube查询,不需要12小时持久缓存,*_base 对应历史查询需要缓存,非该文件不需要持久缓存
QueryContainer.addRepQuery(qr,ReportConstants.VALID_F);
}else if(initQueryDto.getRep_type().equals(ReportConstants.REP_TYPE_OLAP_DETAIL)){
//cube明细报表处理
qr=createQueryCubeDetail(initQueryDto);
//不缓存查询
repQueryLog.setIsvalid(ReportConstants.VALID_F);
QueryContainer.addRepQuery(qr,repQueryLog.getIsvalid());
}else{
//老报表处理 含普通老报表和快译报表处理
qr=createCommonQuery(initQueryDto);
QueryContainer.addRepQuery(qr,repQueryLog.getIsvalid());
}
}
repQueryLog.setQuerynum((qr.getRowSize() - 1));
repQueryLog.setQuerytime( (int)(System.currentTimeMillis()- repQueryLog.getCreate_date().getTime()));
return repQueryLog;
}catch(ReportException e){
throw e;
}
}
public QueryResult get(String query_id) throws ReportException {
QueryResult qr = QueryContainer.getRepQuery(query_id);
if (qr == null)
throw new ReportException("report is no_init or is destroyed.");
qr.updateVisitDate();
return qr;
}
public void delete(String query_id) {
QueryResult queryResult=QueryContainer.getRepQuery(query_id);
QueryContainer.deleteRepQuery(queryResult);
}
/**
* 初始化快逸设计用数据
* testdata:true使用测试数据,false不使用测试数据
*/
public RepQueryLog initRaqQuery(InitQueryDto initQueryDto,
RepQueryLog repQueryLog,boolean testdata) throws ReportException {
FileObjectOutputStream foo=null;
try {
if(testdata&&initQueryDto.getKeyvaluelist()!=null){
for(ConKeyValue keydto:initQueryDto.getKeyvaluelist())
keydto.setValue("");//keydto.getTestvalue());
}
repQueryLog=initQuery(initQueryDto,repQueryLog,repQueryLog.getOptr_id());
foo=new FileObjectOutputStream(ReportConstants.REP_TEMP_TXT+initQueryDto.getQuery_id()+ReportConstants.INDEX);
//写入查询结果集
foo.writeObject(this.get(initQueryDto.getQuery_id()));
//写入查询维度容器
foo.writeObject(DimKeyContainer.getDimkeymap());
return repQueryLog;
} catch (Exception e) {
throw new ReportException(e);
}finally{
try {
if (foo != null){
foo.close();
foo=null;
}
} catch (Exception e1) {
}
}
}
public CubeDetail getCubeDetail() {
return cubeDetail;
}
public void setCubeDetail(CubeDetail cubeDetail) {
this.cubeDetail = cubeDetail;
}
public RepHeadDao getRepHeadDao() {
return repHeadDao;
}
public void setRepHeadDao(RepHeadDao repHeadDao) {
this.repHeadDao = repHeadDao;
}
public RepTotalDao getRepTotalDao() {
return repTotalDao;
}
public void setRepTotalDao(RepTotalDao repTotalDao) {
this.repTotalDao = repTotalDao;
}
public RepGroupDao getRepGroupDao() {
return repGroupDao;
}
public void setRepGroupDao(RepGroupDao repGroupDao) {
this.repGroupDao = repGroupDao;
}
public RepSqlDao getRepSqlDao() {
return repSqlDao;
}
public void setRepSqlDao(RepSqlDao repSqlDao) {
this.repSqlDao = repSqlDao;
}
public QuerySql getQuerySql() {
return querySql;
}
public void setQuerySql(QuerySql querySql) {
this.querySql = querySql;
}
public JedisDao getJedisDao() {
return jedisDao;
}
public void setJedisDao(JedisDao jedisDao) {
this.jedisDao = jedisDao;
}
public QueryKey getQueryKey() {
return queryKey;
}
public void setQueryKey(QueryKey queryKey) {
this.queryKey = queryKey;
}
public RepQueryLogDao getRepQueryLogDao() {
return repQueryLogDao;
}
public void setRepQueryLogDao(RepQueryLogDao repQueryLogDao) {
this.repQueryLogDao = repQueryLogDao;
}
public RepMyCubeDao getRepMyCubeDao() {
return repMyCubeDao;
}
public void setRepMyCubeDao(RepMyCubeDao repMyCubeDao) {
this.repMyCubeDao = repMyCubeDao;
}
public CubeManage getCubeManage() {
return cubeManage;
}
public void setCubeManage(CubeManage cubeManage) {
this.cubeManage = cubeManage;
}
}