From a848e7f2fa5a0f24d8055ecd52c63a160a90e9d6 Mon Sep 17 00:00:00 2001 From: fit2cloud-chenyw Date: Tue, 2 Apr 2024 18:21:42 +0800 Subject: [PATCH] =?UTF-8?q?fix(=E8=BF=87=E6=BB=A4=E7=BB=84=E4=BB=B6):=20?= =?UTF-8?q?=E6=96=87=E6=9C=AC=E4=B8=8B=E6=8B=89=E6=A1=86=E6=8E=92=E5=BA=8F?= =?UTF-8?q?=E5=90=8E=E9=83=A8=E5=88=86=E9=80=89=E9=A1=B9=E7=BC=BA=E5=A4=B1?= =?UTF-8?q?=20close#8714?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../engine/doris/DorisQueryProvider.java | 21 ++++++++++++++++--- .../provider/query/db2/Db2QueryProvider.java | 12 ++++++++++- .../query/mysql/MysqlQueryProvider.java | 21 ++++++++++++++++--- .../query/oracle/OracleQueryProvider.java | 13 ++++++++++-- .../provider/query/pg/PgQueryProvider.java | 13 +++++++++++- .../sqlserver/SqlserverQueryProvider.java | 15 ++++++++++++- .../datasource/query/QueryProvider.java | 4 ++++ 7 files changed, 88 insertions(+), 11 deletions(-) diff --git a/core/backend/src/main/java/io/dataease/provider/engine/doris/DorisQueryProvider.java b/core/backend/src/main/java/io/dataease/provider/engine/doris/DorisQueryProvider.java index 7b22212f9c..ec8e792b7e 100644 --- a/core/backend/src/main/java/io/dataease/provider/engine/doris/DorisQueryProvider.java +++ b/core/backend/src/main/java/io/dataease/provider/engine/doris/DorisQueryProvider.java @@ -40,6 +40,7 @@ import javax.annotation.Resource; import java.text.MessageFormat; import java.text.SimpleDateFormat; import java.util.*; +import java.util.concurrent.atomic.AtomicInteger; import java.util.regex.Matcher; import java.util.regex.Pattern; import java.util.stream.Collectors; @@ -108,13 +109,14 @@ public class DorisQueryProvider extends QueryProvider { .build(); List xFields = new ArrayList<>(); List fieldList = fields.stream().map(DatasetTableField::getId).collect(Collectors.toList()); + AtomicInteger sortIndex = new AtomicInteger(-1); if (CollectionUtils.isNotEmpty(sortFields)) { sortFields.forEach(item -> { - int indexOf = fieldList.indexOf(item.getId()); - if (indexOf == -1) { + sortIndex.set(fieldList.indexOf(item.getId())); + if (sortIndex.get() == -1) { fields.add(item); } else { - fields.set(indexOf, item); + fields.set(sortIndex.get(), item); } }); } @@ -218,6 +220,19 @@ public class DorisQueryProvider extends QueryProvider { if (CollectionUtils.isNotEmpty(xOrders)) { st.add("orders", xOrders); } + if (CollectionUtils.isNotEmpty(xFields)) { + List finallyFields = new ArrayList<>(); + for (int i = 0; i < xFields.size(); i++) { + if (CollectionUtils.isNotEmpty(xOrders) && sortIndex.get() == -1 && i == xFields.size() - 1) { + continue; + } + SQLObj f = xFields.get(i); + String prefix = finallyFields.isEmpty() ? " DISTINCT " : ""; + f.setFieldName(prefix + String.format(MySQLConstants.KEYWORD_FIX, tableSQL.getTableAlias(), f.getFieldAlias())); + finallyFields.add(f); + } + st.add("groups", finallyFields); + } if (ObjectUtils.isNotEmpty(limit)) { return st.render() + " LIMIT 0," + limit; } diff --git a/core/backend/src/main/java/io/dataease/provider/query/db2/Db2QueryProvider.java b/core/backend/src/main/java/io/dataease/provider/query/db2/Db2QueryProvider.java index 2dd9ea9ce1..a17535c851 100644 --- a/core/backend/src/main/java/io/dataease/provider/query/db2/Db2QueryProvider.java +++ b/core/backend/src/main/java/io/dataease/provider/query/db2/Db2QueryProvider.java @@ -163,7 +163,6 @@ public class Db2QueryProvider extends QueryProvider { .build()); } } - STGroup stg = new STGroupFile(SQLConstants.SQL_TEMPLATE); ST st_sql = stg.getInstanceOf("previewSql"); st_sql.add("isGroup", isGroup); @@ -193,6 +192,17 @@ public class Db2QueryProvider extends QueryProvider { } if (ObjectUtils.isNotEmpty(xOrders)) { st_sql.add("orders", xOrders); + if (needDistinct(sortFields, limit)) { + st_sql.remove("groups"); + xOrders.forEach(f -> { + if (xFields.stream().noneMatch(x -> x.getFieldName().equals(f.getOrderField()))) { + String fieldAlias = String.format(SQLConstants.FIELD_ALIAS_X_PREFIX, xFields.size()); + SQLObj tField = SQLObj.builder().fieldName(f.getOrderField()).fieldAlias(fieldAlias).build(); + xFields.add(tField); + } + }); + st_sql.add("groups", xFields); + } } if (ObjectUtils.isNotEmpty(limit)) { ChartViewWithBLOBs view = new ChartViewWithBLOBs(); diff --git a/core/backend/src/main/java/io/dataease/provider/query/mysql/MysqlQueryProvider.java b/core/backend/src/main/java/io/dataease/provider/query/mysql/MysqlQueryProvider.java index 74fe391f29..d1b54f8cd7 100644 --- a/core/backend/src/main/java/io/dataease/provider/query/mysql/MysqlQueryProvider.java +++ b/core/backend/src/main/java/io/dataease/provider/query/mysql/MysqlQueryProvider.java @@ -39,6 +39,7 @@ import javax.annotation.Resource; import java.text.MessageFormat; import java.text.SimpleDateFormat; import java.util.*; +import java.util.concurrent.atomic.AtomicInteger; import java.util.regex.Matcher; import java.util.regex.Pattern; import java.util.stream.Collectors; @@ -168,13 +169,14 @@ public class MysqlQueryProvider extends QueryProvider { .build(); List xFields = new ArrayList<>(); List fieldList = fields.stream().map(DatasetTableField::getId).collect(Collectors.toList()); + AtomicInteger sortIndex = new AtomicInteger(-1); if (CollectionUtils.isNotEmpty(sortFields)) { sortFields.forEach(item -> { - int indexOf = fieldList.indexOf(item.getId()); - if (indexOf == -1) { + sortIndex.set(fieldList.indexOf(item.getId())); + if (sortIndex.get() == -1) { fields.add(item); } else { - fields.set(indexOf, item); + fields.set(sortIndex.get(), item); } }); } @@ -273,6 +275,19 @@ public class MysqlQueryProvider extends QueryProvider { if (CollectionUtils.isNotEmpty(xOrders)) { st.add("orders", xOrders); } + if (CollectionUtils.isNotEmpty(xFields)) { + List finallyFields = new ArrayList<>(); + for (int i = 0; i < xFields.size(); i++) { + if (CollectionUtils.isNotEmpty(xOrders) && sortIndex.get() == -1 && i == xFields.size() - 1) { + continue; + } + SQLObj f = xFields.get(i); + String prefix = finallyFields.isEmpty() ? " DISTINCT " : ""; + f.setFieldName(prefix + String.format(MySQLConstants.KEYWORD_FIX, tableSQL.getTableAlias(), f.getFieldAlias())); + finallyFields.add(f); + } + st.add("groups", finallyFields); + } if (ObjectUtils.isNotEmpty(limit)) { ChartViewWithBLOBs view = new ChartViewWithBLOBs(); view.setResultMode("custom"); diff --git a/core/backend/src/main/java/io/dataease/provider/query/oracle/OracleQueryProvider.java b/core/backend/src/main/java/io/dataease/provider/query/oracle/OracleQueryProvider.java index dfcc5ccbbe..1b5c70fb9d 100644 --- a/core/backend/src/main/java/io/dataease/provider/query/oracle/OracleQueryProvider.java +++ b/core/backend/src/main/java/io/dataease/provider/query/oracle/OracleQueryProvider.java @@ -121,8 +121,6 @@ public class OracleQueryProvider extends QueryProvider { setSchema(tableObj, ds); List xFields = xFields(table, fields); - - STGroup stg = new STGroupFile(SQLConstants.SQL_TEMPLATE); ST st_sql = stg.getInstanceOf("previewSql"); st_sql.add("isGroup", isGroup); @@ -151,6 +149,17 @@ public class OracleQueryProvider extends QueryProvider { } if (ObjectUtils.isNotEmpty(xOrders)) { st_sql.add("orders", xOrders); + if (needDistinct(sortFields, limit)) { + st_sql.remove("groups"); + xOrders.forEach(f -> { + if (xFields.stream().noneMatch(x -> x.getFieldName().equals(f.getOrderField()))) { + String fieldAlias = String.format(SQLConstants.FIELD_ALIAS_X_PREFIX, xFields.size()); + SQLObj tField = SQLObj.builder().fieldName(f.getOrderField()).fieldAlias(fieldAlias).build(); + xFields.add(tField); + } + }); + st_sql.add("groups", xFields); + } } if (ObjectUtils.isNotEmpty(limit)) { ChartViewWithBLOBs view = new ChartViewWithBLOBs(); diff --git a/core/backend/src/main/java/io/dataease/provider/query/pg/PgQueryProvider.java b/core/backend/src/main/java/io/dataease/provider/query/pg/PgQueryProvider.java index a18e0cc6f7..2a2c1a9076 100644 --- a/core/backend/src/main/java/io/dataease/provider/query/pg/PgQueryProvider.java +++ b/core/backend/src/main/java/io/dataease/provider/query/pg/PgQueryProvider.java @@ -170,10 +170,10 @@ public class PgQueryProvider extends QueryProvider { .fieldOriginName(originField) .fieldName(fieldName) .fieldAlias(fieldAlias) + .build()); } } - STGroup stg = new STGroupFile(SQLConstants.SQL_TEMPLATE); ST st_sql = stg.getInstanceOf("previewSql"); st_sql.add("isGroup", isGroup); @@ -207,6 +207,17 @@ public class PgQueryProvider extends QueryProvider { } if (ObjectUtils.isNotEmpty(xOrders)) { st_sql.add("orders", xOrders); + if (needDistinct(sortFields, limit)) { + st_sql.remove("groups"); + xOrders.forEach(f -> { + if (xFields.stream().noneMatch(x -> x.getFieldName().equals(f.getOrderField()))) { + String fieldAlias = String.format(SQLConstants.FIELD_ALIAS_X_PREFIX, xFields.size()); + SQLObj tField = SQLObj.builder().fieldName(f.getOrderField()).fieldAlias(fieldAlias).build(); + xFields.add(tField); + } + }); + st_sql.add("groups", xFields); + } } if (ObjectUtils.isNotEmpty(limit)) { if (ObjectUtils.isNotEmpty(limit)) { 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 37b0e78a00..716c32860b 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 @@ -250,7 +250,20 @@ public class SqlserverQueryProvider extends QueryProvider { } } if (ObjectUtils.isNotEmpty(limit)) { - SQLObj limitFiled = SQLObj.builder().limitFiled(" top " + limit + " ").build(); + String topKeyWord = " top "; + if (needDistinct(sortFields, limit)) { + topKeyWord = " distinct top "; + st_sql.remove("groups"); + xOrders.forEach(f -> { + if (xFields.stream().noneMatch(x -> x.getFieldName().equals(f.getOrderField()))) { + String fieldAlias = String.format(SQLConstants.FIELD_ALIAS_X_PREFIX, xFields.size()); + SQLObj tField = SQLObj.builder().fieldName(f.getOrderField()).fieldAlias(fieldAlias).build(); + xFields.add(tField); + } + }); + st_sql.add("groups", xFields); + } + SQLObj limitFiled = SQLObj.builder().limitFiled(topKeyWord + limit + " ").build(); st_sql.add("limitFiled", limitFiled); } 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 b9f863dc8b..d60e4a37f9 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 @@ -263,4 +263,8 @@ public abstract class QueryProvider { } return "'%" + value + "%'"; } + + public boolean needDistinct(List sortFields, Long limit) { + return CollectionUtils.isNotEmpty(sortFields) && ObjectUtils.isNotEmpty(limit); + } }