feat(视图-子维度下钻): 视图支持从子维度下钻

https://www.tapd.cn/55578866/bugtrace/bugs/view/1155578866001023529
This commit is contained in:
wisonic-s 2023-03-09 20:36:10 +08:00
parent 8c2f7ae06b
commit cac7a1759a
4 changed files with 70 additions and 46 deletions

View File

@ -269,7 +269,8 @@ public class MysqlQueryProvider extends QueryProvider {
ChartViewFieldDTO x = xAxis.get(i);
String originField;
if (ObjectUtils.isNotEmpty(x.getExtField()) && x.getExtField() == 2) {
// 解析origin name中有关联的字段生成sql表达式
// 计算字段和视图字段规则为 函数([原始字段id])这边把[原始字段id] 换成 表名.原始字段id
// 解析origin name中有关联的字段生成sql表达式
originField = calcFieldRegex(x.getOriginName(), tableObj);
} else if (ObjectUtils.isNotEmpty(x.getExtField()) && x.getExtField() == 1) {
originField = String.format(MysqlConstants.KEYWORD_FIX, tableObj.getTableAlias(), x.getDataeaseName());
@ -1058,12 +1059,13 @@ public class MysqlQueryProvider extends QueryProvider {
}
if (field.getDeType() == 1) {
String format = transDateFormat(request.getDateStyle(), request.getDatePattern());
if (field.getDeExtractType() == 0 || field.getDeExtractType() == 5 || field.getDeExtractType() == 1) {
whereName = String.format(MysqlConstants.STR_TO_DATE, originName, StringUtils.isNotEmpty(field.getDateFormat()) ? field.getDateFormat() : MysqlConstants.DEFAULT_DATE_FORMAT);
whereName = String.format(MysqlConstants.DATE_FORMAT, originName, format);
}
if (field.getDeExtractType() == 2 || field.getDeExtractType() == 3 || field.getDeExtractType() == 4) {
String cast = String.format(MysqlConstants.CAST, originName, MysqlConstants.DEFAULT_INT_FORMAT) + "/1000";
whereName = String.format(MysqlConstants.FROM_UNIXTIME, cast, MysqlConstants.DEFAULT_DATE_FORMAT);
whereName = String.format(MysqlConstants.FROM_UNIXTIME, cast, format);
}
} else if (field.getDeType() == 0 && field.getDeExtractType() == 0) {
whereName = String.format(MysqlConstants.CAST, originName, MysqlConstants.CHAR);

View File

@ -31,6 +31,7 @@ import org.stringtemplate.v4.STGroup;
import org.stringtemplate.v4.STGroupFile;
import javax.annotation.Resource;
import java.text.Format;
import java.text.MessageFormat;
import java.text.SimpleDateFormat;
import java.util.*;
@ -1141,15 +1142,16 @@ public class CKQueryProvider extends QueryProvider {
}
if (field.getDeType() == DeTypeConstants.DE_TIME) {
String format = transDateFormat(request.getDateStyle(), request.getDatePattern());
if (field.getDeExtractType() == DeTypeConstants.DE_STRING || field.getDeExtractType() == 5) {
whereName = String.format(CKConstants.toDateTime, originName);
whereName = String.format(CKConstants.formatDateTime, String.format(CKConstants.toDateTime, originName), format);
}
if (field.getDeExtractType() == DeTypeConstants.DE_FLOAT || field.getDeExtractType() == DeTypeConstants.DE_FLOAT || field.getDeExtractType() == 4) {
String cast = String.format(CKConstants.toFloat64, originName);
whereName = String.format(CKConstants.toDateTime, cast);
whereName = String.format(CKConstants.formatDateTime, String.format(CKConstants.toDateTime, cast), format);
}
if (field.getDeExtractType() == 1) {
whereName = originName;
whereName = String.format(CKConstants.formatDateTime, originName, format);
}
} else if (field.getDeType() == 2 || field.getDeType() == 3) {
if (field.getDeExtractType() == 0 || field.getDeExtractType() == 5) {

View File

@ -1062,15 +1062,25 @@ public class MysqlQueryProvider extends QueryProvider {
}
if (field.getDeType() == 1) {
if (field.getDeExtractType() == 0 || field.getDeExtractType() == 5) {
whereName = String.format(MySQLConstants.STR_TO_DATE, originName, StringUtils.isNotEmpty(field.getDateFormat()) ? field.getDateFormat() : MysqlConstants.DEFAULT_DATE_FORMAT);
String format = transDateFormat(request.getDateStyle(), request.getDatePattern());
if (field.getDeExtractType() == 0 || field.getDeExtractType() == 5 || field.getDeExtractType() == 1) {
if (StringUtils.equalsIgnoreCase(request.getDateStyle(),"y_Q")){
whereName = String.format(format,
String.format(MysqlConstants.DATE_FORMAT, originName, "%Y"),
String.format(MysqlConstants.QUARTER, String.format(MysqlConstants.DATE_FORMAT, originName, MysqlConstants.DEFAULT_DATE_FORMAT)));
} else {
whereName = String.format(MySQLConstants.DATE_FORMAT, originName, format);
}
}
if (field.getDeExtractType() == 2 || field.getDeExtractType() == 3 || field.getDeExtractType() == 4) {
String cast = String.format(MySQLConstants.CAST, originName, MySQLConstants.DEFAULT_INT_FORMAT) + "/1000";
whereName = String.format(MySQLConstants.FROM_UNIXTIME, cast, MySQLConstants.DEFAULT_DATE_FORMAT);
}
if (field.getDeExtractType() == 1) {
whereName = originName;
if (StringUtils.equalsIgnoreCase(request.getDateStyle(),"y_Q")){
whereName = String.format(format,
String.format(MysqlConstants.DATE_FORMAT, cast, "%Y"),
String.format(MysqlConstants.QUARTER, String.format(MysqlConstants.DATE_FORMAT, field, MysqlConstants.DEFAULT_DATE_FORMAT)));
} else {
whereName = String.format(MySQLConstants.DATE_FORMAT, cast, format);
}
}
} else if (field.getDeType() == 2 || field.getDeType() == 3) {
if (field.getDeExtractType() == 0 || field.getDeExtractType() == 5) {

View File

@ -71,8 +71,6 @@ import java.math.RoundingMode;
import java.text.SimpleDateFormat;
import java.util.*;
import java.util.concurrent.locks.ReentrantLock;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import java.util.stream.Collectors;
/**
@ -848,21 +846,31 @@ public class ChartViewService {
boolean isDrill = false;
List<ChartDrillRequest> drillRequestList = chartExtRequest.getDrill();
if (CollectionUtils.isNotEmpty(drillRequestList) && (drill.size() > drillRequestList.size())) {
// 如果是从子维度开始下钻那么先把主维度的条件先加上去
if (CollectionUtils.isNotEmpty(xAxisExt) && StringUtils.equalsIgnoreCase(drill.get(0).getId(), xAxisExt.get(0).getId())) {
ChartDrillRequest head = drillRequestList.get(0);
for (int i = 0; i < xAxisBase.size(); i++) {
ChartDimensionDTO dimensionDTO = head.getDimensionList().get(i);
DatasetTableField datasetTableField = dataSetTableFieldsService.get(dimensionDTO.getId());
ChartExtFilterRequest tmp = new ChartExtFilterRequest();
tmp.setFieldId(tmp.getFieldId());
tmp.setValue(Collections.singletonList(dimensionDTO.getValue()));
tmp.setOperator("in");
tmp.setDatasetTableField(datasetTableField);
extFilterList.add(tmp);
drillFilters.add(tmp);
ArrayList<ChartViewFieldDTO> fieldsToFilter = new ArrayList<>();
// 如果是从子维度开始下钻那么其他维度的条件要先加上去
// 分组和堆叠
if (StringUtils.containsIgnoreCase(view.getType(), "group")) {
fieldsToFilter.addAll(xAxisBase);
// 分组堆叠
if (StringUtils.containsIgnoreCase(view.getType(),"stack")){
// 分组和堆叠字段都有才有效
if (CollectionUtils.isNotEmpty(xAxisExt) && CollectionUtils.isNotEmpty(extStack)) {
// 从分组字段下钻就加上堆叠字段的条件
if (StringUtils.equalsIgnoreCase(drill.get(0).getId(), xAxisExt.get(0).getId())) {
fieldsToFilter.addAll(extStack);
}
// 从堆叠字段下钻就加上分组字段的条件
if (StringUtils.equalsIgnoreCase(drill.get(0).getId(), extStack.get(0).getId())) {
fieldsToFilter.addAll(xAxisExt);
}
}
}
}else if (StringUtils.containsIgnoreCase(view.getType(),"stack")){
// 堆叠
fieldsToFilter.addAll(xAxisBase);
}
ChartDrillRequest head = drillRequestList.get(0);
Map<String, String> dimMap = head.getDimensionList().stream().collect(Collectors.toMap(ChartDimensionDTO::getId, ChartDimensionDTO::getValue));
for (int i = 0; i < drillRequestList.size(); i++) {
ChartDrillRequest request = drillRequestList.get(i);
ChartViewFieldDTO chartViewFieldDTO = drill.get(i);
@ -870,26 +878,15 @@ public class ChartViewService {
// 将钻取值作为条件传递将所有钻取字段作为xAxis并加上下一个钻取字段
if (StringUtils.equalsIgnoreCase(requestDimension.getId(), chartViewFieldDTO.getId())) {
isDrill = true;
DatasetTableField datasetTableField = dataSetTableFieldsService.get(requestDimension.getId());
ChartViewFieldDTO d = new ChartViewFieldDTO();
BeanUtils.copyBean(d, datasetTableField);
ChartExtFilterRequest drillFilter = new ChartExtFilterRequest();
drillFilter.setFieldId(requestDimension.getId());
drillFilter.setValue(Collections.singletonList(requestDimension.getValue()));
drillFilter.setOperator("in");
drillFilter.setDatasetTableField(datasetTableField);
extFilterList.add(drillFilter);
drillFilters.add(drillFilter);
if (!checkDrillExist(xAxis, extStack, d, view)) {
xAxis.add(d);
fieldsToFilter.add(chartViewFieldDTO);
dimMap.put(requestDimension.getId(), requestDimension.getValue());
if (!checkDrillExist(xAxis, extStack, requestDimension.getId(), view)) {
xAxis.add(chartViewFieldDTO);
}
//
if (i == drillRequestList.size() - 1) {
ChartViewFieldDTO nextDrillField = drill.get(i + 1);
if (!checkDrillExist(xAxis, extStack, nextDrillField, view)) {
if (!checkDrillExist(xAxis, extStack, nextDrillField.getId(), view)) {
// get drill list first element's sort,then assign to nextDrillField
nextDrillField.setSort(getDrillSort(xAxis, drill.get(0)));
xAxis.add(nextDrillField);
@ -898,6 +895,19 @@ public class ChartViewService {
}
}
}
for (int i = 0; i < fieldsToFilter.size(); i++) {
ChartViewFieldDTO tmpField = fieldsToFilter.get(i);
ChartExtFilterRequest tmpFilter = new ChartExtFilterRequest();
DatasetTableField datasetTableField = dataSetTableFieldsService.get(tmpField.getId());
tmpFilter.setDatasetTableField(datasetTableField);
tmpFilter.setOperator("in");
tmpFilter.setDateStyle(tmpField.getDateStyle());
tmpFilter.setDatePattern(tmpField.getDatePattern());
tmpFilter.setFieldId(tmpField.getId());
tmpFilter.setValue(Collections.singletonList(dimMap.get(tmpField.getId())));
extFilterList.add(tmpFilter);
drillFilters.add(tmpFilter);
}
}
// 判断连接方式直连或者定时抽取 table.mode
@ -1540,17 +1550,17 @@ public class ChartViewService {
}
}
private boolean checkDrillExist(List<ChartViewFieldDTO> xAxis, List<ChartViewFieldDTO> extStack, ChartViewFieldDTO dto, ChartViewWithBLOBs view) {
private boolean checkDrillExist(List<ChartViewFieldDTO> xAxis, List<ChartViewFieldDTO> extStack, String fieldId, ChartViewWithBLOBs view) {
if (CollectionUtils.isNotEmpty(xAxis)) {
for (ChartViewFieldDTO x : xAxis) {
if (StringUtils.equalsIgnoreCase(x.getId(), dto.getId())) {
if (StringUtils.equalsIgnoreCase(x.getId(), fieldId)) {
return true;
}
}
}
if (StringUtils.containsIgnoreCase(view.getType(), "stack") && CollectionUtils.isNotEmpty(extStack)) {
for (ChartViewFieldDTO x : extStack) {
if (StringUtils.equalsIgnoreCase(x.getId(), dto.getId())) {
if (StringUtils.equalsIgnoreCase(x.getId(), fieldId)) {
return true;
}
}