package biz.report.agg;
|
|
import java.text.MessageFormat;
|
import java.util.ArrayList;
|
import java.util.List;
|
|
import foundation.data.entity.Entity;
|
import foundation.data.entity.EntitySet;
|
import foundation.data.entity.Filter;
|
import foundation.data.object.DataObject;
|
import foundation.util.ContentBuilder;
|
import foundation.util.MapList;
|
import foundation.util.Util;
|
|
/**
|
* @author kimi
|
* @description
|
* @date 2024-09-19 14:47
|
*/
|
|
|
public class AggStep {
|
private AggPattern pattern;
|
private String id;
|
private String type;
|
private String sqlSegment;
|
private MapList<String, AggDimension> dimensions;
|
private MapList<String, List<AggField>> measureList;
|
private List<AggField> updateMeasureList;
|
|
public static AggStep createByEntity(Entity entity) throws Exception {
|
if (entity == null) {
|
return null;
|
}
|
AggStep aggStep = new AggStep();
|
aggStep.load(entity);
|
|
aggStep.loadMeasures(entity.getParentId());
|
aggStep.loadDeimension(entity.getString(Constant.FIELD_Dimension));
|
|
return aggStep;
|
}
|
|
private void loadDeimension(String dimensionKey) {
|
if (Util.isEmpty(dimensionKey)) {
|
return ;
|
}
|
|
String[] dimensionKeys = dimensionKey.split(",");
|
dimensions = new MapList<String, AggDimension>();
|
|
for (String dimension : dimensionKeys) {
|
AggDimension aggDimension = AggDimensionBucket.getOne(dimension);
|
dimensions.add(aggDimension.getCode(), aggDimension);
|
}
|
}
|
|
private void loadMeasures(String resultId) throws Exception {
|
DataObject dataObject = DataObject.getInstance(Constant.DATANAME_AGG_RESULT_FILED);
|
Filter filter = new Filter();
|
filter.add("db_type_code", pattern.name());
|
filter.add("step_id", id);
|
filter.add("result_id", resultId);
|
EntitySet entitySet = dataObject.getTableEntitySet(filter);
|
measureList = new MapList<String, List<AggField>>();
|
updateMeasureList = new ArrayList<AggField>();
|
|
for (Entity entity : entitySet) {
|
AggField aggField = new AggField();
|
aggField.load(entity);
|
AggMeasure measure = aggField.getMeasure();
|
|
if (aggField.getMeasure() == null) {
|
updateMeasureList.add(aggField);
|
continue ;
|
}
|
|
List<AggField> measures = null;
|
String brandId = measure.getParentId();
|
if(measureList.contains(brandId)) {
|
measures = measureList.get(brandId);
|
}
|
else {
|
measures = new ArrayList<AggField>();
|
}
|
|
measures.add(aggField);
|
measureList.set(brandId, measures);
|
}
|
}
|
|
private void load(Entity entity) throws Exception {
|
this.id = entity.getId();
|
this.pattern = AggPattern.parse(entity.getString(Constant.FIELD_PATTERN_CODE));
|
this.type = entity.getString("type");
|
this.sqlSegment = entity.getString("sql_segment", "1=1");
|
}
|
|
public AggPattern getPattern() {
|
return pattern;
|
}
|
|
public void setPattern(AggPattern pattern) {
|
this.pattern = pattern;
|
}
|
|
public MapList<String, List<AggField>> getMeasureList() {
|
return measureList;
|
}
|
|
public List<AggField> getUpdateMeasureList() {
|
return updateMeasureList;
|
}
|
|
public String getSqlSegment() {
|
return sqlSegment;
|
}
|
|
public String getJoinSegment() {
|
if (this.dimensions != null ) {
|
ContentBuilder builder = new ContentBuilder(" and ");
|
|
for (AggDimension dimension : dimensions) {
|
String dimensionFieldName = dimension.getCodeField();
|
builder.append(MessageFormat.format("a.{0} = ifnull(a1.{1}, ''--'')", dimensionFieldName, dimension.getSqlSegment()));
|
}
|
|
return builder.toString();
|
}
|
|
return null;
|
}
|
|
public String getMeasureSql(AggField field) {
|
return pattern.createSql(field);
|
}
|
|
public MapList<String, AggDimension> getDimensions() {
|
return dimensions;
|
}
|
|
public String getType() {
|
return type;
|
}
|
|
public boolean isRollUp() {
|
return pattern == AggPattern.agg && (!Util.isEmpty(type)) && type.startsWith("roll_up");
|
}
|
|
public boolean hasExFilter() {
|
return (!Util.isEmpty(type)) && type.startsWith("filter");
|
}
|
}
|