diff --git a/backend/src/main/java/io/dataease/controller/request/chart/ChartExtRequest.java b/backend/src/main/java/io/dataease/controller/request/chart/ChartExtRequest.java index 55c24e6ae2..51d5cc3c74 100644 --- a/backend/src/main/java/io/dataease/controller/request/chart/ChartExtRequest.java +++ b/backend/src/main/java/io/dataease/controller/request/chart/ChartExtRequest.java @@ -44,4 +44,8 @@ public class ChartExtRequest { @ApiModelProperty(hidden = true) private PermissionProxy proxy; + private Long goPage; + + private Long pageSize; + } diff --git a/backend/src/main/java/io/dataease/dto/chart/ChartViewDTO.java b/backend/src/main/java/io/dataease/dto/chart/ChartViewDTO.java index 2c6da656f9..1b7f75132f 100644 --- a/backend/src/main/java/io/dataease/dto/chart/ChartViewDTO.java +++ b/backend/src/main/java/io/dataease/dto/chart/ChartViewDTO.java @@ -41,4 +41,8 @@ public class ChartViewDTO extends ChartViewWithBLOBs { private String yAxis; @SerializedName("yaxisExt") private String yAxisExt; + + private long totalPage; + private long totalItems; + private int datasetMode; } diff --git a/backend/src/main/java/io/dataease/provider/query/ck/CKQueryProvider.java b/backend/src/main/java/io/dataease/provider/query/ck/CKQueryProvider.java index 0be43013ff..8f2c593918 100644 --- a/backend/src/main/java/io/dataease/provider/query/ck/CKQueryProvider.java +++ b/backend/src/main/java/io/dataease/provider/query/ck/CKQueryProvider.java @@ -17,6 +17,7 @@ import io.dataease.plugins.common.dto.sqlObj.SQLObj; import io.dataease.plugins.common.request.chart.ChartExtFilterRequest; import io.dataease.plugins.common.request.permission.DataSetRowPermissionsTreeDTO; import io.dataease.plugins.common.request.permission.DatasetRowPermissionsTreeItem; +import io.dataease.plugins.datasource.entity.PageInfo; import io.dataease.plugins.datasource.query.QueryProvider; import io.dataease.plugins.datasource.query.Utils; import org.apache.commons.collections4.CollectionUtils; @@ -393,8 +394,22 @@ public class CKQueryProvider extends QueryProvider { return sqlLimit(st.render(), view); } + @Override + public String getSQLWithPage(boolean isTable, String table, List xAxis, List fieldCustomFilter, List rowPermissionsTree, List extFilterRequestList, Datasource ds, ChartViewWithBLOBs view, PageInfo pageInfo) { + String limit = ((pageInfo.getGoPage() != null && pageInfo.getPageSize() != null) ? " LIMIT " + (pageInfo.getGoPage() - 1) * pageInfo.getPageSize() + "," + pageInfo.getPageSize() : ""); + if (isTable) { + return originalTableInfo(table, xAxis, fieldCustomFilter, rowPermissionsTree, extFilterRequestList, ds, view) + limit; + } else { + return originalTableInfo("(" + sqlFix(table) + ")", xAxis, fieldCustomFilter, rowPermissionsTree, extFilterRequestList, ds, view) + limit; + } + } + @Override public String getSQLTableInfo(String table, List xAxis, List fieldCustomFilter, List rowPermissionsTree, List extFilterRequestList, Datasource ds, ChartViewWithBLOBs view) { + return sqlLimit(originalTableInfo(table, xAxis, fieldCustomFilter, rowPermissionsTree, extFilterRequestList, ds, view), view); + } + + private String originalTableInfo(String table, List xAxis, List fieldCustomFilter, List rowPermissionsTree, List extFilterRequestList, Datasource ds, ChartViewWithBLOBs view) { SQLObj tableObj = SQLObj.builder() .tableName((table.startsWith("(") && table.endsWith(")")) ? table : String.format(CKConstants.KEYWORD_TABLE, table)) .tableAlias(String.format(TABLE_ALIAS_PREFIX, 0)) @@ -466,7 +481,7 @@ public class CKQueryProvider extends QueryProvider { .build(); if (CollectionUtils.isNotEmpty(orders)) st.add("orders", orders); if (ObjectUtils.isNotEmpty(tableSQL)) st.add("table", tableSQL); - return sqlLimit(st.render(), view); + return st.render(); } @Override @@ -1072,10 +1087,14 @@ public class CKQueryProvider extends QueryProvider { if (ObjectUtils.isNotEmpty(datasetTableField) && datasetTableField.getDeType() == DeTypeConstants.DE_TIME && StringUtils.equalsIgnoreCase(request.getOperator(), "between")) { SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS"); request.setOperator("ge"); - request.setValue(new ArrayList(){{add(String.format(toDateTime64, "'" + simpleDateFormat.format(new Date(Long.parseLong(requestValue.get(0)))) + "'"));}}); + request.setValue(new ArrayList() {{ + add(String.format(toDateTime64, "'" + simpleDateFormat.format(new Date(Long.parseLong(requestValue.get(0)))) + "'")); + }}); ChartExtFilterRequest requestCopy = BeanUtils.copyBean(new ChartExtFilterRequest(), request); requestCopy.setOperator("le"); - requestCopy.setValue(new ArrayList(){{add(String.format(toDateTime64, "'" + simpleDateFormat.format(new Date(Long.parseLong(requestValue.get(1)))) + "'"));}}); + requestCopy.setValue(new ArrayList() {{ + add(String.format(toDateTime64, "'" + simpleDateFormat.format(new Date(Long.parseLong(requestValue.get(1)))) + "'")); + }}); atomicReference.set(requestCopy); } }); diff --git a/backend/src/main/java/io/dataease/provider/query/db2/Db2QueryProvider.java b/backend/src/main/java/io/dataease/provider/query/db2/Db2QueryProvider.java index 1dd968cbc0..7fad9ee875 100644 --- a/backend/src/main/java/io/dataease/provider/query/db2/Db2QueryProvider.java +++ b/backend/src/main/java/io/dataease/provider/query/db2/Db2QueryProvider.java @@ -19,6 +19,7 @@ import io.dataease.plugins.common.request.chart.ChartExtFilterRequest; import io.dataease.plugins.common.request.permission.DataSetRowPermissionsTreeDTO; import io.dataease.plugins.common.request.permission.DatasetRowPermissionsTreeItem; import io.dataease.plugins.datasource.entity.JdbcConfiguration; +import io.dataease.plugins.datasource.entity.PageInfo; import io.dataease.plugins.datasource.query.QueryProvider; import io.dataease.plugins.datasource.query.Utils; import org.apache.commons.collections4.CollectionUtils; @@ -376,8 +377,7 @@ public class Db2QueryProvider extends QueryProvider { return sqlLimit(st.render(), view); } - @Override - public String getSQLTableInfo(String table, List xAxis, List fieldCustomFilter, List rowPermissionsTree, List extFilterRequestList, Datasource ds, ChartViewWithBLOBs view) { + private String originalTableInfo(String table, List xAxis, List fieldCustomFilter, List rowPermissionsTree, List extFilterRequestList, Datasource ds, ChartViewWithBLOBs view) { SQLObj tableObj = SQLObj.builder() .tableName((table.startsWith("(") && table.endsWith(")")) ? table : String.format(Db2Constants.KEYWORD_TABLE, table)) .tableAlias(String.format(TABLE_ALIAS_PREFIX, 0)) @@ -451,7 +451,22 @@ public class Db2QueryProvider extends QueryProvider { .build(); if (CollectionUtils.isNotEmpty(orders)) st.add("orders", orders); if (ObjectUtils.isNotEmpty(tableSQL)) st.add("table", tableSQL); - return sqlLimit(st.render(), view); + return st.render(); + } + + @Override + public String getSQLTableInfo(String table, List xAxis, List fieldCustomFilter, List rowPermissionsTree, List extFilterRequestList, Datasource ds, ChartViewWithBLOBs view) { + return sqlLimit(originalTableInfo(table, xAxis, fieldCustomFilter, rowPermissionsTree, extFilterRequestList, ds, view), view); + } + + @Override + public String getSQLWithPage(boolean isTable, String table, List xAxis, List fieldCustomFilter, List rowPermissionsTree, List extFilterRequestList, Datasource ds, ChartViewWithBLOBs view, PageInfo pageInfo) { + String limit = ((pageInfo.getGoPage() != null && pageInfo.getPageSize() != null) ? " LIMIT " + (pageInfo.getGoPage() - 1) * pageInfo.getPageSize() + "," + pageInfo.getPageSize() : ""); + if (isTable) { + return originalTableInfo(table, xAxis, fieldCustomFilter, rowPermissionsTree, extFilterRequestList, ds, view) + limit; + } else { + return originalTableInfo("(" + sqlFix(table) + ")", xAxis, fieldCustomFilter, rowPermissionsTree, extFilterRequestList, ds, view) + limit; + } } @Override diff --git a/backend/src/main/java/io/dataease/provider/query/hive/HiveQueryProvider.java b/backend/src/main/java/io/dataease/provider/query/hive/HiveQueryProvider.java index def9bcb0ba..ce089d53c9 100644 --- a/backend/src/main/java/io/dataease/provider/query/hive/HiveQueryProvider.java +++ b/backend/src/main/java/io/dataease/provider/query/hive/HiveQueryProvider.java @@ -16,6 +16,7 @@ import io.dataease.plugins.common.dto.sqlObj.SQLObj; import io.dataease.plugins.common.request.chart.ChartExtFilterRequest; import io.dataease.plugins.common.request.permission.DataSetRowPermissionsTreeDTO; import io.dataease.plugins.common.request.permission.DatasetRowPermissionsTreeItem; +import io.dataease.plugins.datasource.entity.PageInfo; import io.dataease.plugins.datasource.query.QueryProvider; import io.dataease.plugins.datasource.query.Utils; import org.apache.commons.collections4.CollectionUtils; @@ -346,7 +347,15 @@ public class HiveQueryProvider extends QueryProvider { } @Override - public String getSQLTableInfo(String table, List xAxis, List fieldCustomFilter, List rowPermissionsTree, List extFilterRequestList, Datasource ds, ChartViewWithBLOBs view) { + public String getSQLWithPage(boolean isTable, String table, List xAxis, List fieldCustomFilter, List rowPermissionsTree, List extFilterRequestList, Datasource ds, ChartViewWithBLOBs view, PageInfo pageInfo) { + String limit = ((pageInfo.getGoPage() != null && pageInfo.getPageSize() != null) ? " LIMIT " + (pageInfo.getGoPage() - 1) * pageInfo.getPageSize() + " , " + pageInfo.getPageSize(): ""); + if (isTable) { + return originalTableInfo(table, xAxis, fieldCustomFilter, rowPermissionsTree, extFilterRequestList, ds, view) + limit; + } else { + return originalTableInfo("(" + sqlFix(table) + ")", xAxis, fieldCustomFilter, rowPermissionsTree, extFilterRequestList, ds, view) + limit; + } + } + private String originalTableInfo(String table, List xAxis, List fieldCustomFilter, List rowPermissionsTree, List extFilterRequestList, Datasource ds, ChartViewWithBLOBs view) { SQLObj tableObj = SQLObj.builder() .tableName((table.startsWith("(") && table.endsWith(")")) ? table : String.format(HiveConstants.KEYWORD_TABLE, table)) .tableAlias(String.format(TABLE_ALIAS_PREFIX, 0)) @@ -418,7 +427,11 @@ public class HiveQueryProvider extends QueryProvider { .build(); if (CollectionUtils.isNotEmpty(orders)) st.add("orders", orders); if (ObjectUtils.isNotEmpty(tableSQL)) st.add("table", tableSQL); - return sqlLimit(st.render(), view); + return st.render(); + } + @Override + public String getSQLTableInfo(String table, List xAxis, List fieldCustomFilter, List rowPermissionsTree, List extFilterRequestList, Datasource ds, ChartViewWithBLOBs view) { + return sqlLimit(originalTableInfo(table, xAxis, fieldCustomFilter, rowPermissionsTree, extFilterRequestList, ds, view), view); } @Override diff --git a/backend/src/main/java/io/dataease/provider/query/impala/ImpalaQueryProvider.java b/backend/src/main/java/io/dataease/provider/query/impala/ImpalaQueryProvider.java index fbaf4631e3..edfd4a8810 100644 --- a/backend/src/main/java/io/dataease/provider/query/impala/ImpalaQueryProvider.java +++ b/backend/src/main/java/io/dataease/provider/query/impala/ImpalaQueryProvider.java @@ -16,6 +16,7 @@ import io.dataease.plugins.common.dto.sqlObj.SQLObj; import io.dataease.plugins.common.request.chart.ChartExtFilterRequest; import io.dataease.plugins.common.request.permission.DataSetRowPermissionsTreeDTO; import io.dataease.plugins.common.request.permission.DatasetRowPermissionsTreeItem; +import io.dataease.plugins.datasource.entity.PageInfo; import io.dataease.plugins.datasource.query.QueryProvider; import io.dataease.plugins.datasource.query.Utils; import org.apache.commons.collections4.CollectionUtils; @@ -343,7 +344,16 @@ public class ImpalaQueryProvider extends QueryProvider { } @Override - public String getSQLTableInfo(String table, List xAxis, List fieldCustomFilter, List rowPermissionsTree, List extFilterRequestList, Datasource ds, ChartViewWithBLOBs view) { + public String getSQLWithPage(boolean isTable, String table, List xAxis, List fieldCustomFilter, List rowPermissionsTree, List extFilterRequestList, Datasource ds, ChartViewWithBLOBs view, PageInfo pageInfo) { + String limit = ((pageInfo.getGoPage() != null && pageInfo.getPageSize() != null) ? " LIMIT " + pageInfo.getPageSize() + " offset " + (pageInfo.getGoPage() - 1) * pageInfo.getPageSize() : ""); + if (isTable) { + return originalTableInfo(table, xAxis, fieldCustomFilter, rowPermissionsTree, extFilterRequestList, ds, view) + limit; + } else { + return originalTableInfo("(" + sqlFix(table) + ")", xAxis, fieldCustomFilter, rowPermissionsTree, extFilterRequestList, ds, view) + limit; + } + } + + private String originalTableInfo(String table, List xAxis, List fieldCustomFilter, List rowPermissionsTree, List extFilterRequestList, Datasource ds, ChartViewWithBLOBs view) { SQLObj tableObj = SQLObj.builder() .tableName((table.startsWith("(") && table.endsWith(")")) ? table : String.format(ImpalaConstants.KEYWORD_TABLE, table)) .tableAlias(String.format(TABLE_ALIAS_PREFIX, 0)) @@ -415,7 +425,11 @@ public class ImpalaQueryProvider extends QueryProvider { .build(); if (CollectionUtils.isNotEmpty(orders)) st.add("orders", orders); if (ObjectUtils.isNotEmpty(tableSQL)) st.add("table", tableSQL); - return sqlLimit(st.render(), view); + return st.render(); + } + @Override + public String getSQLTableInfo(String table, List xAxis, List fieldCustomFilter, List rowPermissionsTree, List extFilterRequestList, Datasource ds, ChartViewWithBLOBs view) { + return sqlLimit(originalTableInfo(table, xAxis, fieldCustomFilter, rowPermissionsTree, extFilterRequestList, ds, view), view); } @Override diff --git a/backend/src/main/java/io/dataease/provider/query/mongodb/MongoQueryProvider.java b/backend/src/main/java/io/dataease/provider/query/mongodb/MongoQueryProvider.java index 3931ed8f9a..1a11a1d232 100644 --- a/backend/src/main/java/io/dataease/provider/query/mongodb/MongoQueryProvider.java +++ b/backend/src/main/java/io/dataease/provider/query/mongodb/MongoQueryProvider.java @@ -16,6 +16,7 @@ import io.dataease.plugins.common.dto.sqlObj.SQLObj; import io.dataease.plugins.common.request.chart.ChartExtFilterRequest; import io.dataease.plugins.common.request.permission.DataSetRowPermissionsTreeDTO; import io.dataease.plugins.common.request.permission.DatasetRowPermissionsTreeItem; +import io.dataease.plugins.datasource.entity.PageInfo; import io.dataease.plugins.datasource.query.QueryProvider; import io.dataease.plugins.datasource.query.Utils; import org.apache.commons.collections4.CollectionUtils; @@ -311,7 +312,16 @@ public class MongoQueryProvider extends QueryProvider { } @Override - public String getSQLTableInfo(String table, List xAxis, List fieldCustomFilter, List rowPermissionsTree, List extFilterRequestList, Datasource ds, ChartViewWithBLOBs view) { + public String getSQLWithPage(boolean isTable, String table, List xAxis, List fieldCustomFilter, List rowPermissionsTree, List extFilterRequestList, Datasource ds, ChartViewWithBLOBs view, PageInfo pageInfo) { + String limit = ((pageInfo.getGoPage() != null && pageInfo.getPageSize() != null) ? " LIMIT " + (pageInfo.getGoPage() - 1) * pageInfo.getPageSize() + " , " + pageInfo.getPageSize() : ""); + if (isTable) { + return originalTableInfo(table, xAxis, fieldCustomFilter, rowPermissionsTree, extFilterRequestList, ds, view) + limit; + } else { + return originalTableInfo("(" + sqlFix(table) + ")", xAxis, fieldCustomFilter, rowPermissionsTree, extFilterRequestList, ds, view) + limit; + } + } + + private String originalTableInfo(String table, List xAxis, List fieldCustomFilter, List rowPermissionsTree, List extFilterRequestList, Datasource ds, ChartViewWithBLOBs view) { SQLObj tableObj = SQLObj.builder() .tableName((table.startsWith("(") && table.endsWith(")")) ? table : String.format(MongoConstants.KEYWORD_TABLE, table)) .tableAlias(String.format(TABLE_ALIAS_PREFIX, 0)) @@ -385,7 +395,12 @@ public class MongoQueryProvider extends QueryProvider { .build(); if (CollectionUtils.isNotEmpty(orders)) st.add("orders", orders); if (ObjectUtils.isNotEmpty(tableSQL)) st.add("table", tableSQL); - return sqlLimit(st.render(), view); + return st.render(); + } + + @Override + public String getSQLTableInfo(String table, List xAxis, List fieldCustomFilter, List rowPermissionsTree, List extFilterRequestList, Datasource ds, ChartViewWithBLOBs view) { + return sqlLimit(originalTableInfo(table, xAxis, fieldCustomFilter, rowPermissionsTree, extFilterRequestList, ds, view), view); } @Override diff --git a/backend/src/main/java/io/dataease/provider/query/mysql/MysqlQueryProvider.java b/backend/src/main/java/io/dataease/provider/query/mysql/MysqlQueryProvider.java index de53211f92..b02ee4ef54 100644 --- a/backend/src/main/java/io/dataease/provider/query/mysql/MysqlQueryProvider.java +++ b/backend/src/main/java/io/dataease/provider/query/mysql/MysqlQueryProvider.java @@ -17,6 +17,7 @@ import io.dataease.plugins.common.dto.sqlObj.SQLObj; import io.dataease.plugins.common.request.chart.ChartExtFilterRequest; import io.dataease.plugins.common.request.permission.DataSetRowPermissionsTreeDTO; import io.dataease.plugins.common.request.permission.DatasetRowPermissionsTreeItem; +import io.dataease.plugins.datasource.entity.PageInfo; import io.dataease.plugins.datasource.query.QueryProvider; import io.dataease.plugins.datasource.query.Utils; import org.apache.commons.collections4.CollectionUtils; @@ -373,6 +374,20 @@ public class MysqlQueryProvider extends QueryProvider { @Override public String getSQLTableInfo(String table, List xAxis, List fieldCustomFilter, List rowPermissionsTree, List extFilterRequestList, Datasource ds, ChartViewWithBLOBs view) { + return sqlLimit(originalTableInfo(table, xAxis, fieldCustomFilter, rowPermissionsTree, extFilterRequestList, ds, view), view); + } + + @Override + public String getSQLWithPage(boolean isTable, String table, List xAxis, List fieldCustomFilter, List rowPermissionsTree, List extFilterRequestList, Datasource ds, ChartViewWithBLOBs view, PageInfo pageInfo) { + String limit = ((pageInfo.getGoPage() != null && pageInfo.getPageSize() != null) ? " LIMIT " + (pageInfo.getGoPage() - 1) * pageInfo.getPageSize() + "," + pageInfo.getPageSize() : ""); + if (isTable) { + return originalTableInfo(table, xAxis, fieldCustomFilter, rowPermissionsTree, extFilterRequestList, ds, view) + limit; + } else { + return originalTableInfo("(" + sqlFix(table) + ")", xAxis, fieldCustomFilter, rowPermissionsTree, extFilterRequestList, ds, view) + limit; + } + } + + private String originalTableInfo(String table, List xAxis, List fieldCustomFilter, List rowPermissionsTree, List extFilterRequestList, Datasource ds, ChartViewWithBLOBs view) { SQLObj tableObj = SQLObj.builder() .tableName((table.startsWith("(") && table.endsWith(")")) ? table : String.format(MySQLConstants.KEYWORD_TABLE, table)) .tableAlias(String.format(TABLE_ALIAS_PREFIX, 0)) @@ -443,7 +458,7 @@ public class MysqlQueryProvider extends QueryProvider { .build(); if (CollectionUtils.isNotEmpty(orders)) st.add("orders", orders); if (ObjectUtils.isNotEmpty(tableSQL)) st.add("table", tableSQL); - return sqlLimit(st.render(), view); + return st.render(); } @Override diff --git a/backend/src/main/java/io/dataease/provider/query/oracle/OracleQueryProvider.java b/backend/src/main/java/io/dataease/provider/query/oracle/OracleQueryProvider.java index 38f524f5bf..8d1c685527 100644 --- a/backend/src/main/java/io/dataease/provider/query/oracle/OracleQueryProvider.java +++ b/backend/src/main/java/io/dataease/provider/query/oracle/OracleQueryProvider.java @@ -19,6 +19,7 @@ import io.dataease.plugins.common.request.chart.ChartExtFilterRequest; import io.dataease.plugins.common.request.permission.DataSetRowPermissionsTreeDTO; import io.dataease.plugins.common.request.permission.DatasetRowPermissionsTreeItem; import io.dataease.plugins.datasource.entity.JdbcConfiguration; +import io.dataease.plugins.datasource.entity.PageInfo; import io.dataease.plugins.datasource.query.QueryProvider; import io.dataease.plugins.datasource.query.Utils; import org.apache.commons.collections4.CollectionUtils; @@ -402,7 +403,42 @@ public class OracleQueryProvider extends QueryProvider { } @Override - public String getSQLTableInfo(String table, List xAxis, List fieldCustomFilter, List rowPermissionsTree, List extFilterRequestList, Datasource ds, ChartViewWithBLOBs view) { + public String getSQLWithPage(boolean isTable, String table, List orgXAxis, List OrgFeldCustomFilter, List rowPermissionsTree, List extFilterRequestList, Datasource ds, ChartViewWithBLOBs view, PageInfo pageInfo) { + List xAxis = new ArrayList<>(); + orgXAxis.forEach(chartViewFieldDTO -> { + xAxis.add(chartViewFieldDTO); + }); + ChartViewFieldDTO chartViewFieldDTO = new ChartViewFieldDTO(); + chartViewFieldDTO.setOriginName("ROWNUM"); + xAxis.add(chartViewFieldDTO); + + + List fieldCustomFilter = new ArrayList<>(); + for (ChartFieldCustomFilterDTO chartFieldCustomFilterDTO : OrgFeldCustomFilter) { + fieldCustomFilter.add(chartFieldCustomFilterDTO); + } + ChartFieldCustomFilterDTO chartFieldCustomFilterDTO = new ChartFieldCustomFilterDTO(); + DatasetTableField datasetTableField = new DatasetTableField(); + datasetTableField.setOriginName("ROWNUM"); + datasetTableField.setDeType(0); + chartFieldCustomFilterDTO.setField(datasetTableField); + + List filterItemDTOS = new ArrayList<>(); + ChartCustomFilterItemDTO itemDTO = new ChartCustomFilterItemDTO(); + itemDTO.setTerm("le"); + itemDTO.setValue(String.valueOf(pageInfo.getGoPage() * pageInfo.getPageSize())); + filterItemDTOS.add(itemDTO); + chartFieldCustomFilterDTO.setFilter(filterItemDTOS); + fieldCustomFilter.add(chartFieldCustomFilterDTO); + + if (isTable) { + return "SELECT * FROM (" + sqlFix(originalTableInfo(table, xAxis, fieldCustomFilter, rowPermissionsTree, extFilterRequestList, ds, view)) + ") DE_RESULT_TMP " + " WHERE DE_ROWNUM >= " + (pageInfo.getGoPage() - 1) * pageInfo.getPageSize(); + } else { + return "SELECT * FROM (" + sqlFix(originalTableInfo("(" + sqlFix(table) + ")", xAxis, fieldCustomFilter, rowPermissionsTree, extFilterRequestList, ds, view)) + ") DE_RESULT_TMP " + " WHERE DE_ROWNUM >= " + (pageInfo.getGoPage() - 1) * pageInfo.getPageSize(); + } + } + + private String originalTableInfo(String table, List xAxis, List fieldCustomFilter, List rowPermissionsTree, List extFilterRequestList, Datasource ds, ChartViewWithBLOBs view) { SQLObj tableObj = SQLObj.builder() .tableName((table.startsWith("(") && table.endsWith(")")) ? table : String.format(OracleConstants.KEYWORD_TABLE, table)) .tableAlias(String.format(OracleConstants.ALIAS_FIX, String.format(TABLE_ALIAS_PREFIX, 0))) @@ -413,6 +449,13 @@ public class OracleQueryProvider extends QueryProvider { if (CollectionUtils.isNotEmpty(xAxis)) { for (int i = 0; i < xAxis.size(); i++) { ChartViewFieldDTO x = xAxis.get(i); + if (x.getOriginName().equalsIgnoreCase("ROWNUM")) { + xFields.add(SQLObj.builder() + .fieldName(x.getOriginName()) + .fieldAlias("DE_ROWNUM") + .build()); + continue; + } String originField; if (ObjectUtils.isNotEmpty(x.getExtField()) && x.getExtField() == 2) { // 解析origin name中有关联的字段生成sql表达式 @@ -474,7 +517,12 @@ public class OracleQueryProvider extends QueryProvider { .build(); if (CollectionUtils.isNotEmpty(orders)) st.add("orders", orders); if (ObjectUtils.isNotEmpty(tableSQL)) st.add("table", tableSQL); - return sqlLimit(st.render(), view); + return st.render(); + } + + @Override + public String getSQLTableInfo(String table, List xAxis, List fieldCustomFilter, List rowPermissionsTree, List extFilterRequestList, Datasource ds, ChartViewWithBLOBs view) { + return sqlLimit(originalTableInfo(table, xAxis, fieldCustomFilter, rowPermissionsTree, extFilterRequestList, ds, view), view); } @Override @@ -974,6 +1022,8 @@ public class OracleQueryProvider extends QueryProvider { originName = calcFieldRegex(field.getOriginName(), tableObj); } else if (ObjectUtils.isNotEmpty(field.getExtField()) && field.getExtField() == 1) { originName = String.format(OracleConstants.KEYWORD_FIX, tableObj.getTableAlias(), field.getOriginName()); + } else if (field.getOriginName().equalsIgnoreCase("ROWNUM")) { + originName = field.getOriginName(); } else { originName = String.format(OracleConstants.KEYWORD_FIX, tableObj.getTableAlias(), field.getOriginName()); } diff --git a/backend/src/main/java/io/dataease/provider/query/pg/PgQueryProvider.java b/backend/src/main/java/io/dataease/provider/query/pg/PgQueryProvider.java index 40c7c26e40..ead69fa59f 100644 --- a/backend/src/main/java/io/dataease/provider/query/pg/PgQueryProvider.java +++ b/backend/src/main/java/io/dataease/provider/query/pg/PgQueryProvider.java @@ -19,6 +19,7 @@ import io.dataease.plugins.common.request.chart.ChartExtFilterRequest; import io.dataease.plugins.common.request.permission.DataSetRowPermissionsTreeDTO; import io.dataease.plugins.common.request.permission.DatasetRowPermissionsTreeItem; import io.dataease.plugins.datasource.entity.JdbcConfiguration; +import io.dataease.plugins.datasource.entity.PageInfo; import io.dataease.plugins.datasource.query.QueryProvider; import io.dataease.plugins.datasource.query.Utils; import org.apache.commons.collections4.CollectionUtils; @@ -144,7 +145,7 @@ public class PgQueryProvider extends QueryProvider { } else if (f.getDeType() == DeTypeConstants.DE_FLOAT) { fieldName = String.format(PgConstants.CAST, originField, PgConstants.DEFAULT_FLOAT_FORMAT); } else if (f.getDeType() == DeTypeConstants.DE_TIME) { - fieldName = String.format(PgConstants.STR_TO_DATE, originField, StringUtils.isNotEmpty(f.getDateFormat()) ? f.getDateFormat() : PgConstants.DEFAULT_DATE_FORMAT); + fieldName = String.format(PgConstants.STR_TO_DATE, originField, StringUtils.isNotEmpty(f.getDateFormat()) ? f.getDateFormat() : PgConstants.DEFAULT_DATE_FORMAT); } else { fieldName = originField; } @@ -218,7 +219,7 @@ public class PgQueryProvider extends QueryProvider { } else if (f.getDeType() == DeTypeConstants.DE_FLOAT) { fieldName = String.format(PgConstants.CAST, originField, PgConstants.DEFAULT_FLOAT_FORMAT); } else if (f.getDeType() == DeTypeConstants.DE_TIME) { - fieldName = String.format(PgConstants.STR_TO_DATE, originField, StringUtils.isNotEmpty(f.getDateFormat()) ? f.getDateFormat() : PgConstants.DEFAULT_DATE_FORMAT); + fieldName = String.format(PgConstants.STR_TO_DATE, originField, StringUtils.isNotEmpty(f.getDateFormat()) ? f.getDateFormat() : PgConstants.DEFAULT_DATE_FORMAT); } else { fieldName = originField; } @@ -373,7 +374,16 @@ public class PgQueryProvider extends QueryProvider { } @Override - public String getSQLTableInfo(String table, List xAxis, List fieldCustomFilter, List rowPermissionsTree, List extFilterRequestList, Datasource ds, ChartViewWithBLOBs view) { + public String getSQLWithPage(boolean isTable, String table, List xAxis, List fieldCustomFilter, List rowPermissionsTree, List extFilterRequestList, Datasource ds, ChartViewWithBLOBs view, PageInfo pageInfo) { + String limit = ((pageInfo.getGoPage() != null && pageInfo.getPageSize() != null) ? " LIMIT " + pageInfo.getPageSize() + " offset " + (pageInfo.getGoPage() - 1) * pageInfo.getPageSize() : ""); + if (isTable) { + return originalTableInfo(table, xAxis, fieldCustomFilter, rowPermissionsTree, extFilterRequestList, ds, view) + limit; + } else { + return originalTableInfo("(" + sqlFix(table) + ")", xAxis, fieldCustomFilter, rowPermissionsTree, extFilterRequestList, ds, view) + limit; + } + } + + private String originalTableInfo(String table, List xAxis, List fieldCustomFilter, List rowPermissionsTree, List extFilterRequestList, Datasource ds, ChartViewWithBLOBs view) { SQLObj tableObj = SQLObj.builder() .tableName((table.startsWith("(") && table.endsWith(")")) ? table : String.format(PgConstants.KEYWORD_TABLE, table)) .tableAlias(String.format(TABLE_ALIAS_PREFIX, 0)) @@ -448,6 +458,11 @@ public class PgQueryProvider extends QueryProvider { return sqlLimit(st.render(), view); } + @Override + public String getSQLTableInfo(String table, List xAxis, List fieldCustomFilter, List rowPermissionsTree, List extFilterRequestList, Datasource ds, ChartViewWithBLOBs view) { + return sqlLimit(originalTableInfo(table, xAxis, fieldCustomFilter, rowPermissionsTree, extFilterRequestList, ds, view), view); + } + @Override public String getSQLAsTmpTableInfo(String sql, List xAxis, List fieldCustomFilter, List rowPermissionsTree, List extFilterRequestList, Datasource ds, ChartViewWithBLOBs view) { return getSQLTableInfo("(" + sqlFix(sql) + ")", xAxis, fieldCustomFilter, rowPermissionsTree, extFilterRequestList, ds, view); @@ -823,7 +838,7 @@ public class PgQueryProvider extends QueryProvider { } if (field.getDeType() == 1) { if (field.getDeExtractType() == 0 || field.getDeExtractType() == 5) { - whereName = String.format(PgConstants.STR_TO_DATE, originName, StringUtils.isNotEmpty(field.getDateFormat()) ? field.getDateFormat() : PgConstants.DEFAULT_DATE_FORMAT); + whereName = String.format(PgConstants.STR_TO_DATE, originName, StringUtils.isNotEmpty(field.getDateFormat()) ? field.getDateFormat() : PgConstants.DEFAULT_DATE_FORMAT); } if (field.getDeExtractType() == 2 || field.getDeExtractType() == 3 || field.getDeExtractType() == 4) { String cast = String.format(PgConstants.CAST, originName, "bigint"); @@ -1281,7 +1296,7 @@ public class PgQueryProvider extends QueryProvider { } @Override - public String sqlForPreview(String table, Datasource ds){ + public String sqlForPreview(String table, Datasource ds) { String schema = new Gson().fromJson(ds.getConfiguration(), JdbcConfiguration.class).getSchema(); schema = String.format(PgConstants.KEYWORD_TABLE, schema); return "SELECT * FROM " + schema + "." + String.format(PgConstants.KEYWORD_TABLE, table); diff --git a/backend/src/main/java/io/dataease/provider/query/redshift/RedshiftQueryProvider.java b/backend/src/main/java/io/dataease/provider/query/redshift/RedshiftQueryProvider.java index f895ca9b42..2ba6bc0e15 100644 --- a/backend/src/main/java/io/dataease/provider/query/redshift/RedshiftQueryProvider.java +++ b/backend/src/main/java/io/dataease/provider/query/redshift/RedshiftQueryProvider.java @@ -17,6 +17,7 @@ import io.dataease.plugins.common.request.chart.ChartExtFilterRequest; import io.dataease.plugins.common.request.permission.DataSetRowPermissionsTreeDTO; import io.dataease.plugins.common.request.permission.DatasetRowPermissionsTreeItem; import io.dataease.plugins.datasource.entity.JdbcConfiguration; +import io.dataease.plugins.datasource.entity.PageInfo; import io.dataease.plugins.datasource.query.QueryProvider; import io.dataease.plugins.datasource.query.Utils; import org.apache.commons.collections4.CollectionUtils; @@ -150,7 +151,7 @@ public class RedshiftQueryProvider extends QueryProvider { } else if (f.getDeType() == DeTypeConstants.DE_FLOAT) { fieldName = String.format(PgConstants.CAST, originField, PgConstants.DEFAULT_FLOAT_FORMAT); } else if (f.getDeType() == DeTypeConstants.DE_TIME) { - fieldName = String.format(PgConstants.STR_TO_DATE, originField, StringUtils.isNotEmpty(f.getDateFormat()) ? f.getDateFormat() : PgConstants.DEFAULT_DATE_FORMAT); + fieldName = String.format(PgConstants.STR_TO_DATE, originField, StringUtils.isNotEmpty(f.getDateFormat()) ? f.getDateFormat() : PgConstants.DEFAULT_DATE_FORMAT); } else { fieldName = originField; } @@ -225,7 +226,7 @@ public class RedshiftQueryProvider extends QueryProvider { } else if (f.getDeType() == DeTypeConstants.DE_FLOAT) { fieldName = String.format(PgConstants.CAST, originField, PgConstants.DEFAULT_FLOAT_FORMAT); } else if (f.getDeType() == DeTypeConstants.DE_TIME) { - fieldName = String.format(PgConstants.STR_TO_DATE, originField, StringUtils.isNotEmpty(f.getDateFormat()) ? f.getDateFormat() : PgConstants.DEFAULT_DATE_FORMAT); + fieldName = String.format(PgConstants.STR_TO_DATE, originField, StringUtils.isNotEmpty(f.getDateFormat()) ? f.getDateFormat() : PgConstants.DEFAULT_DATE_FORMAT); } else { fieldName = originField; } @@ -385,14 +386,99 @@ public class RedshiftQueryProvider extends QueryProvider { return getSQL("(" + sqlFix(sql) + ")", xAxis, yAxis, fieldCustomFilter, rowPermissionsTree, extFilterRequestList, null, view); } + @Override + public String getSQLWithPage(boolean isTable, String table, List xAxis, List fieldCustomFilter, List rowPermissionsTree, List extFilterRequestList, Datasource ds, ChartViewWithBLOBs view, PageInfo pageInfo) { + String limit = ((pageInfo.getGoPage() != null && pageInfo.getPageSize() != null) ? " LIMIT " + pageInfo.getPageSize() + " offset " + (pageInfo.getGoPage() - 1) * pageInfo.getPageSize() : ""); + if (isTable) { + return originalTableInfo(table, xAxis, fieldCustomFilter, rowPermissionsTree, extFilterRequestList, ds, view) + limit; + } else { + return originalTableInfo("(" + sqlFix(table) + ")", xAxis, fieldCustomFilter, rowPermissionsTree, extFilterRequestList, ds, view) + limit; + } + } + + @Override public String getSQLTableInfo(String table, List xAxis, List fieldCustomFilter, List rowPermissionsTree, List extFilterRequestList, Datasource ds, ChartViewWithBLOBs view) { - return null; + return sqlLimit(originalTableInfo(table, xAxis, fieldCustomFilter, rowPermissionsTree, extFilterRequestList, ds, view), view); + } + + private String originalTableInfo(String table, List xAxis, List fieldCustomFilter, List rowPermissionsTree, List extFilterRequestList, Datasource ds, ChartViewWithBLOBs view) { + SQLObj tableObj = SQLObj.builder() + .tableName((table.startsWith("(") && table.endsWith(")")) ? table : String.format(RedshiftConstants.KEYWORD_TABLE, table)) + .tableAlias(String.format(TABLE_ALIAS_PREFIX, 0)) + .build(); + List xFields = new ArrayList<>(); + List xOrders = new ArrayList<>(); + if (CollectionUtils.isNotEmpty(xAxis)) { + for (int i = 0; i < xAxis.size(); i++) { + ChartViewFieldDTO x = xAxis.get(i); + String originField; + if (ObjectUtils.isNotEmpty(x.getExtField()) && x.getExtField() == 2) { + // 解析origin name中有关联的字段生成sql表达式 + originField = calcFieldRegex(x.getOriginName(), tableObj); + } else if (ObjectUtils.isNotEmpty(x.getExtField()) && x.getExtField() == 1) { + originField = String.format(RedshiftConstants.KEYWORD_FIX, tableObj.getTableAlias(), x.getOriginName()); + } else { + if (x.getDeType() == 2 || x.getDeType() == 3) { + originField = String.format(RedshiftConstants.CAST, String.format(RedshiftConstants.KEYWORD_FIX, tableObj.getTableAlias(), x.getOriginName()), RedshiftConstants.DEFAULT_FLOAT_FORMAT); + } else { + originField = String.format(RedshiftConstants.KEYWORD_FIX, tableObj.getTableAlias(), x.getOriginName()); + } + } + String fieldAlias = String.format(SQLConstants.FIELD_ALIAS_X_PREFIX, i); + // 处理横轴字段 + xFields.add(getXFields(x, originField, fieldAlias)); + // 处理横轴排序 + if (StringUtils.isNotEmpty(x.getSort()) && Utils.joinSort(x.getSort())) { + xOrders.add(SQLObj.builder() + .orderField(originField) + .orderAlias(fieldAlias) + .orderDirection(x.getSort()) + .build()); + } + } + } + // 处理视图中字段过滤 + String customWheres = transCustomFilterList(tableObj, fieldCustomFilter); + // 处理仪表板字段过滤 + String extWheres = transExtFilterList(tableObj, extFilterRequestList); + // row permissions tree + String whereTrees = transFilterTrees(tableObj, rowPermissionsTree); + // 构建sql所有参数 + List fields = new ArrayList<>(); + fields.addAll(xFields); + List wheres = new ArrayList<>(); + if (customWheres != null) wheres.add(customWheres); + if (extWheres != null) wheres.add(extWheres); + if (whereTrees != null) wheres.add(whereTrees); + List groups = new ArrayList<>(); + groups.addAll(xFields); + // 外层再次套sql + List orders = new ArrayList<>(); + orders.addAll(xOrders); + + STGroup stg = new STGroupFile(SQLConstants.SQL_TEMPLATE); + ST st_sql = stg.getInstanceOf("previewSql"); + st_sql.add("isGroup", false); + if (CollectionUtils.isNotEmpty(xFields)) st_sql.add("groups", xFields); + if (CollectionUtils.isNotEmpty(wheres)) st_sql.add("filters", wheres); + if (ObjectUtils.isNotEmpty(tableObj)) st_sql.add("table", tableObj); + String sql = st_sql.render(); + + ST st = stg.getInstanceOf("previewSql"); + st.add("isGroup", false); + SQLObj tableSQL = SQLObj.builder() + .tableName(String.format(RedshiftConstants.BRACKETS, sql)) + .tableAlias(String.format(TABLE_ALIAS_PREFIX, 1)) + .build(); + if (CollectionUtils.isNotEmpty(orders)) st.add("orders", orders); + if (ObjectUtils.isNotEmpty(tableSQL)) st.add("table", tableSQL); + return st.render(); } @Override public String getSQLAsTmpTableInfo(String sql, List xAxis, List fieldCustomFilter, List rowPermissionsTree, List extFilterRequestList, Datasource ds, ChartViewWithBLOBs view) { - return null; + return getSQLTableInfo("(" + sqlFix(sql) + ")", xAxis, fieldCustomFilter, rowPermissionsTree, extFilterRequestList, null, view); } @Override @@ -759,7 +845,7 @@ public class RedshiftQueryProvider extends QueryProvider { } if (field.getDeType() == 1) { if (field.getDeExtractType() == 0 || field.getDeExtractType() == 5) { - whereName = String.format(PgConstants.STR_TO_DATE, originName, StringUtils.isNotEmpty(field.getDateFormat()) ? field.getDateFormat() : PgConstants.DEFAULT_DATE_FORMAT); + whereName = String.format(PgConstants.STR_TO_DATE, originName, StringUtils.isNotEmpty(field.getDateFormat()) ? field.getDateFormat() : PgConstants.DEFAULT_DATE_FORMAT); } if (field.getDeExtractType() == 2 || field.getDeExtractType() == 3 || field.getDeExtractType() == 4) { String cast = String.format(PgConstants.CAST, originName, "bigint"); @@ -1195,7 +1281,7 @@ public class RedshiftQueryProvider extends QueryProvider { } @Override - public String sqlForPreview(String table, Datasource ds){ + public String sqlForPreview(String table, Datasource ds) { String schema = new Gson().fromJson(ds.getConfiguration(), JdbcConfiguration.class).getSchema(); schema = String.format(PgConstants.KEYWORD_TABLE, schema); return "SELECT * FROM " + schema + "." + String.format(PgConstants.KEYWORD_TABLE, table); diff --git a/backend/src/main/java/io/dataease/service/chart/ChartViewService.java b/backend/src/main/java/io/dataease/service/chart/ChartViewService.java index 522a33fc66..34b5601182 100644 --- a/backend/src/main/java/io/dataease/service/chart/ChartViewService.java +++ b/backend/src/main/java/io/dataease/service/chart/ChartViewService.java @@ -42,6 +42,7 @@ import io.dataease.plugins.common.request.chart.ChartExtFilterRequest; import io.dataease.plugins.common.request.datasource.DatasourceRequest; import io.dataease.plugins.common.request.permission.DataSetRowPermissionsTreeDTO; import io.dataease.plugins.config.SpringContextUtil; +import io.dataease.plugins.datasource.entity.PageInfo; import io.dataease.plugins.datasource.provider.Provider; import io.dataease.plugins.datasource.query.QueryProvider; import io.dataease.plugins.view.entity.*; @@ -297,6 +298,10 @@ public class ChartViewService { public ChartViewDTO getData(String id, ChartExtRequest request) throws Exception { try { ChartViewDTO view = this.getOne(id, request.getQueryFrom()); + DatasetTable datasetTable = dataSetTableService.get(view.getTableId()); + if (ObjectUtils.isNotEmpty(datasetTable)) { + view.setDatasetMode(datasetTable.getMode()); + } // 如果是从仪表板获取视图数据,则仪表板的查询模式,查询结果的数量,覆盖视图对应的属性 if (CommonConstants.VIEW_RESULT_MODE.CUSTOM.equals(request.getResultMode())) { view.setResultMode(request.getResultMode()); @@ -548,7 +553,8 @@ public class ChartViewService { return data; } - public ChartViewDTO calcData(ChartViewDTO view, ChartExtRequest requestList, boolean cache) throws Exception { + public ChartViewDTO calcData(ChartViewDTO view, ChartExtRequest chartExtRequest, boolean cache) throws Exception { + ChartViewDTO chartViewDTO = new ChartViewDTO(); if (ObjectUtils.isEmpty(view)) { throw new RuntimeException(Translator.get("i18n_chart_delete")); } @@ -568,7 +574,6 @@ public class ChartViewService { }); } - List xAxisBase = gson.fromJson(view.getXAxis(), tokenType); List xAxis = gson.fromJson(view.getXAxis(), tokenType); List xAxisExt = gson.fromJson(view.getXAxisExt(), tokenType); @@ -582,7 +587,7 @@ public class ChartViewService { List yAxisExt = gson.fromJson(view.getYAxisExt(), tokenType); yAxis.addAll(yAxisExt); } - if (StringUtils.equalsIgnoreCase(view.getRender(), "antv") && StringUtils.equalsAnyIgnoreCase(view.getType(), "gauge","liquid")) { + if (StringUtils.equalsIgnoreCase(view.getRender(), "antv") && StringUtils.equalsAnyIgnoreCase(view.getType(), "gauge", "liquid")) { List sizeField = getSizeField(view); yAxis.addAll(sizeField); } @@ -595,12 +600,12 @@ public class ChartViewService { DatasetTableField datasetTableFieldObj = DatasetTableField.builder().tableId(view.getTableId()).checked(Boolean.TRUE).build(); List fields = dataSetTableFieldsService.list(datasetTableFieldObj); // 获取数据集,需校验权限 - DataSetTableDTO table = dataSetTableService.getWithPermission(view.getTableId(), requestList.getUser()); - checkPermission("use", table, requestList.getUser()); + DataSetTableDTO table = dataSetTableService.getWithPermission(view.getTableId(), chartExtRequest.getUser()); + checkPermission("use", table, chartExtRequest.getUser()); List desensitizationList = new ArrayList<>(); //列权限 - List columnPermissionFields = permissionService.filterColumnPermissions(fields, desensitizationList, table.getId(), requestList.getUser()); + List columnPermissionFields = permissionService.filterColumnPermissions(fields, desensitizationList, table.getId(), chartExtRequest.getUser()); //将没有权限的列删掉 List dataeaseNames = columnPermissionFields.stream().map(DatasetTableField::getDataeaseName).collect(Collectors.toList()); dataeaseNames.add("*"); @@ -611,7 +616,7 @@ public class ChartViewService { //行权限 - List rowPermissionsTree = permissionsTreeService.getRowPermissionsTree(fields, table, requestList.getUser()); + List rowPermissionsTree = permissionsTreeService.getRowPermissionsTree(fields, table, chartExtRequest.getUser()); for (ChartFieldCustomFilterDTO ele : fieldCustomFilter) { ele.setField(dataSetTableFieldsService.get(ele.getId())); @@ -621,6 +626,22 @@ public class ChartViewService { return emptyChartViewDTO(view); } + // 直连明细表分页 + Map mapAttr = gson.fromJson(view.getCustomAttr(), Map.class); + Map mapSize = (Map) mapAttr.get("size"); + if (StringUtils.equalsIgnoreCase(view.getType(), "table-info") && table.getMode() == 0 && StringUtils.equalsIgnoreCase((String) mapSize.get("tablePageMode"), "page")) { + if (chartExtRequest.getGoPage() == null) { + chartExtRequest.setGoPage(1L); + } + if (chartExtRequest.getPageSize() == null) { + String pageSize = (String) mapSize.get("tablePageSize"); + chartExtRequest.setPageSize(Long.parseLong(pageSize)); + } + } else { + chartExtRequest.setGoPage(null); + chartExtRequest.setPageSize(null); + } + switch (view.getType()) { case "label": xAxis = xAxis.stream().filter(item -> StringUtils.isNotEmpty(item.getChartId()) || (!desensitizationList.contains(item.getDataeaseName()) && dataeaseNames.contains(item.getDataeaseName()))).collect(Collectors.toList()); @@ -664,8 +685,8 @@ public class ChartViewService { // 过滤来自仪表板的条件 List extFilterList = new ArrayList<>(); //组件过滤条件 - if (ObjectUtils.isNotEmpty(requestList.getFilter())) { - for (ChartExtFilterRequest request : requestList.getFilter()) { + if (ObjectUtils.isNotEmpty(chartExtRequest.getFilter())) { + for (ChartExtFilterRequest request : chartExtRequest.getFilter()) { // 解析多个fieldId,fieldId是一个逗号分隔的字符串 String fieldId = request.getFieldId(); if (request.getIsTree() == null) { @@ -750,13 +771,13 @@ public class ChartViewService { List filters = new ArrayList<>(); // 联动条件 - if (ObjectUtils.isNotEmpty(requestList.getLinkageFilters())) { - filters.addAll(requestList.getLinkageFilters()); + if (ObjectUtils.isNotEmpty(chartExtRequest.getLinkageFilters())) { + filters.addAll(chartExtRequest.getLinkageFilters()); } // 外部参数条件 - if (ObjectUtils.isNotEmpty(requestList.getOuterParamsFilters())) { - filters.addAll(requestList.getOuterParamsFilters()); + if (ObjectUtils.isNotEmpty(chartExtRequest.getOuterParamsFilters())) { + filters.addAll(chartExtRequest.getOuterParamsFilters()); } //联动过滤条件和外部参数过滤条件全部加上 @@ -781,7 +802,7 @@ public class ChartViewService { // 下钻 List drillFilters = new ArrayList<>(); boolean isDrill = false; - List drillRequest = requestList.getDrill(); + List drillRequest = chartExtRequest.getDrill(); if (CollectionUtils.isNotEmpty(drillRequest) && (drill.size() > drillRequest.size())) { for (int i = 0; i < drillRequest.size(); i++) { ChartDrillRequest request = drillRequest.get(i); @@ -864,6 +885,14 @@ public class ChartViewService { // 如果是插件到此结束 } + String querySql = null; + long totalPage = 0l; + long totalItems = 0l; + String totalPageSql = null; + PageInfo pageInfo = new PageInfo(); + pageInfo.setGoPage(chartExtRequest.getGoPage()); + pageInfo.setPageSize(chartExtRequest.getPageSize()); + //如果不是插件视图 走原生逻辑 if (table.getMode() == 0) {// 直连 if (ObjectUtils.isEmpty(ds)) { @@ -872,6 +901,7 @@ public class ChartViewService { if (StringUtils.isNotEmpty(ds.getStatus()) && "Error".equalsIgnoreCase(ds.getStatus())) { throw new Exception(Translator.get("i18n_invalid_ds")); } + pageInfo.setDsVersion(datasourceProvider.dsVersion(ds)); datasourceRequest.setDatasource(ds); DataTableInfoDTO dataTableInfoDTO = gson.fromJson(table.getInfo(), DataTableInfoDTO.class); QueryProvider qp = ProviderFactory.getQueryProvider(ds.getType()); @@ -880,60 +910,70 @@ public class ChartViewService { if (StringUtils.equalsAnyIgnoreCase(view.getType(), "text", "gauge", "liquid")) { datasourceRequest.setQuery(qp.getSQLSummary(dataTableInfoDTO.getTable(), yAxis, fieldCustomFilter, rowPermissionsTree, extFilterList, view, ds)); } else if (StringUtils.containsIgnoreCase(view.getType(), "stack")) { - datasourceRequest.setQuery(qp.getSQLStack(dataTableInfoDTO.getTable(), xAxis, yAxis, fieldCustomFilter, rowPermissionsTree, extFilterList, extStack, ds, view)); + querySql = qp.getSQLStack(dataTableInfoDTO.getTable(), xAxis, yAxis, fieldCustomFilter, rowPermissionsTree, extFilterList, extStack, ds, view); } else if (StringUtils.containsIgnoreCase(view.getType(), "scatter")) { - datasourceRequest.setQuery(qp.getSQLScatter(dataTableInfoDTO.getTable(), xAxis, yAxis, fieldCustomFilter, rowPermissionsTree, extFilterList, extBubble, ds, view)); + querySql = qp.getSQLScatter(dataTableInfoDTO.getTable(), xAxis, yAxis, fieldCustomFilter, rowPermissionsTree, extFilterList, extBubble, ds, view); } else if (StringUtils.equalsIgnoreCase("table-info", view.getType())) { - datasourceRequest.setQuery(qp.getSQLTableInfo(dataTableInfoDTO.getTable(), xAxis, fieldCustomFilter, rowPermissionsTree, extFilterList, ds, view)); + querySql = qp.getSQLWithPage(true, dataTableInfoDTO.getTable(), xAxis, fieldCustomFilter, rowPermissionsTree, extFilterList, ds, view, pageInfo); + totalPageSql = qp.getResultCount(true, dataTableInfoDTO.getTable(), xAxis, fieldCustomFilter, rowPermissionsTree, extFilterList, ds, view); } else { - datasourceRequest.setQuery(qp.getSQL(dataTableInfoDTO.getTable(), xAxis, yAxis, fieldCustomFilter, rowPermissionsTree, extFilterList, ds, view)); + querySql = qp.getSQL(dataTableInfoDTO.getTable(), xAxis, yAxis, fieldCustomFilter, rowPermissionsTree, extFilterList, ds, view); } } else if (StringUtils.equalsIgnoreCase(table.getType(), DatasetType.SQL.name())) { String sql = dataTableInfoDTO.isBase64Encryption() ? new String(java.util.Base64.getDecoder().decode(dataTableInfoDTO.getSql())) : dataTableInfoDTO.getSql(); - sql = handleVariable(sql, requestList, qp, table, ds); + sql = handleVariable(sql, chartExtRequest, qp, table, ds); if (StringUtils.equalsAnyIgnoreCase(view.getType(), "text", "gauge", "liquid")) { - datasourceRequest.setQuery(qp.getSQLSummaryAsTmp(sql, yAxis, fieldCustomFilter, rowPermissionsTree, extFilterList, view)); + querySql = qp.getSQLSummaryAsTmp(sql, yAxis, fieldCustomFilter, rowPermissionsTree, extFilterList, view); } else if (StringUtils.containsIgnoreCase(view.getType(), "stack")) { - datasourceRequest.setQuery(qp.getSQLAsTmpStack(sql, xAxis, yAxis, fieldCustomFilter, rowPermissionsTree, extFilterList, extStack, view)); + querySql = qp.getSQLAsTmpStack(sql, xAxis, yAxis, fieldCustomFilter, rowPermissionsTree, extFilterList, extStack, view); } else if (StringUtils.containsIgnoreCase(view.getType(), "scatter")) { - datasourceRequest.setQuery(qp.getSQLAsTmpScatter(sql, xAxis, yAxis, fieldCustomFilter, rowPermissionsTree, extFilterList, extBubble, view)); + querySql = qp.getSQLAsTmpScatter(sql, xAxis, yAxis, fieldCustomFilter, rowPermissionsTree, extFilterList, extBubble, view); } else if (StringUtils.equalsIgnoreCase("table-info", view.getType())) { - datasourceRequest.setQuery(qp.getSQLAsTmpTableInfo(sql, xAxis, fieldCustomFilter, rowPermissionsTree, extFilterList, ds, view)); + querySql = qp.getSQLWithPage(false, sql, xAxis, fieldCustomFilter, rowPermissionsTree, extFilterList, ds, view, pageInfo); + totalPageSql = qp.getResultCount(false, sql, xAxis, fieldCustomFilter, rowPermissionsTree, extFilterList, ds, view); } else { - datasourceRequest.setQuery(qp.getSQLAsTmp(sql, xAxis, yAxis, fieldCustomFilter, rowPermissionsTree, extFilterList, view)); + querySql = qp.getSQLAsTmp(sql, xAxis, yAxis, fieldCustomFilter, rowPermissionsTree, extFilterList, view); } } else if (StringUtils.equalsIgnoreCase(table.getType(), DatasetType.CUSTOM.name())) { DataTableInfoDTO dt = gson.fromJson(table.getInfo(), DataTableInfoDTO.class); List list = dataSetTableUnionService.listByTableId(dt.getList().get(0).getTableId()); String sql = dataSetTableService.getCustomSQLDatasource(dt, list, ds); if (StringUtils.equalsAnyIgnoreCase(view.getType(), "text", "gauge", "liquid")) { - datasourceRequest.setQuery(qp.getSQLSummaryAsTmp(sql, yAxis, fieldCustomFilter, rowPermissionsTree, extFilterList, view)); + querySql = qp.getSQLSummaryAsTmp(sql, yAxis, fieldCustomFilter, rowPermissionsTree, extFilterList, view); } else if (StringUtils.containsIgnoreCase(view.getType(), "stack")) { - datasourceRequest.setQuery(qp.getSQLAsTmpStack(sql, xAxis, yAxis, fieldCustomFilter, rowPermissionsTree, extFilterList, extStack, view)); + querySql = qp.getSQLAsTmpStack(sql, xAxis, yAxis, fieldCustomFilter, rowPermissionsTree, extFilterList, extStack, view); } else if (StringUtils.containsIgnoreCase(view.getType(), "scatter")) { - datasourceRequest.setQuery(qp.getSQLAsTmpScatter(sql, xAxis, yAxis, fieldCustomFilter, rowPermissionsTree, extFilterList, extBubble, view)); + querySql = qp.getSQLAsTmpScatter(sql, xAxis, yAxis, fieldCustomFilter, rowPermissionsTree, extFilterList, extBubble, view); } else if (StringUtils.equalsIgnoreCase("table-info", view.getType())) { - datasourceRequest.setQuery(qp.getSQLAsTmpTableInfo(sql, xAxis, fieldCustomFilter, rowPermissionsTree, extFilterList, ds, view)); + querySql = qp.getSQLWithPage(false, sql, xAxis, fieldCustomFilter, rowPermissionsTree, extFilterList, ds, view, pageInfo); + totalPageSql = qp.getResultCount(false, sql, xAxis, fieldCustomFilter, rowPermissionsTree, extFilterList, ds, view); } else { - datasourceRequest.setQuery(qp.getSQLAsTmp(sql, xAxis, yAxis, fieldCustomFilter, rowPermissionsTree, extFilterList, view)); + querySql = qp.getSQLAsTmp(sql, xAxis, yAxis, fieldCustomFilter, rowPermissionsTree, extFilterList, view); } } else if (StringUtils.equalsIgnoreCase(table.getType(), DatasetType.UNION.name())) { DataTableInfoDTO dt = gson.fromJson(table.getInfo(), DataTableInfoDTO.class); Map sqlMap = dataSetTableService.getUnionSQLDatasource(dt, ds); String sql = (String) sqlMap.get("sql"); - if (StringUtils.equalsAnyIgnoreCase(view.getType(), "text", "gauge", "liquid")) { - datasourceRequest.setQuery(qp.getSQLSummaryAsTmp(sql, yAxis, fieldCustomFilter, rowPermissionsTree, extFilterList, view)); + querySql = qp.getSQLSummaryAsTmp(sql, yAxis, fieldCustomFilter, rowPermissionsTree, extFilterList, view); } else if (StringUtils.containsIgnoreCase(view.getType(), "stack")) { - datasourceRequest.setQuery(qp.getSQLAsTmpStack(sql, xAxis, yAxis, fieldCustomFilter, rowPermissionsTree, extFilterList, extStack, view)); + querySql = qp.getSQLAsTmpStack(sql, xAxis, yAxis, fieldCustomFilter, rowPermissionsTree, extFilterList, extStack, view); } else if (StringUtils.containsIgnoreCase(view.getType(), "scatter")) { - datasourceRequest.setQuery(qp.getSQLAsTmpScatter(sql, xAxis, yAxis, fieldCustomFilter, rowPermissionsTree, extFilterList, extBubble, view)); + querySql = qp.getSQLAsTmpScatter(sql, xAxis, yAxis, fieldCustomFilter, rowPermissionsTree, extFilterList, extBubble, view); } else if (StringUtils.equalsIgnoreCase("table-info", view.getType())) { - datasourceRequest.setQuery(qp.getSQLAsTmpTableInfo(sql, xAxis, fieldCustomFilter, rowPermissionsTree, extFilterList, ds, view)); + querySql = qp.getSQLWithPage(false, sql, xAxis, fieldCustomFilter, rowPermissionsTree, extFilterList, ds, view, pageInfo); + totalPageSql = qp.getResultCount(false, sql, xAxis, fieldCustomFilter, rowPermissionsTree, extFilterList, ds, view); } else { - datasourceRequest.setQuery(qp.getSQLAsTmp(sql, xAxis, yAxis, fieldCustomFilter, rowPermissionsTree, extFilterList, view)); + querySql = qp.getSQLAsTmp(sql, xAxis, yAxis, fieldCustomFilter, rowPermissionsTree, extFilterList, view); } } + if (StringUtils.isNotEmpty(totalPageSql) && StringUtils.equalsIgnoreCase((String) mapSize.get("tablePageMode"), "page")) { + datasourceRequest.setQuery(totalPageSql); + totalItems = Long.valueOf(datasourceProvider.getData(datasourceRequest).get(0)[0]); + totalPage = (totalItems / pageInfo.getPageSize()) + (totalItems % pageInfo.getPageSize() > 0 ? 1 : 0); + } + + datasourceRequest.setQuery(querySql); data = datasourceProvider.getData(datasourceRequest); if (CollectionUtils.isNotEmpty(assistFields)) { datasourceAssistRequest.setQuery(assistSQL(datasourceRequest.getQuery(), assistFields)); @@ -963,10 +1003,10 @@ public class ChartViewService { assistData = datasourceProvider.getData(datasourceAssistRequest); } // 仪表板有参数不使用缓存 - if (!cache || CollectionUtils.isNotEmpty(requestList.getFilter()) - || CollectionUtils.isNotEmpty(requestList.getLinkageFilters()) - || CollectionUtils.isNotEmpty(requestList.getOuterParamsFilters()) - || CollectionUtils.isNotEmpty(requestList.getDrill()) + if (!cache || CollectionUtils.isNotEmpty(chartExtRequest.getFilter()) + || CollectionUtils.isNotEmpty(chartExtRequest.getLinkageFilters()) + || CollectionUtils.isNotEmpty(chartExtRequest.getOuterParamsFilters()) + || CollectionUtils.isNotEmpty(chartExtRequest.getDrill()) || CollectionUtils.isNotEmpty(rowPermissionsTree) || fields.size() != columnPermissionFields.size()) { data = datasourceProvider.getData(datasourceRequest); @@ -1122,7 +1162,7 @@ public class ChartViewService { } else if (StringUtils.equalsIgnoreCase(view.getRender(), "antv")) { if (StringUtils.equalsAnyIgnoreCase(view.getType(), "bar-group","line")) { mapChart = ChartDataBuild.transBaseGroupDataAntV(xAxisBase, xAxis, xAxisExt, yAxis, view, data, isDrill); - } else if (StringUtils.equalsIgnoreCase(view.getType(),"bar-group-stack")) { + } else if (StringUtils.equalsIgnoreCase(view.getType(), "bar-group-stack")) { mapChart = ChartDataBuild.transGroupStackDataAntV(xAxisBase, xAxis, xAxisExt, yAxis, extStack, data, view, isDrill); } else if (StringUtils.containsIgnoreCase(view.getType(), "bar-stack")) { mapChart = ChartDataBuild.transStackChartDataAntV(xAxis, yAxis, view, data, extStack, isDrill); @@ -1146,7 +1186,10 @@ public class ChartViewService { } // table组件,明细表,也用于导出数据 Map mapTableNormal = ChartDataBuild.transTableNormal(xAxis, yAxis, view, data, extStack, desensitizationList); - return uniteViewResult(datasourceRequest.getQuery(), mapChart, mapTableNormal, view, isDrill, drillFilters, dynamicAssistFields, assistData); + chartViewDTO = uniteViewResult(datasourceRequest.getQuery(), mapChart, mapTableNormal, view, isDrill, drillFilters, dynamicAssistFields, assistData); + chartViewDTO.setTotalPage(totalPage); + chartViewDTO.setTotalItems(totalItems); + return chartViewDTO; } // 对结果排序 diff --git a/frontend/src/components/canvas/customComponent/UserView.vue b/frontend/src/components/canvas/customComponent/UserView.vue index eb526b646d..f6a0cd6c92 100644 --- a/frontend/src/components/canvas/customComponent/UserView.vue +++ b/frontend/src/components/canvas/customComponent/UserView.vue @@ -89,6 +89,7 @@ :search-count="searchCount" @onChartClick="chartClick" @onJumpClick="jumpClick" + @onPageChange="pageClick" /> { // 将视图传入echart组件 if (response.success) { @@ -1136,11 +1156,20 @@ export default { getDataOnly(sourceResponseData, dataBroadcast) { if (this.isEdit) { if ((this.filter.filter && this.filter.filter.length) || (this.filter.linkageFilters && this.filter.linkageFilters.length)) { - viewData(this.chart.id, this.panelInfo.id, { + const requestInfo = { filter: [], drill: [], queryFrom: 'panel' - }).then(response => { + } + // table-info明细表增加分页 + if (this.view.customAttr) { + const attrSize = JSON.parse(this.view.customAttr).size + if (this.chart.type === 'table-info' && this.view.datasetMode === 0 && (!attrSize.tablePageMode || attrSize.tablePageMode === 'page')) { + requestInfo.goPage = this.currentPage.page + requestInfo.pageSize = this.currentPage.pageSize + } + } + viewData(this.chart.id, this.panelInfo.id, requestInfo).then(response => { this.componentViewsData[this.chart.id] = response.data if (dataBroadcast) { bus.$emit('prop-change-data') @@ -1153,6 +1182,10 @@ export default { } } } + }, + pageClick(page) { + this.currentPage = page + this.getData(this.element.propValue.viewId, false) } } } diff --git a/frontend/src/views/chart/components/ChartComponentS2.vue b/frontend/src/views/chart/components/ChartComponentS2.vue index 7077eb23c2..45a26c20f4 100644 --- a/frontend/src/views/chart/components/ChartComponentS2.vue +++ b/frontend/src/views/chart/components/ChartComponentS2.vue @@ -59,7 +59,7 @@ > {{ $t('chart.total') }} - {{ (chart.data && chart.data.tableRow) ? chart.data.tableRow.length : 0 }} + {{ chart.datasetMode === 0 ? chart.totalItems : ((chart.data && chart.data.tableRow) ? chart.data.tableRow.length : 0) }} {{ $t('chart.items') }} this.currentPage.pageSize) { - // 计算分页 - this.currentPage.show = data.length - const pageStart = (this.currentPage.page - 1) * this.currentPage.pageSize - const pageEnd = pageStart + this.currentPage.pageSize - data = data.slice(pageStart, pageEnd) - this.showPage = true + if (this.chart.datasetMode === 0) { + if (this.chart.type === 'table-info' && (attr.size.tablePageMode === 'page' || !attr.size.tablePageMode) && this.chart.totalItems > this.currentPage.pageSize) { + this.currentPage.show = this.chart.totalItems + this.showPage = true + } + } else { + if (this.chart.type === 'table-info' && (attr.size.tablePageMode === 'page' || !attr.size.tablePageMode) && data.length > this.currentPage.pageSize) { + // 计算分页 + this.currentPage.show = data.length + const pageStart = (this.currentPage.page - 1) * this.currentPage.pageSize + const pageEnd = pageStart + this.currentPage.pageSize + data = data.slice(pageStart, pageEnd) + this.showPage = true + } } } else { this.fields = [] @@ -425,14 +432,22 @@ export default { }, pageChange(val) { this.currentPage.pageSize = val - this.initData() - this.drawView() + if (this.chart.datasetMode === 0) { + this.$emit('onPageChange', this.currentPage) + } else { + this.initData() + this.drawView() + } }, pageClick(val) { this.currentPage.page = val - this.initData() - this.drawView() + if (this.chart.datasetMode === 0) { + this.$emit('onPageChange', this.currentPage) + } else { + this.initData() + this.drawView() + } }, resetPage() { diff --git a/frontend/src/views/chart/components/table/TableNormal.vue b/frontend/src/views/chart/components/table/TableNormal.vue index 632491e403..6533281768 100644 --- a/frontend/src/views/chart/components/table/TableNormal.vue +++ b/frontend/src/views/chart/components/table/TableNormal.vue @@ -46,7 +46,7 @@ > {{ $t('chart.total') }} - {{ (chart.data && chart.data.tableRow)?chart.data.tableRow.length:0 }} + {{ chart.datasetMode === 0 ? chart.totalItems : ((chart.data && chart.data.tableRow) ? chart.data.tableRow.length : 0) }} {{ $t('chart.items') }} this.currentPage.pageSize) { - // 计算分页 - this.currentPage.show = data.length - const pageStart = (this.currentPage.page - 1) * this.currentPage.pageSize - const pageEnd = pageStart + this.currentPage.pageSize - data = data.slice(pageStart, pageEnd) - this.showPage = true + if (this.chart.datasetMode === 0) { + if (this.chart.type === 'table-info' && (attr.size.tablePageMode === 'page' || !attr.size.tablePageMode) && this.chart.totalItems > this.currentPage.pageSize) { + this.currentPage.show = this.chart.totalItems + this.showPage = true + } + } else { + if (this.chart.type === 'table-info' && (attr.size.tablePageMode === 'page' || !attr.size.tablePageMode) && data.length > this.currentPage.pageSize) { + // 计算分页 + this.currentPage.show = data.length + const pageStart = (this.currentPage.page - 1) * this.currentPage.pageSize + const pageEnd = pageStart + this.currentPage.pageSize + data = data.slice(pageStart, pageEnd) + this.showPage = true + } } } else { this.fields = [] @@ -403,12 +409,20 @@ export default { pageChange(val) { this.currentPage.pageSize = val - this.init() + if (this.chart.datasetMode === 0) { + this.$emit('onPageChange', this.currentPage) + } else { + this.init() + } }, pageClick(val) { this.currentPage.page = val - this.init() + if (this.chart.datasetMode === 0) { + this.$emit('onPageChange', this.currentPage) + } else { + this.init() + } }, resetPage() { diff --git a/frontend/src/views/chart/view/ChartEdit.vue b/frontend/src/views/chart/view/ChartEdit.vue index 14536f1e3d..ca517c265f 100644 --- a/frontend/src/views/chart/view/ChartEdit.vue +++ b/frontend/src/views/chart/view/ChartEdit.vue @@ -2237,7 +2237,10 @@ export default { if (!view) return viewEditSave(this.panelInfo.id, view).then(() => { // this.getData(this.param.id) - bus.$emit('view-in-cache', { type: 'propChange', viewId: this.param.id }) + bus.$emit('view-in-cache', { type: 'propChange', + viewId: this.param.id, + view: view + }) }) }, calcStyle(modifyName) {