From 64461080539713f4a1dca3264ecea14745816eea Mon Sep 17 00:00:00 2001 From: ulleo Date: Wed, 20 Dec 2023 17:43:55 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20AntV=E6=97=B6=E9=97=B4=E6=9D=A1?= =?UTF-8?q?=E5=BD=A2=E5=9B=BE=20->=20=E5=8C=BA=E9=97=B4=E6=9D=A1=E5=BD=A2?= =?UTF-8?q?=E5=9B=BE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../engine/mysql/MysqlQueryProvider.java | 30 ++++- .../provider/query/ck/CKQueryProvider.java | 28 ++++- .../provider/query/db2/Db2QueryProvider.java | 29 ++++- .../provider/query/es/EsQueryProvider.java | 35 +++++- .../query/hive/HiveQueryProvider.java | 28 ++++- .../query/impala/ImpalaQueryProvider.java | 29 ++++- .../query/mongodb/MongoQueryProvider.java | 81 +++++++------ .../query/mysql/MysqlQueryProvider.java | 29 ++++- .../query/oracle/OracleQueryProvider.java | 29 ++++- .../provider/query/pg/PgQueryProvider.java | 28 ++++- .../query/redshift/RedshiftQueryProvider.java | 29 ++++- .../sqlserver/SqlserverQueryProvider.java | 29 ++++- .../service/chart/ChartViewService.java | 22 +++- .../service/chart/util/ChartDataBuild.java | 75 ++++++++---- core/frontend/src/lang/en.js | 6 +- core/frontend/src/lang/tw.js | 6 +- core/frontend/src/lang/zh.js | 6 +- .../src/views/chart/chart/bar/bar_antv.js | 30 +++-- .../chart/components/dragItem/QuotaItem.vue | 4 +- .../src/views/chart/view/ChartEdit.vue | 107 +++++++++++++----- .../datasource/dm/query/DmQueryProvider.java | 31 ++++- .../kingbase/query/KingbaseQueryProvider.java | 30 ++++- .../kylin/query/KylinQueryProvider.java | 29 ++++- .../dm/query/MaxcomputeQueryProvider.java | 29 ++++- .../mongo/query/MongobiQueryProvider.java | 29 ++++- .../dm/query/PrestoQueryProvider.java | 29 ++++- 26 files changed, 710 insertions(+), 127 deletions(-) diff --git a/core/backend/src/main/java/io/dataease/provider/engine/mysql/MysqlQueryProvider.java b/core/backend/src/main/java/io/dataease/provider/engine/mysql/MysqlQueryProvider.java index 9365af8dd1..12c5de1c14 100644 --- a/core/backend/src/main/java/io/dataease/provider/engine/mysql/MysqlQueryProvider.java +++ b/core/backend/src/main/java/io/dataease/provider/engine/mysql/MysqlQueryProvider.java @@ -387,11 +387,39 @@ public class MysqlQueryProvider extends QueryProvider { List yFields = new ArrayList<>(); // 要把两个时间字段放进y里面 List yWheres = new ArrayList<>(); + List yOrders = new ArrayList<>(); if (CollectionUtils.isNotEmpty(xAxis)) { for (int i = 0; i < xAxis.size(); i++) { ChartViewFieldDTO x = xAxis.get(i); String originField; + + if (StringUtils.equalsIgnoreCase(x.getGroupType(), "q")) { + 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(MysqlConstants.KEYWORD_FIX, tableObj.getTableAlias(), x.getDataeaseName()); + } else { + originField = String.format(MysqlConstants.KEYWORD_FIX, tableObj.getTableAlias(), x.getDataeaseName()); + } + String fieldAlias = String.format(SQLConstants.FIELD_ALIAS_Y_PREFIX, i); + // 处理纵轴字段 + yFields.add(getYFields(x, originField, fieldAlias)); + // 处理纵轴过滤 + yWheres.add(getYWheres(x, originField, fieldAlias)); + // 处理纵轴排序 + if (StringUtils.isNotEmpty(x.getSort()) && Utils.joinSort(x.getSort())) { + yOrders.add(SQLObj.builder() + .orderField(originField) + .orderAlias(fieldAlias) + .orderDirection(x.getSort()) + .build()); + } + continue; + } + + if (ObjectUtils.isNotEmpty(x.getExtField()) && x.getExtField() == 2) { // 计算字段和视图字段,规则为 函数([原始字段id]),这边把[原始字段id] 换成 表名.原始字段id // 解析origin name中有关联的字段生成sql表达式 @@ -432,8 +460,6 @@ public class MysqlQueryProvider extends QueryProvider { } } - List yOrders = new ArrayList<>(); - // 处理视图中字段过滤 String customWheres = transChartFilterTrees(tableObj, fieldCustomFilter); // 处理仪表板字段过滤 diff --git a/core/backend/src/main/java/io/dataease/provider/query/ck/CKQueryProvider.java b/core/backend/src/main/java/io/dataease/provider/query/ck/CKQueryProvider.java index f2a9b3a7be..577b3319e4 100644 --- a/core/backend/src/main/java/io/dataease/provider/query/ck/CKQueryProvider.java +++ b/core/backend/src/main/java/io/dataease/provider/query/ck/CKQueryProvider.java @@ -774,11 +774,38 @@ public class CKQueryProvider extends QueryProvider { List yFields = new ArrayList<>(); // 要把两个时间字段放进y里面 List yWheres = new ArrayList<>(); + List yOrders = new ArrayList<>(); if (CollectionUtils.isNotEmpty(xAxis)) { for (int i = 0; i < xAxis.size(); i++) { ChartViewFieldDTO x = xAxis.get(i); String originField; + + if (StringUtils.equalsIgnoreCase(x.getGroupType(), "q")) { + 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(CKConstants.KEYWORD_FIX, tableObj.getTableAlias(), x.getOriginName()); + } else { + originField = String.format(CKConstants.KEYWORD_FIX, tableObj.getTableAlias(), x.getOriginName()); + } + String fieldAlias = String.format(SQLConstants.FIELD_ALIAS_Y_PREFIX, i); + // 处理纵轴字段 + yFields.add(getYFields(x, originField, fieldAlias)); + // 处理纵轴过滤 + yWheres.add(getYWheres(x, originField, fieldAlias)); + // 处理纵轴排序 + if (StringUtils.isNotEmpty(x.getSort()) && Utils.joinSort(x.getSort())) { + yOrders.add(SQLObj.builder() + .orderField(originField) + .orderAlias(fieldAlias) + .orderDirection(x.getSort()) + .build()); + } + continue; + } + if (ObjectUtils.isNotEmpty(x.getExtField()) && x.getExtField() == 2) { // 解析origin name中有关联的字段生成sql表达式 originField = calcFieldRegex(x.getOriginName(), tableObj); @@ -816,7 +843,6 @@ public class CKQueryProvider extends QueryProvider { } } } - List yOrders = new ArrayList<>(); // 处理视图中字段过滤 String customWheres = transChartFilterTrees(tableObj, fieldCustomFilter); 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 f1176f4add..5b1a66e3ed 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 @@ -760,11 +760,38 @@ public class Db2QueryProvider extends QueryProvider { List yFields = new ArrayList<>(); // 要把两个时间字段放进y里面 List yWheres = new ArrayList<>(); + List yOrders = new ArrayList<>(); if (CollectionUtils.isNotEmpty(xAxis)) { for (int i = 0; i < xAxis.size(); i++) { ChartViewFieldDTO x = xAxis.get(i); String originField; + + if (StringUtils.equalsIgnoreCase(x.getGroupType(), "q")) { + 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(Db2Constants.KEYWORD_FIX, tableObj.getTableAlias(), x.getOriginName()); + } else { + originField = String.format(Db2Constants.KEYWORD_FIX, tableObj.getTableAlias(), x.getOriginName()); + } + String fieldAlias = String.format(SQLConstants.FIELD_ALIAS_Y_PREFIX, i); + // 处理纵轴字段 + yFields.add(getYFields(x, originField, fieldAlias)); + // 处理纵轴过滤 + yWheres.add(getYWheres(x, originField, fieldAlias)); + // 处理纵轴排序 + if (StringUtils.isNotEmpty(x.getSort()) && Utils.joinSort(x.getSort())) { + yOrders.add(SQLObj.builder() + .orderField(originField) + .orderAlias(fieldAlias) + .orderDirection(x.getSort()) + .build()); + } + continue; + } + if (ObjectUtils.isNotEmpty(x.getExtField()) && x.getExtField() == 2) { // 解析origin name中有关联的字段生成sql表达式 originField = calcFieldRegex(x.getOriginName(), tableObj); @@ -803,8 +830,6 @@ public class Db2QueryProvider extends QueryProvider { } } - List yOrders = new ArrayList<>(); - // 处理视图中字段过滤 String customWheres = transChartFilterTrees(tableObj, fieldCustomFilter); // 处理仪表板字段过滤 diff --git a/core/backend/src/main/java/io/dataease/provider/query/es/EsQueryProvider.java b/core/backend/src/main/java/io/dataease/provider/query/es/EsQueryProvider.java index a6793c348f..a75324bb79 100644 --- a/core/backend/src/main/java/io/dataease/provider/query/es/EsQueryProvider.java +++ b/core/backend/src/main/java/io/dataease/provider/query/es/EsQueryProvider.java @@ -775,11 +775,44 @@ public class EsQueryProvider extends QueryProvider { List yFields = new ArrayList<>(); // 要把两个时间字段放进y里面 List yWheres = new ArrayList<>(); + List yOrders = new ArrayList<>(); if (CollectionUtils.isNotEmpty(xAxis)) { for (int i = 0; i < xAxis.size(); i++) { ChartViewFieldDTO x = xAxis.get(i); String originField; + + if (StringUtils.equalsIgnoreCase(x.getGroupType(), "q")) { + if (ObjectUtils.isNotEmpty(x.getExtField()) && x.getExtField() == DeTypeConstants.DE_INT) { + // 解析origin name中有关联的字段生成sql表达式 + originField = calcFieldRegex(x.getOriginName(), tableObj); + } else if (ObjectUtils.isNotEmpty(x.getExtField()) && x.getExtField() == DeTypeConstants.DE_TIME) { + originField = String.format(EsSqlLConstants.KEYWORD_FIX, tableObj.getTableAlias(), x.getOriginName()); + } else { + if (x.getDeType() == 2) { + originField = String.format(EsSqlLConstants.CAST, String.format(EsSqlLConstants.KEYWORD_FIX, tableObj.getTableAlias(), x.getOriginName()), "bigint"); + } else if (x.getDeType() == 3) { + originField = String.format(EsSqlLConstants.CAST, String.format(EsSqlLConstants.KEYWORD_FIX, tableObj.getTableAlias(), x.getOriginName()), "float"); + } else { + originField = String.format(EsSqlLConstants.KEYWORD_FIX, tableObj.getTableAlias(), x.getOriginName()); + } + } + String fieldAlias = String.format(SQLConstants.FIELD_ALIAS_Y_PREFIX, i); + // 处理纵轴字段 + yFields.add(getYFields(x, originField, fieldAlias)); + // 处理纵轴过滤 + yWheres.add(getYWheres(x, originField, fieldAlias)); + // 处理纵轴排序 + if (StringUtils.isNotEmpty(x.getSort()) && Utils.joinSort(x.getSort())) { + yOrders.add(SQLObj.builder() + .orderField(originField) + .orderAlias(fieldAlias) + .orderDirection(x.getSort()) + .build()); + } + continue; + } + if (ObjectUtils.isNotEmpty(x.getExtField()) && x.getExtField() == DeTypeConstants.DE_INT) { // 解析origin name中有关联的字段生成sql表达式 originField = calcFieldRegex(x.getOriginName(), tableObj); @@ -822,8 +855,6 @@ public class EsQueryProvider extends QueryProvider { } } - List yOrders = new ArrayList<>(); - // 处理视图中字段过滤 String customWheres = transChartFilterTrees(tableObj, fieldCustomFilter); // 处理仪表板字段过滤 diff --git a/core/backend/src/main/java/io/dataease/provider/query/hive/HiveQueryProvider.java b/core/backend/src/main/java/io/dataease/provider/query/hive/HiveQueryProvider.java index f1e113ed7a..314c72c783 100644 --- a/core/backend/src/main/java/io/dataease/provider/query/hive/HiveQueryProvider.java +++ b/core/backend/src/main/java/io/dataease/provider/query/hive/HiveQueryProvider.java @@ -724,11 +724,38 @@ public class HiveQueryProvider extends QueryProvider { List yFields = new ArrayList<>(); // 要把两个时间字段放进y里面 List yWheres = new ArrayList<>(); + List yOrders = new ArrayList<>(); if (CollectionUtils.isNotEmpty(xAxis)) { for (int i = 0; i < xAxis.size(); i++) { ChartViewFieldDTO x = xAxis.get(i); String originField; + + if (StringUtils.equalsIgnoreCase(x.getGroupType(), "q")) { + 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(HiveConstants.KEYWORD_FIX, tableObj.getTableAlias(), x.getOriginName()); + } else { + originField = String.format(HiveConstants.KEYWORD_FIX, tableObj.getTableAlias(), x.getOriginName()); + } + String fieldAlias = String.format(SQLConstants.FIELD_ALIAS_Y_PREFIX, i); + // 处理纵轴字段 + yFields.add(getYFields(x, originField, fieldAlias)); + // 处理纵轴过滤 + yWheres.add(getYWheres(x, originField, fieldAlias)); + // 处理纵轴排序 + if (StringUtils.isNotEmpty(x.getSort()) && Utils.joinSort(x.getSort())) { + yOrders.add(SQLObj.builder() + .orderField(originField) + .orderAlias(fieldAlias) + .orderDirection(x.getSort()) + .build()); + } + continue; + } + if (ObjectUtils.isNotEmpty(x.getExtField()) && x.getExtField() == 2) { // 解析origin name中有关联的字段生成sql表达式 originField = calcFieldRegex(x.getOriginName(), tableObj); @@ -766,7 +793,6 @@ public class HiveQueryProvider extends QueryProvider { } } } - List yOrders = new ArrayList<>(); // 处理视图中字段过滤 String customWheres = transChartFilterTrees(tableObj, fieldCustomFilter); diff --git a/core/backend/src/main/java/io/dataease/provider/query/impala/ImpalaQueryProvider.java b/core/backend/src/main/java/io/dataease/provider/query/impala/ImpalaQueryProvider.java index aab1a645c9..f429134db4 100644 --- a/core/backend/src/main/java/io/dataease/provider/query/impala/ImpalaQueryProvider.java +++ b/core/backend/src/main/java/io/dataease/provider/query/impala/ImpalaQueryProvider.java @@ -728,11 +728,38 @@ public class ImpalaQueryProvider extends QueryProvider { List yFields = new ArrayList<>(); // 要把两个时间字段放进y里面 List yWheres = new ArrayList<>(); + List yOrders = new ArrayList<>(); if (CollectionUtils.isNotEmpty(xAxis)) { for (int i = 0; i < xAxis.size(); i++) { ChartViewFieldDTO x = xAxis.get(i); String originField; + + if (StringUtils.equalsIgnoreCase(x.getGroupType(), "q")) { + 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(ImpalaConstants.KEYWORD_FIX, tableObj.getTableAlias(), x.getOriginName()); + } else { + originField = String.format(ImpalaConstants.KEYWORD_FIX, tableObj.getTableAlias(), x.getOriginName()); + } + String fieldAlias = String.format(SQLConstants.FIELD_ALIAS_Y_PREFIX, i); + // 处理纵轴字段 + yFields.add(getYFields(x, originField, fieldAlias)); + // 处理纵轴过滤 + yWheres.add(getYWheres(x, originField, fieldAlias)); + // 处理纵轴排序 + if (StringUtils.isNotEmpty(x.getSort()) && Utils.joinSort(x.getSort())) { + yOrders.add(SQLObj.builder() + .orderField(originField) + .orderAlias(fieldAlias) + .orderDirection(x.getSort()) + .build()); + } + continue; + } + if (ObjectUtils.isNotEmpty(x.getExtField()) && x.getExtField() == 2) { // 解析origin name中有关联的字段生成sql表达式 originField = calcFieldRegex(x.getOriginName(), tableObj); @@ -770,7 +797,7 @@ public class ImpalaQueryProvider extends QueryProvider { } } } - List yOrders = new ArrayList<>(); + // 处理视图中字段过滤 String customWheres = transChartFilterTrees(tableObj, fieldCustomFilter); diff --git a/core/backend/src/main/java/io/dataease/provider/query/mongodb/MongoQueryProvider.java b/core/backend/src/main/java/io/dataease/provider/query/mongodb/MongoQueryProvider.java index 14399c2381..6ed2e479c6 100644 --- a/core/backend/src/main/java/io/dataease/provider/query/mongodb/MongoQueryProvider.java +++ b/core/backend/src/main/java/io/dataease/provider/query/mongodb/MongoQueryProvider.java @@ -697,10 +697,41 @@ public class MongoQueryProvider extends QueryProvider { .build(); List xFields = new ArrayList<>(); List xOrders = new ArrayList<>(); + + List yFields = new ArrayList<>(); // 要把两个时间字段放进y里面 + List yWheres = new ArrayList<>(); + List yOrders = new ArrayList<>(); + if (CollectionUtils.isNotEmpty(xAxis)) { for (int i = 0; i < xAxis.size(); i++) { ChartViewFieldDTO x = xAxis.get(i); String originField; + + if (StringUtils.equalsIgnoreCase(x.getGroupType(), "q")) { + if (ObjectUtils.isNotEmpty(x.getExtField()) && x.getExtField() == DeTypeConstants.DE_INT) { + // 解析origin name中有关联的字段生成sql表达式 + originField = calcFieldRegex(x.getOriginName(), tableObj); + } else if (ObjectUtils.isNotEmpty(x.getExtField()) && x.getExtField() == DeTypeConstants.DE_TIME) { + originField = String.format(MongoConstants.KEYWORD_FIX, tableObj.getTableAlias(), x.getOriginName()); + } else { + originField = String.format(MongoConstants.KEYWORD_FIX, tableObj.getTableAlias(), x.getOriginName()); + } + String fieldAlias = String.format(MongoConstants.ALIAS_FIX, String.format(SQLConstants.FIELD_ALIAS_Y_PREFIX, i)); + // 处理纵轴字段 + yFields.add(getYFields(x, originField, fieldAlias)); + // 处理纵轴过滤 + yWheres.add(getYWheres(x, originField, fieldAlias)); + // 处理纵轴排序 + if (StringUtils.isNotEmpty(x.getSort()) && Utils.joinSort(x.getSort())) { + yOrders.add(SQLObj.builder() + .orderField(originField) + .orderAlias(fieldAlias) + .orderDirection(x.getSort()) + .build()); + } + continue; + } + if (ObjectUtils.isNotEmpty(x.getExtField()) && x.getExtField() == DeTypeConstants.DE_INT) { // 解析origin name中有关联的字段生成sql表达式 originField = calcFieldRegex(x.getOriginName(), tableObj); @@ -710,8 +741,23 @@ public class MongoQueryProvider extends QueryProvider { originField = String.format(MongoConstants.KEYWORD_FIX, tableObj.getTableAlias(), x.getOriginName()); } String fieldAlias = String.format(SQLConstants.FIELD_ALIAS_X_PREFIX, i); - // 处理横轴字段 - xFields.add(getXFields(x, originField, fieldAlias)); + + if (i == baseXAxis.size()) {// 起止时间 + String fieldName = String.format(MongoConstants.AGG_FIELD, "min", originField); + yFields.add(getXFields(x, fieldName, fieldAlias)); + + yWheres.add(getYWheres(x, originField, fieldAlias)); + + } else if (i == baseXAxis.size() + 1) { + String fieldName = String.format(MongoConstants.AGG_FIELD, "max", originField); + + yFields.add(getXFields(x, fieldName, fieldAlias)); + + yWheres.add(getYWheres(x, originField, fieldAlias)); + } else { + // 处理横轴字段 + xFields.add(getXFields(x, originField, fieldAlias)); + } // 处理横轴排序 if (StringUtils.isNotEmpty(x.getSort()) && Utils.joinSort(x.getSort())) { xOrders.add(SQLObj.builder() @@ -722,36 +768,7 @@ public class MongoQueryProvider extends QueryProvider { } } } - List yFields = new ArrayList<>(); - List yWheres = new ArrayList<>(); - List yOrders = new ArrayList<>(); - if (CollectionUtils.isNotEmpty(yAxis)) { - for (int i = 0; i < yAxis.size(); i++) { - ChartViewFieldDTO y = yAxis.get(i); - String originField; - if (ObjectUtils.isNotEmpty(y.getExtField()) && y.getExtField() == DeTypeConstants.DE_INT) { - // 解析origin name中有关联的字段生成sql表达式 - originField = calcFieldRegex(y.getOriginName(), tableObj); - } else if (ObjectUtils.isNotEmpty(y.getExtField()) && y.getExtField() == DeTypeConstants.DE_TIME) { - originField = String.format(MongoConstants.KEYWORD_FIX, tableObj.getTableAlias(), y.getOriginName()); - } else { - originField = String.format(MongoConstants.KEYWORD_FIX, tableObj.getTableAlias(), y.getOriginName()); - } - String fieldAlias = String.format(MongoConstants.ALIAS_FIX, String.format(SQLConstants.FIELD_ALIAS_Y_PREFIX, i)); - // 处理纵轴字段 - yFields.add(getYFields(y, originField, fieldAlias)); - // 处理纵轴过滤 - yWheres.add(getYWheres(y, originField, fieldAlias)); - // 处理纵轴排序 - if (StringUtils.isNotEmpty(y.getSort()) && Utils.joinSort(y.getSort())) { - yOrders.add(SQLObj.builder() - .orderField(originField) - .orderAlias(fieldAlias) - .orderDirection(y.getSort()) - .build()); - } - } - } + // 处理视图中字段过滤 String customWheres = transChartFilterTrees(tableObj, fieldCustomFilter); // 处理仪表板字段过滤 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 21eaefdfcd..3dc3c28360 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 @@ -422,11 +422,38 @@ public class MysqlQueryProvider extends QueryProvider { List yFields = new ArrayList<>(); // 要把两个时间字段放进y里面 List yWheres = new ArrayList<>(); + List yOrders = new ArrayList<>(); if (CollectionUtils.isNotEmpty(xAxis)) { for (int i = 0; i < xAxis.size(); i++) { ChartViewFieldDTO x = xAxis.get(i); String originField; + + if (StringUtils.equalsIgnoreCase(x.getGroupType(), "q")) { + 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(MysqlConstants.KEYWORD_FIX, tableObj.getTableAlias(), x.getDataeaseName()); + } else { + originField = String.format(MysqlConstants.KEYWORD_FIX, tableObj.getTableAlias(), x.getDataeaseName()); + } + String fieldAlias = String.format(SQLConstants.FIELD_ALIAS_Y_PREFIX, i); + // 处理纵轴字段 + yFields.add(getYFields(x, originField, fieldAlias)); + // 处理纵轴过滤 + yWheres.add(getYWheres(x, originField, fieldAlias)); + // 处理纵轴排序 + if (StringUtils.isNotEmpty(x.getSort()) && Utils.joinSort(x.getSort())) { + yOrders.add(SQLObj.builder() + .orderField(originField) + .orderAlias(fieldAlias) + .orderDirection(x.getSort()) + .build()); + } + continue; + } + if (ObjectUtils.isNotEmpty(x.getExtField()) && x.getExtField() == 2) { // 计算字段和视图字段,规则为 函数([原始字段id]),这边把[原始字段id] 换成 表名.原始字段id // 解析origin name中有关联的字段生成sql表达式 @@ -466,8 +493,6 @@ public class MysqlQueryProvider extends QueryProvider { } } - List yOrders = new ArrayList<>(); - // 处理视图中字段过滤 String customWheres = transChartFilterTrees(tableObj, fieldCustomFilter); // 处理仪表板字段过滤 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 69acd5d64a..d3a4cff540 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 @@ -830,11 +830,38 @@ public class OracleQueryProvider extends QueryProvider { List yFields = new ArrayList<>(); // 要把两个时间字段放进y里面 List yWheres = new ArrayList<>(); + List yOrders = new ArrayList<>(); if (CollectionUtils.isNotEmpty(xAxis)) { for (int i = 0; i < xAxis.size(); i++) { ChartViewFieldDTO x = xAxis.get(i); String originField; + + if (StringUtils.equalsIgnoreCase(x.getGroupType(), "q")) { + 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(OracleConstants.KEYWORD_FIX, tableObj.getTableAlias(), x.getOriginName()); + } else { + originField = String.format(OracleConstants.KEYWORD_FIX, tableObj.getTableAlias(), x.getOriginName()); + } + String fieldAlias = String.format(OracleConstants.ALIAS_FIX, String.format(SQLConstants.FIELD_ALIAS_Y_PREFIX, i)); + // 处理纵轴字段 + yFields.add(getYFields(x, originField, fieldAlias)); + // 处理纵轴过滤 + yWheres.add(getYWheres(x, originField, fieldAlias)); + // 处理纵轴排序 + if (StringUtils.isNotEmpty(x.getSort()) && Utils.joinSort(x.getSort())) { + yOrders.add(SQLObj.builder() + .orderField(originField) + .orderAlias(fieldAlias) + .orderDirection(x.getSort()) + .build()); + } + continue; + } + if (ObjectUtils.isNotEmpty(x.getExtField()) && x.getExtField() == 2) { // 解析origin name中有关联的字段生成sql表达式 originField = calcFieldRegex(x.getOriginName(), tableObj); @@ -872,7 +899,7 @@ public class OracleQueryProvider extends QueryProvider { } } } - List yOrders = new ArrayList<>(); + // 处理视图中字段过滤 String customWheres = transChartFilterTrees(tableObj, fieldCustomFilter); 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 a384fb7076..64ab34990a 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 @@ -754,11 +754,38 @@ public class PgQueryProvider extends QueryProvider { List yFields = new ArrayList<>(); // 要把两个时间字段放进y里面 List yWheres = new ArrayList<>(); + List yOrders = new ArrayList<>(); if (CollectionUtils.isNotEmpty(xAxis)) { for (int i = 0; i < xAxis.size(); i++) { ChartViewFieldDTO x = xAxis.get(i); String originField; + + if (StringUtils.equalsIgnoreCase(x.getGroupType(), "q")) { + 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(PgConstants.KEYWORD_FIX, tableObj.getTableAlias(), x.getOriginName()); + } else { + originField = String.format(PgConstants.KEYWORD_FIX, tableObj.getTableAlias(), x.getOriginName()); + } + String fieldAlias = String.format(SQLConstants.FIELD_ALIAS_Y_PREFIX, i); + // 处理纵轴字段 + yFields.add(getYFields(x, originField, fieldAlias)); + // 处理纵轴过滤 + yWheres.add(getYWheres(x, originField, fieldAlias)); + // 处理纵轴排序 + if (StringUtils.isNotEmpty(x.getSort()) && Utils.joinSort(x.getSort())) { + yOrders.add(SQLObj.builder() + .orderField(originField) + .orderAlias(fieldAlias) + .orderDirection(x.getSort()) + .build()); + } + continue; + } + if (ObjectUtils.isNotEmpty(x.getExtField()) && x.getExtField() == 2) { // 解析origin name中有关联的字段生成sql表达式 originField = calcFieldRegex(x.getOriginName(), tableObj); @@ -796,7 +823,6 @@ public class PgQueryProvider extends QueryProvider { } } } - List yOrders = new ArrayList<>(); // 处理视图中字段过滤 String customWheres = transChartFilterTrees(tableObj, fieldCustomFilter); diff --git a/core/backend/src/main/java/io/dataease/provider/query/redshift/RedshiftQueryProvider.java b/core/backend/src/main/java/io/dataease/provider/query/redshift/RedshiftQueryProvider.java index 70dae4d490..cb059ef4a6 100644 --- a/core/backend/src/main/java/io/dataease/provider/query/redshift/RedshiftQueryProvider.java +++ b/core/backend/src/main/java/io/dataease/provider/query/redshift/RedshiftQueryProvider.java @@ -760,11 +760,38 @@ public class RedshiftQueryProvider extends QueryProvider { List yFields = new ArrayList<>(); // 要把两个时间字段放进y里面 List yWheres = new ArrayList<>(); + List yOrders = new ArrayList<>(); if (CollectionUtils.isNotEmpty(xAxis)) { for (int i = 0; i < xAxis.size(); i++) { ChartViewFieldDTO x = xAxis.get(i); String originField; + + if (StringUtils.equalsIgnoreCase(x.getGroupType(), "q")) { + 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(PgConstants.KEYWORD_FIX, tableObj.getTableAlias(), x.getOriginName()); + } else { + originField = String.format(PgConstants.KEYWORD_FIX, tableObj.getTableAlias(), x.getOriginName()); + } + String fieldAlias = String.format(SQLConstants.FIELD_ALIAS_Y_PREFIX, i); + // 处理纵轴字段 + yFields.add(getYFields(x, originField, fieldAlias)); + // 处理纵轴过滤 + yWheres.add(getYWheres(x, originField, fieldAlias)); + // 处理纵轴排序 + if (StringUtils.isNotEmpty(x.getSort()) && Utils.joinSort(x.getSort())) { + yOrders.add(SQLObj.builder() + .orderField(originField) + .orderAlias(fieldAlias) + .orderDirection(x.getSort()) + .build()); + } + continue; + } + if (ObjectUtils.isNotEmpty(x.getExtField()) && x.getExtField() == 2) { // 解析origin name中有关联的字段生成sql表达式 originField = calcFieldRegex(x.getOriginName(), tableObj); @@ -802,7 +829,7 @@ public class RedshiftQueryProvider extends QueryProvider { } } } - List yOrders = new ArrayList<>(); + // 处理视图中字段过滤 String customWheres = transChartFilterTrees(tableObj, fieldCustomFilter); 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 cfe18229af..f7d5a41811 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 @@ -838,11 +838,38 @@ public class SqlserverQueryProvider extends QueryProvider { List yFields = new ArrayList<>(); // 要把两个时间字段放进y里面 List yWheres = new ArrayList<>(); + List yOrders = new ArrayList<>(); if (CollectionUtils.isNotEmpty(xAxis)) { for (int i = 0; i < xAxis.size(); i++) { ChartViewFieldDTO x = xAxis.get(i); String originField; + + if (StringUtils.equalsIgnoreCase(x.getGroupType(), "q")) { + 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(SqlServerSQLConstants.KEYWORD_FIX, tableObj.getTableAlias(), x.getOriginName()); + } else { + originField = String.format(SqlServerSQLConstants.KEYWORD_FIX, tableObj.getTableAlias(), x.getOriginName()); + } + String fieldAlias = String.format(SQLConstants.FIELD_ALIAS_Y_PREFIX, i); + // 处理纵轴字段 + yFields.add(getYFields(x, originField, fieldAlias)); + // 处理纵轴过滤 + yWheres.add(getYWheres(x, originField, fieldAlias)); + // 处理纵轴排序 + if (StringUtils.isNotEmpty(x.getSort()) && Utils.joinSort(x.getSort())) { + yOrders.add(SQLObj.builder() + .orderField(originField) + .orderAlias(fieldAlias) + .orderDirection(x.getSort()) + .build()); + } + continue; + } + if (ObjectUtils.isNotEmpty(x.getExtField()) && x.getExtField() == 2) { // 解析origin name中有关联的字段生成sql表达式 originField = calcFieldRegex(x.getOriginName(), tableObj); @@ -880,7 +907,7 @@ public class SqlserverQueryProvider extends QueryProvider { } } } - List yOrders = new ArrayList<>(); + // 处理视图中字段过滤 String customWheres = transChartFilterTrees(tableObj, fieldCustomFilter); diff --git a/core/backend/src/main/java/io/dataease/service/chart/ChartViewService.java b/core/backend/src/main/java/io/dataease/service/chart/ChartViewService.java index 3d80fdab40..cef39a3364 100644 --- a/core/backend/src/main/java/io/dataease/service/chart/ChartViewService.java +++ b/core/backend/src/main/java/io/dataease/service/chart/ChartViewService.java @@ -540,12 +540,12 @@ public class ChartViewService { datasourceRequest.setQuery(qp.getSQLAsTmpScatter(sql, xAxis, yAxis, fieldCustomFilter, rowPermissionsTree, extFilterList, extBubble, extStack, view)); } else if (StringUtils.equalsIgnoreCase("table-info", view.getType())) { datasourceRequest.setQuery(qp.getSQLAsTmpTableInfo(sql, xAxis, fieldCustomFilter, rowPermissionsTree, extFilterList, ds, view)); - }else if (StringUtils.equalsIgnoreCase("bar-time-range", view.getType())) { + } else if (StringUtils.equalsIgnoreCase("bar-time-range", view.getType())) { List xAxisBase = gson.fromJson(view.getXAxis(), new TypeToken>() { }.getType()); datasourceRequest.setQuery(qp.getSQLAsTmpRangeBar(dataTableInfoDTO.getTable(), xAxisBase, xAxis, yAxis, fieldCustomFilter, rowPermissionsTree, extFilterList, extStack, view)); - } else { + } else { datasourceRequest.setQuery(qp.getSQLAsTmp(sql, xAxis, yAxis, fieldCustomFilter, rowPermissionsTree, extFilterList, view)); } } else if (StringUtils.equalsIgnoreCase(table.getType(), DatasetType.UNION.name())) { @@ -1156,7 +1156,7 @@ public class ChartViewService { totalPageSql = qp.getResultCount(false, sql, xAxis, fieldCustomFilter, rowPermissionsTree, extFilterList, ds, view); } else if (StringUtils.equalsIgnoreCase("bar-time-range", view.getType())) { - querySql = qp.getSQLAsTmpRangeBar(dataTableInfoDTO.getTable(), xAxisBase, xAxis, yAxis, fieldCustomFilter, rowPermissionsTree, extFilterList, extStack, view); + querySql = qp.getSQLAsTmpRangeBar(dataTableInfoDTO.getTable(), xAxisBase, xAxis, yAxis, fieldCustomFilter, rowPermissionsTree, extFilterList, extStack, view); } else { querySql = qp.getSQLAsTmp(sql, xAxis, yAxis, fieldCustomFilter, rowPermissionsTree, extFilterList, view); @@ -1271,7 +1271,7 @@ public class ChartViewService { datasourceRequest.setQuery(qp.getSQLRangeBar(tableName, xAxisBase, xAxis, yAxis, fieldCustomFilter, rowPermissionsTree, extFilterList, extStack, ds, view)); - }else { + } else { datasourceRequest.setQuery(qp.getSQL(tableName, xAxis, yAxis, fieldCustomFilter, rowPermissionsTree, extFilterList, ds, view)); if (containDetailField(view) && CollectionUtils.isNotEmpty(viewFields)) { detailFieldList.addAll(xAxis); @@ -1470,7 +1470,7 @@ public class ChartViewService { } else if (StringUtils.equalsIgnoreCase(view.getType(), "bar-group-stack")) { mapChart = ChartDataBuild.transGroupStackDataAntV(xAxisBase, xAxis, xAxisExt, yAxis, extStack, data, view, isDrill); } else if (StringUtils.equalsIgnoreCase(view.getType(), "bar-time-range")) { - mapChart = ChartDataBuild.transTimeBarDataAntV(xAxisBase, xAxis, xAxisExt, yAxis, extStack, data, view, isDrill); + mapChart = ChartDataBuild.transTimeBarDataAntV(xAxisBase, xAxis, xAxisExt, yAxis, extStack, data, view, isDrill, drillRequestList); } else if (StringUtils.containsIgnoreCase(view.getType(), "bar-stack")) { mapChart = ChartDataBuild.transStackChartDataAntV(xAxis, yAxis, view, data, extStack, isDrill); } else if (StringUtils.containsIgnoreCase(view.getType(), "line-stack")) { @@ -1498,6 +1498,18 @@ public class ChartViewService { if (CollectionUtils.isNotEmpty(detailData)) { mapTableNormal = ChartDataBuild.transTableNormalWithDetail(xAxis, yAxis, data, detailFieldList, detailData, desensitizationList); } else { + if (StringUtils.equalsIgnoreCase(view.getType(), "bar-time-range") && !drillRequestList.isEmpty() && !xAxisExt.isEmpty()) { // 针对区间条形图,还需要给xAxis排个序, 把xAxisExt放到最后 + int count = 0; + for (int i = xAxis.size() - drillRequestList.size() - 1; i >= 0; i--) { + xAxis.remove(i); + count++; + if (xAxisExt.size() == count) { + break; + } + } + xAxis.addAll(xAxisExt); + } + mapTableNormal = ChartDataBuild.transTableNormal(xAxis, yAxis, view, data, extStack, desensitizationList); } chartViewDTO = uniteViewResult(datasourceRequest.getQuery(), mapChart, mapTableNormal, view, isDrill, drillFilters, dynamicAssistFields, assistData); diff --git a/core/backend/src/main/java/io/dataease/service/chart/util/ChartDataBuild.java b/core/backend/src/main/java/io/dataease/service/chart/util/ChartDataBuild.java index f009175662..c7bb427482 100644 --- a/core/backend/src/main/java/io/dataease/service/chart/util/ChartDataBuild.java +++ b/core/backend/src/main/java/io/dataease/service/chart/util/ChartDataBuild.java @@ -1,6 +1,7 @@ package io.dataease.service.chart.util; import cn.hutool.core.util.ArrayUtil; +import io.dataease.controller.request.chart.ChartDrillRequest; import io.dataease.dto.chart.*; import io.dataease.plugins.common.base.domain.ChartViewWithBLOBs; import io.dataease.plugins.common.dto.chart.ChartViewFieldDTO; @@ -1310,7 +1311,7 @@ public class ChartDataBuild { } } - public static Map transTimeBarDataAntV(List xAxisBase, List xAxis, List xAxisExt, List yAxis, List extStack, List data, ChartViewWithBLOBs view, boolean isDrill) { + public static Map transTimeBarDataAntV(List xAxisBase, List xAxis, List xAxisExt, List yAxis, List extStack, List data, ChartViewWithBLOBs view, boolean isDrill, List drillRequestList) { Map map = new HashMap<>(); if (CollectionUtils.isEmpty(xAxisBase) || CollectionUtils.isEmpty(xAxisExt) || xAxisExt.size() < 2) { @@ -1323,9 +1324,17 @@ public class ChartDataBuild { } List dates = new ArrayList<>(); + List numbers = new ArrayList<>(); ChartViewFieldDTO xAxis1 = xAxis.get(xAxisBase.size()); - SimpleDateFormat sdf = new SimpleDateFormat(getDateFormat(xAxis1.getDateStyle(), xAxis1.getDatePattern())); + boolean isDate = true; + if (StringUtils.equalsIgnoreCase(xAxis1.getGroupType(), "q")) { + isDate = false; + } + SimpleDateFormat sdf = null; + if (isDate) { + sdf = new SimpleDateFormat(getDateFormat(xAxis1.getDateStyle(), xAxis1.getDatePattern())); + } List dataList = new ArrayList<>(); for (int i1 = 0; i1 < data.size(); i1++) { @@ -1350,49 +1359,67 @@ public class ChartDataBuild { List dimensionList = new ArrayList<>(); for (int j = 0; j < xAxis.size(); j++) { + if (j == xAxisBase.size() || j == xAxisBase.size() + 1) { + continue; + } + int index = j; + if (j > xAxisBase.size() + 1) { + index = j - 2; + } ChartDimensionDTO chartDimensionDTO = new ChartDimensionDTO(); chartDimensionDTO.setId(xAxis.get(j).getId()); - chartDimensionDTO.setValue(row[j]); + chartDimensionDTO.setValue(row[index]); dimensionList.add(chartDimensionDTO); } obj.put("dimensionList", dimensionList); - List values = new ArrayList<>(); + List values = new ArrayList<>(); // 由于起止时间字段是放到最后的yField里去查询的,所以拿倒数两个 if (row[xAxis.size() - 1] == null || row[xAxis.size() - 2] == null) { continue; } - values.add(row[xAxis.size() - 2]); - values.add(row[xAxis.size() - 1]); - obj.put("values", values); - - - try { - Date date = sdf.parse(row[xAxis.size() - 2]); - if (date != null) { - dates.add(date); + if (isDate) { + values.add(row[xAxis.size() - 2]); + values.add(row[xAxis.size() - 1]); + obj.put("values", values); + try { + Date date = sdf.parse(row[xAxis.size() - 2]); + if (date != null) { + dates.add(date); + } + } catch (Exception ignore) { } - } catch (Exception ignore) { - } - try { - Date date = sdf.parse(row[xAxis.size() - 1]); - if (date != null) { - dates.add(date); + try { + Date date = sdf.parse(row[xAxis.size() - 1]); + if (date != null) { + dates.add(date); + } + } catch (Exception ignore) { } - } catch (Exception ignore) { + } else { + values.add(new BigDecimal(row[xAxis.size() - 2])); + values.add(new BigDecimal(row[xAxis.size() - 1])); + obj.put("values", values); + + numbers.add(new BigDecimal(row[xAxis.size() - 2])); + numbers.add(new BigDecimal(row[xAxis.size() - 1])); } dataList.add(obj); } - map.put("minTime", sdf.format(dates.stream().min(Date::compareTo).orElse(null))); - - - map.put("maxTime", sdf.format(dates.stream().max(Date::compareTo).orElse(null))); + if (isDate) { + map.put("minTime", sdf.format(dates.stream().min(Date::compareTo).orElse(null))); + map.put("maxTime", sdf.format(dates.stream().max(Date::compareTo).orElse(null))); + } else { + map.put("min", numbers.stream().min(BigDecimal::compareTo).orElse(null)); + map.put("max", numbers.stream().max(BigDecimal::compareTo).orElse(null)); + } + map.put("isDate", isDate); map.put("data", dataList); return map; diff --git a/core/frontend/src/lang/en.js b/core/frontend/src/lang/en.js index 251004fd58..aad6c1a058 100644 --- a/core/frontend/src/lang/en.js +++ b/core/frontend/src/lang/en.js @@ -1184,7 +1184,7 @@ export default { chart_bar_stack: 'Stack Bar', chart_percentage_bar_stack: 'Percentage Stack Bar', chart_bar_horizontal: 'Horizontal Bar', - chart_bar_time_range: 'Time Bar', + chart_bar_time_range: 'Range Bar', chart_bar_stack_horizontal: 'Stack Horizontal Bar', chart_percentage_bar_stack_horizontal: 'Horizontal Percentage Stack Bar', chart_bidirectional_bar: 'Bidirectional Bar', @@ -1497,7 +1497,7 @@ export default { dynamic: 'Dynamic', gauge_size_field_delete: 'Dynamic field changed,please edit again', chart_group: 'Sub Type', - chart_bar_time: 'Times', + chart_bar_time: 'Range', chart_bar_group: 'Bar Group', chart_bar_group_stack: 'Group Stack Bar', field_dynamic: 'Dynamic', @@ -1525,7 +1525,7 @@ export default { set_zero: 'Set Zero', ignore_data: 'Hide Data', sub_dimension_tip: 'This field is required, and cannot be included in the type axis, you should choose non-group chart if you don\'t need it, or you will get unexpected chart.', - time_bar_tip: 'This field is required, and axis type must be time', + time_bar_tip: 'This field is required, and need two time dimensions or two quotas', drill_dimension_tip: 'Only fields in the dataset can be drilled', table_scroll_tip: 'The detail table is only effective when the pagination mode is "Drop-down".', table_threshold_tip: 'Tip: Do not select fields repeatedly. If the same field is configured repeatedly, only the last field will take effect.', diff --git a/core/frontend/src/lang/tw.js b/core/frontend/src/lang/tw.js index c8bc177963..9d8b378867 100644 --- a/core/frontend/src/lang/tw.js +++ b/core/frontend/src/lang/tw.js @@ -1182,7 +1182,7 @@ export default { chart_bar_stack: '堆疊柱狀圖', chart_percentage_bar_stack: '百分比柱狀圖', chart_bar_horizontal: '橫嚮柱狀圖', - chart_bar_time_range: '時間條形圖', + chart_bar_time_range: '區間條形圖', chart_bar_stack_horizontal: '橫嚮堆疊柱狀圖', chart_percentage_bar_stack_horizontal: '橫嚮百分比柱狀圖', chart_bidirectional_bar: '對稱柱狀圖', @@ -1494,7 +1494,7 @@ export default { dynamic: '動態值', gauge_size_field_delete: '動態值中字段發生變更,請重新編輯', chart_group: '子類別', - chart_bar_time: '起止時間', + chart_bar_time: '區間范圍', chart_bar_group: '分組柱狀圖', chart_bar_group_stack: '分組堆疊柱狀圖', field_dynamic: '動態值', @@ -1522,7 +1522,7 @@ export default { ignore_data: '隱藏空值', empty_data_field_ctrl: '字段設置', sub_dimension_tip: '該字段為必填項,且不應使用類別軸中的字段,若無需該字段,請選擇基礎圖表進行展示,否則展示效果不理想', - time_bar_tip: '該字段為必填項,且需要兩個時間類型字段', + time_bar_tip: '該字段為必填項,且需要兩個指標或者時間類型緯度字段', drill_dimension_tip: '鑽取字段僅支持數據集中的字段', table_scroll_tip: '明細表僅在分頁模式為"下拉"時生效。', table_threshold_tip: '提示:請勿重複選擇字段,若同一字段重複配置,則只有最後的字段配置生效。', diff --git a/core/frontend/src/lang/zh.js b/core/frontend/src/lang/zh.js index 33a97f9eb8..ec19a423dd 100644 --- a/core/frontend/src/lang/zh.js +++ b/core/frontend/src/lang/zh.js @@ -1182,7 +1182,7 @@ export default { chart_bar_stack: '堆叠柱状图', chart_percentage_bar_stack: '百分比柱状图', chart_bar_horizontal: '横向柱状图', - chart_bar_time_range: '时间条形图', + chart_bar_time_range: '区间条形图', chart_bar_stack_horizontal: '横向堆叠柱状图', chart_percentage_bar_stack_horizontal: '横向百分比柱状图', chart_bidirectional_bar: '对称柱状图', @@ -1494,7 +1494,7 @@ export default { dynamic: '动态值', gauge_size_field_delete: '动态值中字段发生变更,请重新编辑', chart_group: '子类别', - chart_bar_time: '起止时间', + chart_bar_time: '区间范围', chart_bar_group: '分组柱状图', chart_bar_group_stack: '分组堆叠柱状图', field_dynamic: '动态值', @@ -1522,7 +1522,7 @@ export default { set_zero: '置为0', ignore_data: '隐藏空值', sub_dimension_tip: '该字段为必填项,且不应使用类别轴中的字段,若无需该字段,请选择基础图表进行展示,否则展示效果不理想。', - time_bar_tip: '该字段为必填项,且需要两个时间类型字段', + time_bar_tip: '该字段为必填项,且需要两个指标或者时间类型纬度字段', drill_dimension_tip: '钻取字段仅支持数据集中的字段', table_scroll_tip: '明细表仅在分页模式为"下拉"时生效。', table_threshold_tip: '提示:请勿重复选择字段,若同一字段重复配置,则只有最后的字段配置生效', diff --git a/core/frontend/src/views/chart/chart/bar/bar_antv.js b/core/frontend/src/views/chart/chart/bar/bar_antv.js index ee531aff15..c3bfb8e4eb 100644 --- a/core/frontend/src/views/chart/chart/bar/bar_antv.js +++ b/core/frontend/src/views/chart/chart/bar/bar_antv.js @@ -275,9 +275,14 @@ export function timeRangeBarOptionAntV(plot, container, chart, action) { // data const data = _.cloneDeep(chart.data.data) + const isDate = !!chart.data.isDate + const minTime = chart.data.minTime const maxTime = chart.data.maxTime + const minNumber = chart.data.min + const maxNumber = chart.data.max + // config const slider = getSlider(chart) const analyse = getAnalyse(chart) @@ -297,13 +302,6 @@ export function timeRangeBarOptionAntV(plot, container, chart, action) { slider: slider, annotations: analyse, isRange: true, - meta: { - values: { - type: 'time', - min: minTime, - max: maxTime - } - }, brush: { enabled: true, isStartEnable: (context) => { @@ -340,6 +338,24 @@ export function timeRangeBarOptionAntV(plot, container, chart, action) { } ] } + + if (isDate) { + options.meta = { + values: { + type: 'time', + min: minTime, + max: maxTime + } + } + } else { + options.meta = { + values: { + min: minNumber, + max: maxNumber + } + } + } + // size let customAttr = {} if (chart.customAttr) { diff --git a/core/frontend/src/views/chart/components/dragItem/QuotaItem.vue b/core/frontend/src/views/chart/components/dragItem/QuotaItem.vue index 01e05de33d..4faea534c8 100644 --- a/core/frontend/src/views/chart/components/dragItem/QuotaItem.vue +++ b/core/frontend/src/views/chart/components/dragItem/QuotaItem.vue @@ -154,7 +154,7 @@ - + {{ $t('chart.filter') }}... * / - {{ $t('chart.dimension') }} + {{ $t('chart.dimension') }} + {{ $t('chart.dimension_or_quota') }} - +
{{ $t('chart.result_filter') }} - 已设置 + 已设置
{ if (valid) { - if (this.itemForm.renameType === 'quota') { + if (this.itemForm.renameType === 'quota' && this.chart.type !== 'bar-time-range') { this.view.yaxis[this.itemForm.index].name = this.itemForm.name } else if (this.itemForm.renameType === 'dimension') { this.view.xaxis[this.itemForm.index].name = this.itemForm.name } else if (this.itemForm.renameType === 'quotaExt') { this.view.yaxisExt[this.itemForm.index].name = this.itemForm.name - } else if (this.itemForm.renameType === 'dimensionExt') { + } else if (this.itemForm.renameType === 'dimensionExt' || this.chart.type === 'bar-time-range') { this.view.xaxisExt[this.itemForm.index].name = this.itemForm.name } else if (this.itemForm.renameType === 'extStack') { this.view.extStack[this.itemForm.index].name = this.itemForm.name @@ -3242,19 +3291,21 @@ export default { addXaxisExt(e) { this.multiAdd(e, this.view.xaxisExt) this.dragMoveDuplicate(this.view.xaxisExt, e) - if (this.view.type !== 'table-info') { + + if (this.view.type !== 'table-info' && this.view.type !== 'bar-time-range') { this.dragCheckType(this.view.xaxisExt, 'd') } if (this.view.type === 'bar-time-range') { - // 针对时间条形图,需要限定类型为时间类型 if (this.view.xaxisExt && this.view.xaxisExt.length > 0) { const baseXaxisExt = this.view.xaxisExt[0] for (let i = this.view.xaxisExt.length - 1; i >= 0; i--) { + // 针对时间条形图,需要限定类型为时间类型 + if (baseXaxisExt.groupType !== this.view.xaxisExt[i].groupType || baseXaxisExt.groupType === 'd' && this.view.xaxisExt[i].deType !== 1) { + this.view.xaxisExt.splice(i, 1) + continue + } this.view.xaxisExt[i].dateStyle = baseXaxisExt.dateStyle this.view.xaxisExt[i].datePattern = baseXaxisExt.datePattern - if (this.view.xaxisExt[i].deType !== 1) { - this.view.xaxisExt.splice(i, 1) - } } } if (this.view.xaxisExt.length > 2) { @@ -3583,12 +3634,14 @@ export default { return } // 更新指标 - if (this.valueFormatterItem.formatterType === 'quota') { + if (this.valueFormatterItem.formatterType === 'quota' && this.chart.type !== 'bar-time-range') { this.view.yaxis[this.valueFormatterItem.index].formatterCfg = this.valueFormatterItem.formatterCfg } else if (this.valueFormatterItem.formatterType === 'quotaExt') { this.view.yaxisExt[this.valueFormatterItem.index].formatterCfg = this.valueFormatterItem.formatterCfg } else if (this.valueFormatterItem.formatterType === 'dimension') { this.view.xaxis[this.valueFormatterItem.index].formatterCfg = this.valueFormatterItem.formatterCfg + } else if (this.chart.type === 'bar-time-range') { + this.view.xaxisExt[this.valueFormatterItem.index].formatterCfg = this.valueFormatterItem.formatterCfg } this.calcData(true) this.closeValueFormatter() diff --git a/extensions/dataease-extensions-datasource/dm/dm-backend/src/main/java/io/dataease/plugins/datasource/dm/query/DmQueryProvider.java b/extensions/dataease-extensions-datasource/dm/dm-backend/src/main/java/io/dataease/plugins/datasource/dm/query/DmQueryProvider.java index d447781ea2..2e85f60bed 100644 --- a/extensions/dataease-extensions-datasource/dm/dm-backend/src/main/java/io/dataease/plugins/datasource/dm/query/DmQueryProvider.java +++ b/extensions/dataease-extensions-datasource/dm/dm-backend/src/main/java/io/dataease/plugins/datasource/dm/query/DmQueryProvider.java @@ -477,11 +477,41 @@ public class DmQueryProvider extends QueryProvider { List yFields = new ArrayList<>(); // 要把两个时间字段放进y里面 List yWheres = new ArrayList<>(); + List yOrders = new ArrayList<>(); if (CollectionUtils.isNotEmpty(xAxis)) { for (int i = 0; i < xAxis.size(); i++) { ChartViewFieldDTO x = xAxis.get(i); String originField; + + if (StringUtils.equalsIgnoreCase(x.getGroupType(), "q")) { + 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(OracleConstants.KEYWORD_FIX, tableObj.getTableAlias(), + x.getOriginName()); + } else { + originField = String.format(OracleConstants.KEYWORD_FIX, tableObj.getTableAlias(), + x.getOriginName()); + } + String fieldAlias = String.format(OracleConstants.ALIAS_FIX, + String.format(SQLConstants.FIELD_ALIAS_Y_PREFIX, i)); + // 处理纵轴字段 + yFields.add(getYFields(x, originField, fieldAlias)); + // 处理纵轴过滤 + yWheres.add(getYWheres(x, originField, fieldAlias)); + // 处理纵轴排序 + if (StringUtils.isNotEmpty(x.getSort()) && Utils.joinSort(x.getSort())) { + yOrders.add(SQLObj.builder() + .orderField(originField) + .orderAlias(fieldAlias) + .orderDirection(x.getSort()) + .build()); + } + continue; + } + if (ObjectUtils.isNotEmpty(x.getExtField()) && x.getExtField() == 2) { // 解析origin name中有关联的字段生成sql表达式 originField = calcFieldRegex(x.getOriginName(), tableObj); @@ -521,7 +551,6 @@ public class DmQueryProvider extends QueryProvider { } } } - List yOrders = new ArrayList<>(); // 处理视图中字段过滤 String customWheres = transChartFilterTrees(tableObj, fieldCustomFilter); diff --git a/extensions/dataease-extensions-datasource/kingbase/kingbase-backend/src/main/java/io/dataease/plugins/datasource/kingbase/query/KingbaseQueryProvider.java b/extensions/dataease-extensions-datasource/kingbase/kingbase-backend/src/main/java/io/dataease/plugins/datasource/kingbase/query/KingbaseQueryProvider.java index 9888a0ae5a..4785d35df7 100644 --- a/extensions/dataease-extensions-datasource/kingbase/kingbase-backend/src/main/java/io/dataease/plugins/datasource/kingbase/query/KingbaseQueryProvider.java +++ b/extensions/dataease-extensions-datasource/kingbase/kingbase-backend/src/main/java/io/dataease/plugins/datasource/kingbase/query/KingbaseQueryProvider.java @@ -464,11 +464,40 @@ public class KingbaseQueryProvider extends QueryProvider { List yFields = new ArrayList<>(); // 要把两个时间字段放进y里面 List yWheres = new ArrayList<>(); + List yOrders = new ArrayList<>(); if (CollectionUtils.isNotEmpty(xAxis)) { for (int i = 0; i < xAxis.size(); i++) { ChartViewFieldDTO x = xAxis.get(i); String originField; + + if (StringUtils.equalsIgnoreCase(x.getGroupType(), "q")) { + 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(KingbaseConstants.KEYWORD_FIX, tableObj.getTableAlias(), + x.getOriginName()); + } else { + originField = String.format(KingbaseConstants.KEYWORD_FIX, tableObj.getTableAlias(), + x.getOriginName()); + } + String fieldAlias = String.format(SQLConstants.FIELD_ALIAS_Y_PREFIX, i); + // 处理纵轴字段 + yFields.add(getYFields(x, originField, fieldAlias)); + // 处理纵轴过滤 + yWheres.add(getYWheres(x, originField, fieldAlias)); + // 处理纵轴排序 + if (StringUtils.isNotEmpty(x.getSort()) && Utils.joinSort(x.getSort())) { + yOrders.add(SQLObj.builder() + .orderField(originField) + .orderAlias(fieldAlias) + .orderDirection(x.getSort()) + .build()); + } + continue; + } + if (ObjectUtils.isNotEmpty(x.getExtField()) && x.getExtField() == 2) { // 解析origin name中有关联的字段生成sql表达式 originField = calcFieldRegex(x.getOriginName(), tableObj); @@ -508,7 +537,6 @@ public class KingbaseQueryProvider extends QueryProvider { } } - List yOrders = new ArrayList<>(); // 处理视图中字段过滤 String customWheres = transChartFilterTrees(tableObj, fieldCustomFilter); diff --git a/extensions/dataease-extensions-datasource/kylin/kylin-backend/src/main/java/io/dataease/plugins/datasource/kylin/query/KylinQueryProvider.java b/extensions/dataease-extensions-datasource/kylin/kylin-backend/src/main/java/io/dataease/plugins/datasource/kylin/query/KylinQueryProvider.java index fefd418fbd..4c67f4e679 100644 --- a/extensions/dataease-extensions-datasource/kylin/kylin-backend/src/main/java/io/dataease/plugins/datasource/kylin/query/KylinQueryProvider.java +++ b/extensions/dataease-extensions-datasource/kylin/kylin-backend/src/main/java/io/dataease/plugins/datasource/kylin/query/KylinQueryProvider.java @@ -373,11 +373,38 @@ public class KylinQueryProvider extends QueryProvider { List yFields = new ArrayList<>(); // 要把两个时间字段放进y里面 List yWheres = new ArrayList<>(); + List yOrders = new ArrayList<>(); if (CollectionUtils.isNotEmpty(xAxis)) { for (int i = 0; i < xAxis.size(); i++) { ChartViewFieldDTO x = xAxis.get(i); String originField; + + if (StringUtils.equalsIgnoreCase(x.getGroupType(), "q")) { + 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(KylinConstants.KEYWORD_FIX, tableObj.getTableAlias(), x.getOriginName()); + } else { + originField = String.format(KylinConstants.KEYWORD_FIX, tableObj.getTableAlias(), x.getOriginName()); + } + String fieldAlias = String.format(SQLConstants.FIELD_ALIAS_Y_PREFIX, i); + // 处理纵轴字段 + yFields.add(getYFields(x, originField, fieldAlias)); + // 处理纵轴过滤 + yWheres.add(getYWheres(x, originField, fieldAlias)); + // 处理纵轴排序 + if (StringUtils.isNotEmpty(x.getSort()) && !StringUtils.equalsIgnoreCase(x.getSort(), "none")) { + yOrders.add(SQLObj.builder() + .orderField(originField) + .orderAlias(fieldAlias) + .orderDirection(x.getSort()) + .build()); + } + continue; + } + if (ObjectUtils.isNotEmpty(x.getExtField()) && x.getExtField() == 2) { // 解析origin name中有关联的字段生成sql表达式 originField = calcFieldRegex(x.getOriginName(), tableObj); @@ -414,7 +441,7 @@ public class KylinQueryProvider extends QueryProvider { } } } - List yOrders = new ArrayList<>(); + // 处理视图中字段过滤 String customWheres = transChartFilterTrees(tableObj, fieldCustomFilter); diff --git a/extensions/dataease-extensions-datasource/maxcompute/maxcompute-backend/src/main/java/io/dataease/plugins/datasource/dm/query/MaxcomputeQueryProvider.java b/extensions/dataease-extensions-datasource/maxcompute/maxcompute-backend/src/main/java/io/dataease/plugins/datasource/dm/query/MaxcomputeQueryProvider.java index c402b20635..8fbad1e044 100644 --- a/extensions/dataease-extensions-datasource/maxcompute/maxcompute-backend/src/main/java/io/dataease/plugins/datasource/dm/query/MaxcomputeQueryProvider.java +++ b/extensions/dataease-extensions-datasource/maxcompute/maxcompute-backend/src/main/java/io/dataease/plugins/datasource/dm/query/MaxcomputeQueryProvider.java @@ -378,11 +378,38 @@ public class MaxcomputeQueryProvider extends QueryProvider { List yFields = new ArrayList<>(); // 要把两个时间字段放进y里面 List yWheres = new ArrayList<>(); + List yOrders = new ArrayList<>(); if (CollectionUtils.isNotEmpty(xAxis)) { for (int i = 0; i < xAxis.size(); i++) { ChartViewFieldDTO x = xAxis.get(i); String originField; + + if (StringUtils.equalsIgnoreCase(x.getGroupType(), "q")) { + 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(MaxConstants.KEYWORD_FIX, tableObj.getTableAlias(), x.getOriginName()); + } else { + originField = String.format(MaxConstants.KEYWORD_FIX, tableObj.getTableAlias(), x.getOriginName()); + } + String fieldAlias = String.format(SQLConstants.FIELD_ALIAS_Y_PREFIX, i); + // 处理纵轴字段 + yFields.add(getYFields(x, originField, fieldAlias)); + // 处理纵轴过滤 + yWheres.add(getYWheres(x, originField, fieldAlias)); + // 处理纵轴排序 + if (StringUtils.isNotEmpty(x.getSort()) && !StringUtils.equalsIgnoreCase(x.getSort(), "none")) { + yOrders.add(SQLObj.builder() + .orderField(originField) + .orderAlias(fieldAlias) + .orderDirection(x.getSort()) + .build()); + } + continue; + } + if (ObjectUtils.isNotEmpty(x.getExtField()) && x.getExtField() == 2) { // 解析origin name中有关联的字段生成sql表达式 originField = calcFieldRegex(x.getOriginName(), tableObj); @@ -419,7 +446,7 @@ public class MaxcomputeQueryProvider extends QueryProvider { } } } - List yOrders = new ArrayList<>(); + // 处理视图中字段过滤 String customWheres = transChartFilterTrees(tableObj, fieldCustomFilter); diff --git a/extensions/dataease-extensions-datasource/mongo/mongo-backend/src/main/java/io/dataease/plugins/datasource/mongo/query/MongobiQueryProvider.java b/extensions/dataease-extensions-datasource/mongo/mongo-backend/src/main/java/io/dataease/plugins/datasource/mongo/query/MongobiQueryProvider.java index a2b60d2859..fe5bbe0374 100644 --- a/extensions/dataease-extensions-datasource/mongo/mongo-backend/src/main/java/io/dataease/plugins/datasource/mongo/query/MongobiQueryProvider.java +++ b/extensions/dataease-extensions-datasource/mongo/mongo-backend/src/main/java/io/dataease/plugins/datasource/mongo/query/MongobiQueryProvider.java @@ -379,11 +379,38 @@ public class MongobiQueryProvider extends QueryProvider { List yFields = new ArrayList<>(); // 要把两个时间字段放进y里面 List yWheres = new ArrayList<>(); + List yOrders = new ArrayList<>(); if (CollectionUtils.isNotEmpty(xAxis)) { for (int i = 0; i < xAxis.size(); i++) { ChartViewFieldDTO x = xAxis.get(i); String originField; + + if (StringUtils.equalsIgnoreCase(x.getGroupType(), "q")) { + 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(MongoConstants.KEYWORD_FIX, tableObj.getTableAlias(), x.getOriginName()); + } else { + originField = String.format(MongoConstants.KEYWORD_FIX, tableObj.getTableAlias(), x.getOriginName()); + } + String fieldAlias = String.format(SQLConstants.FIELD_ALIAS_Y_PREFIX, i); + // 处理纵轴字段 + yFields.add(getYFields(x, originField, fieldAlias)); + // 处理纵轴过滤 + yWheres.add(getYWheres(x, originField, fieldAlias)); + // 处理纵轴排序 + if (StringUtils.isNotEmpty(x.getSort()) && Utils.joinSort(x.getSort())) { + yOrders.add(SQLObj.builder() + .orderField(originField) + .orderAlias(fieldAlias) + .orderDirection(x.getSort()) + .build()); + } + continue; + } + if (ObjectUtils.isNotEmpty(x.getExtField()) && x.getExtField() == 2) { // 解析origin name中有关联的字段生成sql表达式 originField = calcFieldRegex(x.getOriginName(), tableObj); @@ -420,7 +447,7 @@ public class MongobiQueryProvider extends QueryProvider { } } } - List yOrders = new ArrayList<>(); + // 处理视图中字段过滤 String customWheres = transChartFilterTrees(tableObj, fieldCustomFilter); diff --git a/extensions/dataease-extensions-datasource/presto/presto-backend/src/main/java/io/dataease/plugins/datasource/dm/query/PrestoQueryProvider.java b/extensions/dataease-extensions-datasource/presto/presto-backend/src/main/java/io/dataease/plugins/datasource/dm/query/PrestoQueryProvider.java index 780ac5b12d..698735d5d7 100644 --- a/extensions/dataease-extensions-datasource/presto/presto-backend/src/main/java/io/dataease/plugins/datasource/dm/query/PrestoQueryProvider.java +++ b/extensions/dataease-extensions-datasource/presto/presto-backend/src/main/java/io/dataease/plugins/datasource/dm/query/PrestoQueryProvider.java @@ -375,11 +375,38 @@ public class PrestoQueryProvider extends QueryProvider { List yFields = new ArrayList<>(); // 要把两个时间字段放进y里面 List yWheres = new ArrayList<>(); + List yOrders = new ArrayList<>(); if (CollectionUtils.isNotEmpty(xAxis)) { for (int i = 0; i < xAxis.size(); i++) { ChartViewFieldDTO x = xAxis.get(i); String originField; + + if (StringUtils.equalsIgnoreCase(x.getGroupType(), "q")) { + 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(PrestoConstants.KEYWORD_FIX, tableObj.getTableAlias(), x.getOriginName()); + } else { + originField = String.format(PrestoConstants.KEYWORD_FIX, tableObj.getTableAlias(), x.getOriginName()); + } + String fieldAlias = String.format(SQLConstants.FIELD_ALIAS_Y_PREFIX, i); + // 处理纵轴字段 + yFields.add(getYFields(x, originField, fieldAlias)); + // 处理纵轴过滤 + yWheres.add(getYWheres(x, originField, fieldAlias)); + // 处理纵轴排序 + if (StringUtils.isNotEmpty(x.getSort()) && !StringUtils.equalsIgnoreCase(x.getSort(), "none")) { + yOrders.add(SQLObj.builder() + .orderField(originField) + .orderAlias(fieldAlias) + .orderDirection(x.getSort()) + .build()); + } + continue; + } + if (ObjectUtils.isNotEmpty(x.getExtField()) && x.getExtField() == 2) { // 解析origin name中有关联的字段生成sql表达式 originField = calcFieldRegex(x.getOriginName(), tableObj); @@ -417,7 +444,7 @@ public class PrestoQueryProvider extends QueryProvider { } } } - List yOrders = new ArrayList<>(); + // 处理视图中字段过滤 String customWheres = transChartFilterTrees(tableObj, fieldCustomFilter);