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 com.fasterxml.jackson.core.type.TypeReference;
|
||||||
import io.dataease.api.dataset.dto.SqlVariableDetails;
|
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.exception.DEException;
|
||||||
import io.dataease.i18n.Translator;
|
import io.dataease.i18n.Translator;
|
||||||
import io.dataease.utils.JsonUtil;
|
import io.dataease.utils.JsonUtil;
|
||||||
@ -17,6 +19,7 @@ import org.checkerframework.checker.nullness.qual.Nullable;
|
|||||||
import java.text.SimpleDateFormat;
|
import java.text.SimpleDateFormat;
|
||||||
import java.util.Date;
|
import java.util.Date;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
import java.util.regex.Matcher;
|
import java.util.regex.Matcher;
|
||||||
import java.util.regex.Pattern;
|
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)) {
|
if (StringUtils.isEmpty(sql)) {
|
||||||
DEException.throwException(Translator.get("i18n_sql_not_empty"));
|
DEException.throwException(Translator.get("i18n_sql_not_empty"));
|
||||||
}
|
}
|
||||||
@ -165,6 +168,23 @@ public class SqlparserUtils {
|
|||||||
|
|
||||||
try {
|
try {
|
||||||
sql = removeVariables(sql);
|
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) {
|
} catch (Exception e) {
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
}
|
}
|
||||||
|
@ -104,7 +104,7 @@ public class DatasetDataManage {
|
|||||||
sql = SqlUtils.transSqlDialect(sql, datasourceRequest.getDsList());
|
sql = SqlUtils.transSqlDialect(sql, datasourceRequest.getDsList());
|
||||||
} else {
|
} else {
|
||||||
// parser sql params and replace default value
|
// 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
|
// add sql table schema
|
||||||
|
|
||||||
sql = SQLUtils.buildOriginPreviewSql(SqlPlaceholderConstants.TABLE_PLACEHOLDER, 0, 0);
|
sql = SQLUtils.buildOriginPreviewSql(SqlPlaceholderConstants.TABLE_PLACEHOLDER, 0, 0);
|
||||||
@ -302,13 +302,15 @@ public class DatasetDataManage {
|
|||||||
}
|
}
|
||||||
String alias = String.format(SQLConstants.SCHEMA, datasourceSchemaDTO.getId());
|
String alias = String.format(SQLConstants.SCHEMA, datasourceSchemaDTO.getId());
|
||||||
datasourceSchemaDTO.setSchemaAlias(alias);
|
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<>();
|
Map<Long, DatasourceSchemaDTO> dsMap = new LinkedHashMap<>();
|
||||||
dsMap.put(datasourceSchemaDTO.getId(), datasourceSchemaDTO);
|
dsMap.put(datasourceSchemaDTO.getId(), datasourceSchemaDTO);
|
||||||
DatasourceRequest datasourceRequest = new DatasourceRequest();
|
DatasourceRequest datasourceRequest = new DatasourceRequest();
|
||||||
datasourceRequest.setDsList(dsMap);
|
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
|
// sql 作为临时表,外层加上limit
|
||||||
String sql;
|
String sql;
|
||||||
if (Utils.isNeedOrder(List.of(datasourceSchemaDTO.getType()))) {
|
if (Utils.isNeedOrder(List.of(datasourceSchemaDTO.getType()))) {
|
||||||
|
@ -36,6 +36,8 @@ import org.springframework.util.CollectionUtils;
|
|||||||
|
|
||||||
import java.text.MessageFormat;
|
import java.text.MessageFormat;
|
||||||
import java.util.*;
|
import java.util.*;
|
||||||
|
import java.util.regex.Matcher;
|
||||||
|
import java.util.regex.Pattern;
|
||||||
import java.util.stream.Collectors;
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -97,7 +99,7 @@ public class DatasetSQLManage {
|
|||||||
Set<Long> allDs = getAllDs(union);
|
Set<Long> allDs = getAllDs(union);
|
||||||
boolean isCross = allDs.size() > 1;
|
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++) {
|
for (int i = 0; i < union.size(); i++) {
|
||||||
UnionDTO unionDTO = union.get(i);
|
UnionDTO unionDTO = union.get(i);
|
||||||
@ -110,7 +112,7 @@ public class DatasetSQLManage {
|
|||||||
} else {
|
} else {
|
||||||
schema = putObj2Map(dsMap, datasetTable);
|
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();
|
List<DatasetTableFieldDTO> fields = unionDTO.getCurrentDsFields();
|
||||||
@ -273,7 +275,7 @@ public class DatasetSQLManage {
|
|||||||
} else {
|
} else {
|
||||||
schema = putObj2Map(dsMap, datasetTable);
|
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();
|
List<DatasetTableFieldDTO> fields = unionDTO.getCurrentDsFields();
|
||||||
fields = fields.stream().filter(DatasetTableFieldDTO::getChecked).collect(Collectors.toList());
|
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;
|
SQLObj tableObj;
|
||||||
String tableAlias = String.format(SQLConstants.TABLE_ALIAS_PREFIX, index);
|
String tableAlias = String.format(SQLConstants.TABLE_ALIAS_PREFIX, index);
|
||||||
if (StringUtils.equalsIgnoreCase(currentDs.getType(), DatasetTableTypeConstants.DATASET_TABLE_DB)) {
|
if (StringUtils.equalsIgnoreCase(currentDs.getType(), DatasetTableTypeConstants.DATASET_TABLE_DB)) {
|
||||||
tableObj = SQLObj.builder().tableSchema(tableSchema).tableName(infoDTO.getTable()).tableAlias(tableAlias).build();
|
tableObj = SQLObj.builder().tableSchema(tableSchema).tableName(infoDTO.getTable()).tableAlias(tableAlias).build();
|
||||||
} else if (StringUtils.equalsIgnoreCase(currentDs.getType(), DatasetTableTypeConstants.DATASET_TABLE_SQL)) {
|
} else if (StringUtils.equalsIgnoreCase(currentDs.getType(), DatasetTableTypeConstants.DATASET_TABLE_SQL)) {
|
||||||
// parser sql params and replace default value
|
// 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
|
// add table schema
|
||||||
if (isCross) {
|
if (isCross) {
|
||||||
sql = SqlUtils.addSchema(sql, tableSchema);
|
sql = SqlUtils.addSchema(sql, tableSchema);
|
||||||
|
Loading…
Reference in New Issue
Block a user