forked from github/dataease
feat: 计算字段支持自定义参数
This commit is contained in:
parent
7ac466c08f
commit
75ce919799
@ -105,8 +105,8 @@ public class DefaultChartHandler extends AbstractChartPlugin {
|
||||
var xAxis = formatResult.getAxisMap().get(ChartAxis.xAxis);
|
||||
var yAxis = formatResult.getAxisMap().get(ChartAxis.yAxis);
|
||||
var allFields = (List<ChartViewFieldDTO>) filterResult.getContext().get("allFields");
|
||||
Dimension2SQLObj.dimension2sqlObj(sqlMeta, xAxis, FieldUtil.transFields(allFields), crossDs, dsMap);
|
||||
Quota2SQLObj.quota2sqlObj(sqlMeta, yAxis, FieldUtil.transFields(allFields), crossDs, dsMap);
|
||||
Dimension2SQLObj.dimension2sqlObj(sqlMeta, xAxis, FieldUtil.transFields(allFields), crossDs, dsMap, Utils.getParams(FieldUtil.transFields(allFields)), view.getCalParams());
|
||||
Quota2SQLObj.quota2sqlObj(sqlMeta, yAxis, FieldUtil.transFields(allFields), crossDs, dsMap, Utils.getParams(FieldUtil.transFields(allFields)), view.getCalParams());
|
||||
String querySql = SQLProvider.createQuerySQL(sqlMeta, true, needOrder, view);
|
||||
querySql = provider.rebuildSQL(querySql, sqlMeta, crossDs, dsMap);
|
||||
datasourceRequest.setQuery(querySql);
|
||||
|
@ -81,7 +81,7 @@ public class YoyChartHandler extends DefaultChartHandler {
|
||||
if (yoyFiltered) {
|
||||
var originFilter = (List<ChartExtFilterDTO>) filterResult.getContext().get("originFilter");
|
||||
var allFields = (List<ChartViewFieldDTO>) filterResult.getContext().get("allFields");
|
||||
ExtWhere2Str.extWhere2sqlOjb(sqlMeta, originFilter, FieldUtil.transFields(allFields), crossDs, dsMap);
|
||||
ExtWhere2Str.extWhere2sqlOjb(sqlMeta, originFilter, FieldUtil.transFields(allFields), crossDs, dsMap, Utils.getParams(FieldUtil.transFields(allFields)), view.getCalParams());
|
||||
var originSql = SQLProvider.createQuerySQL(sqlMeta, true, needOrder, view);
|
||||
originSql = provider.rebuildSQL(originSql, sqlMeta, crossDs, dsMap);
|
||||
var request = new DatasourceRequest();
|
||||
|
@ -71,11 +71,11 @@ public class SymbolicMapHandler extends GroupChartHandler {
|
||||
var allFields = (List<ChartViewFieldDTO>) filterResult.getContext().get("allFields");
|
||||
SQLMeta sqlMeta1 = new SQLMeta();
|
||||
BeanUtils.copyBean(sqlMeta1, sqlMeta);
|
||||
Dimension2SQLObj.dimension2sqlObj(sqlMeta, xAxis, FieldUtil.transFields(allFields), crossDs, dsMap);
|
||||
Dimension2SQLObj.dimension2sqlObj(sqlMeta, xAxis, FieldUtil.transFields(allFields), crossDs, dsMap, Utils.getParams(FieldUtil.transFields(allFields)), view.getCalParams());
|
||||
List<ChartViewFieldDTO> yFields = new ArrayList<>();
|
||||
yFields.addAll(chartViewManege.transFieldDTO(Collections.singletonList(chartViewManege.createCountField(view.getTableId()))));
|
||||
yAxis.addAll(yFields);
|
||||
Quota2SQLObj.quota2sqlObj(sqlMeta, yAxis, FieldUtil.transFields(allFields), crossDs, dsMap);
|
||||
Quota2SQLObj.quota2sqlObj(sqlMeta, yAxis, FieldUtil.transFields(allFields), crossDs, dsMap, Utils.getParams(FieldUtil.transFields(allFields)), view.getCalParams());
|
||||
String querySql = SQLProvider.createQuerySQL(sqlMeta, true, needOrder, view);
|
||||
querySql = provider.rebuildSQL(querySql, sqlMeta, crossDs, dsMap);
|
||||
datasourceRequest.setQuery(querySql);
|
||||
@ -93,8 +93,8 @@ public class SymbolicMapHandler extends GroupChartHandler {
|
||||
String sql = (String) sqlMap.get("sql");
|
||||
sql = Utils.replaceSchemaAlias(sql, dsMap);
|
||||
SQLMeta sqlMeta2 = new SQLMeta();
|
||||
Table2SQLObj.table2sqlobj(sqlMeta2, null, "(" + sql + ")", crossDs);
|
||||
Field2SQLObj.field2sqlObj(sqlMeta2, allFieldsTmp, allFieldsTmp, crossDs, dsMap);
|
||||
Table2SQLObj.table2sqlobj(sqlMeta2, null, "(" + sql + ")", crossDs);
|
||||
Field2SQLObj.field2sqlObj(sqlMeta2, allFieldsTmp, allFieldsTmp, crossDs, dsMap, Utils.getParams(allFieldsTmp), null);// todo chartParam从视图里取
|
||||
String querySQL;
|
||||
querySQL = SQLProvider.createQuerySQL(sqlMeta2, false, needOrder, false);
|
||||
querySQL = provider.rebuildSQL(querySQL, sqlMeta2, crossDs, dsMap);
|
||||
|
@ -37,7 +37,7 @@ public class NumericalChartHandler extends DefaultChartHandler {
|
||||
var xAxis = formatResult.getAxisMap().get(ChartAxis.xAxis);
|
||||
var yAxis = formatResult.getAxisMap().get(ChartAxis.yAxis);
|
||||
var allFields = (List<ChartViewFieldDTO>) filterResult.getContext().get("allFields");
|
||||
Quota2SQLObj.quota2sqlObj(sqlMeta, yAxis, FieldUtil.transFields(allFields), crossDs, dsMap);
|
||||
Quota2SQLObj.quota2sqlObj(sqlMeta, yAxis, FieldUtil.transFields(allFields), crossDs, dsMap, Utils.getParams(FieldUtil.transFields(allFields)), view.getCalParams());
|
||||
String querySql = SQLProvider.createQuerySQL(sqlMeta, true, needOrder, view);
|
||||
querySql = provider.rebuildSQL(querySql, sqlMeta, crossDs, dsMap);
|
||||
datasourceRequest.setQuery(querySql);
|
||||
|
@ -84,7 +84,7 @@ public class TableInfoHandler extends DefaultChartHandler {
|
||||
} else {
|
||||
pageInfo.setPageSize(chartExtRequest.getPageSize());
|
||||
}
|
||||
Dimension2SQLObj.dimension2sqlObj(sqlMeta, xAxis, FieldUtil.transFields(allFields), crossDs, dsMap);
|
||||
Dimension2SQLObj.dimension2sqlObj(sqlMeta, xAxis, FieldUtil.transFields(allFields), crossDs, dsMap, Utils.getParams(FieldUtil.transFields(allFields)), view.getCalParams());
|
||||
String originSql = SQLProvider.createQuerySQL(sqlMeta, false, true, view);// 明细表强制加排序
|
||||
String limit = ((pageInfo.getGoPage() != null && pageInfo.getPageSize() != null) ? " LIMIT " + pageInfo.getPageSize() + " OFFSET " + (pageInfo.getGoPage() - 1) * pageInfo.getPageSize() : "");
|
||||
var querySql = originSql + limit;
|
||||
|
@ -347,11 +347,15 @@ public class ChartDataManage {
|
||||
provider = ProviderFactory.getProvider(dsMap.entrySet().iterator().next().getValue().getType());
|
||||
}
|
||||
|
||||
if (ObjectUtils.isEmpty(view.getCalParams())) {
|
||||
view.setCalParams(Utils.getParams(transFields(allFields)));
|
||||
}
|
||||
|
||||
SQLMeta sqlMeta = new SQLMeta();
|
||||
Table2SQLObj.table2sqlobj(sqlMeta, null, "(" + sql + ")", crossDs);
|
||||
CustomWhere2Str.customWhere2sqlObj(sqlMeta, fieldCustomFilter, transFields(allFields), crossDs, dsMap);
|
||||
ExtWhere2Str.extWhere2sqlOjb(sqlMeta, extFilterList, transFields(allFields), crossDs, dsMap);
|
||||
WhereTree2Str.transFilterTrees(sqlMeta, rowPermissionsTree, transFields(allFields), crossDs, dsMap);
|
||||
CustomWhere2Str.customWhere2sqlObj(sqlMeta, fieldCustomFilter, transFields(allFields), crossDs, dsMap, Utils.getParams(transFields(allFields)), view.getCalParams());
|
||||
ExtWhere2Str.extWhere2sqlOjb(sqlMeta, extFilterList, transFields(allFields), crossDs, dsMap, Utils.getParams(transFields(allFields)), view.getCalParams());
|
||||
WhereTree2Str.transFilterTrees(sqlMeta, rowPermissionsTree, transFields(allFields), crossDs, dsMap, Utils.getParams(transFields(allFields)), view.getCalParams());
|
||||
// TODO 數據源插件化之後放到插件裡面組裝SQL
|
||||
if (BooleanUtils.isTrue(view.getIsPlugin())) {
|
||||
List<String> dsList = new ArrayList<>();
|
||||
@ -359,8 +363,8 @@ public class ChartDataManage {
|
||||
dsList.add(next.getValue().getType());
|
||||
}
|
||||
boolean needOrder = Utils.isNeedOrder(dsList);
|
||||
Dimension2SQLObj.dimension2sqlObj(sqlMeta, xAxis, FieldUtil.transFields(allFields), crossDs, dsMap);
|
||||
Quota2SQLObj.quota2sqlObj(sqlMeta, yAxis, FieldUtil.transFields(allFields), crossDs, dsMap);
|
||||
Dimension2SQLObj.dimension2sqlObj(sqlMeta, xAxis, FieldUtil.transFields(allFields), crossDs, dsMap, Utils.getParams(FieldUtil.transFields(allFields)), view.getCalParams());
|
||||
Quota2SQLObj.quota2sqlObj(sqlMeta, yAxis, FieldUtil.transFields(allFields), crossDs, dsMap, Utils.getParams(FieldUtil.transFields(allFields)), view.getCalParams());
|
||||
String querySql = SQLProvider.createQuerySQL(sqlMeta, true, needOrder, view);
|
||||
querySql = provider.rebuildSQL(querySql, sqlMeta, crossDs, dsMap);
|
||||
filterResult.getContext().put("querySql", querySql);
|
||||
@ -691,31 +695,31 @@ public class ChartDataManage {
|
||||
|
||||
SQLMeta sqlMeta = new SQLMeta();
|
||||
Table2SQLObj.table2sqlobj(sqlMeta, null, "(" + sql + ")", crossDs);
|
||||
WhereTree2Str.transFilterTrees(sqlMeta, rowPermissionsTree, transFields(allFields), crossDs, dsMap);
|
||||
WhereTree2Str.transFilterTrees(sqlMeta, rowPermissionsTree, transFields(allFields), crossDs, dsMap, Utils.getParams(transFields(allFields)), view.getCalParams());
|
||||
|
||||
if (StringUtils.equalsAnyIgnoreCase(view.getType(), "indicator", "gauge", "liquid")) {
|
||||
Quota2SQLObj.quota2sqlObj(sqlMeta, yAxis, transFields(allFields), crossDs, dsMap);
|
||||
Quota2SQLObj.quota2sqlObj(sqlMeta, yAxis, transFields(allFields), crossDs, dsMap, Utils.getParams(transFields(allFields)), view.getCalParams());
|
||||
querySql = SQLProvider.createQuerySQL(sqlMeta, true, needOrder, view);
|
||||
} else if (StringUtils.containsIgnoreCase(view.getType(), "stack")) {
|
||||
List<ChartViewFieldDTO> xFields = new ArrayList<>();
|
||||
xFields.addAll(xAxis);
|
||||
xFields.addAll(extStack);
|
||||
Dimension2SQLObj.dimension2sqlObj(sqlMeta, xFields, transFields(allFields), crossDs, dsMap);
|
||||
Quota2SQLObj.quota2sqlObj(sqlMeta, yAxis, transFields(allFields), crossDs, dsMap);
|
||||
Dimension2SQLObj.dimension2sqlObj(sqlMeta, xFields, transFields(allFields), crossDs, dsMap, Utils.getParams(transFields(allFields)), view.getCalParams());
|
||||
Quota2SQLObj.quota2sqlObj(sqlMeta, yAxis, transFields(allFields), crossDs, dsMap, Utils.getParams(transFields(allFields)), view.getCalParams());
|
||||
querySql = SQLProvider.createQuerySQL(sqlMeta, true, needOrder, view);
|
||||
} else if (StringUtils.containsIgnoreCase(view.getType(), "scatter")) {
|
||||
List<ChartViewFieldDTO> yFields = new ArrayList<>();
|
||||
yFields.addAll(yAxis);
|
||||
yFields.addAll(extBubble);
|
||||
Dimension2SQLObj.dimension2sqlObj(sqlMeta, xAxis, transFields(allFields), crossDs, dsMap);
|
||||
Quota2SQLObj.quota2sqlObj(sqlMeta, yFields, transFields(allFields), crossDs, dsMap);
|
||||
Dimension2SQLObj.dimension2sqlObj(sqlMeta, xAxis, transFields(allFields), crossDs, dsMap, Utils.getParams(transFields(allFields)), view.getCalParams());
|
||||
Quota2SQLObj.quota2sqlObj(sqlMeta, yFields, transFields(allFields), crossDs, dsMap, Utils.getParams(transFields(allFields)), view.getCalParams());
|
||||
querySql = SQLProvider.createQuerySQL(sqlMeta, true, needOrder, view);
|
||||
} else if (StringUtils.equalsIgnoreCase("table-info", view.getType())) {
|
||||
Dimension2SQLObj.dimension2sqlObj(sqlMeta, xAxis, transFields(allFields), crossDs, dsMap);
|
||||
Dimension2SQLObj.dimension2sqlObj(sqlMeta, xAxis, transFields(allFields), crossDs, dsMap, Utils.getParams(transFields(allFields)), view.getCalParams());
|
||||
querySql = SQLProvider.createQuerySQL(sqlMeta, false, true, view);
|
||||
} else {
|
||||
Dimension2SQLObj.dimension2sqlObj(sqlMeta, xAxis, transFields(allFields), crossDs, dsMap);
|
||||
Quota2SQLObj.quota2sqlObj(sqlMeta, yAxis, transFields(allFields), crossDs, dsMap);
|
||||
Dimension2SQLObj.dimension2sqlObj(sqlMeta, xAxis, transFields(allFields), crossDs, dsMap, Utils.getParams(transFields(allFields)), view.getCalParams());
|
||||
Quota2SQLObj.quota2sqlObj(sqlMeta, yAxis, transFields(allFields), crossDs, dsMap, Utils.getParams(transFields(allFields)), view.getCalParams());
|
||||
querySql = SQLProvider.createQuerySQL(sqlMeta, true, needOrder, view);
|
||||
}
|
||||
|
||||
|
@ -159,10 +159,12 @@ public class ChartViewManege {
|
||||
|
||||
for (ChartViewFieldDTO ele : list) {
|
||||
if (Objects.equals(ele.getExtField(), ExtFieldConstant.EXT_CALC)) {
|
||||
String originField = Utils.calcFieldRegex(ele.getOriginName(), tableObj, list.stream().peek(e -> {
|
||||
List<DatasetTableFieldDTO> f = list.stream().map(e -> {
|
||||
DatasetTableFieldDTO dto = new DatasetTableFieldDTO();
|
||||
BeanUtils.copyBean(dto, e);
|
||||
}).collect(Collectors.toList()), true, null);
|
||||
return dto;
|
||||
}).collect(Collectors.toList());
|
||||
String originField = Utils.calcFieldRegex(ele.getOriginName(), tableObj, f, true, null, Utils.mergeParam(Utils.getParams(f), null));
|
||||
for (String func : FunctionConstant.AGG_FUNC) {
|
||||
if (Utils.matchFunction(func, originField)) {
|
||||
ele.setSummary("");
|
||||
@ -327,10 +329,10 @@ public class ChartViewManege {
|
||||
public List<ViewSelectorVO> viewOption(Long resourceId) {
|
||||
List<ViewSelectorVO> result = extChartViewMapper.queryViewOption(resourceId);
|
||||
DataVisualizationInfo dvInfo = visualizationInfoMapper.selectById(resourceId);
|
||||
if(dvInfo != null && !CollectionUtils.isEmpty(result)){
|
||||
if (dvInfo != null && !CollectionUtils.isEmpty(result)) {
|
||||
String componentData = dvInfo.getComponentData();
|
||||
return result.stream().filter(item ->componentData.indexOf(String.valueOf(item.getId()))>0).toList();
|
||||
}else{
|
||||
return result.stream().filter(item -> componentData.indexOf(String.valueOf(item.getId())) > 0).toList();
|
||||
} else {
|
||||
return result;
|
||||
}
|
||||
}
|
||||
|
@ -5,11 +5,11 @@ import java.io.Serializable;
|
||||
|
||||
/**
|
||||
* <p>
|
||||
*
|
||||
* table数据集表字段
|
||||
* </p>
|
||||
*
|
||||
* @author fit2cloud
|
||||
* @since 2023-07-10
|
||||
* @since 2024-08-07
|
||||
*/
|
||||
@TableName("core_dataset_table_field")
|
||||
public class CoreDatasetTableField implements Serializable {
|
||||
@ -37,7 +37,7 @@ public class CoreDatasetTableField implements Serializable {
|
||||
private Long datasetGroupId;
|
||||
|
||||
/**
|
||||
* 图表ID
|
||||
* 视图ID
|
||||
*/
|
||||
private Long chartId;
|
||||
|
||||
@ -76,6 +76,9 @@ public class CoreDatasetTableField implements Serializable {
|
||||
*/
|
||||
private String type;
|
||||
|
||||
/**
|
||||
* 字段长度(允许为空,默认0)
|
||||
*/
|
||||
private Integer size;
|
||||
|
||||
/**
|
||||
@ -113,6 +116,9 @@ public class CoreDatasetTableField implements Serializable {
|
||||
*/
|
||||
private Integer accuracy;
|
||||
|
||||
/**
|
||||
* 时间字段类型
|
||||
*/
|
||||
private String dateFormat;
|
||||
|
||||
/**
|
||||
@ -120,6 +126,11 @@ public class CoreDatasetTableField implements Serializable {
|
||||
*/
|
||||
private String dateFormatType;
|
||||
|
||||
/**
|
||||
* 计算字段参数
|
||||
*/
|
||||
private String params;
|
||||
|
||||
public Long getId() {
|
||||
return id;
|
||||
}
|
||||
@ -296,6 +307,14 @@ public class CoreDatasetTableField implements Serializable {
|
||||
this.dateFormatType = dateFormatType;
|
||||
}
|
||||
|
||||
public String getParams() {
|
||||
return params;
|
||||
}
|
||||
|
||||
public void setParams(String params) {
|
||||
this.params = params;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return "CoreDatasetTableField{" +
|
||||
@ -321,6 +340,7 @@ public class CoreDatasetTableField implements Serializable {
|
||||
", accuracy = " + accuracy +
|
||||
", dateFormat = " + dateFormat +
|
||||
", dateFormatType = " + dateFormatType +
|
||||
", params = " + params +
|
||||
"}";
|
||||
}
|
||||
}
|
||||
|
@ -6,11 +6,11 @@ import org.apache.ibatis.annotations.Mapper;
|
||||
|
||||
/**
|
||||
* <p>
|
||||
* Mapper 接口
|
||||
* table数据集表字段 Mapper 接口
|
||||
* </p>
|
||||
*
|
||||
* @author fit2cloud
|
||||
* @since 2023-04-20
|
||||
* @since 2024-08-07
|
||||
*/
|
||||
@Mapper
|
||||
public interface CoreDatasetTableFieldMapper extends BaseMapper<CoreDatasetTableField> {
|
||||
|
@ -218,9 +218,9 @@ public class DatasetDataManage {
|
||||
// build query sql
|
||||
SQLMeta sqlMeta = new SQLMeta();
|
||||
Table2SQLObj.table2sqlobj(sqlMeta, null, "(" + sql + ")", crossDs);
|
||||
Field2SQLObj.field2sqlObj(sqlMeta, fields, fields, crossDs, dsMap);
|
||||
WhereTree2Str.transFilterTrees(sqlMeta, rowPermissionsTree, fields, crossDs, dsMap);
|
||||
Order2SQLObj.getOrders(sqlMeta, datasetGroupInfoDTO.getSortFields(), fields, crossDs, dsMap);
|
||||
Field2SQLObj.field2sqlObj(sqlMeta, fields, fields, crossDs, dsMap, Utils.getParams(fields), null);
|
||||
WhereTree2Str.transFilterTrees(sqlMeta, rowPermissionsTree, fields, crossDs, dsMap, Utils.getParams(fields), null);
|
||||
Order2SQLObj.getOrders(sqlMeta, datasetGroupInfoDTO.getSortFields(), fields, crossDs, dsMap, Utils.getParams(fields), null);
|
||||
String querySQL;
|
||||
if (start == null || count == null) {
|
||||
querySQL = SQLProvider.createQuerySQL(sqlMeta, false, needOrder, false);
|
||||
@ -509,9 +509,9 @@ public class DatasetDataManage {
|
||||
provider = ProviderFactory.getProvider(dsList.getFirst());
|
||||
}
|
||||
|
||||
Field2SQLObj.field2sqlObj(sqlMeta, fields, allFields, crossDs, dsMap);
|
||||
WhereTree2Str.transFilterTrees(sqlMeta, rowPermissionsTree, allFields, crossDs, dsMap);
|
||||
Order2SQLObj.getOrders(sqlMeta, datasetGroupInfoDTO.getSortFields(), allFields, crossDs, dsMap);
|
||||
Field2SQLObj.field2sqlObj(sqlMeta, fields, allFields, crossDs, dsMap, Utils.getParams(allFields), null);
|
||||
WhereTree2Str.transFilterTrees(sqlMeta, rowPermissionsTree, allFields, crossDs, dsMap, Utils.getParams(allFields), null);
|
||||
Order2SQLObj.getOrders(sqlMeta, datasetGroupInfoDTO.getSortFields(), allFields, crossDs, dsMap, Utils.getParams(allFields), null);
|
||||
String querySQL;
|
||||
if (multFieldValuesRequest.getResultMode() == 0) {
|
||||
querySQL = SQLProvider.createQuerySQLWithLimit(sqlMeta, false, needOrder, true, 0, 1000);
|
||||
@ -756,10 +756,10 @@ public class DatasetDataManage {
|
||||
provider = ProviderFactory.getProvider(dsList.getFirst());
|
||||
}
|
||||
|
||||
Field2SQLObj.field2sqlObj(sqlMeta, fields, allFields, crossDs, dsMap);
|
||||
ExtWhere2Str.extWhere2sqlOjb(sqlMeta, extFilterList, allFields, crossDs, dsMap);
|
||||
WhereTree2Str.transFilterTrees(sqlMeta, rowPermissionsTree, allFields, crossDs, dsMap);
|
||||
Order2SQLObj.getOrders(sqlMeta, datasetGroupInfoDTO.getSortFields(), allFields, crossDs, dsMap);
|
||||
Field2SQLObj.field2sqlObj(sqlMeta, fields, allFields, crossDs, dsMap, Utils.getParams(allFields), null);
|
||||
ExtWhere2Str.extWhere2sqlOjb(sqlMeta, extFilterList, allFields, crossDs, dsMap, Utils.getParams(allFields), null);
|
||||
WhereTree2Str.transFilterTrees(sqlMeta, rowPermissionsTree, allFields, crossDs, dsMap, Utils.getParams(allFields), null);
|
||||
Order2SQLObj.getOrders(sqlMeta, datasetGroupInfoDTO.getSortFields(), allFields, crossDs, dsMap, Utils.getParams(allFields), null);
|
||||
String querySQL;
|
||||
if (request.getResultMode() == 0) {
|
||||
querySQL = SQLProvider.createQuerySQLWithLimit(sqlMeta, false, needOrder, sortDistinct && ids.size() == 1, 0, 1000);
|
||||
@ -888,9 +888,9 @@ public class DatasetDataManage {
|
||||
provider = ProviderFactory.getProvider(dsList.getFirst());
|
||||
}
|
||||
|
||||
Field2SQLObj.field2sqlObj(sqlMeta, fields, allFields, crossDs, dsMap);
|
||||
WhereTree2Str.transFilterTrees(sqlMeta, rowPermissionsTree, allFields, crossDs, dsMap);
|
||||
Order2SQLObj.getOrders(sqlMeta, datasetGroupInfoDTO.getSortFields(), allFields, crossDs, dsMap);
|
||||
Field2SQLObj.field2sqlObj(sqlMeta, fields, allFields, crossDs, dsMap, Utils.getParams(allFields), null);
|
||||
WhereTree2Str.transFilterTrees(sqlMeta, rowPermissionsTree, allFields, crossDs, dsMap, Utils.getParams(allFields), null);
|
||||
Order2SQLObj.getOrders(sqlMeta, datasetGroupInfoDTO.getSortFields(), allFields, crossDs, dsMap, Utils.getParams(allFields), null);
|
||||
String querySQL;
|
||||
if (multFieldValuesRequest.getResultMode() == 0) {
|
||||
querySQL = SQLProvider.createQuerySQLWithLimit(sqlMeta, false, needOrder, false, 0, 1000);
|
||||
|
@ -1,6 +1,7 @@
|
||||
package io.dataease.dataset.manage;
|
||||
|
||||
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
|
||||
import com.fasterxml.jackson.core.type.TypeReference;
|
||||
import io.dataease.api.dataset.union.DatasetGroupInfoDTO;
|
||||
import io.dataease.dataset.dao.auto.entity.CoreDatasetTableField;
|
||||
import io.dataease.dataset.dao.auto.mapper.CoreDatasetTableFieldMapper;
|
||||
@ -9,6 +10,7 @@ import io.dataease.engine.constant.ExtFieldConstant;
|
||||
import io.dataease.engine.func.FunctionConstant;
|
||||
import io.dataease.engine.utils.Utils;
|
||||
import io.dataease.exception.DEException;
|
||||
import io.dataease.extensions.datasource.dto.CalParam;
|
||||
import io.dataease.extensions.datasource.dto.DatasetTableFieldDTO;
|
||||
import io.dataease.extensions.datasource.dto.DatasourceSchemaDTO;
|
||||
import io.dataease.extensions.datasource.model.SQLObj;
|
||||
@ -17,6 +19,7 @@ import io.dataease.i18n.Translator;
|
||||
import io.dataease.utils.AuthUtils;
|
||||
import io.dataease.utils.BeanUtils;
|
||||
import io.dataease.utils.IDUtils;
|
||||
import io.dataease.utils.JsonUtil;
|
||||
import jakarta.annotation.Resource;
|
||||
import org.apache.commons.lang3.ObjectUtils;
|
||||
import org.apache.commons.lang3.StringUtils;
|
||||
@ -78,8 +81,7 @@ public class DatasetTableFieldManage {
|
||||
public DatasetTableFieldDTO save(DatasetTableFieldDTO datasetTableFieldDTO) {
|
||||
checkNameLength(datasetTableFieldDTO.getName());
|
||||
CoreDatasetTableField coreDatasetTableField = coreDatasetTableFieldMapper.selectById(datasetTableFieldDTO.getId());
|
||||
CoreDatasetTableField record = new CoreDatasetTableField();
|
||||
BeanUtils.copyBean(record, datasetTableFieldDTO);
|
||||
CoreDatasetTableField record = transDTO2Record(datasetTableFieldDTO);
|
||||
if (ObjectUtils.isEmpty(record.getDataeaseName())) {
|
||||
String n = TableUtils.fieldNameShort(record.getId() + "");
|
||||
record.setFieldShortName(n);
|
||||
@ -256,7 +258,7 @@ public class DatasetTableFieldManage {
|
||||
.filter(ele -> {
|
||||
boolean flag = true;
|
||||
if (Objects.equals(ele.getExtField(), ExtFieldConstant.EXT_CALC)) {
|
||||
String originField = Utils.calcFieldRegex(ele.getOriginName(), tableObj, fields, true, null);
|
||||
String originField = Utils.calcFieldRegex(ele.getOriginName(), tableObj, fields, true, null, Utils.mergeParam(Utils.getParams(fields), null));
|
||||
for (String func : FunctionConstant.AGG_FUNC) {
|
||||
if (Utils.matchFunction(func, originField)) {
|
||||
flag = false;
|
||||
@ -277,10 +279,25 @@ public class DatasetTableFieldManage {
|
||||
DatasetTableFieldDTO dto = new DatasetTableFieldDTO();
|
||||
if (ele == null) return null;
|
||||
BeanUtils.copyBean(dto, ele);
|
||||
if (StringUtils.isNotEmpty(ele.getParams())) {
|
||||
TypeReference<List<CalParam>> tokenType = new TypeReference<>() {
|
||||
};
|
||||
List<CalParam> calParams = JsonUtil.parseList(ele.getParams(), tokenType);
|
||||
dto.setParams(calParams);
|
||||
}
|
||||
return dto;
|
||||
}).collect(Collectors.toList());
|
||||
}
|
||||
|
||||
private CoreDatasetTableField transDTO2Record(DatasetTableFieldDTO dto) {
|
||||
CoreDatasetTableField record = new CoreDatasetTableField();
|
||||
BeanUtils.copyBean(record, dto);
|
||||
if (ObjectUtils.isNotEmpty(dto.getParams())) {
|
||||
record.setParams(JsonUtil.toJSONString(dto.getParams()).toString());
|
||||
}
|
||||
return record;
|
||||
}
|
||||
|
||||
private void checkNameLength(String name) {
|
||||
if (name != null && name.length() > 100) {
|
||||
DEException.throwException(Translator.get("i18n_name_limit_100"));
|
||||
|
@ -3,6 +3,7 @@ package io.dataease.engine.trans;
|
||||
import io.dataease.engine.constant.SQLConstants;
|
||||
import io.dataease.engine.utils.Utils;
|
||||
import io.dataease.extensions.datasource.constant.SqlPlaceholderConstants;
|
||||
import io.dataease.extensions.datasource.dto.CalParam;
|
||||
import io.dataease.extensions.datasource.dto.DatasetTableFieldDTO;
|
||||
import io.dataease.extensions.datasource.dto.DatasourceSchemaDTO;
|
||||
import io.dataease.extensions.datasource.model.SQLMeta;
|
||||
@ -21,7 +22,7 @@ import java.util.*;
|
||||
*/
|
||||
public class CustomWhere2Str {
|
||||
|
||||
public static void customWhere2sqlObj(SQLMeta meta, FilterTreeObj tree, List<DatasetTableFieldDTO> originFields, boolean isCross, Map<Long, DatasourceSchemaDTO> dsMap) {
|
||||
public static void customWhere2sqlObj(SQLMeta meta, FilterTreeObj tree, List<DatasetTableFieldDTO> originFields, boolean isCross, Map<Long, DatasourceSchemaDTO> dsMap, List<CalParam> fieldParam, List<CalParam> chartParam) {
|
||||
SQLObj tableObj = meta.getTable();
|
||||
if (ObjectUtils.isEmpty(tableObj)) {
|
||||
return;
|
||||
@ -34,7 +35,7 @@ public class CustomWhere2Str {
|
||||
return;
|
||||
}
|
||||
Map<String, String> fieldsDialect = new HashMap<>();
|
||||
String treeExp = transTreeToWhere(tableObj, tree, fieldsDialect, originFields, isCross, dsMap);
|
||||
String treeExp = transTreeToWhere(tableObj, tree, fieldsDialect, originFields, isCross, dsMap, fieldParam, chartParam);
|
||||
if (StringUtils.isNotEmpty(treeExp)) {
|
||||
res.add(treeExp);
|
||||
}
|
||||
@ -42,7 +43,7 @@ public class CustomWhere2Str {
|
||||
meta.setCustomWheresDialect(fieldsDialect);
|
||||
}
|
||||
|
||||
private static String transTreeToWhere(SQLObj tableObj, FilterTreeObj tree, Map<String, String> fieldsDialect, List<DatasetTableFieldDTO> originFields, boolean isCross, Map<Long, DatasourceSchemaDTO> dsMap) {
|
||||
private static String transTreeToWhere(SQLObj tableObj, FilterTreeObj tree, Map<String, String> fieldsDialect, List<DatasetTableFieldDTO> originFields, boolean isCross, Map<Long, DatasourceSchemaDTO> dsMap, List<CalParam> fieldParam, List<CalParam> chartParam) {
|
||||
if (ObjectUtils.isEmpty(tree)) {
|
||||
return null;
|
||||
}
|
||||
@ -55,10 +56,10 @@ public class CustomWhere2Str {
|
||||
String exp = null;
|
||||
if (StringUtils.equalsIgnoreCase(item.getType(), "item")) {
|
||||
// 单个item拼接SQL,最后根据logic汇总
|
||||
exp = transTreeItem(tableObj, item, fieldsDialect, originFields, isCross, dsMap);
|
||||
exp = transTreeItem(tableObj, item, fieldsDialect, originFields, isCross, dsMap, fieldParam, chartParam);
|
||||
} else if (StringUtils.equalsIgnoreCase(item.getType(), "tree")) {
|
||||
// 递归tree
|
||||
exp = transTreeToWhere(tableObj, item.getSubTree(), fieldsDialect, originFields, isCross, dsMap);
|
||||
exp = transTreeToWhere(tableObj, item.getSubTree(), fieldsDialect, originFields, isCross, dsMap, fieldParam, chartParam);
|
||||
}
|
||||
if (StringUtils.isNotEmpty(exp)) {
|
||||
list.add(exp);
|
||||
@ -68,18 +69,19 @@ public class CustomWhere2Str {
|
||||
return CollectionUtils.isNotEmpty(list) ? "(" + String.join(" " + logic + " ", list) + ")" : null;
|
||||
}
|
||||
|
||||
private static String transTreeItem(SQLObj tableObj, FilterTreeItem item, Map<String, String> fieldsDialect, List<DatasetTableFieldDTO> originFields, boolean isCross, Map<Long, DatasourceSchemaDTO> dsMap) {
|
||||
private static String transTreeItem(SQLObj tableObj, FilterTreeItem item, Map<String, String> fieldsDialect, List<DatasetTableFieldDTO> originFields, boolean isCross, Map<Long, DatasourceSchemaDTO> dsMap, List<CalParam> fieldParam, List<CalParam> chartParam) {
|
||||
String res = null;
|
||||
DatasetTableFieldDTO field = item.getField();
|
||||
|
||||
if (ObjectUtils.isEmpty(field)) {
|
||||
return null;
|
||||
}
|
||||
Map<String, String> paramMap = Utils.mergeParam(fieldParam, chartParam);
|
||||
String whereName = "";
|
||||
String originName;
|
||||
if (ObjectUtils.isNotEmpty(field.getExtField()) && field.getExtField() == 2) {
|
||||
// 解析origin name中有关联的字段生成sql表达式
|
||||
String calcFieldExp = Utils.calcFieldRegex(field.getOriginName(), tableObj, originFields, isCross, dsMap);
|
||||
String calcFieldExp = Utils.calcFieldRegex(field.getOriginName(), tableObj, originFields, isCross, dsMap, paramMap);
|
||||
// 给计算字段处加一个占位符,后续SQL方言转换后再替换
|
||||
originName = String.format(SqlPlaceholderConstants.CALC_FIELD_PLACEHOLDER, field.getId());
|
||||
fieldsDialect.put(originName, calcFieldExp);
|
||||
|
@ -1,15 +1,16 @@
|
||||
package io.dataease.engine.trans;
|
||||
|
||||
import io.dataease.extensions.datasource.constant.SqlPlaceholderConstants;
|
||||
import io.dataease.extensions.datasource.dto.DatasourceSchemaDTO;
|
||||
import io.dataease.extensions.datasource.model.SQLMeta;
|
||||
import io.dataease.extensions.datasource.model.SQLObj;
|
||||
import io.dataease.extensions.view.dto.ChartViewFieldDTO;
|
||||
import io.dataease.extensions.datasource.dto.DatasetTableFieldDTO;
|
||||
import io.dataease.engine.constant.DeTypeConstants;
|
||||
import io.dataease.engine.constant.ExtFieldConstant;
|
||||
import io.dataease.engine.constant.SQLConstants;
|
||||
import io.dataease.engine.utils.Utils;
|
||||
import io.dataease.extensions.datasource.constant.SqlPlaceholderConstants;
|
||||
import io.dataease.extensions.datasource.dto.CalParam;
|
||||
import io.dataease.extensions.datasource.dto.DatasetTableFieldDTO;
|
||||
import io.dataease.extensions.datasource.dto.DatasourceSchemaDTO;
|
||||
import io.dataease.extensions.datasource.model.SQLMeta;
|
||||
import io.dataease.extensions.datasource.model.SQLObj;
|
||||
import io.dataease.extensions.view.dto.ChartViewFieldDTO;
|
||||
import org.apache.commons.lang3.ObjectUtils;
|
||||
import org.apache.commons.lang3.StringUtils;
|
||||
import org.springframework.util.CollectionUtils;
|
||||
@ -22,11 +23,12 @@ import java.util.*;
|
||||
public class Dimension2SQLObj {
|
||||
|
||||
public static void dimension2sqlObj(SQLMeta meta, List<ChartViewFieldDTO> fields, List<DatasetTableFieldDTO> originFields,
|
||||
boolean isCross, Map<Long, DatasourceSchemaDTO> dsMap) {
|
||||
boolean isCross, Map<Long, DatasourceSchemaDTO> dsMap, List<CalParam> fieldParam, List<CalParam> chartParam) {
|
||||
SQLObj tableObj = meta.getTable();
|
||||
if (ObjectUtils.isEmpty(tableObj)) {
|
||||
return;
|
||||
}
|
||||
Map<String, String> paramMap = Utils.mergeParam(fieldParam, chartParam);
|
||||
List<SQLObj> xFields = new ArrayList<>();
|
||||
List<SQLObj> xOrders = new ArrayList<>();
|
||||
Map<String, String> fieldsDialect = new HashMap<>();
|
||||
@ -36,7 +38,7 @@ public class Dimension2SQLObj {
|
||||
String originField;
|
||||
if (ObjectUtils.isNotEmpty(x.getExtField()) && Objects.equals(x.getExtField(), ExtFieldConstant.EXT_CALC)) {
|
||||
// 解析origin name中有关联的字段生成sql表达式
|
||||
String calcFieldExp = Utils.calcFieldRegex(x.getOriginName(), tableObj, originFields, isCross, dsMap);
|
||||
String calcFieldExp = Utils.calcFieldRegex(x.getOriginName(), tableObj, originFields, isCross, dsMap, paramMap);
|
||||
// 给计算字段处加一个占位符,后续SQL方言转换后再替换
|
||||
originField = String.format(SqlPlaceholderConstants.CALC_FIELD_PLACEHOLDER, x.getId());
|
||||
fieldsDialect.put(originField, calcFieldExp);
|
||||
|
@ -1,13 +1,14 @@
|
||||
package io.dataease.engine.trans;
|
||||
|
||||
import io.dataease.engine.constant.SQLConstants;
|
||||
import io.dataease.engine.utils.Utils;
|
||||
import io.dataease.extensions.datasource.constant.SqlPlaceholderConstants;
|
||||
import io.dataease.extensions.datasource.dto.CalParam;
|
||||
import io.dataease.extensions.datasource.dto.DatasetTableFieldDTO;
|
||||
import io.dataease.extensions.datasource.dto.DatasourceSchemaDTO;
|
||||
import io.dataease.extensions.datasource.model.SQLMeta;
|
||||
import io.dataease.extensions.datasource.model.SQLObj;
|
||||
import io.dataease.extensions.view.dto.ChartExtFilterDTO;
|
||||
import io.dataease.extensions.datasource.dto.DatasetTableFieldDTO;
|
||||
import io.dataease.engine.constant.SQLConstants;
|
||||
import io.dataease.engine.utils.Utils;
|
||||
import org.apache.commons.lang3.ObjectUtils;
|
||||
import org.apache.commons.lang3.StringUtils;
|
||||
|
||||
@ -21,11 +22,12 @@ import java.util.Map;
|
||||
*/
|
||||
public class ExtWhere2Str {
|
||||
|
||||
public static void extWhere2sqlOjb(SQLMeta meta, List<ChartExtFilterDTO> fields, List<DatasetTableFieldDTO> originFields, boolean isCross, Map<Long, DatasourceSchemaDTO> dsMap) {
|
||||
public static void extWhere2sqlOjb(SQLMeta meta, List<ChartExtFilterDTO> fields, List<DatasetTableFieldDTO> originFields, boolean isCross, Map<Long, DatasourceSchemaDTO> dsMap, List<CalParam> fieldParam, List<CalParam> chartParam) {
|
||||
SQLObj tableObj = meta.getTable();
|
||||
if (ObjectUtils.isEmpty(tableObj)) {
|
||||
return;
|
||||
}
|
||||
Map<String, String> paramMap = Utils.mergeParam(fieldParam, chartParam);
|
||||
List<SQLObj> list = new ArrayList<>();
|
||||
Map<String, String> fieldsDialect = new HashMap<>();
|
||||
if (ObjectUtils.isNotEmpty(fields)) {
|
||||
@ -49,7 +51,7 @@ public class ExtWhere2Str {
|
||||
String originName;
|
||||
if (ObjectUtils.isNotEmpty(field.getExtField()) && field.getExtField() == 2) {
|
||||
// 解析origin name中有关联的字段生成sql表达式
|
||||
String calcFieldExp = Utils.calcFieldRegex(field.getOriginName(), tableObj, originFields, isCross, dsMap);
|
||||
String calcFieldExp = Utils.calcFieldRegex(field.getOriginName(), tableObj, originFields, isCross, dsMap, paramMap);
|
||||
// 给计算字段处加一个占位符,后续SQL方言转换后再替换
|
||||
originName = String.format(SqlPlaceholderConstants.CALC_FIELD_PLACEHOLDER, field.getId());
|
||||
fieldsDialect.put(originName, calcFieldExp);
|
||||
|
@ -1,13 +1,14 @@
|
||||
package io.dataease.engine.trans;
|
||||
|
||||
import io.dataease.extensions.datasource.constant.SqlPlaceholderConstants;
|
||||
import io.dataease.extensions.datasource.dto.DatasourceSchemaDTO;
|
||||
import io.dataease.extensions.datasource.dto.DatasetTableFieldDTO;
|
||||
import io.dataease.engine.constant.DeTypeConstants;
|
||||
import io.dataease.engine.constant.ExtFieldConstant;
|
||||
import io.dataease.engine.constant.SQLConstants;
|
||||
import io.dataease.engine.func.FunctionConstant;
|
||||
import io.dataease.engine.utils.Utils;
|
||||
import io.dataease.extensions.datasource.constant.SqlPlaceholderConstants;
|
||||
import io.dataease.extensions.datasource.dto.CalParam;
|
||||
import io.dataease.extensions.datasource.dto.DatasetTableFieldDTO;
|
||||
import io.dataease.extensions.datasource.dto.DatasourceSchemaDTO;
|
||||
import io.dataease.extensions.datasource.model.SQLMeta;
|
||||
import io.dataease.extensions.datasource.model.SQLObj;
|
||||
import org.apache.commons.lang3.ObjectUtils;
|
||||
@ -20,11 +21,12 @@ import java.util.*;
|
||||
*/
|
||||
public class Field2SQLObj {
|
||||
|
||||
public static void field2sqlObj(SQLMeta meta, List<DatasetTableFieldDTO> fields, List<DatasetTableFieldDTO> originFields, boolean isCross, Map<Long, DatasourceSchemaDTO> dsMap) {
|
||||
public static void field2sqlObj(SQLMeta meta, List<DatasetTableFieldDTO> fields, List<DatasetTableFieldDTO> originFields, boolean isCross, Map<Long, DatasourceSchemaDTO> dsMap, List<CalParam> fieldParam, List<CalParam> chartParam) {
|
||||
SQLObj tableObj = meta.getTable();
|
||||
if (ObjectUtils.isEmpty(tableObj)) {
|
||||
return;
|
||||
}
|
||||
Map<String, String> paramMap = Utils.mergeParam(fieldParam, chartParam);
|
||||
List<SQLObj> xFields = new ArrayList<>();
|
||||
Map<String, String> fieldsDialect = new HashMap<>();
|
||||
if (ObjectUtils.isNotEmpty(fields)) {
|
||||
@ -33,7 +35,7 @@ public class Field2SQLObj {
|
||||
String originField;
|
||||
if (ObjectUtils.isNotEmpty(x.getExtField()) && Objects.equals(x.getExtField(), ExtFieldConstant.EXT_CALC)) {
|
||||
// 解析origin name中有关联的字段生成sql表达式
|
||||
String calcFieldExp = Utils.calcFieldRegex(x.getOriginName(), tableObj, originFields, isCross, dsMap);
|
||||
String calcFieldExp = Utils.calcFieldRegex(x.getOriginName(), tableObj, originFields, isCross, dsMap, paramMap);
|
||||
// 给计算字段处加一个占位符,后续SQL方言转换后再替换
|
||||
originField = String.format(SqlPlaceholderConstants.CALC_FIELD_PLACEHOLDER, x.getId());
|
||||
fieldsDialect.put(originField, calcFieldExp);
|
||||
|
@ -1,6 +1,7 @@
|
||||
package io.dataease.engine.trans;
|
||||
|
||||
import io.dataease.api.chart.dto.DeSortField;
|
||||
import io.dataease.extensions.datasource.dto.CalParam;
|
||||
import io.dataease.extensions.datasource.dto.DatasourceSchemaDTO;
|
||||
import io.dataease.extensions.datasource.dto.DatasetTableFieldDTO;
|
||||
import io.dataease.engine.constant.DeTypeConstants;
|
||||
@ -22,7 +23,7 @@ import java.util.Objects;
|
||||
*/
|
||||
public class Order2SQLObj {
|
||||
|
||||
public static void getOrders(SQLMeta meta, List<DeSortField> sortFields, List<DatasetTableFieldDTO> originFields, boolean isCross, Map<Long, DatasourceSchemaDTO> dsMap) {
|
||||
public static void getOrders(SQLMeta meta, List<DeSortField> sortFields, List<DatasetTableFieldDTO> originFields, boolean isCross, Map<Long, DatasourceSchemaDTO> dsMap, List<CalParam> fieldParam, List<CalParam> chartParam) {
|
||||
SQLObj tableObj = meta.getTable();
|
||||
List<SQLObj> xOrders = meta.getXOrders() == null ? new ArrayList<>() : meta.getXOrders();
|
||||
if (ObjectUtils.isEmpty(tableObj)) {
|
||||
@ -32,18 +33,19 @@ public class Order2SQLObj {
|
||||
int step = originFields.size();
|
||||
for (int i = step; i < (step + sortFields.size()); i++) {
|
||||
DeSortField deSortField = sortFields.get(i - step);
|
||||
SQLObj order = buildSortField(deSortField, tableObj, i, originFields, isCross, dsMap);
|
||||
SQLObj order = buildSortField(deSortField, tableObj, i, originFields, isCross, dsMap, fieldParam, chartParam);
|
||||
xOrders.add(order);
|
||||
}
|
||||
meta.setXOrders(xOrders);
|
||||
}
|
||||
}
|
||||
|
||||
private static SQLObj buildSortField(DeSortField f, SQLObj tableObj, int i, List<DatasetTableFieldDTO> originFields, boolean isCross, Map<Long, DatasourceSchemaDTO> dsMap) {
|
||||
private static SQLObj buildSortField(DeSortField f, SQLObj tableObj, int i, List<DatasetTableFieldDTO> originFields, boolean isCross, Map<Long, DatasourceSchemaDTO> dsMap, List<CalParam> fieldParam, List<CalParam> chartParam) {
|
||||
Map<String, String> paramMap = Utils.mergeParam(fieldParam, chartParam);
|
||||
String originField;
|
||||
if (ObjectUtils.isNotEmpty(f.getExtField()) && Objects.equals(f.getExtField(), ExtFieldConstant.EXT_CALC)) {
|
||||
// 解析origin name中有关联的字段生成sql表达式
|
||||
originField = Utils.calcFieldRegex(f.getOriginName(), tableObj, originFields, isCross, dsMap);
|
||||
originField = Utils.calcFieldRegex(f.getOriginName(), tableObj, originFields, isCross, dsMap, paramMap);
|
||||
} else if (ObjectUtils.isNotEmpty(f.getExtField()) && Objects.equals(f.getExtField(), ExtFieldConstant.EXT_COPY)) {
|
||||
originField = String.format(SQLConstants.FIELD_NAME, tableObj.getTableAlias(), f.getDataeaseName());
|
||||
} else {
|
||||
|
@ -1,15 +1,16 @@
|
||||
package io.dataease.engine.trans;
|
||||
|
||||
import io.dataease.extensions.datasource.constant.SqlPlaceholderConstants;
|
||||
import io.dataease.extensions.datasource.dto.DatasourceSchemaDTO;
|
||||
import io.dataease.extensions.datasource.model.SQLMeta;
|
||||
import io.dataease.extensions.datasource.model.SQLObj;
|
||||
import io.dataease.extensions.view.dto.ChartViewFieldDTO;
|
||||
import io.dataease.extensions.datasource.dto.DatasetTableFieldDTO;
|
||||
import io.dataease.engine.constant.DeTypeConstants;
|
||||
import io.dataease.engine.constant.ExtFieldConstant;
|
||||
import io.dataease.engine.constant.SQLConstants;
|
||||
import io.dataease.engine.utils.Utils;
|
||||
import io.dataease.extensions.datasource.constant.SqlPlaceholderConstants;
|
||||
import io.dataease.extensions.datasource.dto.CalParam;
|
||||
import io.dataease.extensions.datasource.dto.DatasetTableFieldDTO;
|
||||
import io.dataease.extensions.datasource.dto.DatasourceSchemaDTO;
|
||||
import io.dataease.extensions.datasource.model.SQLMeta;
|
||||
import io.dataease.extensions.datasource.model.SQLObj;
|
||||
import io.dataease.extensions.view.dto.ChartViewFieldDTO;
|
||||
import org.apache.commons.lang3.ObjectUtils;
|
||||
import org.apache.commons.lang3.StringUtils;
|
||||
import org.springframework.util.CollectionUtils;
|
||||
@ -21,11 +22,12 @@ import java.util.*;
|
||||
*/
|
||||
public class Quota2SQLObj {
|
||||
|
||||
public static void quota2sqlObj(SQLMeta meta, List<ChartViewFieldDTO> fields, List<DatasetTableFieldDTO> originFields, boolean isCross, Map<Long, DatasourceSchemaDTO> dsMap) {
|
||||
public static void quota2sqlObj(SQLMeta meta, List<ChartViewFieldDTO> fields, List<DatasetTableFieldDTO> originFields, boolean isCross, Map<Long, DatasourceSchemaDTO> dsMap, List<CalParam> fieldParam, List<CalParam> chartParam) {
|
||||
SQLObj tableObj = meta.getTable();
|
||||
if (ObjectUtils.isEmpty(tableObj)) {
|
||||
return;
|
||||
}
|
||||
Map<String, String> paramMap = Utils.mergeParam(fieldParam, chartParam);
|
||||
List<SQLObj> yFields = new ArrayList<>();
|
||||
List<String> yWheres = new ArrayList<>();
|
||||
List<SQLObj> yOrders = new ArrayList<>();
|
||||
@ -36,7 +38,7 @@ public class Quota2SQLObj {
|
||||
String originField;
|
||||
if (ObjectUtils.isNotEmpty(y.getExtField()) && Objects.equals(y.getExtField(), ExtFieldConstant.EXT_CALC)) {
|
||||
// 解析origin name中有关联的字段生成sql表达式
|
||||
String calcFieldExp = Utils.calcFieldRegex(y.getOriginName(), tableObj, originFields, isCross, dsMap);
|
||||
String calcFieldExp = Utils.calcFieldRegex(y.getOriginName(), tableObj, originFields, isCross, dsMap, paramMap);
|
||||
// 给计算字段处加一个占位符,后续SQL方言转换后再替换
|
||||
originField = String.format(SqlPlaceholderConstants.CALC_FIELD_PLACEHOLDER, y.getId());
|
||||
fieldsDialect.put(originField, calcFieldExp);
|
||||
|
@ -1,16 +1,17 @@
|
||||
package io.dataease.engine.trans;
|
||||
|
||||
import io.dataease.extensions.datasource.constant.SqlPlaceholderConstants;
|
||||
import io.dataease.extensions.datasource.dto.DatasourceSchemaDTO;
|
||||
import io.dataease.api.permissions.dataset.dto.DataSetRowPermissionsTreeDTO;
|
||||
import io.dataease.engine.constant.ExtFieldConstant;
|
||||
import io.dataease.engine.constant.SQLConstants;
|
||||
import io.dataease.engine.utils.Utils;
|
||||
import io.dataease.extensions.datasource.constant.SqlPlaceholderConstants;
|
||||
import io.dataease.extensions.datasource.dto.CalParam;
|
||||
import io.dataease.extensions.datasource.dto.DatasetTableFieldDTO;
|
||||
import io.dataease.extensions.datasource.dto.DatasourceSchemaDTO;
|
||||
import io.dataease.extensions.datasource.model.SQLMeta;
|
||||
import io.dataease.extensions.datasource.model.SQLObj;
|
||||
import io.dataease.extensions.view.dto.DatasetRowPermissionsTreeItem;
|
||||
import io.dataease.extensions.view.dto.DatasetRowPermissionsTreeObj;
|
||||
import io.dataease.extensions.datasource.dto.DatasetTableFieldDTO;
|
||||
import io.dataease.engine.constant.ExtFieldConstant;
|
||||
import io.dataease.engine.constant.SQLConstants;
|
||||
import io.dataease.engine.utils.Utils;
|
||||
import org.apache.commons.collections4.CollectionUtils;
|
||||
import org.apache.commons.lang3.ObjectUtils;
|
||||
import org.apache.commons.lang3.StringUtils;
|
||||
@ -21,7 +22,7 @@ import java.util.*;
|
||||
* @Author Junjun
|
||||
*/
|
||||
public class WhereTree2Str {
|
||||
public static void transFilterTrees(SQLMeta meta, List<DataSetRowPermissionsTreeDTO> requestList, List<DatasetTableFieldDTO> originFields, boolean isCross, Map<Long, DatasourceSchemaDTO> dsMap) {
|
||||
public static void transFilterTrees(SQLMeta meta, List<DataSetRowPermissionsTreeDTO> requestList, List<DatasetTableFieldDTO> originFields, boolean isCross, Map<Long, DatasourceSchemaDTO> dsMap, List<CalParam> fieldParam, List<CalParam> chartParam) {
|
||||
SQLObj tableObj = meta.getTable();
|
||||
if (ObjectUtils.isEmpty(tableObj)) {
|
||||
return;
|
||||
@ -39,7 +40,7 @@ public class WhereTree2Str {
|
||||
if (ObjectUtils.isEmpty(tree)) {
|
||||
continue;
|
||||
}
|
||||
String treeExp = transTreeToWhere(tableObj, tree, originFields, fieldsDialect, isCross, dsMap);
|
||||
String treeExp = transTreeToWhere(tableObj, tree, originFields, fieldsDialect, isCross, dsMap, fieldParam, chartParam);
|
||||
if (StringUtils.isNotEmpty(treeExp)) {
|
||||
res.add(treeExp);
|
||||
}
|
||||
@ -48,7 +49,7 @@ public class WhereTree2Str {
|
||||
meta.setWhereTreesDialect(fieldsDialect);
|
||||
}
|
||||
|
||||
private static String transTreeToWhere(SQLObj tableObj, DatasetRowPermissionsTreeObj tree, List<DatasetTableFieldDTO> originFields, Map<String, String> fieldsDialect, boolean isCross, Map<Long, DatasourceSchemaDTO> dsMap) {
|
||||
private static String transTreeToWhere(SQLObj tableObj, DatasetRowPermissionsTreeObj tree, List<DatasetTableFieldDTO> originFields, Map<String, String> fieldsDialect, boolean isCross, Map<Long, DatasourceSchemaDTO> dsMap, List<CalParam> fieldParam, List<CalParam> chartParam) {
|
||||
if (ObjectUtils.isEmpty(tree)) {
|
||||
return null;
|
||||
}
|
||||
@ -61,10 +62,10 @@ public class WhereTree2Str {
|
||||
String exp = null;
|
||||
if (StringUtils.equalsIgnoreCase(item.getType(), "item")) {
|
||||
// 单个item拼接SQL,最后根据logic汇总
|
||||
exp = transTreeItem(tableObj, item, originFields, fieldsDialect, isCross, dsMap);
|
||||
exp = transTreeItem(tableObj, item, originFields, fieldsDialect, isCross, dsMap, fieldParam, chartParam);
|
||||
} else if (StringUtils.equalsIgnoreCase(item.getType(), "tree")) {
|
||||
// 递归tree
|
||||
exp = transTreeToWhere(tableObj, item.getSubTree(), originFields, fieldsDialect, isCross, dsMap);
|
||||
exp = transTreeToWhere(tableObj, item.getSubTree(), originFields, fieldsDialect, isCross, dsMap, fieldParam, chartParam);
|
||||
}
|
||||
if (StringUtils.isNotEmpty(exp)) {
|
||||
list.add(exp);
|
||||
@ -74,17 +75,18 @@ public class WhereTree2Str {
|
||||
return CollectionUtils.isNotEmpty(list) ? "(" + String.join(" " + logic + " ", list) + ")" : null;
|
||||
}
|
||||
|
||||
public static String transTreeItem(SQLObj tableObj, DatasetRowPermissionsTreeItem item, List<DatasetTableFieldDTO> originFields, Map<String, String> fieldsDialect, boolean isCross, Map<Long, DatasourceSchemaDTO> dsMap) {
|
||||
public static String transTreeItem(SQLObj tableObj, DatasetRowPermissionsTreeItem item, List<DatasetTableFieldDTO> originFields, Map<String, String> fieldsDialect, boolean isCross, Map<Long, DatasourceSchemaDTO> dsMap, List<CalParam> fieldParam, List<CalParam> chartParam) {
|
||||
String res = null;
|
||||
DatasetTableFieldDTO field = item.getField();
|
||||
if (ObjectUtils.isEmpty(field)) {
|
||||
return null;
|
||||
}
|
||||
Map<String, String> paramMap = Utils.mergeParam(fieldParam, chartParam);
|
||||
String whereName = "";
|
||||
String originName;
|
||||
if (ObjectUtils.isNotEmpty(field.getExtField()) && Objects.equals(field.getExtField(), ExtFieldConstant.EXT_CALC)) {
|
||||
// 解析origin name中有关联的字段生成sql表达式
|
||||
String calcFieldExp = Utils.calcFieldRegex(field.getOriginName(), tableObj, originFields, isCross, dsMap);
|
||||
String calcFieldExp = Utils.calcFieldRegex(field.getOriginName(), tableObj, originFields, isCross, dsMap, paramMap);
|
||||
// 给计算字段处加一个占位符,后续SQL方言转换后再替换
|
||||
originName = String.format(SqlPlaceholderConstants.CALC_FIELD_PLACEHOLDER, field.getId());
|
||||
fieldsDialect.put(originName, calcFieldExp);
|
||||
|
@ -4,6 +4,7 @@ import io.dataease.engine.constant.ExtFieldConstant;
|
||||
import io.dataease.engine.constant.SQLConstants;
|
||||
import io.dataease.exception.DEException;
|
||||
import io.dataease.extensions.datasource.constant.SqlPlaceholderConstants;
|
||||
import io.dataease.extensions.datasource.dto.CalParam;
|
||||
import io.dataease.extensions.datasource.dto.DatasetTableFieldDTO;
|
||||
import io.dataease.extensions.datasource.dto.DatasourceSchemaDTO;
|
||||
import io.dataease.extensions.datasource.model.SQLObj;
|
||||
@ -26,7 +27,7 @@ public class Utils {
|
||||
}
|
||||
|
||||
// 解析计算字段
|
||||
public static String calcFieldRegex(String originField, SQLObj tableObj, List<DatasetTableFieldDTO> originFields, boolean isCross, Map<Long, DatasourceSchemaDTO> dsMap) {
|
||||
public static String calcFieldRegex(String originField, SQLObj tableObj, List<DatasetTableFieldDTO> originFields, boolean isCross, Map<Long, DatasourceSchemaDTO> dsMap, Map<String, String> paramMap) {
|
||||
try {
|
||||
int i = 0;
|
||||
DatasourceConfiguration.DatasourceType datasourceType = null;
|
||||
@ -34,7 +35,7 @@ public class Utils {
|
||||
Map.Entry<Long, DatasourceSchemaDTO> next = dsMap.entrySet().iterator().next();
|
||||
datasourceType = DatasourceConfiguration.DatasourceType.valueOf(next.getValue().getType());
|
||||
}
|
||||
return buildCalcField(originField, tableObj, originFields, i, isCross, datasourceType);
|
||||
return buildCalcField(originField, tableObj, originFields, i, isCross, datasourceType, paramMap);
|
||||
} catch (Exception e) {
|
||||
DEException.throwException(Translator.get("i18n_field_circular_ref"));
|
||||
}
|
||||
@ -49,14 +50,14 @@ public class Utils {
|
||||
Map.Entry<Long, String> next = dsTypeMap.entrySet().iterator().next();
|
||||
datasourceType = DatasourceConfiguration.DatasourceType.valueOf(next.getValue());
|
||||
}
|
||||
return buildCalcField(originField, tableObj, originFields, i, isCross, datasourceType);
|
||||
return buildCalcField(originField, tableObj, originFields, i, isCross, datasourceType, null);
|
||||
} catch (Exception e) {
|
||||
DEException.throwException(Translator.get("i18n_field_circular_ref"));
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
public static String buildCalcField(String originField, SQLObj tableObj, List<DatasetTableFieldDTO> originFields, int i, boolean isCross, DatasourceConfiguration.DatasourceType datasourceType) throws Exception {
|
||||
public static String buildCalcField(String originField, SQLObj tableObj, List<DatasetTableFieldDTO> originFields, int i, boolean isCross, DatasourceConfiguration.DatasourceType datasourceType, Map<String, String> paramMap) throws Exception {
|
||||
try {
|
||||
i++;
|
||||
if (i > 100) {
|
||||
@ -75,6 +76,14 @@ public class Utils {
|
||||
if (CollectionUtils.isEmpty(ids)) {
|
||||
return originField;
|
||||
}
|
||||
// 替换参数
|
||||
if (ObjectUtils.isNotEmpty(paramMap)) {
|
||||
Set<Map.Entry<String, String>> entries = paramMap.entrySet();
|
||||
for (Map.Entry<String, String> ele : entries) {
|
||||
originField = originField.replaceAll("\\[" + ele.getKey() + "]", ele.getValue());
|
||||
}
|
||||
}
|
||||
// 替换字段引用
|
||||
for (DatasetTableFieldDTO ele : originFields) {
|
||||
if (StringUtils.containsIgnoreCase(originField, ele.getId() + "")) {
|
||||
// 计算字段允许二次引用,这里递归查询完整引用链
|
||||
@ -86,7 +95,7 @@ public class Utils {
|
||||
}
|
||||
} else {
|
||||
originField = originField.replaceAll("\\[" + ele.getId() + "]", "(" + ele.getOriginName() + ")");
|
||||
originField = buildCalcField(originField, tableObj, originFields, i, isCross, datasourceType);
|
||||
originField = buildCalcField(originField, tableObj, originFields, i, isCross, datasourceType, paramMap);
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -406,4 +415,30 @@ public class Utils {
|
||||
map.put("endTime", endTime);
|
||||
return map;
|
||||
}
|
||||
|
||||
public static List<CalParam> getParams(List<DatasetTableFieldDTO> list) {
|
||||
if (ObjectUtils.isNotEmpty(list)) return Collections.emptyList();
|
||||
List<CalParam> param = new ArrayList<>();
|
||||
for (DatasetTableFieldDTO dto : list) {
|
||||
if (Objects.equals(dto.getExtField(), ExtFieldConstant.EXT_CALC) && ObjectUtils.isNotEmpty(dto.getParams())) {
|
||||
param.addAll(dto.getParams());
|
||||
}
|
||||
}
|
||||
return param;
|
||||
}
|
||||
|
||||
public static Map<String, String> mergeParam(List<CalParam> fieldParam, List<CalParam> chartParam) {
|
||||
Map<String, String> map = new HashMap<>();
|
||||
if (ObjectUtils.isNotEmpty(fieldParam)) {
|
||||
for (CalParam param : fieldParam) {
|
||||
map.put(param.getId(), param.getValue());
|
||||
}
|
||||
}
|
||||
if (ObjectUtils.isNotEmpty(chartParam)) {
|
||||
for (CalParam param : chartParam) {
|
||||
map.put(param.getId(), param.getValue());
|
||||
}
|
||||
}
|
||||
return map;
|
||||
}
|
||||
}
|
||||
|
@ -2,5 +2,7 @@ BEGIN;
|
||||
INSERT INTO `core_sys_startup_job` VALUES ('chartFilterDynamic', 'chartFilterDynamic', 'ready');
|
||||
COMMIT;
|
||||
|
||||
alter table `core_dataset_table_field` add params text null comment '计算字段参数';
|
||||
|
||||
alter table `core_datasource`
|
||||
add `enable_data_fill` tinyint default 0 null comment '启用数据填报功能';
|
||||
|
@ -2,5 +2,7 @@ BEGIN;
|
||||
INSERT INTO `core_sys_startup_job` VALUES ('chartFilterDynamic', 'chartFilterDynamic', 'ready');
|
||||
COMMIT;
|
||||
|
||||
alter table `core_dataset_table_field` add params text null comment '计算字段参数';
|
||||
|
||||
alter table `core_datasource`
|
||||
add `enable_data_fill` tinyint default 0 null comment '启用数据填报功能';
|
||||
|
@ -0,0 +1,18 @@
|
||||
package io.dataease.extensions.datasource.dto;
|
||||
|
||||
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
|
||||
import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
|
||||
import lombok.Data;
|
||||
|
||||
import java.io.Serializable;
|
||||
|
||||
/**
|
||||
* @Author Junjun
|
||||
*/
|
||||
@Data
|
||||
public class CalParam implements Serializable {
|
||||
@JsonSerialize(using = ToStringSerializer.class)
|
||||
private String id;
|
||||
private String name;
|
||||
private String value;
|
||||
}
|
@ -5,6 +5,7 @@ import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
|
||||
import lombok.Data;
|
||||
|
||||
import java.io.Serializable;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* @Author Junjun
|
||||
@ -126,4 +127,9 @@ public class DatasetTableFieldDTO implements Serializable {
|
||||
* 是否脱敏
|
||||
*/
|
||||
private Boolean desensitized;
|
||||
|
||||
/**
|
||||
* 计算字段参数
|
||||
*/
|
||||
private List<CalParam> params;
|
||||
}
|
||||
|
@ -3,6 +3,7 @@ package io.dataease.extensions.view.dto;
|
||||
import com.fasterxml.jackson.annotation.JsonProperty;
|
||||
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
|
||||
import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
|
||||
import io.dataease.extensions.datasource.dto.CalParam;
|
||||
import io.dataease.extensions.view.filter.FilterTreeObj;
|
||||
import lombok.Data;
|
||||
|
||||
@ -218,4 +219,9 @@ public class ChartViewBaseDTO implements Serializable {
|
||||
*/
|
||||
private List<ChartViewFieldDTO> flowMapEndName;
|
||||
|
||||
/**
|
||||
* 计算字段参数值
|
||||
*/
|
||||
private List<CalParam> calParams;
|
||||
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user