From 2c78e6c1c6b0c53ab3bc62577df8f904f7ad2d8f Mon Sep 17 00:00:00 2001 From: junjun Date: Wed, 10 Apr 2024 10:53:42 +0800 Subject: [PATCH] =?UTF-8?q?refactor:=20=E5=8D=95=E4=B8=80=E6=95=B0?= =?UTF-8?q?=E6=8D=AE=E6=BA=90=E7=9A=84=E6=95=B0=E6=8D=AE=E9=9B=86=E3=80=81?= =?UTF-8?q?=E5=9B=BE=E8=A1=A8=E4=BD=BF=E7=94=A8=E5=AF=B9=E5=BA=94=E6=95=B0?= =?UTF-8?q?=E6=8D=AE=E5=BA=93=E8=AF=AD=E6=B3=95=E5=92=8C=E5=87=BD=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../chart/manage/ChartDataManage.java | 42 +++++++++---------- .../chart/manage/ChartViewManege.java | 2 +- .../dataset/manage/DatasetDataManage.java | 14 +++---- .../engine/trans/CustomWhere2Str.java | 5 ++- .../engine/trans/Dimension2SQLObj.java | 5 ++- .../dataease/engine/trans/ExtWhere2Str.java | 5 ++- .../dataease/engine/trans/Field2SQLObj.java | 7 ++-- .../dataease/engine/trans/Order2SQLObj.java | 12 +++--- .../dataease/engine/trans/Quota2SQLObj.java | 7 ++-- .../dataease/engine/trans/WhereTree2Str.java | 15 +++---- .../java/io/dataease/engine/utils/Utils.java | 23 +++++++--- 11 files changed, 78 insertions(+), 59 deletions(-) diff --git a/core/core-backend/src/main/java/io/dataease/chart/manage/ChartDataManage.java b/core/core-backend/src/main/java/io/dataease/chart/manage/ChartDataManage.java index 6a254d68e6..634388575c 100644 --- a/core/core-backend/src/main/java/io/dataease/chart/manage/ChartDataManage.java +++ b/core/core-backend/src/main/java/io/dataease/chart/manage/ChartDataManage.java @@ -500,29 +500,29 @@ public class ChartDataManage { SQLMeta sqlMeta = new SQLMeta(); Table2SQLObj.table2sqlobj(sqlMeta, null, "(" + sql + ")", crossDs); - CustomWhere2Str.customWhere2sqlObj(sqlMeta, fieldCustomFilter, transFields(allFields)); - ExtWhere2Str.extWhere2sqlOjb(sqlMeta, extFilterList, transFields(allFields)); - WhereTree2Str.transFilterTrees(sqlMeta, rowPermissionsTree, transFields(allFields)); + CustomWhere2Str.customWhere2sqlObj(sqlMeta, fieldCustomFilter, transFields(allFields), crossDs, dsMap); + ExtWhere2Str.extWhere2sqlOjb(sqlMeta, extFilterList, transFields(allFields), crossDs, dsMap); + WhereTree2Str.transFilterTrees(sqlMeta, rowPermissionsTree, transFields(allFields), crossDs, dsMap); if (StringUtils.equalsAnyIgnoreCase(view.getType(), "indicator", "gauge", "liquid")) { - Quota2SQLObj.quota2sqlObj(sqlMeta, yAxis, transFields(allFields)); + Quota2SQLObj.quota2sqlObj(sqlMeta, yAxis, transFields(allFields), crossDs, dsMap); querySql = SQLProvider.createQuerySQL(sqlMeta, true, needOrder, view); } else if (StringUtils.containsIgnoreCase(view.getType(), "stack")) { List xFields = new ArrayList<>(); xFields.addAll(xAxis); xFields.addAll(extStack); - Dimension2SQLObj.dimension2sqlObj(sqlMeta, xFields, transFields(allFields)); - Quota2SQLObj.quota2sqlObj(sqlMeta, yAxis, transFields(allFields)); + Dimension2SQLObj.dimension2sqlObj(sqlMeta, xFields, transFields(allFields), crossDs, dsMap); + Quota2SQLObj.quota2sqlObj(sqlMeta, yAxis, transFields(allFields), crossDs, dsMap); querySql = SQLProvider.createQuerySQL(sqlMeta, true, needOrder, view); } else if (StringUtils.containsIgnoreCase(view.getType(), "scatter")) { List yFields = new ArrayList<>(); yFields.addAll(yAxis); yFields.addAll(extBubble); - Dimension2SQLObj.dimension2sqlObj(sqlMeta, xAxis, transFields(allFields)); - Quota2SQLObj.quota2sqlObj(sqlMeta, yFields, transFields(allFields)); + Dimension2SQLObj.dimension2sqlObj(sqlMeta, xAxis, transFields(allFields), crossDs, dsMap); + Quota2SQLObj.quota2sqlObj(sqlMeta, yFields, transFields(allFields), crossDs, dsMap); querySql = SQLProvider.createQuerySQL(sqlMeta, true, needOrder, view); } else if (StringUtils.equalsIgnoreCase("table-info", view.getType())) { - Dimension2SQLObj.dimension2sqlObj(sqlMeta, xAxis, transFields(allFields)); + Dimension2SQLObj.dimension2sqlObj(sqlMeta, xAxis, transFields(allFields), crossDs, dsMap); 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() : ""); querySql = originSql + limit; @@ -536,14 +536,14 @@ public class ChartDataManage { detailFieldList.addAll(xAxis); detailFieldList.addAll(viewFields); - Dimension2SQLObj.dimension2sqlObj(sqlMeta, detailFieldList, transFields(allFields)); + Dimension2SQLObj.dimension2sqlObj(sqlMeta, detailFieldList, transFields(allFields), crossDs, dsMap); String originSql = SQLProvider.createQuerySQL(sqlMeta, false, needOrder, view); String limit = ((pageInfo.getGoPage() != null && pageInfo.getPageSize() != null) ? " LIMIT " + pageInfo.getPageSize() + " OFFSET " + (pageInfo.getGoPage() - 1) * pageInfo.getPageSize() : ""); detailFieldSql = originSql + limit; } } else { - Dimension2SQLObj.dimension2sqlObj(sqlMeta, xAxis, transFields(allFields)); - Quota2SQLObj.quota2sqlObj(sqlMeta, yAxis, transFields(allFields)); + Dimension2SQLObj.dimension2sqlObj(sqlMeta, xAxis, transFields(allFields), crossDs, dsMap); + Quota2SQLObj.quota2sqlObj(sqlMeta, yAxis, transFields(allFields), crossDs, dsMap); querySql = SQLProvider.createQuerySQL(sqlMeta, true, needOrder, view); if (containDetailField(view) && ObjectUtils.isNotEmpty(viewFields)) { detailFieldList.addAll(xAxis); @@ -1315,31 +1315,31 @@ public class ChartDataManage { SQLMeta sqlMeta = new SQLMeta(); Table2SQLObj.table2sqlobj(sqlMeta, null, "(" + sql + ")", crossDs); - WhereTree2Str.transFilterTrees(sqlMeta, rowPermissionsTree, transFields(allFields)); + WhereTree2Str.transFilterTrees(sqlMeta, rowPermissionsTree, transFields(allFields), crossDs, dsMap); if (StringUtils.equalsAnyIgnoreCase(view.getType(), "indicator", "gauge", "liquid")) { - Quota2SQLObj.quota2sqlObj(sqlMeta, yAxis, transFields(allFields)); + Quota2SQLObj.quota2sqlObj(sqlMeta, yAxis, transFields(allFields), crossDs, dsMap); querySql = SQLProvider.createQuerySQL(sqlMeta, true, needOrder, view); } else if (StringUtils.containsIgnoreCase(view.getType(), "stack")) { List xFields = new ArrayList<>(); xFields.addAll(xAxis); xFields.addAll(extStack); - Dimension2SQLObj.dimension2sqlObj(sqlMeta, xFields, transFields(allFields)); - Quota2SQLObj.quota2sqlObj(sqlMeta, yAxis, transFields(allFields)); + Dimension2SQLObj.dimension2sqlObj(sqlMeta, xFields, transFields(allFields), crossDs, dsMap); + Quota2SQLObj.quota2sqlObj(sqlMeta, yAxis, transFields(allFields), crossDs, dsMap); querySql = SQLProvider.createQuerySQL(sqlMeta, true, needOrder, view); } else if (StringUtils.containsIgnoreCase(view.getType(), "scatter")) { List yFields = new ArrayList<>(); yFields.addAll(yAxis); yFields.addAll(extBubble); - Dimension2SQLObj.dimension2sqlObj(sqlMeta, xAxis, transFields(allFields)); - Quota2SQLObj.quota2sqlObj(sqlMeta, yFields, transFields(allFields)); + Dimension2SQLObj.dimension2sqlObj(sqlMeta, xAxis, transFields(allFields), crossDs, dsMap); + Quota2SQLObj.quota2sqlObj(sqlMeta, yFields, transFields(allFields), crossDs, dsMap); querySql = SQLProvider.createQuerySQL(sqlMeta, true, needOrder, view); } else if (StringUtils.equalsIgnoreCase("table-info", view.getType())) { - Dimension2SQLObj.dimension2sqlObj(sqlMeta, xAxis, transFields(allFields)); + Dimension2SQLObj.dimension2sqlObj(sqlMeta, xAxis, transFields(allFields), crossDs, dsMap); querySql = SQLProvider.createQuerySQL(sqlMeta, false, true, view); } else { - Dimension2SQLObj.dimension2sqlObj(sqlMeta, xAxis, transFields(allFields)); - Quota2SQLObj.quota2sqlObj(sqlMeta, yAxis, transFields(allFields)); + Dimension2SQLObj.dimension2sqlObj(sqlMeta, xAxis, transFields(allFields), crossDs, dsMap); + Quota2SQLObj.quota2sqlObj(sqlMeta, yAxis, transFields(allFields), crossDs, dsMap); querySql = SQLProvider.createQuerySQL(sqlMeta, true, needOrder, view); } diff --git a/core/core-backend/src/main/java/io/dataease/chart/manage/ChartViewManege.java b/core/core-backend/src/main/java/io/dataease/chart/manage/ChartViewManege.java index a1e7e80ab8..e7e66951b2 100644 --- a/core/core-backend/src/main/java/io/dataease/chart/manage/ChartViewManege.java +++ b/core/core-backend/src/main/java/io/dataease/chart/manage/ChartViewManege.java @@ -147,7 +147,7 @@ public class ChartViewManege { String originField = Utils.calcFieldRegex(ele.getOriginName(), tableObj, list.stream().peek(e -> { DatasetTableFieldDTO dto = new DatasetTableFieldDTO(); BeanUtils.copyBean(dto, e); - }).collect(Collectors.toList())); + }).collect(Collectors.toList()), true, null); for (String func : FunctionConstant.AGG_FUNC) { if (Utils.matchFunction(func, originField)) { ele.setSummary(""); 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 0dcead2fa9..30ee9dc3c8 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 @@ -199,9 +199,9 @@ public class DatasetDataManage { // build query sql SQLMeta sqlMeta = new SQLMeta(); Table2SQLObj.table2sqlobj(sqlMeta, null, "(" + sql + ")", crossDs); - Field2SQLObj.field2sqlObj(sqlMeta, fields); - WhereTree2Str.transFilterTrees(sqlMeta, rowPermissionsTree, fields); - Order2SQLObj.getOrders(sqlMeta, fields, datasetGroupInfoDTO.getSortFields()); + Field2SQLObj.field2sqlObj(sqlMeta, fields, crossDs, dsMap); + WhereTree2Str.transFilterTrees(sqlMeta, rowPermissionsTree, fields, crossDs, dsMap); + Order2SQLObj.getOrders(sqlMeta, fields, datasetGroupInfoDTO.getSortFields(), crossDs, dsMap); String querySQL; if (start == null || count == null) { querySQL = SQLProvider.createQuerySQL(sqlMeta, false, false, needOrder); @@ -438,7 +438,7 @@ public class DatasetDataManage { Table2SQLObj.table2sqlobj(sqlMeta, null, "(" + sql + ")", crossDs); // 计算字段先完成内容替换 if (Objects.equals(field.getExtField(), ExtFieldConstant.EXT_CALC)) { - String originField = Utils.calcFieldRegex(field.getOriginName(), sqlMeta.getTable(), allFields); + String originField = Utils.calcFieldRegex(field.getOriginName(), sqlMeta.getTable(), allFields, crossDs, dsMap); // 此处是数据集预览,获取数据库原始字段枚举值等操作使用,如果遇到聚合函数则将originField设置为null for (String func : FunctionConstant.AGG_FUNC) { if (Utils.matchFunction(func, originField)) { @@ -470,9 +470,9 @@ public class DatasetDataManage { rowPermissionsTree = permissionManage.getRowPermissionsTree(datasetGroupInfoDTO.getId(), user.getUserId()); } - Field2SQLObj.field2sqlObj(sqlMeta, fields); - WhereTree2Str.transFilterTrees(sqlMeta, rowPermissionsTree, fields); - Order2SQLObj.getOrders(sqlMeta, fields, datasetGroupInfoDTO.getSortFields()); + 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); diff --git a/core/core-backend/src/main/java/io/dataease/engine/trans/CustomWhere2Str.java b/core/core-backend/src/main/java/io/dataease/engine/trans/CustomWhere2Str.java index ea10837694..360f99c6ab 100644 --- a/core/core-backend/src/main/java/io/dataease/engine/trans/CustomWhere2Str.java +++ b/core/core-backend/src/main/java/io/dataease/engine/trans/CustomWhere2Str.java @@ -4,6 +4,7 @@ import io.dataease.api.chart.dto.ChartCustomFilterItemDTO; import io.dataease.api.chart.dto.ChartFieldCustomFilterDTO; import io.dataease.api.dataset.union.model.SQLMeta; import io.dataease.api.dataset.union.model.SQLObj; +import io.dataease.dataset.dto.DatasourceSchemaDTO; import io.dataease.dto.dataset.DatasetTableFieldDTO; import io.dataease.engine.constant.SQLConstants; import io.dataease.engine.constant.SqlPlaceholderConstants; @@ -21,7 +22,7 @@ import java.util.Map; */ public class CustomWhere2Str { - public static void customWhere2sqlObj(SQLMeta meta, List fields, List originFields) { + public static void customWhere2sqlObj(SQLMeta meta, List fields, List originFields, boolean isCross, Map dsMap) { SQLObj tableObj = meta.getTable(); if (ObjectUtils.isEmpty(tableObj)) { return; @@ -40,7 +41,7 @@ public class CustomWhere2Str { String originName; if (ObjectUtils.isNotEmpty(field.getExtField()) && field.getExtField() == 2) { // 解析origin name中有关联的字段生成sql表达式 - String calcFieldExp = Utils.calcFieldRegex(field.getOriginName(), tableObj, originFields); + String calcFieldExp = Utils.calcFieldRegex(field.getOriginName(), tableObj, originFields, isCross, dsMap); // 给计算字段处加一个占位符,后续SQL方言转换后再替换 originName = String.format(SqlPlaceholderConstants.CALC_FIELD_PLACEHOLDER, field.getId()); fieldsDialect.put(originName, calcFieldExp); diff --git a/core/core-backend/src/main/java/io/dataease/engine/trans/Dimension2SQLObj.java b/core/core-backend/src/main/java/io/dataease/engine/trans/Dimension2SQLObj.java index 05cb63e08f..d6b279ea27 100644 --- a/core/core-backend/src/main/java/io/dataease/engine/trans/Dimension2SQLObj.java +++ b/core/core-backend/src/main/java/io/dataease/engine/trans/Dimension2SQLObj.java @@ -3,6 +3,7 @@ package io.dataease.engine.trans; import io.dataease.api.chart.dto.ChartViewFieldDTO; import io.dataease.api.dataset.union.model.SQLMeta; import io.dataease.api.dataset.union.model.SQLObj; +import io.dataease.dataset.dto.DatasourceSchemaDTO; import io.dataease.dto.dataset.DatasetTableFieldDTO; import io.dataease.engine.constant.DeTypeConstants; import io.dataease.engine.constant.ExtFieldConstant; @@ -20,7 +21,7 @@ import java.util.*; */ public class Dimension2SQLObj { - public static void dimension2sqlObj(SQLMeta meta, List fields, List originFields) { + public static void dimension2sqlObj(SQLMeta meta, List fields, List originFields, boolean isCross, Map dsMap) { SQLObj tableObj = meta.getTable(); if (ObjectUtils.isEmpty(tableObj)) { return; @@ -34,7 +35,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); + String calcFieldExp = Utils.calcFieldRegex(x.getOriginName(), tableObj, originFields, isCross, dsMap); // 给计算字段处加一个占位符,后续SQL方言转换后再替换 originField = String.format(SqlPlaceholderConstants.CALC_FIELD_PLACEHOLDER, x.getId()); fieldsDialect.put(originField, calcFieldExp); diff --git a/core/core-backend/src/main/java/io/dataease/engine/trans/ExtWhere2Str.java b/core/core-backend/src/main/java/io/dataease/engine/trans/ExtWhere2Str.java index c7c4c78d5b..452e21ddac 100644 --- a/core/core-backend/src/main/java/io/dataease/engine/trans/ExtWhere2Str.java +++ b/core/core-backend/src/main/java/io/dataease/engine/trans/ExtWhere2Str.java @@ -3,6 +3,7 @@ package io.dataease.engine.trans; import io.dataease.api.chart.dto.ChartExtFilterDTO; import io.dataease.api.dataset.union.model.SQLMeta; import io.dataease.api.dataset.union.model.SQLObj; +import io.dataease.dataset.dto.DatasourceSchemaDTO; import io.dataease.dto.dataset.DatasetTableFieldDTO; import io.dataease.engine.constant.SQLConstants; import io.dataease.engine.constant.SqlPlaceholderConstants; @@ -20,7 +21,7 @@ import java.util.Map; */ public class ExtWhere2Str { - public static void extWhere2sqlOjb(SQLMeta meta, List fields, List originFields) { + public static void extWhere2sqlOjb(SQLMeta meta, List fields, List originFields, boolean isCross, Map dsMap) { SQLObj tableObj = meta.getTable(); if (ObjectUtils.isEmpty(tableObj)) { return; @@ -48,7 +49,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); + String calcFieldExp = Utils.calcFieldRegex(field.getOriginName(), tableObj, originFields, isCross, dsMap); // 给计算字段处加一个占位符,后续SQL方言转换后再替换 originName = String.format(SqlPlaceholderConstants.CALC_FIELD_PLACEHOLDER, field.getId()); fieldsDialect.put(originName, calcFieldExp); diff --git a/core/core-backend/src/main/java/io/dataease/engine/trans/Field2SQLObj.java b/core/core-backend/src/main/java/io/dataease/engine/trans/Field2SQLObj.java index f3e9462f76..ce17474b6e 100644 --- a/core/core-backend/src/main/java/io/dataease/engine/trans/Field2SQLObj.java +++ b/core/core-backend/src/main/java/io/dataease/engine/trans/Field2SQLObj.java @@ -2,6 +2,7 @@ package io.dataease.engine.trans; import io.dataease.api.dataset.union.model.SQLMeta; import io.dataease.api.dataset.union.model.SQLObj; +import io.dataease.dataset.dto.DatasourceSchemaDTO; import io.dataease.dto.dataset.DatasetTableFieldDTO; import io.dataease.engine.constant.DeTypeConstants; import io.dataease.engine.constant.ExtFieldConstant; @@ -19,7 +20,7 @@ import java.util.*; */ public class Field2SQLObj { - public static void field2sqlObj(SQLMeta meta, List fields) { + public static void field2sqlObj(SQLMeta meta, List fields, boolean isCross, Map dsMap) { SQLObj tableObj = meta.getTable(); if (ObjectUtils.isEmpty(tableObj)) { return; @@ -32,13 +33,13 @@ 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, fields); + String calcFieldExp = Utils.calcFieldRegex(x.getOriginName(), tableObj, fields, isCross, dsMap); // 给计算字段处加一个占位符,后续SQL方言转换后再替换 originField = String.format(SqlPlaceholderConstants.CALC_FIELD_PLACEHOLDER, x.getId()); fieldsDialect.put(originField, calcFieldExp); // 此处是数据集预览,获取数据库原始字段枚举值等操作使用,如果遇到聚合函数则将originField设置为null for (String func : FunctionConstant.AGG_FUNC) { - if (Utils.matchFunction(func, originField)) { + if (Utils.matchFunction(func, calcFieldExp)) { originField = null; break; } diff --git a/core/core-backend/src/main/java/io/dataease/engine/trans/Order2SQLObj.java b/core/core-backend/src/main/java/io/dataease/engine/trans/Order2SQLObj.java index b1ab44874d..7bbab4e9f5 100644 --- a/core/core-backend/src/main/java/io/dataease/engine/trans/Order2SQLObj.java +++ b/core/core-backend/src/main/java/io/dataease/engine/trans/Order2SQLObj.java @@ -1,9 +1,10 @@ package io.dataease.engine.trans; import io.dataease.api.chart.dto.DeSortField; -import io.dataease.dto.dataset.DatasetTableFieldDTO; import io.dataease.api.dataset.union.model.SQLMeta; import io.dataease.api.dataset.union.model.SQLObj; +import io.dataease.dataset.dto.DatasourceSchemaDTO; +import io.dataease.dto.dataset.DatasetTableFieldDTO; import io.dataease.engine.constant.DeTypeConstants; import io.dataease.engine.constant.ExtFieldConstant; import io.dataease.engine.constant.SQLConstants; @@ -13,6 +14,7 @@ import org.apache.commons.lang3.StringUtils; import org.springframework.util.CollectionUtils; import java.util.List; +import java.util.Map; import java.util.Objects; /** @@ -20,7 +22,7 @@ import java.util.Objects; */ public class Order2SQLObj { - public static void getOrders(SQLMeta meta, List fields, List sortFields) { + public static void getOrders(SQLMeta meta, List fields, List sortFields, boolean isCross, Map dsMap) { SQLObj tableObj = meta.getTable(); List xOrders = meta.getXOrders(); if (ObjectUtils.isEmpty(tableObj) || CollectionUtils.isEmpty(xOrders)) { @@ -30,17 +32,17 @@ public class Order2SQLObj { int step = fields.size(); for (int i = step; i < (step + sortFields.size()); i++) { DeSortField deSortField = sortFields.get(i - step); - SQLObj order = buildSortField(deSortField, tableObj, i, fields); + SQLObj order = buildSortField(deSortField, tableObj, i, fields, isCross, dsMap); xOrders.add(order); } } } - private static SQLObj buildSortField(DeSortField f, SQLObj tableObj, int i, List originFields) { + private static SQLObj buildSortField(DeSortField f, SQLObj tableObj, int i, List originFields, boolean isCross, Map dsMap) { String originField; if (ObjectUtils.isNotEmpty(f.getExtField()) && Objects.equals(f.getExtField(), ExtFieldConstant.EXT_CALC)) { // 解析origin name中有关联的字段生成sql表达式 - originField = Utils.calcFieldRegex(f.getOriginName(), tableObj, originFields); + originField = Utils.calcFieldRegex(f.getOriginName(), tableObj, originFields, isCross, dsMap); } else if (ObjectUtils.isNotEmpty(f.getExtField()) && Objects.equals(f.getExtField(), ExtFieldConstant.EXT_COPY)) { originField = String.format(SQLConstants.FIELD_NAME, tableObj.getTableAlias(), f.getDataeaseName()); } else { diff --git a/core/core-backend/src/main/java/io/dataease/engine/trans/Quota2SQLObj.java b/core/core-backend/src/main/java/io/dataease/engine/trans/Quota2SQLObj.java index f76d4427b4..2da6da80d8 100644 --- a/core/core-backend/src/main/java/io/dataease/engine/trans/Quota2SQLObj.java +++ b/core/core-backend/src/main/java/io/dataease/engine/trans/Quota2SQLObj.java @@ -1,9 +1,10 @@ package io.dataease.engine.trans; import io.dataease.api.chart.dto.ChartViewFieldDTO; -import io.dataease.dto.dataset.DatasetTableFieldDTO; import io.dataease.api.dataset.union.model.SQLMeta; import io.dataease.api.dataset.union.model.SQLObj; +import io.dataease.dataset.dto.DatasourceSchemaDTO; +import io.dataease.dto.dataset.DatasetTableFieldDTO; import io.dataease.engine.constant.DeTypeConstants; import io.dataease.engine.constant.ExtFieldConstant; import io.dataease.engine.constant.SQLConstants; @@ -20,7 +21,7 @@ import java.util.*; */ public class Quota2SQLObj { - public static void quota2sqlObj(SQLMeta meta, List fields, List originFields) { + public static void quota2sqlObj(SQLMeta meta, List fields, List originFields, boolean isCross, Map dsMap) { SQLObj tableObj = meta.getTable(); if (ObjectUtils.isEmpty(tableObj)) { return; @@ -35,7 +36,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); + String calcFieldExp = Utils.calcFieldRegex(y.getOriginName(), tableObj, originFields, isCross, dsMap); // 给计算字段处加一个占位符,后续SQL方言转换后再替换 originField = String.format(SqlPlaceholderConstants.CALC_FIELD_PLACEHOLDER, y.getId()); fieldsDialect.put(originField, calcFieldExp); diff --git a/core/core-backend/src/main/java/io/dataease/engine/trans/WhereTree2Str.java b/core/core-backend/src/main/java/io/dataease/engine/trans/WhereTree2Str.java index 321d910d4e..cef6a80e07 100644 --- a/core/core-backend/src/main/java/io/dataease/engine/trans/WhereTree2Str.java +++ b/core/core-backend/src/main/java/io/dataease/engine/trans/WhereTree2Str.java @@ -5,6 +5,7 @@ import io.dataease.api.dataset.union.model.SQLObj; import io.dataease.api.permissions.dataset.dto.DataSetRowPermissionsTreeDTO; import io.dataease.api.permissions.dataset.dto.DatasetRowPermissionsTreeItem; import io.dataease.api.permissions.dataset.dto.DatasetRowPermissionsTreeObj; +import io.dataease.dataset.dto.DatasourceSchemaDTO; import io.dataease.dto.dataset.DatasetTableFieldDTO; import io.dataease.engine.constant.ExtFieldConstant; import io.dataease.engine.constant.SQLConstants; @@ -20,7 +21,7 @@ import java.util.*; * @Author Junjun */ public class WhereTree2Str { - public static void transFilterTrees(SQLMeta meta, List requestList, List originFields) { + public static void transFilterTrees(SQLMeta meta, List requestList, List originFields, boolean isCross, Map dsMap) { SQLObj tableObj = meta.getTable(); if (ObjectUtils.isEmpty(tableObj)) { return; @@ -38,7 +39,7 @@ public class WhereTree2Str { if (ObjectUtils.isEmpty(tree)) { continue; } - String treeExp = transTreeToWhere(tableObj, tree, originFields, fieldsDialect); + String treeExp = transTreeToWhere(tableObj, tree, originFields, fieldsDialect, isCross, dsMap); if (StringUtils.isNotEmpty(treeExp)) { res.add(treeExp); } @@ -47,7 +48,7 @@ public class WhereTree2Str { meta.setWhereTreesDialect(fieldsDialect); } - private static String transTreeToWhere(SQLObj tableObj, DatasetRowPermissionsTreeObj tree, List originFields, Map fieldsDialect) { + private static String transTreeToWhere(SQLObj tableObj, DatasetRowPermissionsTreeObj tree, List originFields, Map fieldsDialect, boolean isCross, Map dsMap) { if (ObjectUtils.isEmpty(tree)) { return null; } @@ -60,10 +61,10 @@ public class WhereTree2Str { String exp = null; if (StringUtils.equalsIgnoreCase(item.getType(), "item")) { // 单个item拼接SQL,最后根据logic汇总 - exp = transTreeItem(tableObj, item, originFields, fieldsDialect); + exp = transTreeItem(tableObj, item, originFields, fieldsDialect, isCross, dsMap); } else if (StringUtils.equalsIgnoreCase(item.getType(), "tree")) { // 递归tree - exp = transTreeToWhere(tableObj, item.getSubTree(), originFields, fieldsDialect); + exp = transTreeToWhere(tableObj, item.getSubTree(), originFields, fieldsDialect, isCross, dsMap); } if (StringUtils.isNotEmpty(exp)) { list.add(exp); @@ -73,7 +74,7 @@ public class WhereTree2Str { return CollectionUtils.isNotEmpty(list) ? "(" + String.join(" " + logic + " ", list) + ")" : null; } - public static String transTreeItem(SQLObj tableObj, DatasetRowPermissionsTreeItem item, List originFields, Map fieldsDialect) { + public static String transTreeItem(SQLObj tableObj, DatasetRowPermissionsTreeItem item, List originFields, Map fieldsDialect, boolean isCross, Map dsMap) { String res = null; DatasetTableFieldDTO field = item.getField(); if (ObjectUtils.isEmpty(field)) { @@ -83,7 +84,7 @@ public class WhereTree2Str { 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); + String calcFieldExp = Utils.calcFieldRegex(field.getOriginName(), tableObj, originFields, isCross, dsMap); // 给计算字段处加一个占位符,后续SQL方言转换后再替换 originName = String.format(SqlPlaceholderConstants.CALC_FIELD_PLACEHOLDER, field.getId()); fieldsDialect.put(originName, calcFieldExp); diff --git a/core/core-backend/src/main/java/io/dataease/engine/utils/Utils.java b/core/core-backend/src/main/java/io/dataease/engine/utils/Utils.java index 9a7dec7884..992c5d65d8 100644 --- a/core/core-backend/src/main/java/io/dataease/engine/utils/Utils.java +++ b/core/core-backend/src/main/java/io/dataease/engine/utils/Utils.java @@ -1,6 +1,7 @@ package io.dataease.engine.utils; import io.dataease.api.dataset.union.model.SQLObj; +import io.dataease.api.ds.vo.DatasourceConfiguration; import io.dataease.dataset.dto.DatasourceSchemaDTO; import io.dataease.dto.dataset.DatasetTableFieldDTO; import io.dataease.engine.constant.ExtFieldConstant; @@ -24,17 +25,22 @@ public class Utils { } // 解析计算字段 - public static String calcFieldRegex(String originField, SQLObj tableObj, List originFields) { + public static String calcFieldRegex(String originField, SQLObj tableObj, List originFields, boolean isCross, Map dsMap) { try { int i = 0; - return buildCalcField(originField, tableObj, originFields, i); + DatasourceConfiguration.DatasourceType datasourceType = null; + if (dsMap != null && dsMap.entrySet().iterator().hasNext()) { + Map.Entry next = dsMap.entrySet().iterator().next(); + datasourceType = DatasourceConfiguration.DatasourceType.valueOf(next.getValue().getType()); + } + return buildCalcField(originField, tableObj, originFields, i, isCross, datasourceType); } catch (Exception e) { DEException.throwException(Translator.get("i18n_field_circular_ref")); } return null; } - public static String buildCalcField(String originField, SQLObj tableObj, List originFields, int i) throws Exception { + public static String buildCalcField(String originField, SQLObj tableObj, List originFields, int i, boolean isCross, DatasourceConfiguration.DatasourceType datasourceType) throws Exception { try { i++; if (i > 100) { @@ -57,11 +63,16 @@ public class Utils { if (StringUtils.containsIgnoreCase(originField, ele.getId() + "")) { // 计算字段允许二次引用,这里递归查询完整引用链 if (Objects.equals(ele.getExtField(), ExtFieldConstant.EXT_NORMAL)) { - originField = originField.replaceAll("\\[" + ele.getId() + "]", - String.format(SQLConstants.FIELD_NAME, tableObj.getTableAlias(), ele.getDataeaseName())); + if (isCross) { + originField = originField.replaceAll("\\[" + ele.getId() + "]", + String.format(SQLConstants.FIELD_NAME, tableObj.getTableAlias(), ele.getDataeaseName())); + } else { + originField = originField.replaceAll("\\[" + ele.getId() + "]", + tableObj.getTableAlias() + "." + datasourceType.getPrefix() + ele.getDataeaseName() + datasourceType.getSuffix()); + } } else { originField = originField.replaceAll("\\[" + ele.getId() + "]", "(" + ele.getOriginName() + ")"); - originField = buildCalcField(originField, tableObj, originFields, i); + originField = buildCalcField(originField, tableObj, originFields, i, isCross, datasourceType); } } }