diff --git a/core/backend/src/main/java/io/dataease/provider/engine/doris/DorisQueryProvider.java b/core/backend/src/main/java/io/dataease/provider/engine/doris/DorisQueryProvider.java index d668680894..9f8b919a25 100644 --- a/core/backend/src/main/java/io/dataease/provider/engine/doris/DorisQueryProvider.java +++ b/core/backend/src/main/java/io/dataease/provider/engine/doris/DorisQueryProvider.java @@ -768,6 +768,112 @@ public class DorisQueryProvider extends QueryProvider { return getSQLScatter("(" + table + ")", xAxis, yAxis, fieldCustomFilter, rowPermissionsTree, extFilterRequestList, extBubble, extGroup, null, view); } + @Override + public String getSQLRangeBar(String table, List baseXAxis, List xAxis, List yAxis, List fieldCustomFilter, List rowPermissionsTree, List extFilterRequestList, List extStack, Datasource ds, ChartViewWithBLOBs view) { + SQLObj tableObj = SQLObj.builder() + .tableName((table.startsWith("(") && table.endsWith(")")) ? table : String.format(DorisConstants.KEYWORD_TABLE, table)) + .tableAlias(String.format(TABLE_ALIAS_PREFIX, 0)) + .build(); + List xFields = new ArrayList<>(); + List xOrders = new ArrayList<>(); + + List yFields = new ArrayList<>(); // 要把两个时间字段放进y里面 + List yWheres = 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(DorisConstants.KEYWORD_FIX, tableObj.getTableAlias(), x.getDataeaseName()); + } else { + originField = String.format(DorisConstants.KEYWORD_FIX, tableObj.getTableAlias(), x.getDataeaseName()); + } + String fieldAlias = String.format(SQLConstants.FIELD_ALIAS_X_PREFIX, i); + + if (i == baseXAxis.size()) {// 起止时间 + String fieldName = String.format(DorisConstants.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(DorisConstants.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() + .orderField(originField) + .orderAlias(fieldAlias) + .orderDirection(x.getSort()) + .build()); + } + } + } + + List yOrders = new ArrayList<>(); + + // 处理视图中字段过滤 + 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); + fields.addAll(yFields); + 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); + orders.addAll(yOrders); + List aggWheres = new ArrayList<>(); + aggWheres.addAll(yWheres.stream().filter(ObjectUtils::isNotEmpty).collect(Collectors.toList())); + + STGroup stg = new STGroupFile(SQLConstants.SQL_TEMPLATE); + ST st_sql = stg.getInstanceOf("querySql"); + if (CollectionUtils.isNotEmpty(xFields)) { + st_sql.add("useAliasForGroup", true); + st_sql.add("groups", xFields); + } + if (CollectionUtils.isNotEmpty(yFields)) st_sql.add("aggregators", yFields); + 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("querySql"); + SQLObj tableSQL = SQLObj.builder() + .tableName(String.format(DorisConstants.BRACKETS, sql)) + .tableAlias(String.format(TABLE_ALIAS_PREFIX, 1)) + .build(); + if (CollectionUtils.isNotEmpty(aggWheres)) st.add("filters", aggWheres); + if (CollectionUtils.isNotEmpty(orders)) st.add("orders", orders); + if (ObjectUtils.isNotEmpty(tableSQL)) st.add("table", tableSQL); + return sqlLimit(st.render(), view); + } + + @Override + public String getSQLAsTmpRangeBar(String table, List baseXAxis, List xAxis, List yAxis, List fieldCustomFilter, List rowPermissionsTree, List extFilterRequestList, List extStack, ChartViewWithBLOBs view) { + return getSQLRangeBar("(" + table + ")", baseXAxis, xAxis, yAxis, fieldCustomFilter, rowPermissionsTree, extFilterRequestList, extStack, null, view); + } + @Override public String searchTable(String table) { return "SELECT table_name FROM information_schema.TABLES WHERE table_name ='" + table + "'"; 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 5a619bf662..daa47e7f2d 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 @@ -374,6 +374,110 @@ public class MysqlQueryProvider extends QueryProvider { return sqlLimit(st.render(), view); } + @Override + public String getSQLRangeBar(String table, List baseXAxis, List xAxis, List yAxis, List fieldCustomFilter, List rowPermissionsTree, List extFilterRequestList, List extStack, 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)) + .build(); + List xFields = new ArrayList<>(); + List xOrders = new ArrayList<>(); + + List yFields = new ArrayList<>(); // 要把两个时间字段放进y里面 + List yWheres = 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) { +// 计算字段和视图字段,规则为 函数([原始字段id]),这边把[原始字段id] 换成 表名.原始字段id +// 解析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_X_PREFIX, i); + + + if (i == baseXAxis.size()) {// 起止时间 + String fieldName = String.format(MysqlConstants.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(MysqlConstants.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() + .orderField(originField) + .orderAlias(fieldAlias) + .orderDirection(x.getSort()) + .build()); + } + } + } + + List yOrders = new ArrayList<>(); + + // 处理视图中字段过滤 + 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); + fields.addAll(yFields); + List wheres = new ArrayList<>(); + if (customWheres != null) wheres.add(customWheres); + if (extWheres != null) wheres.add(extWheres); + if (whereTrees != null) wheres.add(whereTrees); + + // 外层再次套sql + List orders = new ArrayList<>(); + orders.addAll(xOrders); + orders.addAll(yOrders); + List aggWheres = new ArrayList<>(); + aggWheres.addAll(yWheres.stream().filter(ObjectUtils::isNotEmpty).collect(Collectors.toList())); + + STGroup stg = new STGroupFile(SQLConstants.SQL_TEMPLATE); + ST st_sql = stg.getInstanceOf("querySql"); + if (CollectionUtils.isNotEmpty(xFields)) st_sql.add("groups", xFields); + if (CollectionUtils.isNotEmpty(yFields)) st_sql.add("aggregators", yFields); + 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("querySql"); + SQLObj tableSQL = SQLObj.builder() + .tableName(String.format(MysqlConstants.BRACKETS, sql)) + .tableAlias(String.format(TABLE_ALIAS_PREFIX, 1)) + .build(); + if (CollectionUtils.isNotEmpty(aggWheres)) st.add("filters", aggWheres); + if (CollectionUtils.isNotEmpty(orders)) st.add("orders", orders); + if (ObjectUtils.isNotEmpty(tableSQL)) st.add("table", tableSQL); + return sqlLimit(st.render(), view); + } + + @Override + public String getSQLAsTmpRangeBar(String table, List baseXAxis, List xAxis, List yAxis, List fieldCustomFilter, List rowPermissionsTree, List extFilterRequestList, List extStack, ChartViewWithBLOBs view) { + return getSQLRangeBar("(" + table + ")", baseXAxis, xAxis, yAxis, fieldCustomFilter, rowPermissionsTree, extFilterRequestList, extStack, 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.getGoPage() - 1) * pageInfo.getPageSize() + "," + pageInfo.getPageSize() : ""); diff --git a/core/backend/src/main/java/io/dataease/provider/query/api/ApiProvider.java b/core/backend/src/main/java/io/dataease/provider/query/api/ApiProvider.java index bbc677f418..3705334905 100644 --- a/core/backend/src/main/java/io/dataease/provider/query/api/ApiProvider.java +++ b/core/backend/src/main/java/io/dataease/provider/query/api/ApiProvider.java @@ -120,6 +120,16 @@ public class ApiProvider extends QueryProvider { return null; } + @Override + public String getSQLRangeBar(String table, List baseXAxis, List xAxis, List yAxis, List fieldCustomFilter, List rowPermissionsTree, List extFilterRequestList, List extStack, Datasource ds, ChartViewWithBLOBs view) { + return null; + } + + @Override + public String getSQLAsTmpRangeBar(String table, List baseXAxis, List xAxis, List yAxis, List fieldCustomFilter, List rowPermissionsTree, List extFilterRequestList, List extStack, ChartViewWithBLOBs view) { + return getSQLRangeBar("(" + table + ")", baseXAxis, xAxis, yAxis, fieldCustomFilter, rowPermissionsTree, extFilterRequestList, extStack, null, view); + } + @Override public String searchTable(String s) { return null; 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 050598bbec..d92d0649f8 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 @@ -761,6 +761,108 @@ public class CKQueryProvider extends QueryProvider { return getSQLScatter("(" + sqlFix(table) + ")", xAxis, yAxis, fieldCustomFilter, rowPermissionsTree, extFilterRequestList, extBubble, extGroup, null, view); } + @Override + public String getSQLRangeBar(String table, List baseXAxis, List xAxis, List yAxis, List fieldCustomFilter, List rowPermissionsTree, List extFilterRequestList, List extStack, 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)) + .build(); + List xFields = new ArrayList<>(); + List xOrders = new ArrayList<>(); + + List yFields = new ArrayList<>(); // 要把两个时间字段放进y里面 + List yWheres = 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(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_X_PREFIX, i); + + if (i == baseXAxis.size()) {// 起止时间 + String fieldName = String.format(CKConstants.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(CKConstants.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() + .orderField(originField) + .orderAlias(fieldAlias) + .orderDirection(x.getSort()) + .build()); + } + } + } + List yOrders = new ArrayList<>(); + + // 处理视图中字段过滤 + 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); + fields.addAll(yFields); + 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); + orders.addAll(yOrders); + List aggWheres = new ArrayList<>(); + aggWheres.addAll(yWheres.stream().filter(ObjectUtils::isNotEmpty).collect(Collectors.toList())); + + STGroup stg = new STGroupFile(SQLConstants.SQL_TEMPLATE); + ST st_sql = stg.getInstanceOf("querySql"); + if (CollectionUtils.isNotEmpty(xFields)) st_sql.add("groups", xFields); + if (CollectionUtils.isNotEmpty(yFields)) st_sql.add("aggregators", yFields); + 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("querySql"); + SQLObj tableSQL = SQLObj.builder() + .tableName(String.format(CKConstants.BRACKETS, sql)) + .tableAlias(String.format(TABLE_ALIAS_PREFIX, 1)) + .build(); + if (CollectionUtils.isNotEmpty(aggWheres)) st.add("filters", aggWheres); + if (CollectionUtils.isNotEmpty(orders)) st.add("orders", orders); + if (ObjectUtils.isNotEmpty(tableSQL)) st.add("table", tableSQL); + return sqlLimit(st.render(), view); + } + + @Override + public String getSQLAsTmpRangeBar(String table, List baseXAxis, List xAxis, List yAxis, List fieldCustomFilter, List rowPermissionsTree, List extFilterRequestList, List extStack, ChartViewWithBLOBs view) { + return getSQLRangeBar("(" + table + ")", baseXAxis, xAxis, yAxis, fieldCustomFilter, rowPermissionsTree, extFilterRequestList, extStack, null, view); + } + @Override public String searchTable(String table) { return "SELECT table_name FROM information_schema.TABLES WHERE table_name ='" + table + "'"; 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 998ddab7fb..2da26f93ca 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 @@ -747,6 +747,110 @@ public class Db2QueryProvider extends QueryProvider { return getSQLScatter("(" + sqlFix(table) + ")", xAxis, yAxis, fieldCustomFilter, rowPermissionsTree, extFilterRequestList, extBubble, extGroup, null, view); } + @Override + public String getSQLRangeBar(String table, List baseXAxis, List xAxis, List yAxis, List fieldCustomFilter, List rowPermissionsTree, List extFilterRequestList, List extStack, 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)) + .build(); + setSchema(tableObj, ds); + List xFields = new ArrayList<>(); + List xOrders = new ArrayList<>(); + + List yFields = new ArrayList<>(); // 要把两个时间字段放进y里面 + List yWheres = 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(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_X_PREFIX, i); + + if (i == baseXAxis.size()) {// 起止时间 + String fieldName = String.format(Db2Constants.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(Db2Constants.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() + .orderField(originField) + .orderAlias(fieldAlias) + .orderDirection(x.getSort()) + .build()); + } + } + } + + List yOrders = new ArrayList<>(); + + // 处理视图中字段过滤 + 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); + fields.addAll(yFields); + 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); + orders.addAll(yOrders); + List aggWheres = new ArrayList<>(); + aggWheres.addAll(yWheres.stream().filter(ObjectUtils::isNotEmpty).collect(Collectors.toList())); + + STGroup stg = new STGroupFile(SQLConstants.SQL_TEMPLATE); + ST st_sql = stg.getInstanceOf("querySql"); + if (CollectionUtils.isNotEmpty(xFields)) st_sql.add("groups", xFields); + if (CollectionUtils.isNotEmpty(yFields)) st_sql.add("aggregators", yFields); + 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("querySql"); + SQLObj tableSQL = SQLObj.builder() + .tableName(String.format(Db2Constants.BRACKETS, sql)) + .tableAlias(String.format(TABLE_ALIAS_PREFIX, 1)) + .build(); + if (CollectionUtils.isNotEmpty(aggWheres)) st.add("filters", aggWheres); + if (CollectionUtils.isNotEmpty(orders)) st.add("orders", orders); + if (ObjectUtils.isNotEmpty(tableSQL)) st.add("table", tableSQL); + return sqlLimit(st.render(), view); + } + + @Override + public String getSQLAsTmpRangeBar(String table, List baseXAxis, List xAxis, List yAxis, List fieldCustomFilter, List rowPermissionsTree, List extFilterRequestList, List extStack, ChartViewWithBLOBs view) { + return getSQLRangeBar("(" + table + ")", baseXAxis, xAxis, yAxis, fieldCustomFilter, rowPermissionsTree, extFilterRequestList, extStack, null, view); + } + @Override public String searchTable(String table) { return "SELECT table_name FROM information_schema.TABLES WHERE table_name ='" + table + "'"; 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 ad074db3cc..ebfaa64a9d 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 @@ -194,7 +194,7 @@ public class EsQueryProvider extends QueryProvider { if (customWheres != null) wheres.add(customWheres); if (whereTrees != null) wheres.add(whereTrees); if (StringUtils.isNotBlank(keyword)) { - String keyWhere = "("+transKeywordFilterList(tableObj, xFields, keyword)+")"; + String keyWhere = "(" + transKeywordFilterList(tableObj, xFields, keyword) + ")"; wheres.add(keyWhere); } if (CollectionUtils.isNotEmpty(wheres)) st_sql.add("filters", wheres); @@ -762,6 +762,113 @@ public class EsQueryProvider extends QueryProvider { return getSQLScatter("(" + sqlFix(table) + ")", xAxis, yAxis, fieldCustomFilter, rowPermissionsTree, extFilterRequestList, extBubble, extGroup, null, view); } + @Override + public String getSQLRangeBar(String table, List baseXAxis, List xAxis, List yAxis, List fieldCustomFilter, List rowPermissionsTree, List extFilterRequestList, List extStack, Datasource ds, ChartViewWithBLOBs view) { + SQLObj tableObj = SQLObj.builder() + .tableName((table.startsWith("(") && table.endsWith(")")) ? table : String.format(EsSqlLConstants.KEYWORD_TABLE, table)) + .tableAlias(String.format(TABLE_ALIAS_PREFIX, 0)) + .build(); + List xFields = new ArrayList<>(); + List xOrders = new ArrayList<>(); + + List yFields = new ArrayList<>(); // 要把两个时间字段放进y里面 + List yWheres = 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() == 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 || x.getDeType() == 3) { + originField = String.format(EsSqlLConstants.CAST, String.format(EsSqlLConstants.KEYWORD_FIX, tableObj.getTableAlias(), x.getOriginName()), "double"); + } else { + originField = String.format(EsSqlLConstants.KEYWORD_FIX, tableObj.getTableAlias(), x.getOriginName()); + } + } + String fieldAlias = String.format(SQLConstants.FIELD_ALIAS_X_PREFIX, i); + + if (i == baseXAxis.size()) {// 起止时间 + String fieldName = String.format(EsSqlLConstants.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(EsSqlLConstants.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() + .orderField(originField) + .orderAlias(fieldAlias) + .orderDirection(x.getSort()) + .build()); + } + } + } + + List yOrders = new ArrayList<>(); + + // 处理视图中字段过滤 + 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); + fields.addAll(yFields); + 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); + orders.addAll(yOrders); + List aggWheres = new ArrayList<>(); + aggWheres.addAll(yWheres.stream().filter(ObjectUtils::isNotEmpty).collect(Collectors.toList())); + + STGroup stg = new STGroupFile(SQLConstants.SQL_TEMPLATE); + ST st_sql = stg.getInstanceOf("querySql"); + if (CollectionUtils.isNotEmpty(xFields)) st_sql.add("groups", xFields); + if (CollectionUtils.isNotEmpty(yFields)) st_sql.add("aggregators", yFields); + 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("querySql"); + SQLObj tableSQL = SQLObj.builder() + .tableName(String.format(EsSqlLConstants.BRACKETS, sql)) + .tableAlias(String.format(TABLE_ALIAS_PREFIX, 1)) + .build(); + if (CollectionUtils.isNotEmpty(aggWheres)) st.add("filters", aggWheres); + if (CollectionUtils.isNotEmpty(orders)) st.add("orders", orders); + if (ObjectUtils.isNotEmpty(tableSQL)) st.add("table", tableSQL); + return sqlLimit(st.render(), view); + } + + @Override + public String getSQLAsTmpRangeBar(String table, List baseXAxis, List xAxis, List yAxis, List fieldCustomFilter, List rowPermissionsTree, List extFilterRequestList, List extStack, ChartViewWithBLOBs view) { + return getSQLRangeBar("(" + table + ")", baseXAxis, xAxis, yAxis, fieldCustomFilter, rowPermissionsTree, extFilterRequestList, extStack, null, view); + } + @Override public String searchTable(String table) { return ""; 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 0731a2b417..169c7aba7b 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 @@ -711,6 +711,108 @@ public class HiveQueryProvider extends QueryProvider { return getSQLScatter("(" + sqlFix(table) + ")", xAxis, yAxis, fieldCustomFilter, rowPermissionsTree, extFilterRequestList, extBubble, extGroup, null, view); } + @Override + public String getSQLRangeBar(String table, List baseXAxis, List xAxis, List yAxis, List fieldCustomFilter, List rowPermissionsTree, List extFilterRequestList, List extStack, 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)) + .build(); + List xFields = new ArrayList<>(); + List xOrders = new ArrayList<>(); + + List yFields = new ArrayList<>(); // 要把两个时间字段放进y里面 + List yWheres = 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(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_X_PREFIX, i); + + if (i == baseXAxis.size()) {// 起止时间 + String fieldName = String.format(HiveConstants.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(HiveConstants.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() + .orderField(originField) + .orderAlias(fieldAlias) + .orderDirection(x.getSort()) + .build()); + } + } + } + List yOrders = new ArrayList<>(); + + // 处理视图中字段过滤 + 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); + fields.addAll(yFields); + 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); + orders.addAll(yOrders); + List aggWheres = new ArrayList<>(); + aggWheres.addAll(yWheres.stream().filter(ObjectUtils::isNotEmpty).collect(Collectors.toList())); + + STGroup stg = new STGroupFile(SQLConstants.SQL_TEMPLATE); + ST st_sql = stg.getInstanceOf("querySql"); + if (CollectionUtils.isNotEmpty(xFields)) st_sql.add("groups", xFields); + if (CollectionUtils.isNotEmpty(yFields)) st_sql.add("aggregators", yFields); + 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("querySql"); + SQLObj tableSQL = SQLObj.builder() + .tableName(String.format(HiveConstants.BRACKETS, sql)) + .tableAlias(String.format(TABLE_ALIAS_PREFIX, 1)) + .build(); + if (CollectionUtils.isNotEmpty(aggWheres)) st.add("filters", aggWheres); + if (CollectionUtils.isNotEmpty(orders)) st.add("orders", orders); + if (ObjectUtils.isNotEmpty(tableSQL)) st.add("table", tableSQL); + return sqlLimit(st.render(), view); + } + + @Override + public String getSQLAsTmpRangeBar(String table, List baseXAxis, List xAxis, List yAxis, List fieldCustomFilter, List rowPermissionsTree, List extFilterRequestList, List extStack, ChartViewWithBLOBs view) { + return getSQLRangeBar("(" + table + ")", baseXAxis, xAxis, yAxis, fieldCustomFilter, rowPermissionsTree, extFilterRequestList, extStack, null, view); + } + @Override public String searchTable(String table) { return "SELECT table_name FROM information_schema.TABLES WHERE table_name ='" + table + "'"; 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 18eb08549c..361702376c 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 @@ -715,6 +715,108 @@ public class ImpalaQueryProvider extends QueryProvider { return getSQLScatter("(" + sqlFix(table) + ")", xAxis, yAxis, fieldCustomFilter, rowPermissionsTree, extFilterRequestList, extBubble, extGroup, null, view); } + @Override + public String getSQLRangeBar(String table, List baseXAxis, List xAxis, List yAxis, List fieldCustomFilter, List rowPermissionsTree, List extFilterRequestList, List extStack, 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)) + .build(); + List xFields = new ArrayList<>(); + List xOrders = new ArrayList<>(); + + List yFields = new ArrayList<>(); // 要把两个时间字段放进y里面 + List yWheres = 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(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_X_PREFIX, i); + + if (i == baseXAxis.size()) {// 起止时间 + String fieldName = String.format(ImpalaConstants.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(ImpalaConstants.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() + .orderField(originField) + .orderAlias(fieldAlias) + .orderDirection(x.getSort()) + .build()); + } + } + } + List yOrders = new ArrayList<>(); + + // 处理视图中字段过滤 + 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); + fields.addAll(yFields); + 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); + orders.addAll(yOrders); + List aggWheres = new ArrayList<>(); + aggWheres.addAll(yWheres.stream().filter(ObjectUtils::isNotEmpty).collect(Collectors.toList())); + + STGroup stg = new STGroupFile(SQLConstants.SQL_TEMPLATE); + ST st_sql = stg.getInstanceOf("querySql"); + if (CollectionUtils.isNotEmpty(xFields)) st_sql.add("groups", xFields); + if (CollectionUtils.isNotEmpty(yFields)) st_sql.add("aggregators", yFields); + 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("querySql"); + SQLObj tableSQL = SQLObj.builder() + .tableName(String.format(ImpalaConstants.BRACKETS, sql)) + .tableAlias(String.format(TABLE_ALIAS_PREFIX, 1)) + .build(); + if (CollectionUtils.isNotEmpty(aggWheres)) st.add("filters", aggWheres); + if (CollectionUtils.isNotEmpty(orders)) st.add("orders", orders); + if (ObjectUtils.isNotEmpty(tableSQL)) st.add("table", tableSQL); + return sqlLimit(st.render(), view); + } + + @Override + public String getSQLAsTmpRangeBar(String table, List baseXAxis, List xAxis, List yAxis, List fieldCustomFilter, List rowPermissionsTree, List extFilterRequestList, List extStack, ChartViewWithBLOBs view) { + return getSQLRangeBar("(" + table + ")", baseXAxis, xAxis, yAxis, fieldCustomFilter, rowPermissionsTree, extFilterRequestList, extStack, null, view); + } + @Override public String searchTable(String table) { return "SELECT table_name FROM information_schema.TABLES WHERE table_name ='" + table + "'"; 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 78687c2e34..c3c72a688b 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 @@ -687,6 +687,121 @@ public class MongoQueryProvider extends QueryProvider { return getSQLScatter("(" + sqlFix(table) + ")", xAxis, yAxis, fieldCustomFilter, rowPermissionsTree, extFilterRequestList, extBubble, extGroup, null, view); } + @Override + public String getSQLRangeBar(String table, List baseXAxis, List xAxis, List yAxis, List fieldCustomFilter, List rowPermissionsTree, List extFilterRequestList, List extStack, 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)) + .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() == 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(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()); + } + } + } + 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 = transCustomFilterList(tableObj, fieldCustomFilter); + // 处理仪表板字段过滤 + String extWheres = transExtFilterList(tableObj, extFilterRequestList); + // row permissions tree + String whereTrees = transFilterTrees(tableObj, rowPermissionsTree); + // 构建sql所有参数 + List fields = new ArrayList<>(); + fields.addAll(xFields); + fields.addAll(yFields); + 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); + orders.addAll(yOrders); + List aggWheres = new ArrayList<>(); + aggWheres.addAll(yWheres.stream().filter(ObjectUtils::isNotEmpty).collect(Collectors.toList())); + + STGroup stg = new STGroupFile(SQLConstants.SQL_TEMPLATE); + ST st_sql = stg.getInstanceOf("querySql"); + if (CollectionUtils.isNotEmpty(xFields)) { + st_sql.add("groups", xFields); + st_sql.add("notUseAs", true); + } + if (CollectionUtils.isNotEmpty(yFields)) { + st_sql.add("aggregators", yFields); + } + 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("querySql"); + SQLObj tableSQL = SQLObj.builder() + .tableName(String.format(MongoConstants.BRACKETS, sql)) + .tableAlias(String.format(TABLE_ALIAS_PREFIX, 1)) + .build(); + if (CollectionUtils.isNotEmpty(aggWheres)) st.add("filters", aggWheres); + if (CollectionUtils.isNotEmpty(orders)) st.add("orders", orders); + if (ObjectUtils.isNotEmpty(tableSQL)) st.add("table", tableSQL); + return sqlLimit(st.render(), view); + } + + @Override + public String getSQLAsTmpRangeBar(String table, List baseXAxis, List xAxis, List yAxis, List fieldCustomFilter, List rowPermissionsTree, List extFilterRequestList, List extStack, ChartViewWithBLOBs view) { + return getSQLRangeBar("(" + table + ")", baseXAxis, xAxis, yAxis, fieldCustomFilter, rowPermissionsTree, extFilterRequestList, extStack, null, view); + } + @Override public String searchTable(String table) { return "SELECT table_name FROM information_schema.TABLES WHERE table_name ='" + table + "'"; 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 30cd6a7ed0..f04029b7b4 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 @@ -409,6 +409,109 @@ public class MysqlQueryProvider extends QueryProvider { return sqlLimit(st.render(), view); } + @Override + public String getSQLRangeBar(String table, List baseXAxis, List xAxis, List yAxis, List fieldCustomFilter, List rowPermissionsTree, List extFilterRequestList, List extStack, 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)) + .build(); + List xFields = new ArrayList<>(); + List xOrders = new ArrayList<>(); + + List yFields = new ArrayList<>(); // 要把两个时间字段放进y里面 + List yWheres = 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) { +// 计算字段和视图字段,规则为 函数([原始字段id]),这边把[原始字段id] 换成 表名.原始字段id +// 解析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_X_PREFIX, i); + + if (i == baseXAxis.size()) {// 起止时间 + String fieldName = String.format(MysqlConstants.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(MysqlConstants.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() + .orderField(originField) + .orderAlias(fieldAlias) + .orderDirection(x.getSort()) + .build()); + } + } + } + + List yOrders = new ArrayList<>(); + + // 处理视图中字段过滤 + 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); + fields.addAll(yFields); + List wheres = new ArrayList<>(); + if (customWheres != null) wheres.add(customWheres); + if (extWheres != null) wheres.add(extWheres); + if (whereTrees != null) wheres.add(whereTrees); + + // 外层再次套sql + List orders = new ArrayList<>(); + orders.addAll(xOrders); + orders.addAll(yOrders); + List aggWheres = new ArrayList<>(); + aggWheres.addAll(yWheres.stream().filter(ObjectUtils::isNotEmpty).collect(Collectors.toList())); + + STGroup stg = new STGroupFile(SQLConstants.SQL_TEMPLATE); + ST st_sql = stg.getInstanceOf("querySql"); + if (CollectionUtils.isNotEmpty(xFields)) st_sql.add("groups", xFields); + if (CollectionUtils.isNotEmpty(yFields)) st_sql.add("aggregators", yFields); + 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("querySql"); + SQLObj tableSQL = SQLObj.builder() + .tableName(String.format(MysqlConstants.BRACKETS, sql)) + .tableAlias(String.format(TABLE_ALIAS_PREFIX, 1)) + .build(); + if (CollectionUtils.isNotEmpty(aggWheres)) st.add("filters", aggWheres); + if (CollectionUtils.isNotEmpty(orders)) st.add("orders", orders); + if (ObjectUtils.isNotEmpty(tableSQL)) st.add("table", tableSQL); + return sqlLimit(st.render(), view); + } + + @Override + public String getSQLAsTmpRangeBar(String table, List baseXAxis, List xAxis, List yAxis, List fieldCustomFilter, List rowPermissionsTree, List extFilterRequestList, List extStack, ChartViewWithBLOBs view) { + return getSQLRangeBar("(" + table + ")", baseXAxis, xAxis, yAxis, fieldCustomFilter, rowPermissionsTree, extFilterRequestList, extStack, null, 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, false), view); 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 3aa245b90d..74fdfff205 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 @@ -810,6 +810,109 @@ public class OracleQueryProvider extends QueryProvider { return getSQLScatter("(" + sqlFix(table) + ")", xAxis, yAxis, fieldCustomFilter, rowPermissionsTree, extFilterRequestList, extBubble, extGroup, null, view); } + @Override + public String getSQLRangeBar(String table, List baseXAxis, List xAxis, List yAxis, List fieldCustomFilter, List rowPermissionsTree, List extFilterRequestList, List extStack, 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))) + .build(); + setSchema(tableObj, ds); + List xFields = new ArrayList<>(); + List xOrders = new ArrayList<>(); + + List yFields = new ArrayList<>(); // 要把两个时间字段放进y里面 + List yWheres = 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(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_X_PREFIX, i)); + + if (i == baseXAxis.size()) {// 起止时间 + String fieldName = String.format(OracleConstants.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(OracleConstants.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() + .orderField(originField) + .orderAlias(fieldAlias) + .orderDirection(x.getSort()) + .build()); + } + } + } + List yOrders = new ArrayList<>(); + + // 处理视图中字段过滤 + 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); + fields.addAll(yFields); + 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); + orders.addAll(yOrders); + List aggWheres = new ArrayList<>(); + aggWheres.addAll(yWheres.stream().filter(ObjectUtils::isNotEmpty).collect(Collectors.toList())); + + STGroup stg = new STGroupFile(SQLConstants.SQL_TEMPLATE); + ST st_sql = stg.getInstanceOf("querySql"); + if (CollectionUtils.isNotEmpty(xFields)) st_sql.add("groups", xFields); + if (CollectionUtils.isNotEmpty(yFields)) st_sql.add("aggregators", yFields); + 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("querySql"); + SQLObj tableSQL = SQLObj.builder() + .tableName(String.format(OracleConstants.BRACKETS, sql)) + .tableAlias(String.format(TABLE_ALIAS_PREFIX, 1)) + .build(); + if (CollectionUtils.isNotEmpty(aggWheres)) st.add("filters", aggWheres); + if (CollectionUtils.isNotEmpty(orders)) st.add("orders", orders); + if (ObjectUtils.isNotEmpty(tableSQL)) st.add("table", tableSQL); + return sqlLimit(st.render(), view); + } + + @Override + public String getSQLAsTmpRangeBar(String table, List baseXAxis, List xAxis, List yAxis, List fieldCustomFilter, List rowPermissionsTree, List extFilterRequestList, List extStack, ChartViewWithBLOBs view) { + return getSQLRangeBar("(" + table + ")", baseXAxis, xAxis, yAxis, fieldCustomFilter, rowPermissionsTree, extFilterRequestList, extStack, null, view); + } + @Override public String searchTable(String table) { return "SELECT table_name FROM information_schema.TABLES WHERE table_name ='" + table + "'"; 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 cee8b5423a..235e172260 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 @@ -740,6 +740,109 @@ public class PgQueryProvider extends QueryProvider { return getSQLScatter("(" + sqlFix(table) + ")", xAxis, yAxis, fieldCustomFilter, rowPermissionsTree, extFilterRequestList, extBubble, extGroup, null, view); } + @Override + public String getSQLRangeBar(String table, List baseXAxis, List xAxis, List yAxis, List fieldCustomFilter, List rowPermissionsTree, List extFilterRequestList, List extStack, 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)) + .build(); + setSchema(tableObj, ds); + List xFields = new ArrayList<>(); + List xOrders = new ArrayList<>(); + + List yFields = new ArrayList<>(); // 要把两个时间字段放进y里面 + List yWheres = 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(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_X_PREFIX, i); + + if (i == baseXAxis.size()) {// 起止时间 + String fieldName = String.format(PgConstants.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(PgConstants.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() + .orderField(originField) + .orderAlias(fieldAlias) + .orderDirection(x.getSort()) + .build()); + } + } + } + List yOrders = new ArrayList<>(); + + // 处理视图中字段过滤 + 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); + fields.addAll(yFields); + 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); + orders.addAll(yOrders); + List aggWheres = new ArrayList<>(); + aggWheres.addAll(yWheres.stream().filter(ObjectUtils::isNotEmpty).collect(Collectors.toList())); + + STGroup stg = new STGroupFile(SQLConstants.SQL_TEMPLATE); + ST st_sql = stg.getInstanceOf("querySql"); + if (CollectionUtils.isNotEmpty(xFields)) st_sql.add("groups", xFields); + if (CollectionUtils.isNotEmpty(yFields)) st_sql.add("aggregators", yFields); + 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("querySql"); + SQLObj tableSQL = SQLObj.builder() + .tableName(String.format(PgConstants.BRACKETS, sql)) + .tableAlias(String.format(TABLE_ALIAS_PREFIX, 1)) + .build(); + if (CollectionUtils.isNotEmpty(aggWheres)) st.add("filters", aggWheres); + if (CollectionUtils.isNotEmpty(orders)) st.add("orders", orders); + if (ObjectUtils.isNotEmpty(tableSQL)) st.add("table", tableSQL); + return sqlLimit(st.render(), view); + } + + @Override + public String getSQLAsTmpRangeBar(String table, List baseXAxis, List xAxis, List yAxis, List fieldCustomFilter, List rowPermissionsTree, List extFilterRequestList, List extStack, ChartViewWithBLOBs view) { + return getSQLRangeBar("(" + table + ")", baseXAxis, xAxis, yAxis, fieldCustomFilter, rowPermissionsTree, extFilterRequestList, extStack, null, view); + } + @Override public String searchTable(String table) { return "SELECT table_name FROM information_schema.TABLES WHERE table_name ='" + table + "'"; 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 e5cf7d1376..9f4df9d8e1 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 @@ -746,6 +746,109 @@ public class RedshiftQueryProvider extends QueryProvider { return getSQLScatter("(" + sqlFix(table) + ")", xAxis, yAxis, fieldCustomFilter, rowPermissionsTree, extFilterRequestList, extBubble, extGroup, null, view); } + @Override + public String getSQLRangeBar(String table, List baseXAxis, List xAxis, List yAxis, List fieldCustomFilter, List rowPermissionsTree, List extFilterRequestList, List extStack, 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)) + .build(); + setSchema(tableObj, ds); + List xFields = new ArrayList<>(); + List xOrders = new ArrayList<>(); + + List yFields = new ArrayList<>(); // 要把两个时间字段放进y里面 + List yWheres = 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(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_X_PREFIX, i); + + if (i == baseXAxis.size()) {// 起止时间 + String fieldName = String.format(PgConstants.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(PgConstants.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() + .orderField(originField) + .orderAlias(fieldAlias) + .orderDirection(x.getSort()) + .build()); + } + } + } + List yOrders = new ArrayList<>(); + + // 处理视图中字段过滤 + 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); + fields.addAll(yFields); + 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); + orders.addAll(yOrders); + List aggWheres = new ArrayList<>(); + aggWheres.addAll(yWheres.stream().filter(ObjectUtils::isNotEmpty).collect(Collectors.toList())); + + STGroup stg = new STGroupFile(SQLConstants.SQL_TEMPLATE); + ST st_sql = stg.getInstanceOf("querySql"); + if (CollectionUtils.isNotEmpty(xFields)) st_sql.add("groups", xFields); + if (CollectionUtils.isNotEmpty(yFields)) st_sql.add("aggregators", yFields); + 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("querySql"); + SQLObj tableSQL = SQLObj.builder() + .tableName(String.format(PgConstants.BRACKETS, sql)) + .tableAlias(String.format(TABLE_ALIAS_PREFIX, 1)) + .build(); + if (CollectionUtils.isNotEmpty(aggWheres)) st.add("filters", aggWheres); + if (CollectionUtils.isNotEmpty(orders)) st.add("orders", orders); + if (ObjectUtils.isNotEmpty(tableSQL)) st.add("table", tableSQL); + return sqlLimit(st.render(), view); + } + + @Override + public String getSQLAsTmpRangeBar(String table, List baseXAxis, List xAxis, List yAxis, List fieldCustomFilter, List rowPermissionsTree, List extFilterRequestList, List extStack, ChartViewWithBLOBs view) { + return getSQLRangeBar("(" + table + ")", baseXAxis, xAxis, yAxis, fieldCustomFilter, rowPermissionsTree, extFilterRequestList, extStack, null, view); + } + @Override public String searchTable(String table) { return "SELECT table_name FROM information_schema.TABLES WHERE table_name ='" + table + "'"; 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 c50de9060f..11a5e82245 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 @@ -824,6 +824,113 @@ public class SqlserverQueryProvider extends QueryProvider { return getSQLScatter("(" + sqlFix(table) + ")", xAxis, yAxis, fieldCustomFilter, rowPermissionsTree, extFilterRequestList, extBubble, extGroup, null, view); } + @Override + public String getSQLRangeBar(String table, List baseXAxis, List xAxis, List yAxis, List fieldCustomFilter, List rowPermissionsTree, List extFilterRequestList, List extStack, Datasource ds, ChartViewWithBLOBs view) { + SQLObj tableObj = SQLObj.builder() + .tableName((table.startsWith("(") && table.endsWith(")")) ? table : String.format(SqlServerSQLConstants.KEYWORD_TABLE, table)) + .tableAlias(String.format(TABLE_ALIAS_PREFIX, 0)) + .build(); + setSchema(tableObj, ds); + List xFields = new ArrayList<>(); + List xOrders = new ArrayList<>(); + + List yFields = new ArrayList<>(); // 要把两个时间字段放进y里面 + List yWheres = 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(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_X_PREFIX, i); + + if (i == baseXAxis.size()) {// 起止时间 + String fieldName = String.format(SqlServerSQLConstants.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(SqlServerSQLConstants.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() + .orderField(originField) + .orderAlias(fieldAlias) + .orderDirection(x.getSort()) + .build()); + } + } + } + List yOrders = new ArrayList<>(); + + // 处理视图中字段过滤 + 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); + fields.addAll(yFields); + 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); + orders.addAll(yOrders); + List aggWheres = new ArrayList<>(); + aggWheres.addAll(yWheres.stream().filter(ObjectUtils::isNotEmpty).collect(Collectors.toList())); + + STGroup stg = new STGroupFile(SQLConstants.SQL_TEMPLATE); + ST st_sql = stg.getInstanceOf("querySql"); + if (CollectionUtils.isNotEmpty(xFields)) st_sql.add("groups", xFields); + if (CollectionUtils.isNotEmpty(yFields)) st_sql.add("aggregators", yFields); + 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("querySql"); + SQLObj tableSQL = SQLObj.builder() + .tableName(String.format(SqlServerSQLConstants.BRACKETS, sql)) + .tableAlias(String.format(TABLE_ALIAS_PREFIX, 1)) + .build(); + if (CollectionUtils.isNotEmpty(aggWheres)) st.add("filters", aggWheres); + if (CollectionUtils.isNotEmpty(orders)) st.add("orders", orders); + if (ObjectUtils.isNotEmpty(tableSQL)) st.add("table", tableSQL); + if (StringUtils.equalsIgnoreCase(view.getResultMode(), "custom")) { + SQLObj limitFiled = SQLObj.builder().limitFiled("top " + view.getResultCount() + " ").build(); + st.add("limitFiled", limitFiled); + } + return st.render(); + } + + @Override + public String getSQLAsTmpRangeBar(String table, List baseXAxis, List xAxis, List yAxis, List fieldCustomFilter, List rowPermissionsTree, List extFilterRequestList, List extStack, ChartViewWithBLOBs view) { + return getSQLRangeBar("(" + table + ")", baseXAxis, xAxis, yAxis, fieldCustomFilter, rowPermissionsTree, extFilterRequestList, extStack, null, view); + } + @Override public String searchTable(String table) { return "SELECT table_name FROM information_schema.TABLES WHERE table_name ='" + table + "'"; 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 8ceeb2e40b..3f70ec156f 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 @@ -342,7 +342,7 @@ public class ChartViewService { } List xAxis = gson.fromJson(view.getXAxis(), new TypeToken>() { }.getType()); - if (StringUtils.equalsIgnoreCase(view.getType(), "table-pivot")) { + if (StringUtils.equalsIgnoreCase(view.getType(), "table-pivot") || StringUtils.equalsIgnoreCase(view.getType(), "bar-time-range")) { List xAxisExt = gson.fromJson(view.getXAxisExt(), new TypeToken>() { }.getType()); xAxis.addAll(xAxisExt); @@ -498,6 +498,11 @@ public class ChartViewService { datasourceRequest.setQuery(qp.getSQLScatter(dataTableInfoDTO.getTable(), xAxis, yAxis, fieldCustomFilter, rowPermissionsTree, extFilterList, extBubble, extStack, ds, view)); } else if (StringUtils.equalsIgnoreCase("table-info", view.getType())) { datasourceRequest.setQuery(qp.getSQLTableInfo(dataTableInfoDTO.getTable(), xAxis, fieldCustomFilter, rowPermissionsTree, extFilterList, ds, view)); + } else if (StringUtils.equalsIgnoreCase("bar-time-range", view.getType())) { + List xAxisBase = gson.fromJson(view.getXAxis(), new TypeToken>() { + }.getType()); + datasourceRequest.setQuery(qp.getSQLRangeBar(dataTableInfoDTO.getTable(), xAxisBase, xAxis, yAxis, fieldCustomFilter, rowPermissionsTree, extFilterList, extStack, ds, view)); + } else { datasourceRequest.setQuery(qp.getSQL(dataTableInfoDTO.getTable(), xAxis, yAxis, fieldCustomFilter, rowPermissionsTree, extFilterList, ds, view)); } @@ -512,6 +517,11 @@ 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())) { + List xAxisBase = gson.fromJson(view.getXAxis(), new TypeToken>() { + }.getType()); + datasourceRequest.setQuery(qp.getSQLAsTmpRangeBar(dataTableInfoDTO.getTable(), xAxisBase, xAxis, yAxis, fieldCustomFilter, rowPermissionsTree, extFilterList, extStack, view)); + } else { datasourceRequest.setQuery(qp.getSQLAsTmp(sql, xAxis, yAxis, fieldCustomFilter, rowPermissionsTree, extFilterList, view)); } @@ -527,7 +537,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 { + }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 { datasourceRequest.setQuery(qp.getSQLAsTmp(sql, xAxis, yAxis, fieldCustomFilter, rowPermissionsTree, extFilterList, view)); } } else if (StringUtils.equalsIgnoreCase(table.getType(), DatasetType.UNION.name())) { @@ -543,6 +558,11 @@ 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())) { + List xAxisBase = gson.fromJson(view.getXAxis(), new TypeToken>() { + }.getType()); + datasourceRequest.setQuery(qp.getSQLAsTmpRangeBar(dataTableInfoDTO.getTable(), xAxisBase, xAxis, yAxis, fieldCustomFilter, rowPermissionsTree, extFilterList, extStack, view)); + } else { datasourceRequest.setQuery(qp.getSQLAsTmp(sql, xAxis, yAxis, fieldCustomFilter, rowPermissionsTree, extFilterList, view)); } @@ -568,6 +588,11 @@ public class ChartViewService { datasourceRequest.setQuery(qp.getSQLScatter(tableName, xAxis, yAxis, fieldCustomFilter, rowPermissionsTree, extFilterList, extBubble, extStack, ds, view)); } else if (StringUtils.equalsIgnoreCase("table-info", view.getType())) { datasourceRequest.setQuery(qp.getSQLTableInfo(tableName, xAxis, fieldCustomFilter, rowPermissionsTree, extFilterList, ds, view)); + } else if (StringUtils.equalsIgnoreCase("bar-time-range", view.getType())) { + List xAxisBase = gson.fromJson(view.getXAxis(), new TypeToken>() { + }.getType()); + datasourceRequest.setQuery(qp.getSQLRangeBar(tableName, xAxisBase, xAxis, yAxis, fieldCustomFilter, rowPermissionsTree, extFilterList, extStack, ds, view)); + } else { datasourceRequest.setQuery(qp.getSQL(tableName, xAxis, yAxis, fieldCustomFilter, rowPermissionsTree, extFilterList, ds, view)); } @@ -1099,6 +1124,8 @@ public class ChartViewService { } else if (StringUtils.equalsIgnoreCase("table-info", view.getType())) { 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 if (StringUtils.equalsIgnoreCase("bar-time-range", view.getType())) { + querySql = qp.getSQLRangeBar(dataTableInfoDTO.getTable(), xAxisBase, xAxis, yAxis, fieldCustomFilter, rowPermissionsTree, extFilterList, extStack, ds, view); } else { querySql = qp.getSQL(dataTableInfoDTO.getTable(), xAxis, yAxis, fieldCustomFilter, rowPermissionsTree, extFilterList, ds, view); if (containDetailField(view) && CollectionUtils.isNotEmpty(viewFields)) { @@ -1122,6 +1149,10 @@ public class ChartViewService { } else if (StringUtils.equalsIgnoreCase("table-info", view.getType())) { querySql = qp.getSQLWithPage(false, sql, xAxis, fieldCustomFilter, rowPermissionsTree, extFilterList, ds, view, pageInfo); 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); + } else { querySql = qp.getSQLAsTmp(sql, xAxis, yAxis, fieldCustomFilter, rowPermissionsTree, extFilterList, view); if (containDetailField(view) && CollectionUtils.isNotEmpty(viewFields)) { @@ -1146,6 +1177,9 @@ public class ChartViewService { } else if (StringUtils.equalsIgnoreCase("table-info", view.getType())) { querySql = qp.getSQLWithPage(false, sql, xAxis, fieldCustomFilter, rowPermissionsTree, extFilterList, ds, view, pageInfo); 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); + } else { querySql = qp.getSQLAsTmp(sql, xAxis, yAxis, fieldCustomFilter, rowPermissionsTree, extFilterList, view); if (containDetailField(view) && CollectionUtils.isNotEmpty(viewFields)) { @@ -1170,6 +1204,10 @@ public class ChartViewService { } else if (StringUtils.equalsIgnoreCase("table-info", view.getType())) { querySql = qp.getSQLWithPage(false, sql, xAxis, fieldCustomFilter, rowPermissionsTree, extFilterList, ds, view, pageInfo); 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); + } else { querySql = qp.getSQLAsTmp(sql, xAxis, yAxis, fieldCustomFilter, rowPermissionsTree, extFilterList, view); if (containDetailField(view) && CollectionUtils.isNotEmpty(viewFields)) { @@ -1224,7 +1262,11 @@ public class ChartViewService { datasourceRequest.setQuery(qp.getSQLScatter(tableName, xAxis, yAxis, fieldCustomFilter, rowPermissionsTree, extFilterList, extBubble, extStack, ds, view)); } else if (StringUtils.equalsIgnoreCase("table-info", view.getType())) { datasourceRequest.setQuery(qp.getSQLTableInfo(tableName, xAxis, fieldCustomFilter, rowPermissionsTree, extFilterList, ds, view)); - } else { + } else if (StringUtils.equalsIgnoreCase("bar-time-range", view.getType())) { + + datasourceRequest.setQuery(qp.getSQLRangeBar(tableName, xAxisBase, xAxis, yAxis, fieldCustomFilter, rowPermissionsTree, extFilterList, extStack, ds, view)); + + }else { datasourceRequest.setQuery(qp.getSQL(tableName, xAxis, yAxis, fieldCustomFilter, rowPermissionsTree, extFilterList, ds, view)); if (containDetailField(view) && CollectionUtils.isNotEmpty(viewFields)) { detailFieldList.addAll(xAxis); 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 239b8cdd07..f009175662 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 @@ -1333,7 +1333,7 @@ public class ChartDataBuild { StringBuilder xField = new StringBuilder(); if (isDrill) { - xField.append(row[xAxis.size() - 1]); + xField.append(row[xAxis.size() - 1 - 2]); // 由于起止时间字段是放到最后的yField里去查询的,所以要再减两个 } else { for (int i = 0; i < xAxisBase.size(); i++) { if (i == xAxisBase.size() - 1) { @@ -1360,24 +1360,25 @@ public class ChartDataBuild { List values = new ArrayList<>(); - if (row[xAxisBase.size()] == null || row[xAxisBase.size() + 1] == null) { + // 由于起止时间字段是放到最后的yField里去查询的,所以拿倒数两个 + if (row[xAxis.size() - 1] == null || row[xAxis.size() - 2] == null) { continue; } - values.add(row[xAxisBase.size()]); - values.add(row[xAxisBase.size() + 1]); + values.add(row[xAxis.size() - 2]); + values.add(row[xAxis.size() - 1]); obj.put("values", values); try { - Date date = sdf.parse(row[xAxisBase.size()]); + Date date = sdf.parse(row[xAxis.size() - 2]); if (date != null) { dates.add(date); } } catch (Exception ignore) { } try { - Date date = sdf.parse(row[xAxisBase.size() + 1]); + Date date = sdf.parse(row[xAxis.size() - 1]); if (date != null) { dates.add(date); } diff --git a/core/frontend/src/views/chart/view/ChartEdit.vue b/core/frontend/src/views/chart/view/ChartEdit.vue index 8e219fff94..b22b22772e 100644 --- a/core/frontend/src/views/chart/view/ChartEdit.vue +++ b/core/frontend/src/views/chart/view/ChartEdit.vue @@ -3330,7 +3330,10 @@ export default { 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--) { + 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) } 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 5aef3e8ca2..67275f598a 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 @@ -1,6 +1,5 @@ package io.dataease.plugins.datasource.dm.query; -import cn.hutool.json.JSONArray; import com.fasterxml.jackson.core.type.TypeReference; import com.fasterxml.jackson.databind.ObjectMapper; import com.google.gson.Gson; @@ -129,7 +128,7 @@ public class DmQueryProvider extends QueryProvider { if (whereTrees != null) wheres.add(whereTrees); if (StringUtils.isNotBlank(keyword)) { - String keyWhere = "("+transKeywordFilterList(tableObj, xFields, keyword)+")"; + String keyWhere = "(" + transKeywordFilterList(tableObj, xFields, keyword) + ")"; wheres.add(keyWhere); } if (CollectionUtils.isNotEmpty(wheres)) @@ -463,6 +462,122 @@ public class DmQueryProvider extends QueryProvider { return sqlLimit(st.render(), view); } + @Override + public String getSQLRangeBar(String table, List baseXAxis, List xAxis, List yAxis, List fieldCustomFilter, List rowPermissionsTree, List extFilterRequestList, List extStack, 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))) + .build(); + setSchema(tableObj, ds); + List xFields = new ArrayList<>(); + List xOrders = new ArrayList<>(); + + List yFields = new ArrayList<>(); // 要把两个时间字段放进y里面 + List yWheres = 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(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_X_PREFIX, i)); + + if (i == baseXAxis.size()) {// 起止时间 + String fieldName = String.format(OracleConstants.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(OracleConstants.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() + .orderField(originField) + .orderAlias(fieldAlias) + .orderDirection(x.getSort()) + .build()); + } + } + } + List yOrders = new ArrayList<>(); + + // 处理视图中字段过滤 + 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); + fields.addAll(yFields); + 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); + orders.addAll(yOrders); + List aggWheres = new ArrayList<>(); + aggWheres.addAll(yWheres.stream().filter(ObjectUtils::isNotEmpty).collect(Collectors.toList())); + + STGroup stg = new STGroupFile(SQLConstants.SQL_TEMPLATE); + ST st_sql = stg.getInstanceOf("querySql"); + if (CollectionUtils.isNotEmpty(xFields)) + st_sql.add("groups", xFields); + if (CollectionUtils.isNotEmpty(yFields)) + st_sql.add("aggregators", yFields); + 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("querySql"); + SQLObj tableSQL = SQLObj.builder() + .tableName(String.format(OracleConstants.BRACKETS, sql)) + .tableAlias(String.format(TABLE_ALIAS_PREFIX, 1)) + .build(); + if (CollectionUtils.isNotEmpty(aggWheres)) + st.add("filters", aggWheres); + if (CollectionUtils.isNotEmpty(orders)) + st.add("orders", orders); + if (ObjectUtils.isNotEmpty(tableSQL)) + st.add("table", tableSQL); + return sqlLimit(st.render(), view); + } + + @Override + public String getSQLAsTmpRangeBar(String table, List baseXAxis, List xAxis, List yAxis, List fieldCustomFilter, List rowPermissionsTree, List extFilterRequestList, List extStack, ChartViewWithBLOBs view) { + return getSQLRangeBar("(" + table + ")", baseXAxis, xAxis, yAxis, fieldCustomFilter, rowPermissionsTree, extFilterRequestList, extStack, null, 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 @@ -551,7 +666,8 @@ public class DmQueryProvider extends QueryProvider { st.add("table", tableSQL); return st.render(); } - @Override + + @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); } @@ -713,7 +829,7 @@ public class DmQueryProvider extends QueryProvider { @Override public String getSQLScatter(String table, List xAxis, List yAxis, List fieldCustomFilter, List rowPermissionsTree, List extFilterRequestList, - List extBubble,List extGroup, Datasource ds, ChartViewWithBLOBs view) { + List extBubble, List extGroup, Datasource ds, ChartViewWithBLOBs view) { SQLObj tableObj = SQLObj.builder() .tableName((table.startsWith("(") && table.endsWith(")")) ? table : String.format(OracleConstants.KEYWORD_TABLE, table)) @@ -862,9 +978,9 @@ public class DmQueryProvider extends QueryProvider { @Override public String getSQLAsTmpScatter(String table, List xAxis, List yAxis, List fieldCustomFilter, List rowPermissionsTree, List extFilterRequestList, - List extBubble, List extGroup,ChartViewWithBLOBs view) { + List extBubble, List extGroup, ChartViewWithBLOBs view) { return getSQLScatter("(" + sqlFix(table) + ")", xAxis, yAxis, fieldCustomFilter, rowPermissionsTree, extFilterRequestList, - extBubble, extGroup,null, view); + extBubble, extGroup, null, view); } @Override @@ -1576,7 +1692,7 @@ public class DmQueryProvider extends QueryProvider { public List dateformat() { ObjectMapper objectMapper = new ObjectMapper(); List dateformats = new ArrayList<>(); - try{ + try { dateformats = objectMapper.readValue("[\n" + "{\"dateformat\": \"YYYY-MM-DD\"},\n" + "{\"dateformat\": \"YYYY/MM/DD\"},\n" + @@ -1584,8 +1700,10 @@ public class DmQueryProvider extends QueryProvider { "{\"dateformat\": \"YYYY-MM-DD HH24:MI:SS\"},\n" + "{\"dateformat\": \"YYYY/MM/DD HH24:MI:SS\"},\n" + "{\"dateformat\": \"YYYYMMDD HH24:MI:SS\"}\n" + - "]", new TypeReference>() {} ); - }catch (Exception e){} + "]", new TypeReference>() { + }); + } catch (Exception e) { + } return dateformats; } } 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 e8d475963a..b5017e33ed 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 @@ -199,7 +199,7 @@ public class KingbaseQueryProvider extends QueryProvider { if (whereTrees != null) wheres.add(whereTrees); if (StringUtils.isNotBlank(keyword)) { - String keyWhere = "("+transKeywordFilterList(tableObj, xFields, keyword)+")"; + String keyWhere = "(" + transKeywordFilterList(tableObj, xFields, keyword) + ")"; wheres.add(keyWhere); } if (CollectionUtils.isNotEmpty(wheres)) @@ -449,6 +449,122 @@ public class KingbaseQueryProvider extends QueryProvider { return sqlLimit(st.render(), view); } + @Override + public String getSQLRangeBar(String table, List baseXAxis, List xAxis, List yAxis, List fieldCustomFilter, List rowPermissionsTree, List extFilterRequestList, List extStack, Datasource ds, ChartViewWithBLOBs view) { + SQLObj tableObj = SQLObj.builder() + .tableName((table.startsWith("(") && table.endsWith(")")) ? table + : String.format(KingbaseConstants.KEYWORD_TABLE, table)) + .tableAlias(String.format(TABLE_ALIAS_PREFIX, 0)) + .build(); + setSchema(tableObj, ds); + List xFields = new ArrayList<>(); + List xOrders = new ArrayList<>(); + + List yFields = new ArrayList<>(); // 要把两个时间字段放进y里面 + List yWheres = 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(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_X_PREFIX, i); + + if (i == baseXAxis.size()) {// 起止时间 + String fieldName = String.format(KingbaseConstants.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(KingbaseConstants.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() + .orderField(originField) + .orderAlias(fieldAlias) + .orderDirection(x.getSort()) + .build()); + } + } + } + + List yOrders = new ArrayList<>(); + + // 处理视图中字段过滤 + 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); + fields.addAll(yFields); + 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); + orders.addAll(yOrders); + List aggWheres = new ArrayList<>(); + aggWheres.addAll(yWheres.stream().filter(ObjectUtils::isNotEmpty).collect(Collectors.toList())); + + STGroup stg = new STGroupFile(SQLConstants.SQL_TEMPLATE); + ST st_sql = stg.getInstanceOf("querySql"); + if (CollectionUtils.isNotEmpty(xFields)) + st_sql.add("groups", xFields); + if (CollectionUtils.isNotEmpty(yFields)) + st_sql.add("aggregators", yFields); + 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("querySql"); + SQLObj tableSQL = SQLObj.builder() + .tableName(String.format(KingbaseConstants.BRACKETS, sql)) + .tableAlias(String.format(TABLE_ALIAS_PREFIX, 1)) + .build(); + if (CollectionUtils.isNotEmpty(aggWheres)) + st.add("filters", aggWheres); + if (CollectionUtils.isNotEmpty(orders)) + st.add("orders", orders); + if (ObjectUtils.isNotEmpty(tableSQL)) + st.add("table", tableSQL); + return sqlLimit(st.render(), view); + } + + @Override + public String getSQLAsTmpRangeBar(String table, List baseXAxis, List xAxis, List yAxis, List fieldCustomFilter, List rowPermissionsTree, List extFilterRequestList, List extStack, ChartViewWithBLOBs view) { + return getSQLRangeBar("(" + table + ")", baseXAxis, xAxis, yAxis, fieldCustomFilter, rowPermissionsTree, extFilterRequestList, extStack, null, view); + } + @Override public String getSQLWithPage(boolean isTable, String table, List xAxis, List 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 cd40abfcd2..6311525c5e 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 @@ -1,7 +1,5 @@ package io.dataease.plugins.datasource.kylin.query; -import com.fasterxml.jackson.core.type.TypeReference; -import com.fasterxml.jackson.databind.ObjectMapper; import com.google.gson.Gson; import io.dataease.plugins.common.base.domain.ChartViewWithBLOBs; import io.dataease.plugins.common.base.domain.DatasetTableField; @@ -19,7 +17,6 @@ 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.Dateformat; import io.dataease.plugins.datasource.entity.JdbcConfiguration; import io.dataease.plugins.datasource.query.QueryProvider; import org.apache.commons.collections4.CollectionUtils; @@ -158,7 +155,7 @@ public class KylinQueryProvider extends QueryProvider { if (customWheres != null) wheres.add(customWheres); if (whereTrees != null) wheres.add(whereTrees); if (StringUtils.isNotBlank(keyword)) { - String keyWhere = "("+transKeywordFilterList(tableObj, xFields, keyword)+")"; + String keyWhere = "(" + transKeywordFilterList(tableObj, xFields, keyword) + ")"; wheres.add(keyWhere); } if (CollectionUtils.isNotEmpty(wheres)) st_sql.add("filters", wheres); @@ -362,6 +359,108 @@ public class KylinQueryProvider extends QueryProvider { return sqlLimit(st.render(), view); } + @Override + public String getSQLRangeBar(String table, List baseXAxis, List xAxis, List yAxis, List fieldCustomFilter, List rowPermissionsTree, List extFilterRequestList, List extStack, Datasource ds, ChartViewWithBLOBs view) { + SQLObj tableObj = SQLObj.builder() + .tableName((table.startsWith("(") && table.endsWith(")")) ? table : String.format(KylinConstants.KEYWORD_TABLE, table)) + .tableAlias(String.format(TABLE_ALIAS_PREFIX, 0)) + .build(); + setSchema(tableObj, ds); + List xFields = new ArrayList<>(); + List xOrders = new ArrayList<>(); + + List yFields = new ArrayList<>(); // 要把两个时间字段放进y里面 + List yWheres = 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(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_X_PREFIX, i); + + if (i == baseXAxis.size()) {// 起止时间 + String fieldName = String.format(KylinConstants.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(KylinConstants.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()) && !StringUtils.equalsIgnoreCase(x.getSort(), "none")) { + xOrders.add(SQLObj.builder() + .orderField(originField) + .orderAlias(fieldAlias) + .orderDirection(x.getSort()) + .build()); + } + } + } + List yOrders = new ArrayList<>(); + + // 处理视图中字段过滤 + 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); + fields.addAll(yFields); + 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); + orders.addAll(yOrders); + List aggWheres = new ArrayList<>(); + aggWheres.addAll(yWheres.stream().filter(ObjectUtils::isNotEmpty).collect(Collectors.toList())); + + STGroup stg = new STGroupFile(SQLConstants.SQL_TEMPLATE); + ST st_sql = stg.getInstanceOf("querySql"); + if (CollectionUtils.isNotEmpty(xFields)) st_sql.add("groups", xFields); + if (CollectionUtils.isNotEmpty(yFields)) st_sql.add("aggregators", yFields); + 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("querySql"); + SQLObj tableSQL = SQLObj.builder() + .tableName(String.format(KylinConstants.BRACKETS, sql)) + .tableAlias(String.format(TABLE_ALIAS_PREFIX, 1)) + .build(); + if (CollectionUtils.isNotEmpty(aggWheres)) st.add("filters", aggWheres); + if (CollectionUtils.isNotEmpty(orders)) st.add("orders", orders); + if (ObjectUtils.isNotEmpty(tableSQL)) st.add("table", tableSQL); + return sqlLimit(st.render(), view); + } + + @Override + public String getSQLAsTmpRangeBar(String table, List baseXAxis, List xAxis, List yAxis, List fieldCustomFilter, List rowPermissionsTree, List extFilterRequestList, List extStack, ChartViewWithBLOBs view) { + return getSQLRangeBar("(" + table + ")", baseXAxis, xAxis, yAxis, fieldCustomFilter, rowPermissionsTree, extFilterRequestList, extStack, null, view); + } + @Override public String getSQLTableInfo(String table, List xAxis, List fieldCustomFilter, List rowPermissionsTree, List extFilterRequestList, Datasource ds, ChartViewWithBLOBs view) { SQLObj tableObj = SQLObj.builder() 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 86ef0b5e1f..f194e7fbee 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 @@ -154,7 +154,7 @@ public class MaxcomputeQueryProvider extends QueryProvider { if (customWheres != null) wheres.add(customWheres); if (whereTrees != null) wheres.add(whereTrees); if (StringUtils.isNotBlank(keyword)) { - String keyWhere = "("+transKeywordFilterList(tableObj, xFields, keyword)+")"; + String keyWhere = "(" + transKeywordFilterList(tableObj, xFields, keyword) + ")"; wheres.add(keyWhere); } if (CollectionUtils.isNotEmpty(wheres)) st_sql.add("filters", wheres); @@ -364,6 +364,108 @@ public class MaxcomputeQueryProvider extends QueryProvider { return sqlLimit(st.render(), view); } + @Override + public String getSQLRangeBar(String table, List baseXAxis, List xAxis, List yAxis, List fieldCustomFilter, List rowPermissionsTree, List extFilterRequestList, List extStack, Datasource ds, ChartViewWithBLOBs view) { + SQLObj tableObj = SQLObj.builder() + .tableName((table.startsWith("(") && table.endsWith(")")) ? table : String.format(MaxConstants.KEYWORD_TABLE, table)) + .tableAlias(String.format(TABLE_ALIAS_PREFIX, 0)) + .build(); + + List xFields = new ArrayList<>(); + List xOrders = new ArrayList<>(); + + List yFields = new ArrayList<>(); // 要把两个时间字段放进y里面 + List yWheres = 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(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_X_PREFIX, i); + + if (i == baseXAxis.size()) {// 起止时间 + String fieldName = String.format(MaxConstants.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(MaxConstants.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()) && !StringUtils.equalsIgnoreCase(x.getSort(), "none")) { + xOrders.add(SQLObj.builder() + .orderField(originField) + .orderAlias(fieldAlias) + .orderDirection(x.getSort()) + .build()); + } + } + } + List yOrders = new ArrayList<>(); + + // 处理视图中字段过滤 + 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); + fields.addAll(yFields); + 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); + orders.addAll(yOrders); + List aggWheres = new ArrayList<>(); + aggWheres.addAll(yWheres.stream().filter(ObjectUtils::isNotEmpty).collect(Collectors.toList())); + + STGroup stg = new STGroupFile(SQLConstants.SQL_TEMPLATE); + ST st_sql = stg.getInstanceOf("querySql"); + if (CollectionUtils.isNotEmpty(xFields)) st_sql.add("groups", xFields); + if (CollectionUtils.isNotEmpty(yFields)) st_sql.add("aggregators", yFields); + 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("querySql"); + SQLObj tableSQL = SQLObj.builder() + .tableName(String.format(MaxConstants.BRACKETS, sql)) + .tableAlias(String.format(TABLE_ALIAS_PREFIX, 1)) + .build(); + if (CollectionUtils.isNotEmpty(aggWheres)) st.add("filters", aggWheres); + if (CollectionUtils.isNotEmpty(orders)) st.add("orders", orders); + if (ObjectUtils.isNotEmpty(tableSQL)) st.add("table", tableSQL); + return sqlLimit(st.render(), view); + } + + @Override + public String getSQLAsTmpRangeBar(String table, List baseXAxis, List xAxis, List yAxis, List fieldCustomFilter, List rowPermissionsTree, List extFilterRequestList, List extStack, ChartViewWithBLOBs view) { + return getSQLRangeBar("(" + table + ")", baseXAxis, xAxis, yAxis, fieldCustomFilter, rowPermissionsTree, extFilterRequestList, extStack, 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() : ""); 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 797b4b043e..32f23ed8fe 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 @@ -210,7 +210,7 @@ public class MongobiQueryProvider extends QueryProvider { if (customWheres != null) wheres.add(customWheres); if (whereTrees != null) wheres.add(whereTrees); if (StringUtils.isNotBlank(keyword)) { - String keyWhere = "("+transKeywordFilterList(tableObj, xFields, keyword)+")"; + String keyWhere = "(" + transKeywordFilterList(tableObj, xFields, keyword) + ")"; wheres.add(keyWhere); } if (CollectionUtils.isNotEmpty(wheres)) st_sql.add("filters", wheres); @@ -366,6 +366,107 @@ public class MongobiQueryProvider extends QueryProvider { return sqlLimit(st.render(), view); } + @Override + public String getSQLRangeBar(String table, List baseXAxis, List xAxis, List yAxis, List fieldCustomFilter, List rowPermissionsTree, List extFilterRequestList, List extStack, 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)) + .build(); + List xFields = new ArrayList<>(); + List xOrders = new ArrayList<>(); + + List yFields = new ArrayList<>(); // 要把两个时间字段放进y里面 + List yWheres = 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(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_X_PREFIX, i); + + 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() + .orderField(originField) + .orderAlias(fieldAlias) + .orderDirection(x.getSort()) + .build()); + } + } + } + List yOrders = new ArrayList<>(); + + // 处理视图中字段过滤 + 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); + fields.addAll(yFields); + 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); + orders.addAll(yOrders); + List aggWheres = new ArrayList<>(); + aggWheres.addAll(yWheres.stream().filter(ObjectUtils::isNotEmpty).collect(Collectors.toList())); + + STGroup stg = new STGroupFile(SQLConstants.SQL_TEMPLATE); + ST st_sql = stg.getInstanceOf("querySql"); + if (CollectionUtils.isNotEmpty(xFields)) st_sql.add("groups", xFields); + if (CollectionUtils.isNotEmpty(yFields)) st_sql.add("aggregators", yFields); + 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("querySql"); + SQLObj tableSQL = SQLObj.builder() + .tableName(String.format(MongoConstants.BRACKETS, sql)) + .tableAlias(String.format(TABLE_ALIAS_PREFIX, 1)) + .build(); + if (CollectionUtils.isNotEmpty(aggWheres)) st.add("filters", aggWheres); + if (CollectionUtils.isNotEmpty(orders)) st.add("orders", orders); + if (ObjectUtils.isNotEmpty(tableSQL)) st.add("table", tableSQL); + return sqlLimit(st.render(), view); + } + + @Override + public String getSQLAsTmpRangeBar(String table, List baseXAxis, List xAxis, List yAxis, List fieldCustomFilter, List rowPermissionsTree, List extFilterRequestList, List extStack, ChartViewWithBLOBs view) { + return getSQLRangeBar("(" + table + ")", baseXAxis, xAxis, yAxis, fieldCustomFilter, rowPermissionsTree, extFilterRequestList, extStack, 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.getGoPage() - 1) * pageInfo.getPageSize() + "," + pageInfo.getPageSize() : ""); 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 5775c86852..5a772340eb 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 @@ -22,7 +22,6 @@ import io.dataease.plugins.common.request.permission.DatasetRowPermissionsTreeIt import io.dataease.plugins.datasource.dm.provider.PrestoConfig; import io.dataease.plugins.datasource.entity.Dateformat; import io.dataease.plugins.datasource.entity.JdbcConfiguration; -import io.dataease.plugins.datasource.entity.PageInfo; import io.dataease.plugins.datasource.query.QueryProvider; import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.lang3.ObjectUtils; @@ -158,7 +157,7 @@ public class PrestoQueryProvider extends QueryProvider { if (customWheres != null) wheres.add(customWheres); if (whereTrees != null) wheres.add(whereTrees); if (StringUtils.isNotBlank(keyword)) { - String keyWhere = "("+transKeywordFilterList(tableObj, xFields, keyword)+")"; + String keyWhere = "(" + transKeywordFilterList(tableObj, xFields, keyword) + ")"; wheres.add(keyWhere); } if (CollectionUtils.isNotEmpty(wheres)) st_sql.add("filters", wheres); @@ -362,6 +361,109 @@ public class PrestoQueryProvider extends QueryProvider { return sqlLimit(st.render(), view); } + @Override + public String getSQLRangeBar(String table, List baseXAxis, List xAxis, List yAxis, List fieldCustomFilter, List rowPermissionsTree, List extFilterRequestList, List extStack, Datasource ds, ChartViewWithBLOBs view) { + SQLObj tableObj = SQLObj.builder() + .tableName((table.startsWith("(") && table.endsWith(")")) ? table : String.format(PrestoConstants.KEYWORD_TABLE, table)) + .tableAlias(String.format(TABLE_ALIAS_PREFIX, 0)) + .build(); + setSchema(tableObj, ds); + List xFields = new ArrayList<>(); + List xOrders = new ArrayList<>(); + + List yFields = new ArrayList<>(); // 要把两个时间字段放进y里面 + List yWheres = 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(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_X_PREFIX, i); + + if (i == baseXAxis.size()) {// 起止时间 + String fieldName = String.format(PrestoConstants.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(PrestoConstants.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()) && !StringUtils.equalsIgnoreCase(x.getSort(), "none")) { + xOrders.add(SQLObj.builder() + .orderField(originField) + .orderAlias(fieldAlias) + .orderDirection(x.getSort()) + .build()); + } + } + } + List yOrders = new ArrayList<>(); + + // 处理视图中字段过滤 + 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); + fields.addAll(yFields); + 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); + orders.addAll(yOrders); + List aggWheres = new ArrayList<>(); + aggWheres.addAll(yWheres.stream().filter(ObjectUtils::isNotEmpty).collect(Collectors.toList())); + + STGroup stg = new STGroupFile(SQLConstants.SQL_TEMPLATE); + ST st_sql = stg.getInstanceOf("querySql"); + if (CollectionUtils.isNotEmpty(xFields)) st_sql.add("groups", xFields); + if (CollectionUtils.isNotEmpty(yFields)) st_sql.add("aggregators", yFields); + 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("querySql"); + SQLObj tableSQL = SQLObj.builder() + .tableName(String.format(PrestoConstants.BRACKETS, sql)) + .tableAlias(String.format(TABLE_ALIAS_PREFIX, 1)) + .build(); + if (CollectionUtils.isNotEmpty(aggWheres)) st.add("filters", aggWheres); + if (CollectionUtils.isNotEmpty(orders)) st.add("orders", orders); + if (ObjectUtils.isNotEmpty(tableSQL)) st.add("table", tableSQL); + return sqlLimit(st.render(), view); + } + + @Override + public String getSQLAsTmpRangeBar(String table, List baseXAxis, List xAxis, List yAxis, List fieldCustomFilter, List rowPermissionsTree, List extFilterRequestList, List extStack, ChartViewWithBLOBs view) { + return getSQLRangeBar("(" + table + ")", baseXAxis, xAxis, yAxis, fieldCustomFilter, rowPermissionsTree, extFilterRequestList, extStack, null, view); + } + private String originalTableInfo(String table, List xAxis, List fieldCustomFilter, List rowPermissionsTree, List extFilterRequestList, Datasource ds, ChartViewWithBLOBs view) { SQLObj tableObj = SQLObj.builder() @@ -1109,7 +1211,7 @@ public class PrestoQueryProvider extends QueryProvider { String endTime = simpleDateFormat.format(new Date(Long.parseLong(value.get(1)))); startTime = String.format("CAST('%s' AS %s)", startTime, "timestamp"); endTime = String.format("CAST('%s' AS %s)", endTime, "timestamp"); - whereValue = String.format("%s AND %s",startTime, endTime); + whereValue = String.format("%s AND %s", startTime, endTime); } else { whereValue = String.format(PrestoConstants.WHERE_BETWEEN, value.get(0), value.get(1)); } diff --git a/sdk/dataease-plugin-datasource/src/main/java/io/dataease/plugins/datasource/query/QueryProvider.java b/sdk/dataease-plugin-datasource/src/main/java/io/dataease/plugins/datasource/query/QueryProvider.java index c3b3313c80..dcbb85f645 100644 --- a/sdk/dataease-plugin-datasource/src/main/java/io/dataease/plugins/datasource/query/QueryProvider.java +++ b/sdk/dataease-plugin-datasource/src/main/java/io/dataease/plugins/datasource/query/QueryProvider.java @@ -85,6 +85,10 @@ public abstract class QueryProvider { public abstract String getSQLAsTmpScatter(String table, List xAxis, List yAxis, List fieldCustomFilter, List rowPermissionsTree, List extFilterRequestList, List extBubble, List extGroup, ChartViewWithBLOBs view); + public abstract String getSQLRangeBar(String table, List baseXAxis, List xAxis, List yAxis, List fieldCustomFilter, List rowPermissionsTree, List extFilterRequestList, List extStack, Datasource ds, ChartViewWithBLOBs view); + + public abstract String getSQLAsTmpRangeBar(String table, List baseXAxis, List xAxis, List yAxis, List fieldCustomFilter, List rowPermissionsTree, List extFilterRequestList, List extStack, ChartViewWithBLOBs view); + public abstract String searchTable(String table); public abstract String getSQLSummary(String table, List yAxis, List fieldCustomFilter, List rowPermissionsTree, List extFilterRequestList, ChartViewWithBLOBs view, Datasource ds); @@ -167,7 +171,7 @@ public abstract class QueryProvider { String tableAlias = tableObj.getTableAlias(); return xFields.stream().map(xField -> { String whereName = xField.getFieldOriginName(); - return whereName + " LIKE '%"+keyword+"%'"; + return whereName + " LIKE '%" + keyword + "%'"; }).collect(Collectors.joining(" or ")); }