forked from github/dataease
refactor: 单一数据源的数据集、图表使用对应数据库语法和函数
This commit is contained in:
parent
aec7614e58
commit
01fbfa418b
@ -2,6 +2,8 @@ package io.dataease.commons.utils;
|
||||
|
||||
import com.fasterxml.jackson.core.type.TypeReference;
|
||||
import io.dataease.api.dataset.dto.SqlVariableDetails;
|
||||
import io.dataease.api.ds.vo.DatasourceConfiguration;
|
||||
import io.dataease.dataset.dto.DatasourceSchemaDTO;
|
||||
import io.dataease.exception.DEException;
|
||||
import io.dataease.i18n.Translator;
|
||||
import io.dataease.utils.JsonUtil;
|
||||
@ -17,6 +19,7 @@ import org.checkerframework.checker.nullness.qual.Nullable;
|
||||
import java.text.SimpleDateFormat;
|
||||
import java.util.Date;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.regex.Matcher;
|
||||
import java.util.regex.Pattern;
|
||||
|
||||
@ -117,7 +120,7 @@ public class SqlparserUtils {
|
||||
};
|
||||
}
|
||||
|
||||
public static String handleVariableDefaultValue(String sql, String sqlVariableDetails, boolean isEdit, boolean isFromDataSet, List<SqlVariableDetails> parameters) {
|
||||
public static String handleVariableDefaultValue(String sql, String sqlVariableDetails, boolean isEdit, boolean isFromDataSet, List<SqlVariableDetails> parameters, boolean isCross, Map<Long, DatasourceSchemaDTO> dsMap) {
|
||||
if (StringUtils.isEmpty(sql)) {
|
||||
DEException.throwException(Translator.get("i18n_sql_not_empty"));
|
||||
}
|
||||
@ -165,6 +168,23 @@ public class SqlparserUtils {
|
||||
|
||||
try {
|
||||
sql = removeVariables(sql);
|
||||
|
||||
// replace keyword '`'
|
||||
if (!isCross) {
|
||||
Map.Entry<Long, DatasourceSchemaDTO> next = dsMap.entrySet().iterator().next();
|
||||
DatasourceSchemaDTO value = next.getValue();
|
||||
DatasourceConfiguration.DatasourceType datasourceType = DatasourceConfiguration.DatasourceType.valueOf(value.getType());
|
||||
String prefix = datasourceType.getPrefix();
|
||||
String suffix = datasourceType.getSuffix();
|
||||
|
||||
Pattern pattern = Pattern.compile("(`.*?`)");
|
||||
Matcher matcher = pattern.matcher(sql);
|
||||
while (matcher.find()) {
|
||||
String group = matcher.group();
|
||||
String info = group.substring(1, group.length() - 1);
|
||||
sql = sql.replaceAll(group, prefix + info + suffix);
|
||||
}
|
||||
}
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
|
@ -104,7 +104,7 @@ public class DatasetDataManage {
|
||||
sql = SqlUtils.transSqlDialect(sql, datasourceRequest.getDsList());
|
||||
} else {
|
||||
// parser sql params and replace default value
|
||||
String originSql = SqlparserUtils.handleVariableDefaultValue(new String(Base64.getDecoder().decode(tableInfoDTO.getSql())), datasetTableDTO.getSqlVariableDetails(), false, false, null);
|
||||
String originSql = SqlparserUtils.handleVariableDefaultValue(new String(Base64.getDecoder().decode(tableInfoDTO.getSql())), datasetTableDTO.getSqlVariableDetails(), false, false, null, false, datasourceRequest.getDsList());
|
||||
// add sql table schema
|
||||
|
||||
sql = SQLUtils.buildOriginPreviewSql(SqlPlaceholderConstants.TABLE_PLACEHOLDER, 0, 0);
|
||||
@ -302,13 +302,15 @@ public class DatasetDataManage {
|
||||
}
|
||||
String alias = String.format(SQLConstants.SCHEMA, datasourceSchemaDTO.getId());
|
||||
datasourceSchemaDTO.setSchemaAlias(alias);
|
||||
// parser sql params and replace default value
|
||||
String originSql = SqlparserUtils.handleVariableDefaultValue(datasetSQLManage.subPrefixSuffixChar(new String(Base64.getDecoder().decode(dto.getSql()))), dto.getSqlVariableDetails(), true, true, null);
|
||||
|
||||
Map<Long, DatasourceSchemaDTO> dsMap = new LinkedHashMap<>();
|
||||
dsMap.put(datasourceSchemaDTO.getId(), datasourceSchemaDTO);
|
||||
DatasourceRequest datasourceRequest = new DatasourceRequest();
|
||||
datasourceRequest.setDsList(dsMap);
|
||||
|
||||
// parser sql params and replace default value
|
||||
String originSql = SqlparserUtils.handleVariableDefaultValue(datasetSQLManage.subPrefixSuffixChar(new String(Base64.getDecoder().decode(dto.getSql()))), dto.getSqlVariableDetails(), true, true, null, false, dsMap);
|
||||
|
||||
// sql 作为临时表,外层加上limit
|
||||
String sql;
|
||||
if (Utils.isNeedOrder(List.of(datasourceSchemaDTO.getType()))) {
|
||||
|
@ -36,6 +36,8 @@ import org.springframework.util.CollectionUtils;
|
||||
|
||||
import java.text.MessageFormat;
|
||||
import java.util.*;
|
||||
import java.util.regex.Matcher;
|
||||
import java.util.regex.Pattern;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
/**
|
||||
@ -97,7 +99,7 @@ public class DatasetSQLManage {
|
||||
Set<Long> allDs = getAllDs(union);
|
||||
boolean isCross = allDs.size() > 1;
|
||||
|
||||
SQLObj tableName = getUnionTable(currentDs, infoDTO, tableSchema, 0, filterParameters(chartExtRequest, currentDs.getId()), chartExtRequest == null, isCross);
|
||||
SQLObj tableName = getUnionTable(currentDs, infoDTO, tableSchema, 0, filterParameters(chartExtRequest, currentDs.getId()), chartExtRequest == null, isCross, dsMap);
|
||||
|
||||
for (int i = 0; i < union.size(); i++) {
|
||||
UnionDTO unionDTO = union.get(i);
|
||||
@ -110,7 +112,7 @@ public class DatasetSQLManage {
|
||||
} else {
|
||||
schema = putObj2Map(dsMap, datasetTable);
|
||||
}
|
||||
SQLObj table = getUnionTable(datasetTable, tableInfo, schema, i, filterParameters(chartExtRequest, currentDs.getId()), chartExtRequest == null, isCross);
|
||||
SQLObj table = getUnionTable(datasetTable, tableInfo, schema, i, filterParameters(chartExtRequest, currentDs.getId()), chartExtRequest == null, isCross, dsMap);
|
||||
|
||||
// 获取前端传过来选中的字段
|
||||
List<DatasetTableFieldDTO> fields = unionDTO.getCurrentDsFields();
|
||||
@ -273,7 +275,7 @@ public class DatasetSQLManage {
|
||||
} else {
|
||||
schema = putObj2Map(dsMap, datasetTable);
|
||||
}
|
||||
SQLObj table = getUnionTable(datasetTable, tableInfo, schema, index, filterParameters(chartExtRequest, datasetTable.getId()), chartExtRequest == null, isCross);
|
||||
SQLObj table = getUnionTable(datasetTable, tableInfo, schema, index, filterParameters(chartExtRequest, datasetTable.getId()), chartExtRequest == null, isCross, dsMap);
|
||||
|
||||
List<DatasetTableFieldDTO> fields = unionDTO.getCurrentDsFields();
|
||||
fields = fields.stream().filter(DatasetTableFieldDTO::getChecked).collect(Collectors.toList());
|
||||
@ -384,14 +386,14 @@ public class DatasetSQLManage {
|
||||
}
|
||||
}
|
||||
|
||||
private SQLObj getUnionTable(DatasetTableDTO currentDs, DatasetTableInfoDTO infoDTO, String tableSchema, int index, List<SqlVariableDetails> parameters, boolean isFromDataSet, boolean isCross) {
|
||||
private SQLObj getUnionTable(DatasetTableDTO currentDs, DatasetTableInfoDTO infoDTO, String tableSchema, int index, List<SqlVariableDetails> parameters, boolean isFromDataSet, boolean isCross, Map<Long, DatasourceSchemaDTO> dsMap) {
|
||||
SQLObj tableObj;
|
||||
String tableAlias = String.format(SQLConstants.TABLE_ALIAS_PREFIX, index);
|
||||
if (StringUtils.equalsIgnoreCase(currentDs.getType(), DatasetTableTypeConstants.DATASET_TABLE_DB)) {
|
||||
tableObj = SQLObj.builder().tableSchema(tableSchema).tableName(infoDTO.getTable()).tableAlias(tableAlias).build();
|
||||
} else if (StringUtils.equalsIgnoreCase(currentDs.getType(), DatasetTableTypeConstants.DATASET_TABLE_SQL)) {
|
||||
// parser sql params and replace default value
|
||||
String sql = SqlparserUtils.handleVariableDefaultValue(new String(Base64.getDecoder().decode(infoDTO.getSql())), currentDs.getSqlVariableDetails(), false, isFromDataSet, parameters);
|
||||
String sql = SqlparserUtils.handleVariableDefaultValue(new String(Base64.getDecoder().decode(infoDTO.getSql())), currentDs.getSqlVariableDetails(), false, isFromDataSet, parameters, isCross, dsMap);
|
||||
// add table schema
|
||||
if (isCross) {
|
||||
sql = SqlUtils.addSchema(sql, tableSchema);
|
||||
|
Loading…
Reference in New Issue
Block a user