package com.ycsoft.report.query.cube.impl; import java.util.ArrayList; import java.util.List; import java.util.Map; import java.util.HashMap; import com.ycsoft.commons.exception.ReportException; import com.ycsoft.report.query.cube.CubeDataSet; import com.ycsoft.report.query.cube.CubeExec; import com.ycsoft.report.query.cube.CubeHeadCell; import com.ycsoft.report.query.cube.Dimension; import com.ycsoft.report.query.cube.DimensionRolap; import com.ycsoft.report.query.cube.Measure; import com.ycsoft.report.query.cube.graph.CubeGraph; import com.ycsoft.report.query.cube.showclass.cellwarn.MeaWarn; import com.ycsoft.report.query.sql.cubesql.AnalyseCubeSql; import com.ycsoft.report.query.sql.cubesql.CubeSqlContainer; /** * cube变换用数据源 * 数据源使用sql */ public abstract class AbstractDataSet implements CubeDataSet<String> { private CubeExec cube=null; private CubeHeadCell[] headcells=null; private String cubesql=null; private List<MeaWarn> meawarns=null; public List<MeaWarn> getMeawarns() { return meawarns; } public void setMeawarns(List<MeaWarn> meawarns) { this.meawarns = meawarns; } public void clearMeawarn(){ this.meawarns=null; } public String getAssembleDataSet(){ return this.cubesql; } /** * 组装cube数据源 * 考虑被权限影响的未使用维度 */ public void assembleCubeDataSet() throws ReportException { AnalyseCubeSql sqlcon=new CubeSqlContainer(); //横向维,行标签 List<DimensionRolap> crosswiselist=new ArrayList<DimensionRolap>(); //纵向维,表头 List<DimensionRolap> verticallist=new ArrayList<DimensionRolap>(); //权限控制的未使用的维度 List<DimensionRolap> datacotrollist=new ArrayList<DimensionRolap>(); for (DimensionRolap dimrolap : this.cube.getDimensionRolaps()) { if(dimrolap.isUsesign()&&dimrolap.isVerticalsign()) verticallist.add(dimrolap); if(dimrolap.isUsesign()&&!dimrolap.isVerticalsign()) crosswiselist.add(dimrolap); if(!dimrolap.isUsesign()&&dimrolap.getDim().getDimLevelControlMap().size()>0) datacotrollist.add(dimrolap); } // 横向维装配 for (DimensionRolap dimcon : crosswiselist) { //DimensionRolap dimcon = this.dimconMap.get(crossDim); sqlcon.appendSelect(dimcon); sqlcon.appendFrom(dimcon.getDim()); sqlcon.appendWhere(dimcon); sqlcon.appendGroup(dimcon); sqlcon.appendOrderBy(dimcon); } // 纵向维 if (verticallist.size() > 0) { // 只处理一个纵向维 DimensionRolap dimcon=verticallist.get(0); sqlcon.appendSelect(dimcon,this.cube.getMeasures(), null,1,false); sqlcon.appendFrom(dimcon.getDim()); sqlcon.appendWhere(dimcon); } else { sqlcon.appendSelect(this.cube.getMeasures()); } //权限影响的未使用的维度 for (DimensionRolap dimcon : datacotrollist) { sqlcon.appendFrom(dimcon.getDim()); sqlcon.appendWhere(dimcon); } this.headcells=sqlcon.getBaseHeadCells(); this.cubesql= sqlcon.getAnalyseSql(this.getDataSet()); } /** * 图形数据提取sql组装 */ public void assembleGraphDataSet(CubeGraph graph) throws ReportException { AnalyseCubeSql sqlcon=new CubeSqlContainer(); Map<Dimension, DimensionRolap> dimconMap=new HashMap<Dimension, DimensionRolap>(); Map<String,Measure> meaMap=new HashMap<String,Measure>(); for(DimensionRolap o: this.cube.getDimensionRolaps()){ dimconMap.put(o.getDim(), o); } for(Measure o: this.cube.getDefaultMeasures()){ meaMap.put(o.getColumnCode(), o); } //1.cube使用的维且图形未使用的维度,有权限影响和切片影响 List<DimensionRolap> slicesRolap=new ArrayList<DimensionRolap>(); //2.cube未使用的维,有权限影响 List<DimensionRolap> datacotrolRolap=new ArrayList<DimensionRolap>(); for(DimensionRolap rolap:dimconMap.values()){ if(rolap.isUsesign()&&(rolap.getSlices_level()!=null||rolap.getDim().getDimLevelControlMap().size()>0)){ if(!rolap.getDim().equals(graph.getCrossDimension()) &&!rolap.getDim().equals(graph.getVertDimension())) slicesRolap.add(rolap); } if(!rolap.isUsesign()&&rolap.getDim().getDimLevelControlMap().size()>0) datacotrolRolap.add(rolap); } //图形横向维度 (x轴?) if(graph.getCrossDimension()!=null){ DimensionRolap dimcon=dimconMap.get(graph.getCrossDimension()); sqlcon.appendSelect(dimcon); sqlcon.appendFrom(dimcon.getDim()); sqlcon.appendWhere(dimcon); sqlcon.appendGroup(dimcon); sqlcon.appendOrderBy(dimcon); } //指标和纵向维(y轴?z轴) List<Measure> list=new ArrayList<Measure>(); list.add(meaMap.get(graph.getMeasure())); //粒度维 if(graph.getVertDimension()==null) sqlcon.appendSelect(list); else{ DimensionRolap o =dimconMap.get(graph.getVertDimension()); sqlcon.appendSelect(o,list, null,1,true); sqlcon.appendFrom(o.getDim()); sqlcon.appendWhere(o); } //非图形维但cube使用的维有切片和权限影响 影响 for (DimensionRolap o : slicesRolap) { sqlcon.appendFrom(o.getDim()); sqlcon.appendWhere(o); } //未使用维的有 权限影响 for (DimensionRolap o : datacotrolRolap) { sqlcon.appendFrom(o.getDim()); sqlcon.appendWhere(o); } this.headcells=sqlcon.getBaseHeadCells(); this.cubesql= sqlcon.getAnalyseSql(this.getDataSet()); } public CubeHeadCell[] getBaseHeadCells(){ return headcells; } public CubeExec getCube() { return this.cube; } public void setCube(CubeExec cube) { this.cube=cube; } }