diff --git a/core/core-backend/src/main/java/io/dataease/dataset/manage/DatasetDataManage.java b/core/core-backend/src/main/java/io/dataease/dataset/manage/DatasetDataManage.java index b49a509a1b..2737028633 100644 --- a/core/core-backend/src/main/java/io/dataease/dataset/manage/DatasetDataManage.java +++ b/core/core-backend/src/main/java/io/dataease/dataset/manage/DatasetDataManage.java @@ -2,8 +2,10 @@ package io.dataease.dataset.manage; import io.dataease.api.chart.dto.ChartViewDTO; import io.dataease.api.chart.dto.ColumnPermissionItem; +import io.dataease.api.chart.dto.DeSortField; import io.dataease.api.chart.request.ChartExtRequest; import io.dataease.api.dataset.dto.DatasetTableDTO; +import io.dataease.api.dataset.dto.EnumValueRequest; import io.dataease.api.dataset.dto.PreviewSqlDTO; import io.dataease.api.dataset.dto.SqlLogDTO; import io.dataease.api.dataset.union.DatasetGroupInfoDTO; @@ -29,7 +31,6 @@ import io.dataease.dto.dataset.DatasetTableFieldDTO; import io.dataease.engine.constant.ExtFieldConstant; import io.dataease.engine.constant.SQLConstants; import io.dataease.engine.constant.SqlPlaceholderConstants; -import io.dataease.engine.func.FunctionConstant; import io.dataease.engine.sql.SQLProvider; import io.dataease.engine.trans.Field2SQLObj; import io.dataease.engine.trans.Order2SQLObj; @@ -436,18 +437,6 @@ public class DatasetDataManage { // build query sql SQLMeta sqlMeta = new SQLMeta(); Table2SQLObj.table2sqlobj(sqlMeta, null, "(" + sql + ")", crossDs); - // 计算字段先完成内容替换 - if (Objects.equals(field.getExtField(), ExtFieldConstant.EXT_CALC)) { - String originField = Utils.calcFieldRegex(field.getOriginName(), sqlMeta.getTable(), allFields, crossDs, dsMap); - // 此处是数据集预览,获取数据库原始字段枚举值等操作使用,如果遇到聚合函数则将originField设置为null - for (String func : FunctionConstant.AGG_FUNC) { - if (Utils.matchFunction(func, originField)) { - originField = null; - break; - } - } - field.setOriginName(originField); - } // 获取allFields List fields = Collections.singletonList(field); @@ -507,4 +496,127 @@ public class DatasetDataManage { } return result.stream().toList(); } + + public List> getFieldEnumObj(EnumValueRequest request) throws Exception { + List ids = new ArrayList<>(); + if (ObjectUtils.isNotEmpty(request.getQueryId())) { + ids.add(request.getQueryId()); + } + if (ObjectUtils.isNotEmpty(request.getDisplayId())) { + ids.add(request.getDisplayId()); + } + + if (CollectionUtils.isEmpty(ids)) { + return Collections.emptyList(); + } + if (ids.size() == 2 && Objects.equals(ids.get(0), ids.get(1))) { + ids.remove(1); + } + + SQLMeta sqlMeta = new SQLMeta(); + DatasetGroupInfoDTO datasetGroupInfoDTO = null; + List fields = new ArrayList<>(); + Map sqlMap = null; + boolean crossDs = false; + Map dsMap = null; + + for (Long id : ids) { + DatasetTableFieldDTO field = datasetTableFieldManage.selectById(id); + if (field == null) { + DEException.throwException(Translator.get("i18n_no_field")); + } + List allFields = new ArrayList<>(); + // 根据图表计算字段,获取数据集 + Long datasetGroupId; + if (field.getDatasetGroupId() == null && field.getChartId() != null) { + ChartViewDTO chart = chartViewManege.getChart(field.getChartId()); + datasetGroupId = chart.getTableId(); + allFields.addAll(datasetTableFieldManage.getChartCalcFields(field.getChartId())); + } else { + datasetGroupId = field.getDatasetGroupId(); + } + datasetGroupInfoDTO = datasetGroupManage.get(datasetGroupId, null); + + sqlMap = datasetSQLManage.getUnionSQLForEdit(datasetGroupInfoDTO, new ChartExtRequest()); + String sql = (String) sqlMap.get("sql"); + + allFields.addAll(datasetGroupInfoDTO.getAllFields()); + + dsMap = (Map) sqlMap.get("dsMap"); + crossDs = Utils.isCrossDs(dsMap); + if (!crossDs) { + sql = Utils.replaceSchemaAlias(sql, dsMap); + } + + // build query sql + Table2SQLObj.table2sqlobj(sqlMeta, null, "(" + sql + ")", crossDs); + fields.add(field); + } + + // 获取allFields + Map desensitizationList = new HashMap<>(); + fields = permissionManage.filterColumnPermissions(fields, desensitizationList, datasetGroupInfoDTO.getId(), null); + if (ObjectUtils.isEmpty(fields)) { + DEException.throwException(Translator.get("i18n_no_column_permission")); + } + buildFieldName(sqlMap, fields); + + List dsList = new ArrayList<>(); + for (Map.Entry next : dsMap.entrySet()) { + dsList.add(next.getValue().getType()); + } + boolean needOrder = Utils.isNeedOrder(dsList); + + List rowPermissionsTree = new ArrayList<>(); + TokenUserBO user = AuthUtils.getUser(); + if (user != null) { + rowPermissionsTree = permissionManage.getRowPermissionsTree(datasetGroupInfoDTO.getId(), user.getUserId()); + } + + // 排序 + if (ObjectUtils.isNotEmpty(request.getSortId())) { + DatasetTableFieldDTO field = datasetTableFieldManage.selectById(request.getSortId()); + if (field == null) { + DEException.throwException(Translator.get("i18n_no_field")); + } + DeSortField deSortField = new DeSortField(); + BeanUtils.copyBean(deSortField, field); + deSortField.setOrderDirection(request.getSort()); + datasetGroupInfoDTO.setSortFields(Collections.singletonList(deSortField)); + } + + Field2SQLObj.field2sqlObj(sqlMeta, fields, crossDs, dsMap); + WhereTree2Str.transFilterTrees(sqlMeta, rowPermissionsTree, fields, crossDs, dsMap); + Order2SQLObj.getOrders(sqlMeta, fields, datasetGroupInfoDTO.getSortFields(), crossDs, dsMap); + String querySQL = SQLProvider.createQuerySQLWithLimit(sqlMeta, false, needOrder, true, 0, 1000); + querySQL = SqlUtils.rebuildSQL(querySQL, sqlMeta, crossDs, dsMap); + logger.info("calcite data enum sql: " + querySQL); + + // 通过数据源请求数据 + // 调用数据源的calcite获得data + DatasourceRequest datasourceRequest = new DatasourceRequest(); + datasourceRequest.setQuery(querySQL); + datasourceRequest.setDsList(dsMap); + Map data = calciteProvider.fetchResultField(datasourceRequest); + List dataList = (List) data.get("data"); + List> previewData = new ArrayList<>(); + + if (ObjectUtils.isNotEmpty(dataList)) { + for (String[] ele : dataList) { + Map map = new LinkedHashMap<>(); + for (int i = 0; i < ele.length; i++) { + String val = ele[i]; + DatasetTableFieldDTO field = fields.get(i); + if (desensitizationList.containsKey(field.getDataeaseName())) { + String str = ChartDataBuild.desensitizationValue(desensitizationList.get(field.getDataeaseName()), val); + map.put(field.getId() + "", str); + } else { + map.put(field.getId() + "", val); + } + } + previewData.add(map); + } + } + return previewData; + } } diff --git a/core/core-backend/src/main/java/io/dataease/dataset/server/DatasetDataServer.java b/core/core-backend/src/main/java/io/dataease/dataset/server/DatasetDataServer.java index eb87de325b..e9430a3325 100644 --- a/core/core-backend/src/main/java/io/dataease/dataset/server/DatasetDataServer.java +++ b/core/core-backend/src/main/java/io/dataease/dataset/server/DatasetDataServer.java @@ -2,6 +2,7 @@ package io.dataease.dataset.server; import io.dataease.api.dataset.DatasetDataApi; import io.dataease.api.dataset.dto.DatasetTableDTO; +import io.dataease.api.dataset.dto.EnumValueRequest; import io.dataease.api.dataset.dto.PreviewSqlDTO; import io.dataease.api.dataset.union.DatasetGroupInfoDTO; import io.dataease.dataset.manage.DatasetDataManage; @@ -45,14 +46,24 @@ public class DatasetDataServer implements DatasetDataApi { @Override public List getFieldEnum(List ids) { - try{ - return datasetDataManage.getFieldEnum(ids); - }catch (Exception e){ + try { + return datasetDataManage.getFieldEnum(ids); + } catch (Exception e) { e.printStackTrace(); LogUtil.error(e); return null; } + } + @Override + public List> getFieldEnumObj(EnumValueRequest request) throws Exception { + try { + return datasetDataManage.getFieldEnumObj(request); + } catch (Exception e) { + e.printStackTrace(); + LogUtil.error(e); + return null; + } } @Override diff --git a/sdk/api/api-base/src/main/java/io/dataease/api/dataset/DatasetDataApi.java b/sdk/api/api-base/src/main/java/io/dataease/api/dataset/DatasetDataApi.java index 6929840a40..61d9198112 100644 --- a/sdk/api/api-base/src/main/java/io/dataease/api/dataset/DatasetDataApi.java +++ b/sdk/api/api-base/src/main/java/io/dataease/api/dataset/DatasetDataApi.java @@ -2,6 +2,7 @@ package io.dataease.api.dataset; import com.github.xiaoymin.knife4j.annotations.ApiSupport; import io.dataease.api.dataset.dto.DatasetTableDTO; +import io.dataease.api.dataset.dto.EnumValueRequest; import io.dataease.api.dataset.dto.PreviewSqlDTO; import io.dataease.api.dataset.union.DatasetGroupInfoDTO; import io.dataease.dto.dataset.DatasetTableFieldDTO; @@ -39,6 +40,10 @@ public interface DatasetDataApi { @PostMapping("enumValue") List getFieldEnum(@RequestBody List ids) throws Exception; + @Operation(summary = "获取字段枚举值(多字段)") + @PostMapping("enumValueObj") + List> getFieldEnumObj(@RequestBody EnumValueRequest request) throws Exception; + @Operation(summary = "获取数据集总数据量", hidden = true) @PostMapping("getDatasetCount") Long getDatasetCount(@RequestBody DatasetGroupInfoDTO datasetGroupInfoDTO) throws Exception; diff --git a/sdk/api/api-base/src/main/java/io/dataease/api/dataset/dto/EnumValueRequest.java b/sdk/api/api-base/src/main/java/io/dataease/api/dataset/dto/EnumValueRequest.java new file mode 100644 index 0000000000..25dc8e2598 --- /dev/null +++ b/sdk/api/api-base/src/main/java/io/dataease/api/dataset/dto/EnumValueRequest.java @@ -0,0 +1,14 @@ +package io.dataease.api.dataset.dto; + +import lombok.Data; + +/** + * @Author Junjun + */ +@Data +public class EnumValueRequest { + private Long queryId; + private Long displayId; + private Long sortId; + private String sort; +} diff --git a/sdk/api/api-base/src/main/java/io/dataease/api/dataset/dto/Sorted.java b/sdk/api/api-base/src/main/java/io/dataease/api/dataset/dto/Sorted.java new file mode 100644 index 0000000000..0575b452ad --- /dev/null +++ b/sdk/api/api-base/src/main/java/io/dataease/api/dataset/dto/Sorted.java @@ -0,0 +1,9 @@ +package io.dataease.api.dataset.dto; + +/** + * @Author Junjun + */ +public class Sorted { + private Long id; + private String sort; +}