From 664d7ee98f3787fbc7666143a701767728ab1ec6 Mon Sep 17 00:00:00 2001 From: junjun Date: Fri, 7 Feb 2025 14:43:01 +0800 Subject: [PATCH] =?UTF-8?q?feat(=E6=95=B0=E6=8D=AE=E9=9B=86):=20=E6=95=B0?= =?UTF-8?q?=E6=8D=AE=E9=9B=86=E5=A2=9E=E5=8A=A0=E5=88=86=E7=BB=84=E5=AD=97?= =?UTF-8?q?=E6=AE=B5=E5=8A=9F=E8=83=BD=E6=9E=9A=E4=B8=BE=E5=80=BC=E6=8E=A5?= =?UTF-8?q?=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dataset/manage/DatasetDataManage.java | 111 ++++++++++++++++++ .../dataset/server/DatasetDataServer.java | 11 ++ .../dataease/api/dataset/DatasetDataApi.java | 4 + 3 files changed, 126 insertions(+) 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 5ab668c365..943aa89fed 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 @@ -538,6 +538,117 @@ public class DatasetDataManage { } } + public List getFieldEnumDs(DatasetTableFieldDTO field) throws Exception { + // 根据前端传的查询组件field ids,获取所有字段枚举值并去重合并 +// List> list = new ArrayList<>(); + if (field == null) { + DEException.throwException(Translator.get("i18n_no_field")); + } + List allFields = new ArrayList<>(); + // 根据图表计算字段,获取数据集 + Long datasetGroupId = field.getDatasetGroupId(); + + DatasetGroupInfoDTO datasetGroupInfoDTO = datasetGroupManage.getDatasetGroupInfoDTO(datasetGroupId, null); + + Map sqlMap = datasetSQLManage.getUnionSQLForEdit(datasetGroupInfoDTO, new ChartExtRequest()); + String sql = (String) sqlMap.get("sql"); + + allFields.addAll(datasetGroupInfoDTO.getAllFields()); + + Map dsMap = (Map) sqlMap.get("dsMap"); + boolean crossDs = Utils.isCrossDs(dsMap); + if (!crossDs) { + sql = Utils.replaceSchemaAlias(sql, dsMap); + } + + // build query sql + SQLMeta sqlMeta = new SQLMeta(); + Table2SQLObj.table2sqlobj(sqlMeta, null, "(" + sql + ")", crossDs); + + // 获取allFields + List fields = Collections.singletonList(field); + 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()); + } + + Provider provider; + if (crossDs) { + provider = ProviderFactory.getDefaultProvider(); + } else { + provider = ProviderFactory.getProvider(dsList.getFirst()); + } + + String dsType = null; + if (dsMap != null && dsMap.entrySet().iterator().hasNext()) { + Map.Entry next = dsMap.entrySet().iterator().next(); + dsType = next.getValue().getType(); + } + + Field2SQLObj.field2sqlObj(sqlMeta, fields, allFields, crossDs, dsMap, Utils.getParams(allFields), null, pluginManage); + WhereTree2Str.transFilterTrees(sqlMeta, rowPermissionsTree, allFields, crossDs, dsMap, Utils.getParams(allFields), null, pluginManage); + Order2SQLObj.getOrders(sqlMeta, datasetGroupInfoDTO.getSortFields(), allFields, crossDs, dsMap, Utils.getParams(allFields), null, pluginManage); + String querySQL; + querySQL = SQLProvider.createQuerySQL(sqlMeta, false, needOrder, !StringUtils.equalsIgnoreCase(dsType, "es")); + querySQL = provider.rebuildSQL(querySQL, sqlMeta, crossDs, dsMap); + logger.debug("calcite data enum sql: " + querySQL); + + // 通过数据源请求数据 + // 调用数据源的calcite获得data + DatasourceRequest datasourceRequest = new DatasourceRequest(); + datasourceRequest.setQuery(querySQL); + datasourceRequest.setDsList(dsMap); + + Map data = provider.fetchResultField(datasourceRequest); + List dataList = (List) data.get("data"); + dataList = dataList.stream().filter(row -> { + boolean hasEmpty = false; + for (String s : row) { + if (StringUtils.isBlank(s)) { + hasEmpty = true; + break; + } + } + return !hasEmpty; + }).toList(); + List previewData = new ArrayList<>(); + if (ObjectUtils.isNotEmpty(dataList)) { + List tmpData = dataList.stream().map(ele -> (ObjectUtils.isNotEmpty(ele) && ele.length > 0) ? ele[0] : null).collect(Collectors.toList()); + if (!CollectionUtils.isEmpty(tmpData)) { + for (int i = 0; i < tmpData.size(); i++) { + String val = tmpData.get(i); + if (field.getDeType() == 3 && StringUtils.containsIgnoreCase(val, "E")) { + BigDecimal bigDecimal = new BigDecimal(val); + val = String.format("%.8f", bigDecimal); + tmpData.set(i, val); + } + } + if (desensitizationList.keySet().contains(field.getDataeaseName())) { + for (int i = 0; i < tmpData.size(); i++) { + previewData.add(ChartDataBuild.desensitizationValue(desensitizationList.get(field.getDataeaseName()), tmpData.get(i))); + } + } else { + previewData = tmpData; + } + } + } + return previewData; + } + public List getFieldEnum(MultFieldValuesRequest multFieldValuesRequest) throws Exception { // 根据前端传的查询组件field ids,获取所有字段枚举值并去重合并 List> list = new ArrayList<>(); 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 e1ce9ff994..17dd612863 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 @@ -46,6 +46,17 @@ public class DatasetDataServer implements DatasetDataApi { return datasetDataManage.previewSql(dto); } + @Override + public List getFieldEnumDs(DatasetTableFieldDTO field) throws Exception { + try { + return datasetDataManage.getFieldEnumDs(field); + } catch (Exception e) { + e.printStackTrace(); + LogUtil.error(e); + return null; + } + } + @Override public List getFieldEnum(MultFieldValuesRequest multFieldValuesRequest) { try { 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 51d4af9221..3bc05b6ca2 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 @@ -38,6 +38,10 @@ public interface DatasetDataApi { @PostMapping("previewSqlCheck") Map previewSqlCheck(@RequestBody PreviewSqlDTO dto) throws Exception; + @Operation(summary = "数据集获取字段枚举值") + @PostMapping("enumValueDs") + List getFieldEnumDs(@RequestBody DatasetTableFieldDTO field) throws Exception; + @Operation(summary = "获取字段枚举值") @PostMapping("enumValue") List getFieldEnum(@RequestBody MultFieldValuesRequest multFieldValuesRequest) throws Exception;