package com.ycsoft.report.query.sql.cubesql;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import com.ycsoft.commons.exception.ReportException;
import com.ycsoft.commons.helper.StringHelper;
import com.ycsoft.report.query.cube.CellType;
import com.ycsoft.report.query.cube.CubeHeadCell;
import com.ycsoft.report.query.cube.Dimension;
import com.ycsoft.report.query.cube.DimensionLevel;
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.cube.MeasureGather;
import com.ycsoft.report.query.cube.impl.CubeHeadCellImpl;
import com.ycsoft.report.query.key.Impl.QueryKeyValue;
public class CubeSqlContainer implements AnalyseCubeSql {
public static final String table_as = "cube";// 数据体别名
public static final String comma = ",";
public static final String and = " and ";
private StringBuilder select = new StringBuilder();
private StringBuilder from = new StringBuilder();
private StringBuilder where = new StringBuilder();
private StringBuilder group = new StringBuilder();
private StringBuilder orderby = new StringBuilder();
private List<CubeHeadCell> headcells=new ArrayList<CubeHeadCell>();//表头
public CubeHeadCell[] getBaseHeadCells(){
return headcells.toArray(new CubeHeadCell[headcells.size()]);
}
/**
* 获得组装分析的sql
*/
public String getAnalyseSql(String sql) {
StringBuilder sqlbuffer = new StringBuilder();
if (select.length() > comma.length()) {
sqlbuffer.append("select ").append(
select.substring(0,
select.length()- comma.length()));
} else {
return sql;
}
sqlbuffer.append("\n from ").append("(").append(sql).append(") ")
.append(table_as);
if (from.length() > comma.length())
sqlbuffer.append(comma).append(
from.substring(0, from.length() - comma.length()));
if (where.length() > and.length())
sqlbuffer.append("\n where ").append(
where.substring(0, where.length() - and.length()));
if (group.length() > comma.length())
sqlbuffer.append("\n group by ").append(
group.substring(0, group.length() - comma.length()));
if (orderby.length() > comma.length())
sqlbuffer.append("\n order by ")
.append(orderby.substring(0,
orderby.length() - comma.length()));
return sqlbuffer.toString();
}
/**
* 装载横向维
* 参数isgroup表示是否分组合计
* 参数warn 表示指标警戒条件(指标数值变色)
* @param crossDim
* @param dimlevel
*/
protected void appendSelect(Dimension crossDim, DimensionLevel dimlevel,Boolean isgroup) {
if(StringHelper.isEmpty(crossDim.getTabel())){
//rep_dimension未定义from_table
select.append(crossDim.getId()).append("_").append(dimlevel.getLevel()).append(".").append(
dimlevel.getColumn_code()).append(comma);
//select.append(crossDim.getId()).append("_").append(dimlevel.getLevel()).append(".").append(
// dimlevel.getColumn_text()).append(comma);
}else{
//ID NAME 明细关系需要
select.append(crossDim.getId()).append(".").append(
dimlevel.getColumn_code()).append(comma);
//select.append(crossDim.getId()).append(".").append(
//dimlevel.getColumn_text()).append(comma);
}
CubeHeadCellImpl cell=new CubeHeadCellImpl();
cell.setName(dimlevel.getName());
cell.setDim(crossDim.getId());
cell.setColspan(1);
cell.setRowspan(1);
cell.setDim_type(DimensionType.crosswise);
cell.setLevel(dimlevel.getLevel());
cell.setCell_type(CellType.dimension);
this.headcells.add(cell);
}
public void appendSelect(DimensionRolap dimcon) {
for (int i =1;i<=dimcon.getLevel() ; i++) {
appendSelect(dimcon.getDim(), dimcon.getDim().getLevel(i),dimcon.isLevelTotal(i));
}
}
/**
* 无纵向维装载度量
*
* @param measures
*/
public void appendSelect(List<Measure> measures) {
for (Measure mea : measures){
// sum(cube.字段) 说明,
select.append(mea.getCalculation()).append("(")
.append(table_as).append(".").append(
mea.getColumnCode()).append(")").append(" ")
.append(mea.getColumnText()).append(comma);
CubeHeadCellImpl cell=new CubeHeadCellImpl();
cell.setId(mea.getColumnCode());
cell.setName(mea.getColumnText());
//cell.setDim(crossDim.getId());
cell.setColspan(1);
cell.setRowspan(1);
cell.setDim_type(DimensionType.measure);
//cell.setLevel(dimlevel.getLevel());
cell.setCell_type(CellType.dimension);
cell.setMea_detail_id(mea.getMeaRepId());
cell.setMea_datatype(mea.getDateType());
cell.setMea_custom(mea.getMeaCustom());
cell.setMea_code(mea.getColumnCode());
this.headcells.add(cell);
}
}
/**
* 设置纵向维和度量
*
* @throws ReportException
*/
public void appendSelect(DimensionRolap dimcon,
List<Measure> defalutMeasures, String pid, int level,boolean isgraph)
throws ReportException {
//System.out.println(level+":层"+pid+":开始计算");
for (QueryKeyValue vo : dimcon.queryLevelValue(level)) {
if(StringHelper.isEmpty(pid) || pid.equals(vo.getPid())){
if (dimcon.getLevel() > level) {
appendSelect(dimcon,defalutMeasures,vo.getId(),level+1,isgraph);
} else {
//System.out.println(level+":层"+pid+":记录"+vo.getId());
// sum(case when cube.字段=id then 度量 else 0/null end)
for(Measure mea:defalutMeasures){
select.append(mea.getCalculation()).append("(").append(
" case when ").append(dimcon.getDim().getId()).append(".").append(
dimcon.getDim().getLevel(dimcon.getLevel())
.getColumn_code()).append("='").append(
vo.getId()).append("' then ").append(table_as)
.append(".").append(mea.getColumnCode())
.append(" else ").append(
mea.getCalculation().equals(
MeasureGather.SUM) ? "0" : "null").append(
" end) \"").append(vo.getName().substring(0, vo.getName().length()>6?6:vo.getName().length())).append(mea.getColumnText()).append("\"").append(
comma);
CubeHeadCellImpl cell=new CubeHeadCellImpl();
cell.setId(vo.getId());
cell.setPid(defalutMeasures.size()==1?vo.getPid():vo.getId());
//多指标时,使用指标名称
cell.setName(defalutMeasures.size()==1? vo.getName():mea.getColumnText());
cell.setColspan(1);
cell.setRowspan(1);
cell.setCell_type(CellType.dimension);
cell.setDim(dimcon.getDim().getId());
cell.setDim_type(DimensionType.vertical);
//多个指标时,level+1,目的是为cube计算表头时提供表头层数依据
cell.setLevel(defalutMeasures.size()==1?level:level+1);
cell.setMea_detail_id(mea.getMeaRepId());
cell.setMea_code(mea.getColumnCode());
cell.setMea_datatype(mea.getDateType());
cell.setMea_custom(mea.getMeaCustom());
this.headcells.add(cell);
}
}
}
}
//循环结束插入判断有无合计头,有则插入合计头
if(dimcon.isLevelTotal(level)&&!isgraph){
for(Measure mea:defalutMeasures){
CubeHeadCellImpl cell=new CubeHeadCellImpl();
cell.setPid(pid);
cell.setName(defalutMeasures.size()==1?"合计": mea.getColumnText());//多个指标时,使用指标名称
cell.setColspan(1);
cell.setRowspan(1);
cell.setCell_type(CellType.group);
cell.setDim(dimcon.getDim().getId());
cell.setDim_type(DimensionType.vertical);
//多个指标时,level+1,目的是为cube计算表头时提供表头层数依据
cell.setLevel(defalutMeasures.size()==1?level:level+1);
cell.setMea_detail_id(mea.getMeaRepId());
cell.setMea_code(mea.getColumnCode());
cell.setMea_datatype(mea.getDateType());
cell.setMea_custom(mea.getMeaCustom());
this.headcells.add(cell);
}
}
}
/**
* 维度表
*
* @param crossDim
*/
public void appendFrom(Dimension dim) {
if(StringHelper.isEmpty(dim.getTabel())){
for(int i=1;i<=dim.getLevelNum();i++){
DimensionLevel level=dim.getLevel(i);
from.append(level.getColumn_table()).append(" ").append(dim.getId()).append("_").append(i).append(
comma);
}
}else{
from.append(dim.getTabel()).append(" ").append(dim.getId()).append(
comma);
}
}
/**
* 装载横向维
*
* @param crossDim
* @throws ReportException
*/
public void appendWhere(DimensionRolap dimcon) throws ReportException {
if(StringHelper.isEmpty(dimcon.getDim().getTabel())){
where.append(dimcon.getDim().getId()).append("_").append(dimcon.getDim().getLevelNum()).append(".").append(
dimcon.getColumnMappingKey()).append("=").append(table_as)
.append(".").append(dimcon.getCubeMappingKey()).append(and);
for(int i=1;i<dimcon.getDim().getLevelNum();i++){
where.append(dimcon.getDim().getId()).append("_").append(i).append(".")
.append(dimcon.getDim().getLevel(i).getColumn_code()).append("=")
.append(dimcon.getDim().getId()).append("_").append(i+1).append(".")
.append(dimcon.getDim().getLevel(i+1).getColumn_pid()).append(and);
}
}else{
where.append(dimcon.getDim().getId()).append(".").append(
dimcon.getColumnMappingKey()).append("=").append(table_as)
.append(".").append(dimcon.getCubeMappingKey()).append(and);
}
//切片处理
if (dimcon.getSlices_level()!=null
&&dimcon.getSlices_value()!=null
&&dimcon.getSlices_value().length>0){
if(StringHelper.isEmpty(dimcon.getDim().getTabel())){
where.append(dimcon.getDim().getId()).append("_").append(dimcon.getSlices_level()).append(".").append(
dimcon.getDim().getLevel(dimcon.getSlices_level())
.getColumn_code()).append(" in ('");
}else{
where.append(dimcon.getDim().getId()).append(".").append(
dimcon.getDim().getLevel(dimcon.getSlices_level())
.getColumn_code()).append(" in ('");
}
for(int i=0;i<dimcon.getSlices_value().length;i++){
where.append(dimcon.getSlices_value()[i]);
if(i<dimcon.getSlices_value().length-1)
where.append("','");
}
where.append("')").append(and);
}
//权限控制处理
Map<DimensionLevel, List<QueryKeyValue>> levelcontrolMap= dimcon.getDim().getDimLevelControlMap();
for(DimensionLevel level: levelcontrolMap.keySet()){
if(StringHelper.isEmpty(dimcon.getDim().getTabel())){
where.append(dimcon.getDim().getId()).append("_").append(level.getLevel()).append(".")
.append(level.getColumn_code()).append(" in ('");
}else{
where.append(dimcon.getDim().getId()).append(".")
.append(level.getColumn_code()).append(" in ('");
}
List<QueryKeyValue> valuelist=levelcontrolMap.get(level);
if(valuelist==null||valuelist.size()==0)
throw new ReportException("数据权限异常,请联系管理员!");
for(int i=0;i<valuelist.size();i++){
where.append(valuelist.get(i).getId());
if(i<valuelist.size()-1)
where.append("','");
}
where.append("')").append(and);
}
}
/**
* 装载横向维的group
*
* @param crossDim
* @param dimlevel
*/
private void appendGroup(Dimension crossDim, DimensionLevel dimlevel) {
if(StringHelper.isEmpty(crossDim.getTabel())){
group.append(crossDim.getId()).append("_").append(dimlevel.getLevel()).append(".").append(
dimlevel.getColumn_code()).append(comma);
//group.append(crossDim.getId()).append("_").append(dimlevel.getLevel()).append(".").append(
// dimlevel.getColumn_text()).append(comma);
}else{
group.append(crossDim.getId()).append(".").append(
dimlevel.getColumn_code()).append(comma);
//group.append(crossDim.getId()).append(".").append(
// dimlevel.getColumn_text()).append(comma);
}
}
/**
* 多级装载横向维
*
* @param dimcon
*/
public void appendGroup(DimensionRolap dimcon) {
for (int i =1;i<=dimcon.getLevel() ; i++) {
appendGroup(dimcon.getDim(), dimcon.getDim().getLevel(i));
}
}
private void appendOrderBy(Dimension crossDim, DimensionLevel dimlevel) {
if(StringHelper.isEmpty(crossDim.getTabel())){
orderby.append(crossDim.getId()).append("_").append(dimlevel.getLevel()).append(".").append(
dimlevel.getColumn_code()).append(comma);
}else{
orderby.append(crossDim.getId()).append(".").append(
dimlevel.getColumn_code()).append(comma);
}
}
public void appendOrderBy(DimensionRolap dimcon) {
for (int i =1;i<=dimcon.getLevel() ; i++) {
appendOrderBy(dimcon.getDim(), dimcon.getDim().getLevel(i));
}
}
}