package com.ycsoft.report.query.cube.impl; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import com.ycsoft.commons.exception.ReportException; import com.ycsoft.commons.helper.CollectionHelper; import com.ycsoft.report.bean.RepCube; import com.ycsoft.report.bean.RepDefine; import com.ycsoft.report.dao.config.RepCubeDao; import com.ycsoft.report.query.cube.CubeExec; import com.ycsoft.report.query.cube.Dimension; import com.ycsoft.report.query.cube.DimensionRolap; import com.ycsoft.report.query.cube.DimensionType; import com.ycsoft.report.query.cube.Measure; import com.ycsoft.report.query.key.Impl.QueryKeyValue; import com.ycsoft.report.query.menory.MemoryCacheInit; /** * cube管理 */ public class CubeManage implements MemoryCacheInit { /** * key=rep_id,value=一个完整CUBE配置 */ private static Map<String,List<RepCube>> cubeMap=new HashMap<String,List<RepCube>>(); /** * key=rep_id,value= 一个完整的CUBE配置Map<Sreing,RepCube>(key=column_define维或指标,value=cube的一个字段配置关系) */ private static Map<String,Map<String,RepCube>> cubeMapBycolumn=new HashMap<String,Map<String,RepCube>>(); private RepCubeDao repCubeDao; public static List<RepCube> getRepCubes(String rep_id){ return cubeMap.get(rep_id); } /** * 使用完整CUBE配置构造一个cube * @param repcubes * @return * @throws ReportException */ public CubeExec createCube(List<RepCube> repcubes) throws ReportException{ Cube cube=new Cube(repcubes); return cube; } /** * 使用缓存的CUBE配置构造一个cube * @param rep_id * @return * @throws ReportException */ public CubeExec getCube(String rep_id) throws ReportException{ List<RepCube> list=cubeMap.get(rep_id); if(list!=null) return createCube(list); else return null; } /** * 从一个cube中提取mycube * @param cube * @return */ public MyCube getMyCube(CubeExec cube){ MyCube mycube=new MyCube(); //指标 for(Measure mea: cube.getMeasures()){ if(mycube.getMealist()==null){ mycube.setMealist(new ArrayList<String>()); } mycube.getMealist().add(mea.getColumnCode()); } //维度 for(DimensionRolap rolap:cube.getDimensionRolaps()){ if(rolap.isUsesign()){ //维度清单 if(mycube.getDimlist()==null){ mycube.setDimlist(new ArrayList<String>()); } //纵向维 mycube.getDimlist().add(rolap.getId()); if(rolap.isVerticalsign()){ mycube.setVertdim(rolap.getId()); } //维层级 if(mycube.getDimlevelmap()==null){ mycube.setDimlevelmap(new HashMap<String,Integer>()); } mycube.getDimlevelmap().put(rolap.getId(), rolap.getLevel()); //合计值 if(mycube.getDimtotalmap()==null){ mycube.setDimtotalmap(new HashMap<String,Integer[]>()); } List<Integer> totals=new ArrayList<Integer>(); for(int i=1;i<=rolap.getDim().getLevelNum();i++){ if(rolap.isLevelTotal(i)) totals.add(i); } mycube.getDimtotalmap().put(rolap.getId(), totals.toArray(new Integer[totals.size()])); //切片值 if(mycube.getDimslicesmap()==null){ mycube.setDimslicesmap(new HashMap<String,Map<Integer,String[]>>()); } if(rolap.getSlices_level()!=null){ Map<Integer,String[]> slicesmap=new HashMap<Integer,String[]>(); slicesmap.put(rolap.getSlices_level(), rolap.getSlices_value()); mycube.getDimslicesmap().put(rolap.getId(), slicesmap); } //自定义排序 if(mycube.getDimsortmap()==null){ mycube.setDimsortmap(new HashMap<String,Map<Integer,String[]>>() ); } if(rolap.getLevel_sort_map()!=null&&rolap.getLevel_sort_map().size()>0){ mycube.getDimsortmap().put(rolap.getId(), rolap.getLevel_sort_map()); } } } return mycube; } /** * 使用mycube设置cube * 并判断mycube配置是否正确 * @param cube * @param mycube * @return * @throws ReportException */ public void setCube(CubeExec cube,MyCube mycube) throws ReportException{ //指标 cube.selectMeasure(mycube.getMealist().toArray(new String[mycube.getMealist().size()])); //维度 if(mycube.getDimlist()!=null){ Dimension[] dims=new Dimension[mycube.getDimlist().size()]; for(int i=0;i<mycube.getDimlist().size();i++){ dims[i]=DimensionManage.getDimension(mycube.getDimlist().get(i)); if(dims[i]==null) throw new ReportException(mycube.getDimlist().get(i)+":mycube.dimlist["+i+"] is undefined."); } cube.selectDimension(DimensionManage.getDimension(mycube.getVertdim()), dims); } //合计 if(mycube.getDimtotalmap()!=null){ for(String dim:mycube.getDimtotalmap().keySet()) cube.configDimensionTotal(DimensionManage.getDimension(dim), mycube.getDimtotalmap().get(dim)); } //切片 if(mycube.getDimslicesmap()!=null){ for(String dim:mycube.getDimslicesmap().keySet()){ Map<Integer,String[]> map=mycube.getDimslicesmap().get(dim); for(Integer level:map.keySet()){ cube.slicesDimension(DimensionManage.getDimension(dim), level, map.get(level)); } } } //自定义排序 if(mycube.getDimsortmap()!=null){ for(String dim:mycube.getDimsortmap().keySet()){ Map<Integer,String[]> map=mycube.getDimsortmap().get(dim); cube.sortDimension(DimensionManage.getDimension(dim), map); } } //层 if(mycube.getDimlevelmap()!=null){ for(String dim:mycube.getDimlevelmap().keySet()){ Integer level=mycube.getDimlevelmap().get(dim); if(level==null||level<1||level>DimensionManage.getDimension(dim).getLevelNum()) throw new ReportException("level is 0 or level <1 or level> levelNum"); for(int i=cube.getDimensionRolap(DimensionManage.getDimension(dim)).getLevel();i>level;i--) cube.shrinkDimension(DimensionManage.getDimension(dim)); for(int i=cube.getDimensionRolap(DimensionManage.getDimension(dim)).getLevel();i<level;i++) cube.expandDimension(DimensionManage.getDimension(dim)); } } } /** * 使用mycube创建cube * @param rep_id * @param mycube * @return * @throws ReportException */ public CubeExec createCube(String rep_id,MyCube mycube) throws ReportException{ CubeExec cube= this.getCube(rep_id); this.setCube(cube, mycube); return cube; } /** * 生成维度配置清单 * 格式: * 维度: 地区_县区_区域(横向维;层=地区,县区;合计=地区,县区;切片=(县区:台山, * 广海),维度:年_月(横向维;层=月;合计=月;切片=(月:1月,2月)), 度量: * 客户数_SUM * @return * @throws ReportException */ public String getMyCubeConfig(String rep_id,MyCube mycube) throws ReportException{ StringBuilder config=new StringBuilder(); if(mycube.getDimlist()==null||mycube.getDimlist().size()==0) return config.toString(); config.append("维:"); for(String id:mycube.getDimlist()){ //维 Dimension dim=DimensionManage.getDimension(id); config.append(dim.getName()).append("(") .append(dim.getId().equals(mycube.getVertdim())?"纵":"横"); //层 if(dim.getLevelNum()>1){ config.append(":"); config.append(dim.getLevel(mycube.getDimlevelmap().get(id)).getName()); } config.append("),"); }//指标 if(mycube.getMealist()!=null&&mycube.getMealist().size()>0){ config.append("指标("); for(String mea:mycube.getMealist()){ RepCube repcube= cubeMapBycolumn.get(rep_id).get(mea); if(repcube==null) throw new ReportException("该CUBE中指标("+mea+")不存在"); config.append(repcube.getColumn_as()).append("_").append(repcube.getColumn_define()).append(","); } config.append(")"); } //合计项目 if(mycube.getDimtotalmap()!=null&&mycube.getDimtotalmap().size()>0){ config.append("\n合计:"); for(String id:mycube.getDimlist()){ if(mycube.getDimtotalmap().get(id)!=null&&mycube.getDimtotalmap().get(id).length>0){ Dimension dim=DimensionManage.getDimension(id); Integer[] levels=mycube.getDimtotalmap().get(id); for(int i=0;i<levels.length;i++){ if(i>0) config.append(","); config.append(dim.getLevel(levels[i]).getName()); } } } } //切片过滤 if(mycube.getDimslicesmap()!=null&&mycube.getDimslicesmap().size()>0){ config.append("\n过滤:"); for(String id:mycube.getDimlist()){ if(mycube.getDimslicesmap().get(id)!=null&&mycube.getDimslicesmap().get(id).size()>0){ Dimension dim=DimensionManage.getDimension(id); Map<Integer,String[]> map=mycube.getDimslicesmap().get(id); for(Integer level:map.keySet()){ if(map.get(level)!=null&&map.get(level).length>0){ config.append(dim.getLevel(level).getName()).append("=("); Map<String,String> valuemap=new HashMap<String,String>(); for(String o:map.get(level)) valuemap.put(o, null); for(QueryKeyValue vo: dim.getLevelValues(level)){ if(valuemap.containsKey(vo.getId())) config.append(vo.getName()).append(","); } config.append("),"); } } } } } //自定义排序 if(mycube.getDimsortmap()!=null&&mycube.getDimsortmap().size()>0){ config.append("\n排序:"); for(String dimid:mycube.getDimsortmap().keySet()){ Dimension dim=DimensionManage.getDimension(dimid); Map<Integer,String[]> map= mycube.getDimsortmap().get(dimid); for(Integer level:map.keySet()){ config.append(dim.getLevel(level).getName()).append("("); Map<String,String> valuemap=new HashMap<String,String>(); for(String o:map.get(level)){ valuemap.put(o, null); } for(QueryKeyValue vo: dim.getLevelValues(level)){ if(valuemap.containsKey(vo.getId())) config.append(vo.getName()).append(","); } config.append("),"); } } } return config.toString(); } /** * 初始化cube配置缓存 * @throws ReportException */ public String initAll() throws ReportException { try { List<RepCube> list=repCubeDao.findAll(); for(RepCube o:list){ if(DimensionType.measure.name().equals(o.getColumn_type())) o.setIsmea(true); else o.setIsmea(false); } cubeMap=CollectionHelper.converToMap(list, "rep_id"); Map<String,Map<String,RepCube>> cubecodemap=new HashMap<String,Map<String,RepCube>>(); for(Object rep_id:cubeMap.keySet().toArray()){ cubecodemap.put(rep_id.toString(), CollectionHelper.converToMapSingle(cubeMap.get(rep_id.toString()),"column_code")); } cubeMapBycolumn=cubecodemap; StringBuilder buffer=new StringBuilder(); for(RepDefine rep: repCubeDao.checkCubeDimDatabase()){ buffer.append("报表_").append(rep.getRep_name()).append("(").append(rep.getRep_id()).append(")") .append("数据源与配置的维度_").append(rep.getRemark()).append("(").append(rep.getRep_info()).append(")数据源不一致;"); } return buffer.toString(); } catch (Exception e) { throw new ReportException("cube内存初始化错误",e); } } public void setRepCubeDao(RepCubeDao repCubeDao) { this.repCubeDao = repCubeDao; } }