From 03b727c4ac2e71819460a7a20b2ebbe40287a4aa Mon Sep 17 00:00:00 2001 From: taojinlong Date: Fri, 17 Nov 2023 16:19:39 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20sqlserver=20=E4=B8=8B=E6=8B=89=E7=BB=84?= =?UTF-8?q?=E4=BB=B6=E6=9C=89=E6=8E=92=E5=BA=8F=E6=97=B6=E7=AD=9B=E9=80=89?= =?UTF-8?q?=E6=8A=A5=E9=94=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../sqlserver/SqlserverQueryProvider.java | 92 +++++++++++++++++++ .../impl/direct/DirectFieldService.java | 8 +- .../datasource/query/QueryProvider.java | 9 ++ 3 files changed, 105 insertions(+), 4 deletions(-) diff --git a/core/backend/src/main/java/io/dataease/provider/query/sqlserver/SqlserverQueryProvider.java b/core/backend/src/main/java/io/dataease/provider/query/sqlserver/SqlserverQueryProvider.java index b3a24f8744..ec52866ae8 100644 --- a/core/backend/src/main/java/io/dataease/provider/query/sqlserver/SqlserverQueryProvider.java +++ b/core/backend/src/main/java/io/dataease/provider/query/sqlserver/SqlserverQueryProvider.java @@ -106,10 +106,102 @@ public class SqlserverQueryProvider extends QueryProvider { } @Override + public String createQuerySQLAsTmpWithLimit(String sql, List fields, boolean isGroup, List fieldCustomFilter, List rowPermissionsTree, List sortFields, Long limit) { + return createQuerySQLWithLimit("(" + sqlFix(sql) + ")", fields, isGroup, null, fieldCustomFilter, rowPermissionsTree, sortFields, limit); + } public String createQuerySQLAsTmp(String sql, List fields, boolean isGroup, List fieldCustomFilter, List rowPermissionsTree, List sortFields) { return createQuerySQL("(" + sqlFix(sql) + ")", fields, isGroup, null, fieldCustomFilter, rowPermissionsTree, sortFields); } + @Override + public String createQuerySQLWithLimit(String table, List fields, boolean isGroup, Datasource ds, List fieldCustomFilter, List rowPermissionsTree, List sortFields, Long limit) { + SQLObj tableObj = SQLObj.builder() + .tableName((table.startsWith("(") && table.endsWith(")")) ? table : String.format(SqlServerSQLConstants.KEYWORD_TABLE, table)) + .tableAlias(String.format(TABLE_ALIAS_PREFIX, 0)) + .build(); + setSchema(tableObj, ds); + + List xFields = new ArrayList<>(); + if (CollectionUtils.isNotEmpty(fields)) { + for (int i = 0; i < fields.size(); i++) { + DatasetTableField f = fields.get(i); + String originField; + if (ObjectUtils.isNotEmpty(f.getExtField()) && f.getExtField() == 2) { + // 解析origin name中有关联的字段生成sql表达式 + originField = calcFieldRegex(f.getOriginName(), tableObj); + } else if (ObjectUtils.isNotEmpty(f.getExtField()) && f.getExtField() == 1) { + originField = String.format(SqlServerSQLConstants.KEYWORD_FIX, tableObj.getTableAlias(), f.getOriginName()); + } else { + originField = String.format(SqlServerSQLConstants.KEYWORD_FIX, tableObj.getTableAlias(), f.getOriginName()); + } + String fieldAlias = String.format(SQLConstants.FIELD_ALIAS_X_PREFIX, i); + String fieldName; + // 处理横轴字段 + if (f.getDeExtractType() == DeTypeConstants.DE_TIME) { // 时间 转为 数值 + if (f.getDeType() == DeTypeConstants.DE_INT || f.getDeType() == DeTypeConstants.DE_FLOAT) { + fieldName = String.format(SqlServerSQLConstants.UNIX_TIMESTAMP, originField); + } else { + fieldName = originField; + } + } else if (f.getDeExtractType() == DeTypeConstants.DE_STRING) { + if (f.getDeType() == DeTypeConstants.DE_INT) { + fieldName = String.format(SqlServerSQLConstants.CONVERT, SqlServerSQLConstants.DEFAULT_INT_FORMAT, originField); + } else if (f.getDeType() == DeTypeConstants.DE_FLOAT) { + fieldName = String.format(SqlServerSQLConstants.CONVERT, SqlServerSQLConstants.DEFAULT_FLOAT_FORMAT, originField); + } else if (f.getDeType() == DeTypeConstants.DE_TIME) { //字符串转时间 + fieldName = String.format(SqlServerSQLConstants.STRING_TO_DATE, originField, StringUtils.isNotEmpty(f.getDateFormat()) ? f.getDateFormat() : SqlServerSQLConstants.DEFAULT_DATE_FORMAT); + } else { + fieldName = originField; + } + } else { + if (f.getDeType() == DeTypeConstants.DE_TIME) { // 数值转时间 + String cast = String.format(SqlServerSQLConstants.LONG_TO_DATE, originField + "/1000"); + fieldName = String.format(SqlServerSQLConstants.FROM_UNIXTIME, cast); + } else if (f.getDeType() == DeTypeConstants.DE_INT) { + fieldName = String.format(SqlServerSQLConstants.CONVERT, SqlServerSQLConstants.DEFAULT_INT_FORMAT, originField); + } else { + fieldName = originField; + } + } + xFields.add(SQLObj.builder() + .fieldName(fieldName) + .fieldAlias(fieldAlias) + .build()); + } + } + + STGroup stg = new STGroupFile(SQLConstants.SQL_TEMPLATE); + ST st_sql = stg.getInstanceOf("previewSql"); + st_sql.add("isGroup", isGroup); + if (CollectionUtils.isNotEmpty(xFields)) st_sql.add("groups", xFields); + if (ObjectUtils.isNotEmpty(tableObj)) st_sql.add("table", tableObj); + String customWheres = transCustomFilterList(tableObj, fieldCustomFilter); + // row permissions tree + String whereTrees = transFilterTrees(tableObj, rowPermissionsTree); + List wheres = new ArrayList<>(); + if (customWheres != null) wheres.add(customWheres); + if (whereTrees != null) wheres.add(whereTrees); + if (CollectionUtils.isNotEmpty(wheres)) st_sql.add("filters", wheres); + List xOrders = new ArrayList<>(); + if (CollectionUtils.isNotEmpty(sortFields)) { + 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); + xOrders.add(order); + } + } + if(limit != null){ + SQLObj limitFiled = SQLObj.builder().limitFiled(" top " + limit + " ").build(); + st_sql.add("limitFiled", limitFiled); + } + if (ObjectUtils.isNotEmpty(xOrders)) { + st_sql.add("orders", xOrders); + } + return st_sql.render(); + } + + @Override public String createQuerySQL(String table, List fields, boolean isGroup, Datasource ds, List fieldCustomFilter, List rowPermissionsTree, List sortFields) { SQLObj tableObj = SQLObj.builder() diff --git a/core/backend/src/main/java/io/dataease/service/dataset/impl/direct/DirectFieldService.java b/core/backend/src/main/java/io/dataease/service/dataset/impl/direct/DirectFieldService.java index 08c8d794bb..d436b1cea0 100644 --- a/core/backend/src/main/java/io/dataease/service/dataset/impl/direct/DirectFieldService.java +++ b/core/backend/src/main/java/io/dataease/service/dataset/impl/direct/DirectFieldService.java @@ -177,7 +177,7 @@ public class DirectFieldService implements DataSetFieldService { if (StringUtils.equalsIgnoreCase(datasetTable.getType(), DatasetType.DB.toString())) { datasourceRequest.setTable(dataTableInfoDTO.getTable()); String formatSql = formatTableByKeyword(keyword, dataTableInfoDTO.getTable(), permissionFields, false); - createSQL = qp.createQuerySQL(formatSql, permissionFields, !needSort, ds, customFilter, rowPermissionsTree, deSortFields); + createSQL = qp.createQuerySQLWithLimit(formatSql, permissionFields, !needSort, ds, customFilter, rowPermissionsTree, deSortFields, 1000L); } else if (StringUtils.equalsIgnoreCase(datasetTable.getType(), DatasetType.SQL.toString())) { String sql = dataTableInfoDTO.getSql(); if (dataTableInfoDTO.isBase64Encryption()) { @@ -187,7 +187,7 @@ public class DirectFieldService implements DataSetFieldService { if (StringUtils.isNotBlank(keyword)) { sql = formatTableByKeyword(keyword, " (" + sql + ") " + "inner_like_temp ", permissionFields, false); } - createSQL = qp.createQuerySQLAsTmp(sql, permissionFields, !needSort, customFilter, rowPermissionsTree, deSortFields); + createSQL = qp.createQuerySQLAsTmpWithLimit(sql, permissionFields, !needSort, customFilter, rowPermissionsTree, deSortFields, 1000L); } else if (StringUtils.equalsIgnoreCase(datasetTable.getType(), DatasetType.CUSTOM.toString())) { DataTableInfoDTO dt = new Gson().fromJson(datasetTable.getInfo(), DataTableInfoDTO.class); List listUnion = dataSetTableUnionService.listByTableId(dt.getList().get(0).getTableId()); @@ -195,14 +195,14 @@ public class DirectFieldService implements DataSetFieldService { if (StringUtils.isNotBlank(keyword)) { sql = formatTableByKeyword(keyword, " (" + sql + ") " + "inner_like_temp ", permissionFields, false); } - createSQL = qp.createQuerySQLAsTmp(sql, permissionFields, !needSort, customFilter, rowPermissionsTree, deSortFields); + createSQL = qp.createQuerySQLAsTmpWithLimit(sql, permissionFields, !needSort, customFilter, rowPermissionsTree, deSortFields, 1000L); } else if (StringUtils.equalsIgnoreCase(datasetTable.getType(), DatasetType.UNION.toString())) { DataTableInfoDTO dt = new Gson().fromJson(datasetTable.getInfo(), DataTableInfoDTO.class); String sql = (String) dataSetTableService.getUnionSQLDatasource(dt, ds).get("sql"); if (StringUtils.isNotBlank(keyword)) { sql = formatTableByKeyword(keyword, " (" + sql + ") " + "inner_like_temp ", permissionFields, false); } - createSQL = qp.createQuerySQLAsTmp(sql, permissionFields, !needSort, customFilter, rowPermissionsTree, deSortFields); + createSQL = qp.createQuerySQLAsTmpWithLimit(sql, permissionFields, !needSort, customFilter, rowPermissionsTree, deSortFields, 1000L); } if (StringUtils.equalsAny(ds.getType(), "ds_doris", "mysql")) { Object[] args = new Object[]{createSQL, view}; diff --git a/sdk/dataease-plugin-datasource/src/main/java/io/dataease/plugins/datasource/query/QueryProvider.java b/sdk/dataease-plugin-datasource/src/main/java/io/dataease/plugins/datasource/query/QueryProvider.java index c3de471a40..674e9464ae 100644 --- a/sdk/dataease-plugin-datasource/src/main/java/io/dataease/plugins/datasource/query/QueryProvider.java +++ b/sdk/dataease-plugin-datasource/src/main/java/io/dataease/plugins/datasource/query/QueryProvider.java @@ -42,8 +42,17 @@ public abstract class QueryProvider { public abstract String createQuerySQL(String table, List fields, boolean isGroup, Datasource ds, List fieldCustomFilter, List rowPermissionsTree, List sortFields); + public String createQuerySQLWithLimit(String table, List fields, boolean isGroup, Datasource ds, List fieldCustomFilter, List rowPermissionsTree, List sortFields, Long limit) { + return createQuerySQL(table, fields, isGroup, ds, fieldCustomFilter, rowPermissionsTree, sortFields); + } + public abstract String createQuerySQLAsTmp(String sql, List fields, boolean isGroup, List fieldCustomFilter, List rowPermissionsTree, List sortFields); + public String createQuerySQLAsTmpWithLimit(String sql, List fields, boolean isGroup, List fieldCustomFilter, List rowPermissionsTree, List sortFields, Long limit) { + return createQuerySQLAsTmp(sql, fields, isGroup, fieldCustomFilter, rowPermissionsTree, sortFields); + } + + public abstract String createQueryTableWithPage(String table, List fields, Integer page, Integer pageSize, Integer realSize, boolean isGroup, Datasource ds, List fieldCustomFilter, List rowPermissionsTree); public abstract String createQuerySQLWithPage(String sql, List fields, Integer page, Integer pageSize, Integer realSize, boolean isGroup, List fieldCustomFilter, List rowPermissionsTree);