diff --git a/backend/src/main/java/io/dataease/dto/chart/ChartFieldCustomFilterDTO.java b/backend/src/main/java/io/dataease/dto/chart/ChartFieldCustomFilterDTO.java index 588f9e9d54..57a9c8d2ae 100644 --- a/backend/src/main/java/io/dataease/dto/chart/ChartFieldCustomFilterDTO.java +++ b/backend/src/main/java/io/dataease/dto/chart/ChartFieldCustomFilterDTO.java @@ -1,5 +1,6 @@ package io.dataease.dto.chart; +import io.dataease.base.domain.DatasetTableField; import lombok.Getter; import lombok.Setter; @@ -12,6 +13,8 @@ import java.util.List; */ @Getter @Setter -public class ChartFieldCustomFilterDTO implements Serializable { +public class ChartFieldCustomFilterDTO extends ChartViewFieldBaseDTO implements Serializable { private List filter; + + private DatasetTableField field; } diff --git a/backend/src/main/java/io/dataease/dto/chart/ChartViewFieldBaseDTO.java b/backend/src/main/java/io/dataease/dto/chart/ChartViewFieldBaseDTO.java new file mode 100644 index 0000000000..1f84afc654 --- /dev/null +++ b/backend/src/main/java/io/dataease/dto/chart/ChartViewFieldBaseDTO.java @@ -0,0 +1,51 @@ +package io.dataease.dto.chart; + +import lombok.Data; + +import java.io.Serializable; +import java.util.List; + +/** + * @Author gin + * @Date 2021/3/11 1:18 下午 + */ +@Data +public class ChartViewFieldBaseDTO implements Serializable { + private String id; + + private String tableId; + + private String originName; + + private String dataeaseName; + + private String name; + + private String type; + + private Boolean checked; + + private Integer columnIndex; + + private Long lastSyncTime; + + private Integer deType; + + private String summary; + + private String sort; + + private Integer deExtractType; + + private String dateStyle; + + private String datePattern; + + private Integer extField; + + private String chartType; + + private ChartFieldCompareDTO compareCalc; + + private String logic; +} diff --git a/backend/src/main/java/io/dataease/dto/chart/ChartViewFieldDTO.java b/backend/src/main/java/io/dataease/dto/chart/ChartViewFieldDTO.java index 3d5b13665d..78e8353109 100644 --- a/backend/src/main/java/io/dataease/dto/chart/ChartViewFieldDTO.java +++ b/backend/src/main/java/io/dataease/dto/chart/ChartViewFieldDTO.java @@ -10,42 +10,6 @@ import java.util.List; * @Date 2021/3/11 1:18 下午 */ @Data -public class ChartViewFieldDTO implements Serializable { - private String id; - - private String tableId; - - private String originName; - - private String dataeaseName; - - private String name; - - private String type; - - private Boolean checked; - - private Integer columnIndex; - - private Long lastSyncTime; - - private Integer deType; - - private String summary; - - private String sort; - +public class ChartViewFieldDTO extends ChartViewFieldBaseDTO implements Serializable { private List filter; - - private Integer deExtractType; - - private String dateStyle; - - private String datePattern; - - private Integer extField; - - private String chartType; - - private ChartFieldCompareDTO compareCalc; } diff --git a/backend/src/main/java/io/dataease/provider/query/QueryProvider.java b/backend/src/main/java/io/dataease/provider/query/QueryProvider.java index 8deeaf3d67..894d317d9e 100644 --- a/backend/src/main/java/io/dataease/provider/query/QueryProvider.java +++ b/backend/src/main/java/io/dataease/provider/query/QueryProvider.java @@ -5,9 +5,9 @@ import io.dataease.base.domain.ChartViewWithBLOBs; import io.dataease.base.domain.DatasetTableField; import io.dataease.base.domain.Datasource; import io.dataease.controller.request.chart.ChartExtFilterRequest; -import io.dataease.dto.datasource.JdbcConfiguration; -import io.dataease.dto.chart.ChartCustomFilterDTO; +import io.dataease.dto.chart.ChartFieldCustomFilterDTO; import io.dataease.dto.chart.ChartViewFieldDTO; +import io.dataease.dto.datasource.JdbcConfiguration; import io.dataease.dto.sqlObj.SQLObj; import io.dataease.provider.query.pg.PgConstants; @@ -23,52 +23,43 @@ public abstract class QueryProvider { public abstract String createSQLPreview(String sql, String orderBy); - public abstract String createQuerySQL(String table, List fields, boolean isGroup, Datasource ds, List customFilter); + public abstract String createQuerySQL(String table, List fields, boolean isGroup, Datasource ds, List fieldCustomFilter); - public abstract String createQuerySQLAsTmp(String sql, List fields, boolean isGroup, List customFilter); + public abstract String createQuerySQLAsTmp(String sql, List fields, boolean isGroup, List fieldCustomFilter); - public abstract String createQueryTableWithPage(String table, List fields, Integer page, Integer pageSize, Integer realSize, boolean isGroup, Datasource ds, List customFilter); + public abstract String createQueryTableWithPage(String table, List fields, Integer page, Integer pageSize, Integer realSize, boolean isGroup, Datasource ds, List fieldCustomFilter); - public abstract String createQuerySQLWithPage(String sql, List fields, Integer page, Integer pageSize, Integer realSize, boolean isGroup, List customFilter); + public abstract String createQuerySQLWithPage(String sql, List fields, Integer page, Integer pageSize, Integer realSize, boolean isGroup, List fieldCustomFilter); - public abstract String createQueryTableWithLimit(String table, List fields, Integer limit, boolean isGroup, Datasource ds, List customFilter); + public abstract String createQueryTableWithLimit(String table, List fields, Integer limit, boolean isGroup, Datasource ds, List fieldCustomFilter); - public abstract String createQuerySqlWithLimit(String sql, List fields, Integer limit, boolean isGroup, List customFilter); + public abstract String createQuerySqlWithLimit(String sql, List fields, Integer limit, boolean isGroup, List fieldCustomFilter); - public abstract String getSQL(String table, List xAxis, List yAxis, List customFilter, List extFilterRequestList, Datasource ds, ChartViewWithBLOBs view); + public abstract String getSQL(String table, List xAxis, List yAxis, List fieldCustomFilter, List extFilterRequestList, Datasource ds, ChartViewWithBLOBs view); - public abstract String getSQLAsTmp(String table, List xAxis, List yAxis, List customFilter, List extFilterRequestList, ChartViewWithBLOBs view); + public abstract String getSQLAsTmp(String table, List xAxis, List yAxis, List fieldCustomFilter, List extFilterRequestList, ChartViewWithBLOBs view); - public abstract String getSQLTableInfo(String table, List xAxis, List customFilter, List extFilterRequestList, Datasource ds, ChartViewWithBLOBs view); + public abstract String getSQLTableInfo(String table, List xAxis, List fieldCustomFilter, List extFilterRequestList, Datasource ds, ChartViewWithBLOBs view); - public abstract String getSQLAsTmpTableInfo(String sql, List xAxis, List customFilter, List extFilterRequestList, Datasource ds, ChartViewWithBLOBs view); + public abstract String getSQLAsTmpTableInfo(String sql, List xAxis, List fieldCustomFilter, List extFilterRequestList, Datasource ds, ChartViewWithBLOBs view); - public abstract String getSQLStack(String table, List xAxis, List yAxis, List customFilter, List extFilterRequestList, List extStack, Datasource ds, ChartViewWithBLOBs view); + public abstract String getSQLStack(String table, List xAxis, List yAxis, List fieldCustomFilter, List extFilterRequestList, List extStack, Datasource ds, ChartViewWithBLOBs view); - public abstract String getSQLAsTmpStack(String table, List xAxis, List yAxis, List customFilter, List extFilterRequestList, List extStack, ChartViewWithBLOBs view); + public abstract String getSQLAsTmpStack(String table, List xAxis, List yAxis, List fieldCustomFilter, List extFilterRequestList, List extStack, ChartViewWithBLOBs view); - public abstract String getSQLScatter(String table, List xAxis, List yAxis, List customFilter, List extFilterRequestList, List extBubble, Datasource ds, ChartViewWithBLOBs view); + public abstract String getSQLScatter(String table, List xAxis, List yAxis, List fieldCustomFilter, List extFilterRequestList, List extBubble, Datasource ds, ChartViewWithBLOBs view); - public abstract String getSQLAsTmpScatter(String table, List xAxis, List yAxis, List customFilter, List extFilterRequestList, List extBubble, ChartViewWithBLOBs view); + public abstract String getSQLAsTmpScatter(String table, List xAxis, List yAxis, List fieldCustomFilter, List extFilterRequestList, List extBubble, ChartViewWithBLOBs view); public abstract String searchTable(String table); - public abstract String getSQLSummary(String table, List yAxis, List customFilter, List extFilterRequestList, ChartViewWithBLOBs view); + public abstract String getSQLSummary(String table, List yAxis, List fieldCustomFilter, List extFilterRequestList, ChartViewWithBLOBs view); public Integer transFieldSize(String type) { return 50; } - /** - * 单指标汇总 - * - * @param sql - * @param yAxis - * @param customFilter - * @param extFilterRequestList - * @return - */ - public abstract String getSQLSummaryAsTmp(String sql, List yAxis, List customFilter, List extFilterRequestList, ChartViewWithBLOBs view); + public abstract String getSQLSummaryAsTmp(String sql, List yAxis, List fieldCustomFilter, List extFilterRequestList, ChartViewWithBLOBs view); public abstract String wrapSql(String sql); @@ -84,7 +75,7 @@ public abstract class QueryProvider { } } - public String convertTableToSql(String tableName, Datasource ds){ + public String convertTableToSql(String tableName, Datasource ds) { return "select * from TABLE_NAME".replace("TABLE_NAME", tableName); } } diff --git a/backend/src/main/java/io/dataease/provider/query/ck/CKQueryProvider.java b/backend/src/main/java/io/dataease/provider/query/ck/CKQueryProvider.java index ac61b70b7e..6fef337c5e 100644 --- a/backend/src/main/java/io/dataease/provider/query/ck/CKQueryProvider.java +++ b/backend/src/main/java/io/dataease/provider/query/ck/CKQueryProvider.java @@ -7,7 +7,8 @@ import io.dataease.base.domain.Datasource; import io.dataease.base.mapper.DatasetTableFieldMapper; import io.dataease.commons.constants.DeTypeConstants; import io.dataease.controller.request.chart.ChartExtFilterRequest; -import io.dataease.dto.chart.ChartCustomFilterDTO; +import io.dataease.dto.chart.ChartCustomFilterItemDTO; +import io.dataease.dto.chart.ChartFieldCustomFilterDTO; import io.dataease.dto.chart.ChartViewFieldDTO; import io.dataease.dto.sqlObj.SQLObj; import io.dataease.provider.query.QueryProvider; @@ -26,6 +27,7 @@ import java.text.SimpleDateFormat; import java.util.*; import java.util.regex.Matcher; import java.util.regex.Pattern; +import java.util.stream.Collectors; import static io.dataease.provider.query.SQLConstants.TABLE_ALIAS_PREFIX; @@ -107,7 +109,7 @@ public class CKQueryProvider extends QueryProvider { } @Override - public String createQuerySQL(String table, List fields, boolean isGroup, Datasource ds, List customFilter) { + public String createQuerySQL(String table, List fields, boolean isGroup, Datasource ds, List fieldCustomFilter) { SQLObj tableObj = SQLObj.builder() .tableName((table.startsWith("(") && table.endsWith(")")) ? table : String.format(CKConstants.KEYWORD_TABLE, table)) .tableAlias(String.format(TABLE_ALIAS_PREFIX, 0)) @@ -170,46 +172,45 @@ public class CKQueryProvider extends QueryProvider { st_sql.add("isGroup", isGroup); if (CollectionUtils.isNotEmpty(xFields)) st_sql.add("groups", xFields); if (ObjectUtils.isNotEmpty(tableObj)) st_sql.add("table", tableObj); - List customWheres = transCustomFilterList(tableObj, customFilter); - List wheres = new ArrayList<>(); - if (customWheres != null) wheres.addAll(customWheres); + String customWheres = transCustomFilterList(tableObj, fieldCustomFilter); + List wheres = new ArrayList<>(); + if (customWheres != null) wheres.add(customWheres); if (CollectionUtils.isNotEmpty(wheres)) st_sql.add("filters", wheres); return st_sql.render(); } @Override - public String createQuerySQLAsTmp(String sql, List fields, boolean isGroup, List customFilter) { - return createQuerySQL("(" + sqlFix(sql) + ")", fields, isGroup, null, customFilter); + public String createQuerySQLAsTmp(String sql, List fields, boolean isGroup, List fieldCustomFilter) { + return createQuerySQL("(" + sqlFix(sql) + ")", fields, isGroup, null, fieldCustomFilter); } @Override - public String createQueryTableWithPage(String table, List fields, Integer page, Integer pageSize, Integer realSize, boolean isGroup, Datasource ds, List customFilter) { - return createQuerySQL(table, fields, isGroup, null, customFilter) + " LIMIT " + (page - 1) * pageSize + "," + realSize; + public String createQueryTableWithPage(String table, List fields, Integer page, Integer pageSize, Integer realSize, boolean isGroup, Datasource ds, List fieldCustomFilter) { + return createQuerySQL(table, fields, isGroup, null, fieldCustomFilter) + " LIMIT " + (page - 1) * pageSize + "," + realSize; } @Override - public String createQueryTableWithLimit(String table, List fields, Integer limit, boolean isGroup, Datasource ds, List customFilter) { - return createQuerySQL(table, fields, isGroup, null, customFilter) + " LIMIT 0," + limit; + public String createQueryTableWithLimit(String table, List fields, Integer limit, boolean isGroup, Datasource ds, List fieldCustomFilter) { + return createQuerySQL(table, fields, isGroup, null, fieldCustomFilter) + " LIMIT 0," + limit; } @Override - public String createQuerySqlWithLimit(String sql, List fields, Integer limit, boolean isGroup, List customFilter) { - return createQuerySQLAsTmp(sql, fields, isGroup, customFilter) + " LIMIT 0," + limit; + public String createQuerySqlWithLimit(String sql, List fields, Integer limit, boolean isGroup, List fieldCustomFilter) { + return createQuerySQLAsTmp(sql, fields, isGroup, fieldCustomFilter) + " LIMIT 0," + limit; } @Override - public String createQuerySQLWithPage(String sql, List fields, Integer page, Integer pageSize, Integer realSize, boolean isGroup, List customFilter) { - return createQuerySQLAsTmp(sql, fields, isGroup, customFilter) + " LIMIT " + (page - 1) * pageSize + "," + realSize; + public String createQuerySQLWithPage(String sql, List fields, Integer page, Integer pageSize, Integer realSize, boolean isGroup, List fieldCustomFilter) { + return createQuerySQLAsTmp(sql, fields, isGroup, fieldCustomFilter) + " LIMIT " + (page - 1) * pageSize + "," + realSize; } @Override - public String getSQL(String table, List xAxis, List yAxis, List customFilter, List extFilterRequestList, Datasource ds, ChartViewWithBLOBs view) { + public String getSQL(String table, List xAxis, List yAxis, List fieldCustomFilter, List extFilterRequestList, Datasource ds, ChartViewWithBLOBs view) { SQLObj tableObj = SQLObj.builder() .tableName((table.startsWith("(") && table.endsWith(")")) ? table : String.format(CKConstants.KEYWORD_TABLE, table)) .tableAlias(String.format(TABLE_ALIAS_PREFIX, 0)) .build(); List xFields = new ArrayList<>(); - List xWheres = new ArrayList<>(); List xOrders = new ArrayList<>(); if (CollectionUtils.isNotEmpty(xAxis)) { for (int i = 0; i < xAxis.size(); i++) { @@ -238,7 +239,7 @@ public class CKQueryProvider extends QueryProvider { } } List yFields = new ArrayList<>(); - List yWheres = new ArrayList<>(); + List yWheres = new ArrayList<>(); List yOrders = new ArrayList<>(); if (CollectionUtils.isNotEmpty(yAxis)) { for (int i = 0; i < yAxis.size(); i++) { @@ -256,7 +257,7 @@ public class CKQueryProvider extends QueryProvider { // 处理纵轴字段 yFields.add(getYFields(y, originField, fieldAlias)); // 处理纵轴过滤 - yWheres.addAll(getYWheres(y, originField, fieldAlias)); + yWheres.add(getYWheres(y, originField, fieldAlias)); // 处理纵轴排序 if (StringUtils.isNotEmpty(y.getSort()) && !StringUtils.equalsIgnoreCase(y.getSort(), "none")) { yOrders.add(SQLObj.builder() @@ -268,25 +269,24 @@ public class CKQueryProvider extends QueryProvider { } } // 处理视图中字段过滤 - List customWheres = transCustomFilterList(tableObj, customFilter); + String customWheres = transCustomFilterList(tableObj, fieldCustomFilter); // 处理仪表板字段过滤 - List extWheres = transExtFilterList(tableObj, extFilterRequestList); + String extWheres = transExtFilterList(tableObj, extFilterRequestList); // 构建sql所有参数 List fields = new ArrayList<>(); fields.addAll(xFields); fields.addAll(yFields); - List wheres = new ArrayList<>(); - wheres.addAll(xWheres); - if (customWheres != null) wheres.addAll(customWheres); - if (extWheres != null) wheres.addAll(extWheres); + List wheres = new ArrayList<>(); + if (customWheres != null) wheres.add(customWheres); + if (extWheres != null) wheres.add(extWheres); 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); + 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"); @@ -308,13 +308,12 @@ public class CKQueryProvider extends QueryProvider { } @Override - public String getSQLTableInfo(String table, List xAxis, List customFilter, List extFilterRequestList, Datasource ds, ChartViewWithBLOBs view) { + public String getSQLTableInfo(String table, List xAxis, List fieldCustomFilter, List extFilterRequestList, Datasource ds, ChartViewWithBLOBs view) { SQLObj tableObj = SQLObj.builder() .tableName((table.startsWith("(") && table.endsWith(")")) ? table : String.format(CKConstants.KEYWORD_TABLE, table)) .tableAlias(String.format(TABLE_ALIAS_PREFIX, 0)) .build(); List xFields = new ArrayList<>(); - List xWheres = new ArrayList<>(); List xOrders = new ArrayList<>(); if (CollectionUtils.isNotEmpty(xAxis)) { for (int i = 0; i < xAxis.size(); i++) { @@ -343,16 +342,15 @@ public class CKQueryProvider extends QueryProvider { } } // 处理视图中字段过滤 - List customWheres = transCustomFilterList(tableObj, customFilter); + String customWheres = transCustomFilterList(tableObj, fieldCustomFilter); // 处理仪表板字段过滤 - List extWheres = transExtFilterList(tableObj, extFilterRequestList); + String extWheres = transExtFilterList(tableObj, extFilterRequestList); // 构建sql所有参数 List fields = new ArrayList<>(); fields.addAll(xFields); - List wheres = new ArrayList<>(); - wheres.addAll(xWheres); - if (customWheres != null) wheres.addAll(customWheres); - if (extWheres != null) wheres.addAll(extWheres); + List wheres = new ArrayList<>(); + if (customWheres != null) wheres.add(customWheres); + if (extWheres != null) wheres.add(extWheres); List groups = new ArrayList<>(); groups.addAll(xFields); // 外层再次套sql @@ -379,24 +377,23 @@ public class CKQueryProvider extends QueryProvider { } @Override - public String getSQLAsTmpTableInfo(String sql, List xAxis, List customFilter, List extFilterRequestList, Datasource ds, ChartViewWithBLOBs view) { - return getSQLTableInfo("(" + sqlFix(sql) + ")", xAxis, customFilter, extFilterRequestList, null, view); + public String getSQLAsTmpTableInfo(String sql, List xAxis, List fieldCustomFilter, List extFilterRequestList, Datasource ds, ChartViewWithBLOBs view) { + return getSQLTableInfo("(" + sqlFix(sql) + ")", xAxis, fieldCustomFilter, extFilterRequestList, null, view); } @Override - public String getSQLAsTmp(String sql, List xAxis, List yAxis, List customFilter, List extFilterRequestList, ChartViewWithBLOBs view) { - return getSQL("(" + sqlFix(sql) + ")", xAxis, yAxis, customFilter, extFilterRequestList, null, view); + public String getSQLAsTmp(String sql, List xAxis, List yAxis, List fieldCustomFilter, List extFilterRequestList, ChartViewWithBLOBs view) { + return getSQL("(" + sqlFix(sql) + ")", xAxis, yAxis, fieldCustomFilter, extFilterRequestList, null, view); } @Override - public String getSQLStack(String table, List xAxis, List yAxis, List customFilter, List extFilterRequestList, List extStack, Datasource ds, ChartViewWithBLOBs view) { + public String getSQLStack(String table, List xAxis, List yAxis, List fieldCustomFilter, 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 xWheres = new ArrayList<>(); List xOrders = new ArrayList<>(); List xList = new ArrayList<>(); xList.addAll(xAxis); @@ -428,7 +425,7 @@ public class CKQueryProvider extends QueryProvider { } } List yFields = new ArrayList<>(); - List yWheres = new ArrayList<>(); + List yWheres = new ArrayList<>(); List yOrders = new ArrayList<>(); if (CollectionUtils.isNotEmpty(yAxis)) { for (int i = 0; i < yAxis.size(); i++) { @@ -446,7 +443,7 @@ public class CKQueryProvider extends QueryProvider { // 处理纵轴字段 yFields.add(getYFields(y, originField, fieldAlias)); // 处理纵轴过滤 - yWheres.addAll(getYWheres(y, originField, fieldAlias)); + yWheres.add(getYWheres(y, originField, fieldAlias)); // 处理纵轴排序 if (StringUtils.isNotEmpty(y.getSort()) && !StringUtils.equalsIgnoreCase(y.getSort(), "none")) { yOrders.add(SQLObj.builder() @@ -458,25 +455,24 @@ public class CKQueryProvider extends QueryProvider { } } // 处理视图中字段过滤 - List customWheres = transCustomFilterList(tableObj, customFilter); + String customWheres = transCustomFilterList(tableObj, fieldCustomFilter); // 处理仪表板字段过滤 - List extWheres = transExtFilterList(tableObj, extFilterRequestList); + String extWheres = transExtFilterList(tableObj, extFilterRequestList); // 构建sql所有参数 List fields = new ArrayList<>(); fields.addAll(xFields); fields.addAll(yFields); - List wheres = new ArrayList<>(); - wheres.addAll(xWheres); - if (customWheres != null) wheres.addAll(customWheres); - if (extWheres != null) wheres.addAll(extWheres); + List wheres = new ArrayList<>(); + if (customWheres != null) wheres.add(customWheres); + if (extWheres != null) wheres.add(extWheres); 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); + 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"); @@ -498,18 +494,17 @@ public class CKQueryProvider extends QueryProvider { } @Override - public String getSQLAsTmpStack(String table, List xAxis, List yAxis, List customFilter, List extFilterRequestList, List extStack, ChartViewWithBLOBs view) { - return getSQLStack("(" + sqlFix(table) + ")", xAxis, yAxis, customFilter, extFilterRequestList, extStack, null, view); + public String getSQLAsTmpStack(String table, List xAxis, List yAxis, List fieldCustomFilter, List extFilterRequestList, List extStack, ChartViewWithBLOBs view) { + return getSQLStack("(" + sqlFix(table) + ")", xAxis, yAxis, fieldCustomFilter, extFilterRequestList, extStack, null, view); } @Override - public String getSQLScatter(String table, List xAxis, List yAxis, List customFilter, List extFilterRequestList, List extBubble, Datasource ds, ChartViewWithBLOBs view) { + public String getSQLScatter(String table, List xAxis, List yAxis, List fieldCustomFilter, List extFilterRequestList, List extBubble, 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 xWheres = new ArrayList<>(); List xOrders = new ArrayList<>(); if (CollectionUtils.isNotEmpty(xAxis)) { for (int i = 0; i < xAxis.size(); i++) { @@ -538,7 +533,7 @@ public class CKQueryProvider extends QueryProvider { } } List yFields = new ArrayList<>(); - List yWheres = new ArrayList<>(); + List yWheres = new ArrayList<>(); List yOrders = new ArrayList<>(); List yList = new ArrayList<>(); yList.addAll(yAxis); @@ -559,7 +554,7 @@ public class CKQueryProvider extends QueryProvider { // 处理纵轴字段 yFields.add(getYFields(y, originField, fieldAlias)); // 处理纵轴过滤 - yWheres.addAll(getYWheres(y, originField, fieldAlias)); + yWheres.add(getYWheres(y, originField, fieldAlias)); // 处理纵轴排序 if (StringUtils.isNotEmpty(y.getSort()) && !StringUtils.equalsIgnoreCase(y.getSort(), "none")) { yOrders.add(SQLObj.builder() @@ -571,25 +566,24 @@ public class CKQueryProvider extends QueryProvider { } } // 处理视图中字段过滤 - List customWheres = transCustomFilterList(tableObj, customFilter); + String customWheres = transCustomFilterList(tableObj, fieldCustomFilter); // 处理仪表板字段过滤 - List extWheres = transExtFilterList(tableObj, extFilterRequestList); + String extWheres = transExtFilterList(tableObj, extFilterRequestList); // 构建sql所有参数 List fields = new ArrayList<>(); fields.addAll(xFields); fields.addAll(yFields); - List wheres = new ArrayList<>(); - wheres.addAll(xWheres); - if (customWheres != null) wheres.addAll(customWheres); - if (extWheres != null) wheres.addAll(extWheres); + List wheres = new ArrayList<>(); + if (customWheres != null) wheres.add(customWheres); + if (extWheres != null) wheres.add(extWheres); 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); + 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"); @@ -611,8 +605,8 @@ public class CKQueryProvider extends QueryProvider { } @Override - public String getSQLAsTmpScatter(String table, List xAxis, List yAxis, List customFilter, List extFilterRequestList, List extBubble, ChartViewWithBLOBs view) { - return getSQLScatter("(" + sqlFix(table) + ")", xAxis, yAxis, customFilter, extFilterRequestList, extBubble, null, view); + public String getSQLAsTmpScatter(String table, List xAxis, List yAxis, List fieldCustomFilter, List extFilterRequestList, List extBubble, ChartViewWithBLOBs view) { + return getSQLScatter("(" + sqlFix(table) + ")", xAxis, yAxis, fieldCustomFilter, extFilterRequestList, extBubble, null, view); } @Override @@ -621,14 +615,14 @@ public class CKQueryProvider extends QueryProvider { } @Override - public String getSQLSummary(String table, List yAxis, List customFilter, List extFilterRequestList, ChartViewWithBLOBs view) { + public String getSQLSummary(String table, List yAxis, List fieldCustomFilter, List extFilterRequestList, 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 yFields = new ArrayList<>(); - List yWheres = new ArrayList<>(); + List yWheres = new ArrayList<>(); List yOrders = new ArrayList<>(); if (CollectionUtils.isNotEmpty(yAxis)) { for (int i = 0; i < yAxis.size(); i++) { @@ -646,7 +640,7 @@ public class CKQueryProvider extends QueryProvider { // 处理纵轴字段 yFields.add(getYFields(y, originField, fieldAlias)); // 处理纵轴过滤 - yWheres.addAll(getYWheres(y, originField, fieldAlias)); + yWheres.add(getYWheres(y, originField, fieldAlias)); // 处理纵轴排序 if (StringUtils.isNotEmpty(y.getSort()) && !StringUtils.equalsIgnoreCase(y.getSort(), "none")) { yOrders.add(SQLObj.builder() @@ -658,21 +652,21 @@ public class CKQueryProvider extends QueryProvider { } } // 处理视图中字段过滤 - List customWheres = transCustomFilterList(tableObj, customFilter); + String customWheres = transCustomFilterList(tableObj, fieldCustomFilter); // 处理仪表板字段过滤 - List extWheres = transExtFilterList(tableObj, extFilterRequestList); + String extWheres = transExtFilterList(tableObj, extFilterRequestList); // 构建sql所有参数 List fields = new ArrayList<>(); fields.addAll(yFields); - List wheres = new ArrayList<>(); - if (customWheres != null) wheres.addAll(customWheres); - if (extWheres != null) wheres.addAll(extWheres); + List wheres = new ArrayList<>(); + if (customWheres != null) wheres.add(customWheres); + if (extWheres != null) wheres.add(extWheres); List groups = new ArrayList<>(); // 外层再次套sql List orders = new ArrayList<>(); orders.addAll(yOrders); - List aggWheres = new ArrayList<>(); - aggWheres.addAll(yWheres); + 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"); @@ -693,8 +687,8 @@ public class CKQueryProvider extends QueryProvider { } @Override - public String getSQLSummaryAsTmp(String sql, List yAxis, List customFilter, List extFilterRequestList, ChartViewWithBLOBs view) { - return getSQLSummary("(" + sqlFix(sql) + ")", yAxis, customFilter, extFilterRequestList, view); + public String getSQLSummaryAsTmp(String sql, List yAxis, List fieldCustomFilter, List extFilterRequestList, ChartViewWithBLOBs view) { + return getSQLSummary("(" + sqlFix(sql) + ")", yAxis, fieldCustomFilter, extFilterRequestList, view); } @Override @@ -768,84 +762,90 @@ public class CKQueryProvider extends QueryProvider { } } - public List transCustomFilterList(SQLObj tableObj, List requestList) { + public String transCustomFilterList(SQLObj tableObj, List requestList) { if (CollectionUtils.isEmpty(requestList)) { return null; } - List list = new ArrayList<>(); - for (ChartCustomFilterDTO request : requestList) { + List res = new ArrayList<>(); + for (ChartFieldCustomFilterDTO request : requestList) { + List list = new ArrayList<>(); DatasetTableField field = request.getField(); - if (ObjectUtils.isEmpty(field)) { - continue; - } - String value = request.getValue(); - String whereName = ""; - String whereTerm = transMysqlFilterTerm(request.getTerm()); - String whereValue = ""; - String originName; - if (ObjectUtils.isNotEmpty(field.getExtField()) && field.getExtField() == 2) { - // 解析origin name中有关联的字段生成sql表达式 - originName = calcFieldRegex(field.getOriginName(), tableObj); - } else if (ObjectUtils.isNotEmpty(field.getExtField()) && field.getExtField() == 1) { - originName = String.format(CKConstants.KEYWORD_FIX, tableObj.getTableAlias(), field.getOriginName()); - } else { - originName = String.format(CKConstants.KEYWORD_FIX, tableObj.getTableAlias(), field.getOriginName()); - } - if (field.getDeType() == DeTypeConstants.DE_TIME) { - if (field.getDeExtractType() == DeTypeConstants.DE_STRING || field.getDeExtractType() == 5) { - whereName = String.format(CKConstants.toDateTime, originName); + List filter = request.getFilter(); + for (ChartCustomFilterItemDTO filterItemDTO : filter) { + if (ObjectUtils.isEmpty(field)) { + continue; } - if (field.getDeExtractType() == DeTypeConstants.DE_INT || field.getDeExtractType() == DeTypeConstants.DE_FLOAT || field.getDeExtractType() == 4) { - String cast = String.format(CKConstants.toFloat64, originName); - whereName = String.format(CKConstants.toDateTime, cast); + String value = filterItemDTO.getValue(); + String whereName = ""; + String whereTerm = transMysqlFilterTerm(filterItemDTO.getTerm()); + String whereValue = ""; + String originName; + if (ObjectUtils.isNotEmpty(field.getExtField()) && field.getExtField() == 2) { + // 解析origin name中有关联的字段生成sql表达式 + originName = calcFieldRegex(field.getOriginName(), tableObj); + } else if (ObjectUtils.isNotEmpty(field.getExtField()) && field.getExtField() == 1) { + originName = String.format(CKConstants.KEYWORD_FIX, tableObj.getTableAlias(), field.getOriginName()); + } else { + originName = String.format(CKConstants.KEYWORD_FIX, tableObj.getTableAlias(), field.getOriginName()); } - if (field.getDeExtractType() == 1) { + if (field.getDeType() == DeTypeConstants.DE_TIME) { + if (field.getDeExtractType() == DeTypeConstants.DE_STRING || field.getDeExtractType() == 5) { + whereName = String.format(CKConstants.toDateTime, originName); + } + if (field.getDeExtractType() == DeTypeConstants.DE_INT || field.getDeExtractType() == DeTypeConstants.DE_FLOAT || field.getDeExtractType() == 4) { + String cast = String.format(CKConstants.toFloat64, originName); + whereName = String.format(CKConstants.toDateTime, cast); + } + if (field.getDeExtractType() == 1) { + whereName = originName; + } + } else { whereName = originName; } - } else { - whereName = originName; - } - if (StringUtils.equalsIgnoreCase(request.getTerm(), "null")) { - whereValue = ""; - } else if (StringUtils.equalsIgnoreCase(request.getTerm(), "not_null")) { - whereValue = ""; - } else if (StringUtils.equalsIgnoreCase(request.getTerm(), "empty")) { - whereValue = "''"; - } else if (StringUtils.equalsIgnoreCase(request.getTerm(), "not_empty")) { - whereValue = "''"; - } else if (StringUtils.containsIgnoreCase(request.getTerm(), "in")) { - whereValue = "('" + StringUtils.join(value, "','") + "')"; - } else if (StringUtils.containsIgnoreCase(request.getTerm(), "like")) { - whereValue = "'%" + value + "%'"; - } else { - if (field.getDeType() == DeTypeConstants.DE_TIME) { - whereValue = String.format(CKConstants.toDateTime, "'" + value + "'"); + if (StringUtils.equalsIgnoreCase(filterItemDTO.getTerm(), "null")) { + whereValue = ""; + } else if (StringUtils.equalsIgnoreCase(filterItemDTO.getTerm(), "not_null")) { + whereValue = ""; + } else if (StringUtils.equalsIgnoreCase(filterItemDTO.getTerm(), "empty")) { + whereValue = "''"; + } else if (StringUtils.equalsIgnoreCase(filterItemDTO.getTerm(), "not_empty")) { + whereValue = "''"; + } else if (StringUtils.containsIgnoreCase(filterItemDTO.getTerm(), "in")) { + whereValue = "('" + StringUtils.join(value, "','") + "')"; + } else if (StringUtils.containsIgnoreCase(filterItemDTO.getTerm(), "like")) { + whereValue = "'%" + value + "%'"; } else { - whereValue = String.format(CKConstants.WHERE_VALUE_VALUE, value); + if (field.getDeType() == DeTypeConstants.DE_TIME) { + whereValue = String.format(CKConstants.toDateTime, "'" + value + "'"); + } else { + whereValue = String.format(CKConstants.WHERE_VALUE_VALUE, value); + } + } + if (field.getDeType() == DeTypeConstants.DE_TIME && StringUtils.equalsIgnoreCase(filterItemDTO.getTerm(), "null")) { + list.add(SQLObj.builder() + .whereField(whereName) + .whereTermAndValue("is null") + .build()); + } else if (field.getDeType() == DeTypeConstants.DE_TIME && StringUtils.equalsIgnoreCase(filterItemDTO.getTerm(), "not_null")) { + list.add(SQLObj.builder() + .whereField(whereName) + .whereTermAndValue("is not null") + .build()); + } else { + list.add(SQLObj.builder() + .whereField(whereName) + .whereTermAndValue(whereTerm + whereValue) + .build()); } } - if (field.getDeType() == DeTypeConstants.DE_TIME && StringUtils.equalsIgnoreCase(request.getTerm(), "null")) { - list.add(SQLObj.builder() - .whereField(whereName) - .whereTermAndValue("is null") - .build()); - } else if (field.getDeType() == DeTypeConstants.DE_TIME && StringUtils.equalsIgnoreCase(request.getTerm(), "not_null")) { - list.add(SQLObj.builder() - .whereField(whereName) - .whereTermAndValue("is not null") - .build()); - } else { - list.add(SQLObj.builder() - .whereField(whereName) - .whereTermAndValue(whereTerm + whereValue) - .build()); - } - + List strList = new ArrayList<>(); + list.forEach(ele -> strList.add(ele.getWhereField() + " " + ele.getWhereTermAndValue())); + res.add("(" + String.join(" " + getLogic(request.getLogic()) + " ", strList) + ")"); } - return list; + return "(" + String.join(" AND ", res) + ")"; } - public List transExtFilterList(SQLObj tableObj, List requestList) { + public String transExtFilterList(SQLObj tableObj, List requestList) { if (CollectionUtils.isEmpty(requestList)) { return null; } @@ -920,7 +920,9 @@ public class CKQueryProvider extends QueryProvider { .build()); } } - return list; + List strList = new ArrayList<>(); + list.forEach(ele -> strList.add(ele.getWhereField() + " " + ele.getWhereTermAndValue())); + return "(" + String.join(" AND ", strList) + ")"; } private String sqlFix(String sql) { @@ -1018,7 +1020,7 @@ public class CKQueryProvider extends QueryProvider { .build(); } - private List getYWheres(ChartViewFieldDTO y, String originField, String fieldAlias) { + private String getYWheres(ChartViewFieldDTO y, String originField, String fieldAlias) { List list = new ArrayList<>(); if (CollectionUtils.isNotEmpty(y.getFilter()) && y.getFilter().size() > 0) { y.getFilter().forEach(f -> { @@ -1062,7 +1064,9 @@ public class CKQueryProvider extends QueryProvider { } }); } - return list; + List strList = new ArrayList<>(); + list.forEach(ele -> strList.add(ele.getWhereField() + " " + ele.getWhereTermAndValue())); + return CollectionUtils.isNotEmpty(list) ? "(" + String.join(" " + getLogic(y.getLogic()) + " ", strList) + ")" : null; } private String calcFieldRegex(String originField, SQLObj tableObj) { @@ -1096,4 +1100,14 @@ public class CKQueryProvider extends QueryProvider { return sql; } } + + private String getLogic(String logic) { + switch (logic) { + case "and": + return "AND"; + case "or": + return "OR"; + } + return "AND"; + } } diff --git a/backend/src/main/java/io/dataease/provider/query/db2/Db2QueryProvider.java b/backend/src/main/java/io/dataease/provider/query/db2/Db2QueryProvider.java index 7cf3aac5d0..708950ef11 100644 --- a/backend/src/main/java/io/dataease/provider/query/db2/Db2QueryProvider.java +++ b/backend/src/main/java/io/dataease/provider/query/db2/Db2QueryProvider.java @@ -7,7 +7,8 @@ import io.dataease.base.domain.Datasource; import io.dataease.base.mapper.DatasetTableFieldMapper; import io.dataease.commons.constants.DeTypeConstants; import io.dataease.controller.request.chart.ChartExtFilterRequest; -import io.dataease.dto.chart.ChartCustomFilterDTO; +import io.dataease.dto.chart.ChartCustomFilterItemDTO; +import io.dataease.dto.chart.ChartFieldCustomFilterDTO; import io.dataease.dto.chart.ChartViewFieldDTO; import io.dataease.dto.sqlObj.SQLObj; import io.dataease.provider.query.QueryProvider; @@ -26,6 +27,7 @@ import java.text.SimpleDateFormat; import java.util.*; import java.util.regex.Matcher; import java.util.regex.Pattern; +import java.util.stream.Collectors; import static io.dataease.provider.query.SQLConstants.TABLE_ALIAS_PREFIX; @@ -76,7 +78,7 @@ public class Db2QueryProvider extends QueryProvider { } @Override - public String createQuerySQL(String table, List fields, boolean isGroup, Datasource ds, List customFilter) { + public String createQuerySQL(String table, List fields, boolean isGroup, Datasource ds, List fieldCustomFilter) { SQLObj tableObj = SQLObj.builder() .tableName((table.startsWith("(") && table.endsWith(")")) ? table : String.format(Db2Constants.KEYWORD_TABLE, table)) .tableAlias(String.format(TABLE_ALIAS_PREFIX, 0)) @@ -139,41 +141,40 @@ public class Db2QueryProvider extends QueryProvider { } @Override - public String createQuerySQLAsTmp(String sql, List fields, boolean isGroup, List customFilter) { - return createQuerySQL("(" + sqlFix(sql) + ")", fields, isGroup, null, customFilter); + public String createQuerySQLAsTmp(String sql, List fields, boolean isGroup, List fieldCustomFilter) { + return createQuerySQL("(" + sqlFix(sql) + ")", fields, isGroup, null, fieldCustomFilter); } @Override - public String createQueryTableWithPage(String table, List fields, Integer page, Integer pageSize, Integer realSize, boolean isGroup, Datasource ds, List customFilter) { + public String createQueryTableWithPage(String table, List fields, Integer page, Integer pageSize, Integer realSize, boolean isGroup, Datasource ds, List fieldCustomFilter) { Integer size = (page - 1) * pageSize + realSize; - return createQuerySQL(table, fields, isGroup, null, customFilter) + String.format(" fetch first %s rows only; ", size); + return createQuerySQL(table, fields, isGroup, null, fieldCustomFilter) + String.format(" fetch first %s rows only; ", size); } @Override - public String createQueryTableWithLimit(String table, List fields, Integer limit, boolean isGroup, Datasource ds, List customFilter) { - return createQuerySQL(table, fields, isGroup, null, customFilter) + String.format(" fetch first %s rows only; ", limit); + public String createQueryTableWithLimit(String table, List fields, Integer limit, boolean isGroup, Datasource ds, List fieldCustomFilter) { + return createQuerySQL(table, fields, isGroup, null, fieldCustomFilter) + String.format(" fetch first %s rows only; ", limit); } @Override - public String createQuerySqlWithLimit(String sql, List fields, Integer limit, boolean isGroup, List customFilter) { - return createQuerySQLAsTmp(sql, fields, isGroup, customFilter) + String.format(" fetch first %s rows only; ", limit); + public String createQuerySqlWithLimit(String sql, List fields, Integer limit, boolean isGroup, List fieldCustomFilter) { + return createQuerySQLAsTmp(sql, fields, isGroup, fieldCustomFilter) + String.format(" fetch first %s rows only; ", limit); } @Override - public String createQuerySQLWithPage(String sql, List fields, Integer page, Integer pageSize, Integer realSize, boolean isGroup, List customFilter) { + public String createQuerySQLWithPage(String sql, List fields, Integer page, Integer pageSize, Integer realSize, boolean isGroup, List fieldCustomFilter) { Integer size = (page - 1) * pageSize + realSize; - return createQuerySQLAsTmp(sql, fields, isGroup, customFilter) + String.format(" fetch first %s rows only; ", size); + return createQuerySQLAsTmp(sql, fields, isGroup, fieldCustomFilter) + String.format(" fetch first %s rows only; ", size); } @Override - public String getSQL(String table, List xAxis, List yAxis, List customFilter, List extFilterRequestList, Datasource ds, ChartViewWithBLOBs view) { + public String getSQL(String table, List xAxis, List yAxis, List fieldCustomFilter, List extFilterRequestList, Datasource ds, ChartViewWithBLOBs view) { System.out.println(table); SQLObj tableObj = SQLObj.builder() .tableName((table.startsWith("(") && table.endsWith(")")) ? table : String.format(Db2Constants.KEYWORD_TABLE, table)) .tableAlias(String.format(TABLE_ALIAS_PREFIX, 0)) .build(); List xFields = new ArrayList<>(); - List xWheres = new ArrayList<>(); List xOrders = new ArrayList<>(); if (CollectionUtils.isNotEmpty(xAxis)) { for (int i = 0; i < xAxis.size(); i++) { @@ -202,7 +203,7 @@ public class Db2QueryProvider extends QueryProvider { } } List yFields = new ArrayList<>(); - List yWheres = new ArrayList<>(); + List yWheres = new ArrayList<>(); List yOrders = new ArrayList<>(); if (CollectionUtils.isNotEmpty(yAxis)) { for (int i = 0; i < yAxis.size(); i++) { @@ -220,7 +221,7 @@ public class Db2QueryProvider extends QueryProvider { // 处理纵轴字段 yFields.add(getYFields(y, originField, fieldAlias)); // 处理纵轴过滤 - yWheres.addAll(getYWheres(y, originField, fieldAlias)); + yWheres.add(getYWheres(y, originField, fieldAlias)); // 处理纵轴排序 if (StringUtils.isNotEmpty(y.getSort()) && !StringUtils.equalsIgnoreCase(y.getSort(), "none")) { yOrders.add(SQLObj.builder() @@ -232,25 +233,24 @@ public class Db2QueryProvider extends QueryProvider { } } // 处理视图中字段过滤 - List customWheres = transCustomFilterList(tableObj, customFilter); + String customWheres = transCustomFilterList(tableObj, fieldCustomFilter); // 处理仪表板字段过滤 - List extWheres = transExtFilterList(tableObj, extFilterRequestList); + String extWheres = transExtFilterList(tableObj, extFilterRequestList); // 构建sql所有参数 List fields = new ArrayList<>(); fields.addAll(xFields); fields.addAll(yFields); - List wheres = new ArrayList<>(); - wheres.addAll(xWheres); - if (customWheres != null) wheres.addAll(customWheres); - if (extWheres != null) wheres.addAll(extWheres); + List wheres = new ArrayList<>(); + if (customWheres != null) wheres.add(customWheres); + if (extWheres != null) wheres.add(extWheres); 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); + 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"); @@ -272,13 +272,12 @@ public class Db2QueryProvider extends QueryProvider { } @Override - public String getSQLTableInfo(String table, List xAxis, List customFilter, List extFilterRequestList, Datasource ds, ChartViewWithBLOBs view) { + public String getSQLTableInfo(String table, List xAxis, List fieldCustomFilter, List extFilterRequestList, Datasource ds, ChartViewWithBLOBs view) { SQLObj tableObj = SQLObj.builder() .tableName((table.startsWith("(") && table.endsWith(")")) ? table : String.format(Db2Constants.KEYWORD_TABLE, table)) .tableAlias(String.format(TABLE_ALIAS_PREFIX, 0)) .build(); List xFields = new ArrayList<>(); - List xWheres = new ArrayList<>(); List xOrders = new ArrayList<>(); if (CollectionUtils.isNotEmpty(xAxis)) { for (int i = 0; i < xAxis.size(); i++) { @@ -307,16 +306,15 @@ public class Db2QueryProvider extends QueryProvider { } } // 处理视图中字段过滤 - List customWheres = transCustomFilterList(tableObj, customFilter); + String customWheres = transCustomFilterList(tableObj, fieldCustomFilter); // 处理仪表板字段过滤 - List extWheres = transExtFilterList(tableObj, extFilterRequestList); + String extWheres = transExtFilterList(tableObj, extFilterRequestList); // 构建sql所有参数 List fields = new ArrayList<>(); fields.addAll(xFields); - List wheres = new ArrayList<>(); - wheres.addAll(xWheres); - if (customWheres != null) wheres.addAll(customWheres); - if (extWheres != null) wheres.addAll(extWheres); + List wheres = new ArrayList<>(); + if (customWheres != null) wheres.add(customWheres); + if (extWheres != null) wheres.add(extWheres); List groups = new ArrayList<>(); groups.addAll(xFields); // 外层再次套sql @@ -343,24 +341,23 @@ public class Db2QueryProvider extends QueryProvider { } @Override - public String getSQLAsTmpTableInfo(String sql, List xAxis, List customFilter, List extFilterRequestList, Datasource ds, ChartViewWithBLOBs view) { - return getSQLTableInfo("(" + sqlFix(sql) + ")", xAxis, customFilter, extFilterRequestList, null, view); + public String getSQLAsTmpTableInfo(String sql, List xAxis, List fieldCustomFilter, List extFilterRequestList, Datasource ds, ChartViewWithBLOBs view) { + return getSQLTableInfo("(" + sqlFix(sql) + ")", xAxis, fieldCustomFilter, extFilterRequestList, null, view); } @Override - public String getSQLAsTmp(String sql, List xAxis, List yAxis, List customFilter, List extFilterRequestList, ChartViewWithBLOBs view) { - return getSQL("(" + sqlFix(sql) + ")", xAxis, yAxis, customFilter, extFilterRequestList, null, view); + public String getSQLAsTmp(String sql, List xAxis, List yAxis, List fieldCustomFilter, List extFilterRequestList, ChartViewWithBLOBs view) { + return getSQL("(" + sqlFix(sql) + ")", xAxis, yAxis, fieldCustomFilter, extFilterRequestList, null, view); } @Override - public String getSQLStack(String table, List xAxis, List yAxis, List customFilter, List extFilterRequestList, List extStack, Datasource ds, ChartViewWithBLOBs view) { + public String getSQLStack(String table, List xAxis, List yAxis, List fieldCustomFilter, 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(); List xFields = new ArrayList<>(); - List xWheres = new ArrayList<>(); List xOrders = new ArrayList<>(); List xList = new ArrayList<>(); xList.addAll(xAxis); @@ -392,7 +389,7 @@ public class Db2QueryProvider extends QueryProvider { } } List yFields = new ArrayList<>(); - List yWheres = new ArrayList<>(); + List yWheres = new ArrayList<>(); List yOrders = new ArrayList<>(); if (CollectionUtils.isNotEmpty(yAxis)) { for (int i = 0; i < yAxis.size(); i++) { @@ -410,7 +407,7 @@ public class Db2QueryProvider extends QueryProvider { // 处理纵轴字段 yFields.add(getYFields(y, originField, fieldAlias)); // 处理纵轴过滤 - yWheres.addAll(getYWheres(y, originField, fieldAlias)); + yWheres.add(getYWheres(y, originField, fieldAlias)); // 处理纵轴排序 if (StringUtils.isNotEmpty(y.getSort()) && !StringUtils.equalsIgnoreCase(y.getSort(), "none")) { yOrders.add(SQLObj.builder() @@ -422,25 +419,24 @@ public class Db2QueryProvider extends QueryProvider { } } // 处理视图中字段过滤 - List customWheres = transCustomFilterList(tableObj, customFilter); + String customWheres = transCustomFilterList(tableObj, fieldCustomFilter); // 处理仪表板字段过滤 - List extWheres = transExtFilterList(tableObj, extFilterRequestList); + String extWheres = transExtFilterList(tableObj, extFilterRequestList); // 构建sql所有参数 List fields = new ArrayList<>(); fields.addAll(xFields); fields.addAll(yFields); - List wheres = new ArrayList<>(); - wheres.addAll(xWheres); - if (customWheres != null) wheres.addAll(customWheres); - if (extWheres != null) wheres.addAll(extWheres); + List wheres = new ArrayList<>(); + if (customWheres != null) wheres.add(customWheres); + if (extWheres != null) wheres.add(extWheres); 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); + 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"); @@ -462,18 +458,17 @@ public class Db2QueryProvider extends QueryProvider { } @Override - public String getSQLAsTmpStack(String table, List xAxis, List yAxis, List customFilter, List extFilterRequestList, List extStack, ChartViewWithBLOBs view) { - return getSQLStack("(" + sqlFix(table) + ")", xAxis, yAxis, customFilter, extFilterRequestList, extStack, null, view); + public String getSQLAsTmpStack(String table, List xAxis, List yAxis, List fieldCustomFilter, List extFilterRequestList, List extStack, ChartViewWithBLOBs view) { + return getSQLStack("(" + sqlFix(table) + ")", xAxis, yAxis, fieldCustomFilter, extFilterRequestList, extStack, null, view); } @Override - public String getSQLScatter(String table, List xAxis, List yAxis, List customFilter, List extFilterRequestList, List extBubble, Datasource ds, ChartViewWithBLOBs view) { + public String getSQLScatter(String table, List xAxis, List yAxis, List fieldCustomFilter, List extFilterRequestList, List extBubble, 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(); List xFields = new ArrayList<>(); - List xWheres = new ArrayList<>(); List xOrders = new ArrayList<>(); if (CollectionUtils.isNotEmpty(xAxis)) { for (int i = 0; i < xAxis.size(); i++) { @@ -502,7 +497,7 @@ public class Db2QueryProvider extends QueryProvider { } } List yFields = new ArrayList<>(); - List yWheres = new ArrayList<>(); + List yWheres = new ArrayList<>(); List yOrders = new ArrayList<>(); List yList = new ArrayList<>(); yList.addAll(yAxis); @@ -523,7 +518,7 @@ public class Db2QueryProvider extends QueryProvider { // 处理纵轴字段 yFields.add(getYFields(y, originField, fieldAlias)); // 处理纵轴过滤 - yWheres.addAll(getYWheres(y, originField, fieldAlias)); + yWheres.add(getYWheres(y, originField, fieldAlias)); // 处理纵轴排序 if (StringUtils.isNotEmpty(y.getSort()) && !StringUtils.equalsIgnoreCase(y.getSort(), "none")) { yOrders.add(SQLObj.builder() @@ -535,25 +530,24 @@ public class Db2QueryProvider extends QueryProvider { } } // 处理视图中字段过滤 - List customWheres = transCustomFilterList(tableObj, customFilter); + String customWheres = transCustomFilterList(tableObj, fieldCustomFilter); // 处理仪表板字段过滤 - List extWheres = transExtFilterList(tableObj, extFilterRequestList); + String extWheres = transExtFilterList(tableObj, extFilterRequestList); // 构建sql所有参数 List fields = new ArrayList<>(); fields.addAll(xFields); fields.addAll(yFields); - List wheres = new ArrayList<>(); - wheres.addAll(xWheres); - if (customWheres != null) wheres.addAll(customWheres); - if (extWheres != null) wheres.addAll(extWheres); + List wheres = new ArrayList<>(); + if (customWheres != null) wheres.add(customWheres); + if (extWheres != null) wheres.add(extWheres); 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); + 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"); @@ -575,8 +569,8 @@ public class Db2QueryProvider extends QueryProvider { } @Override - public String getSQLAsTmpScatter(String table, List xAxis, List yAxis, List customFilter, List extFilterRequestList, List extBubble, ChartViewWithBLOBs view) { - return getSQLScatter("(" + sqlFix(table) + ")", xAxis, yAxis, customFilter, extFilterRequestList, extBubble, null, view); + public String getSQLAsTmpScatter(String table, List xAxis, List yAxis, List fieldCustomFilter, List extFilterRequestList, List extBubble, ChartViewWithBLOBs view) { + return getSQLScatter("(" + sqlFix(table) + ")", xAxis, yAxis, fieldCustomFilter, extFilterRequestList, extBubble, null, view); } @Override @@ -585,14 +579,14 @@ public class Db2QueryProvider extends QueryProvider { } @Override - public String getSQLSummary(String table, List yAxis, List customFilter, List extFilterRequestList, ChartViewWithBLOBs view) { + public String getSQLSummary(String table, List yAxis, List fieldCustomFilter, List extFilterRequestList, 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(); List yFields = new ArrayList<>(); - List yWheres = new ArrayList<>(); + List yWheres = new ArrayList<>(); List yOrders = new ArrayList<>(); if (CollectionUtils.isNotEmpty(yAxis)) { for (int i = 0; i < yAxis.size(); i++) { @@ -610,7 +604,7 @@ public class Db2QueryProvider extends QueryProvider { // 处理纵轴字段 yFields.add(getYFields(y, originField, fieldAlias)); // 处理纵轴过滤 - yWheres.addAll(getYWheres(y, originField, fieldAlias)); + yWheres.add(getYWheres(y, originField, fieldAlias)); // 处理纵轴排序 if (StringUtils.isNotEmpty(y.getSort()) && !StringUtils.equalsIgnoreCase(y.getSort(), "none")) { yOrders.add(SQLObj.builder() @@ -622,21 +616,21 @@ public class Db2QueryProvider extends QueryProvider { } } // 处理视图中字段过滤 - List customWheres = transCustomFilterList(tableObj, customFilter); + String customWheres = transCustomFilterList(tableObj, fieldCustomFilter); // 处理仪表板字段过滤 - List extWheres = transExtFilterList(tableObj, extFilterRequestList); + String extWheres = transExtFilterList(tableObj, extFilterRequestList); // 构建sql所有参数 List fields = new ArrayList<>(); fields.addAll(yFields); - List wheres = new ArrayList<>(); - if (customWheres != null) wheres.addAll(customWheres); - if (extWheres != null) wheres.addAll(extWheres); + List wheres = new ArrayList<>(); + if (customWheres != null) wheres.add(customWheres); + if (extWheres != null) wheres.add(extWheres); List groups = new ArrayList<>(); // 外层再次套sql List orders = new ArrayList<>(); orders.addAll(yOrders); - List aggWheres = new ArrayList<>(); - aggWheres.addAll(yWheres); + 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"); @@ -657,8 +651,8 @@ public class Db2QueryProvider extends QueryProvider { } @Override - public String getSQLSummaryAsTmp(String sql, List yAxis, List customFilter, List extFilterRequestList, ChartViewWithBLOBs view) { - return getSQLSummary("(" + sqlFix(sql) + ")", yAxis, customFilter, extFilterRequestList, view); + public String getSQLSummaryAsTmp(String sql, List yAxis, List fieldCustomFilter, List extFilterRequestList, ChartViewWithBLOBs view) { + return getSQLSummary("(" + sqlFix(sql) + ")", yAxis, fieldCustomFilter, extFilterRequestList, view); } @Override @@ -728,72 +722,80 @@ public class Db2QueryProvider extends QueryProvider { } } - public List transCustomFilterList(SQLObj tableObj, List requestList) { + public String transCustomFilterList(SQLObj tableObj, List requestList) { if (CollectionUtils.isEmpty(requestList)) { return null; } - List list = new ArrayList<>(); - for (ChartCustomFilterDTO request : requestList) { + List res = new ArrayList<>(); + for (ChartFieldCustomFilterDTO request : requestList) { + List list = new ArrayList<>(); DatasetTableField field = request.getField(); - if (ObjectUtils.isEmpty(field)) { - continue; - } - String value = request.getValue(); - String whereName = ""; - String whereTerm = transMysqlFilterTerm(request.getTerm()); - String whereValue = ""; - String originName; - if (ObjectUtils.isNotEmpty(field.getExtField()) && field.getExtField() == 2) { - // 解析origin name中有关联的字段生成sql表达式 - originName = calcFieldRegex(field.getOriginName(), tableObj); - } else if (ObjectUtils.isNotEmpty(field.getExtField()) && field.getExtField() == 1) { - originName = String.format(Db2Constants.KEYWORD_FIX, tableObj.getTableAlias(), field.getOriginName()); - } else { - originName = String.format(Db2Constants.KEYWORD_FIX, tableObj.getTableAlias(), field.getOriginName()); - } - if (field.getDeType() == DeTypeConstants.DE_TIME) { - if (field.getDeExtractType() == DeTypeConstants.DE_STRING || field.getDeExtractType() == 5) { - originName = String.format(Db2Constants.STR_TO_DATE, originName); - whereName = String.format(Db2Constants.DATE_FORMAT, originName, Db2Constants.DEFAULT_DATE_FORMAT); + List filter = request.getFilter(); + for (ChartCustomFilterItemDTO filterItemDTO : filter) { + if (ObjectUtils.isEmpty(field)) { + continue; } - if (field.getDeExtractType() == DeTypeConstants.DE_INT || field.getDeExtractType() == DeTypeConstants.DE_FLOAT) { - String cast = String.format(Db2Constants.CAST, originName, Db2Constants.DEFAULT_INT_FORMAT); - whereName = String.format(Db2Constants.FROM_UNIXTIME, cast, Db2Constants.DEFAULT_DATE_FORMAT); + String value = filterItemDTO.getValue(); + String whereName = ""; + String whereTerm = transMysqlFilterTerm(filterItemDTO.getTerm()); + String whereValue = ""; + String originName; + if (ObjectUtils.isNotEmpty(field.getExtField()) && field.getExtField() == 2) { + // 解析origin name中有关联的字段生成sql表达式 + originName = calcFieldRegex(field.getOriginName(), tableObj); + } else if (ObjectUtils.isNotEmpty(field.getExtField()) && field.getExtField() == 1) { + originName = String.format(Db2Constants.KEYWORD_FIX, tableObj.getTableAlias(), field.getOriginName()); + } else { + originName = String.format(Db2Constants.KEYWORD_FIX, tableObj.getTableAlias(), field.getOriginName()); } - if (field.getDeExtractType() == DeTypeConstants.DE_TIME) { + if (field.getDeType() == DeTypeConstants.DE_TIME) { + if (field.getDeExtractType() == DeTypeConstants.DE_STRING || field.getDeExtractType() == 5) { + originName = String.format(Db2Constants.STR_TO_DATE, originName); + whereName = String.format(Db2Constants.DATE_FORMAT, originName, Db2Constants.DEFAULT_DATE_FORMAT); + } + if (field.getDeExtractType() == DeTypeConstants.DE_INT || field.getDeExtractType() == DeTypeConstants.DE_FLOAT) { + String cast = String.format(Db2Constants.CAST, originName, Db2Constants.DEFAULT_INT_FORMAT); + whereName = String.format(Db2Constants.FROM_UNIXTIME, cast, Db2Constants.DEFAULT_DATE_FORMAT); + } + if (field.getDeExtractType() == DeTypeConstants.DE_TIME) { + whereName = originName; + } + } else { whereName = originName; } - } else { - whereName = originName; - } - if (StringUtils.equalsIgnoreCase(request.getTerm(), "null")) { - whereValue = ""; - } else if (StringUtils.equalsIgnoreCase(request.getTerm(), "not_null")) { - whereValue = ""; - } else if (StringUtils.equalsIgnoreCase(request.getTerm(), "empty")) { - whereValue = "''"; - } else if (StringUtils.equalsIgnoreCase(request.getTerm(), "not_empty")) { - whereValue = "''"; - } else if (StringUtils.containsIgnoreCase(request.getTerm(), "in")) { - whereValue = "('" + StringUtils.join(value, "','") + "')"; - } else if (StringUtils.containsIgnoreCase(request.getTerm(), "like")) { - whereValue = "'%" + value + "%'"; - } else { - if(field.getDeType().equals(DeTypeConstants.DE_TIME)){ - whereValue = String.format(Db2Constants.DATE_FORMAT, "'" + value + "'", Db2Constants.DEFAULT_DATE_FORMAT);; - }else { - whereValue = String.format(Db2Constants.WHERE_VALUE_VALUE, value); + if (StringUtils.equalsIgnoreCase(filterItemDTO.getTerm(), "null")) { + whereValue = ""; + } else if (StringUtils.equalsIgnoreCase(filterItemDTO.getTerm(), "not_null")) { + whereValue = ""; + } else if (StringUtils.equalsIgnoreCase(filterItemDTO.getTerm(), "empty")) { + whereValue = "''"; + } else if (StringUtils.equalsIgnoreCase(filterItemDTO.getTerm(), "not_empty")) { + whereValue = "''"; + } else if (StringUtils.containsIgnoreCase(filterItemDTO.getTerm(), "in")) { + whereValue = "('" + StringUtils.join(value, "','") + "')"; + } else if (StringUtils.containsIgnoreCase(filterItemDTO.getTerm(), "like")) { + whereValue = "'%" + value + "%'"; + } else { + if (field.getDeType().equals(DeTypeConstants.DE_TIME)) { + whereValue = String.format(Db2Constants.DATE_FORMAT, "'" + value + "'", Db2Constants.DEFAULT_DATE_FORMAT); + } else { + whereValue = String.format(Db2Constants.WHERE_VALUE_VALUE, value); + } } + list.add(SQLObj.builder() + .whereField(whereName) + .whereTermAndValue(whereTerm + whereValue) + .build()); } - list.add(SQLObj.builder() - .whereField(whereName) - .whereTermAndValue(whereTerm + whereValue) - .build()); + + List strList = new ArrayList<>(); + list.forEach(ele -> strList.add(ele.getWhereField() + " " + ele.getWhereTermAndValue())); + res.add("(" + String.join(" " + getLogic(request.getLogic()) + " ", strList) + ")"); } - return list; + return "(" + String.join(" AND ", res) + ")"; } - public List transExtFilterList(SQLObj tableObj, List requestList) { + public String transExtFilterList(SQLObj tableObj, List requestList) { if (CollectionUtils.isEmpty(requestList)) { return null; } @@ -856,7 +858,9 @@ public class Db2QueryProvider extends QueryProvider { .whereTermAndValue(whereTerm + whereValue) .build()); } - return list; + List strList = new ArrayList<>(); + list.forEach(ele -> strList.add(ele.getWhereField() + " " + ele.getWhereTermAndValue())); + return "(" + String.join(" AND ", strList) + ")"; } private String sqlFix(String sql) { @@ -951,7 +955,7 @@ public class Db2QueryProvider extends QueryProvider { .build(); } - private List getYWheres(ChartViewFieldDTO y, String originField, String fieldAlias) { + private String getYWheres(ChartViewFieldDTO y, String originField, String fieldAlias) { List list = new ArrayList<>(); if (CollectionUtils.isNotEmpty(y.getFilter()) && y.getFilter().size() > 0) { y.getFilter().forEach(f -> { @@ -971,9 +975,10 @@ public class Db2QueryProvider extends QueryProvider { } else if (StringUtils.containsIgnoreCase(f.getTerm(), "like")) { whereValue = "'%" + f.getValue() + "%'"; } else { - if(y.getDeType().equals(DeTypeConstants.DE_TIME)){ - whereValue = String.format(Db2Constants.DATE_FORMAT, "'" + f.getValue() + "'", Db2Constants.DEFAULT_DATE_FORMAT);; - }else { + if (y.getDeType().equals(DeTypeConstants.DE_TIME)) { + whereValue = String.format(Db2Constants.DATE_FORMAT, "'" + f.getValue() + "'", Db2Constants.DEFAULT_DATE_FORMAT); + ; + } else { whereValue = String.format(Db2Constants.WHERE_VALUE_VALUE, f.getValue()); } } @@ -984,7 +989,9 @@ public class Db2QueryProvider extends QueryProvider { .build()); }); } - return list; + List strList = new ArrayList<>(); + list.forEach(ele -> strList.add(ele.getWhereField() + " " + ele.getWhereTermAndValue())); + return CollectionUtils.isNotEmpty(list) ? "(" + String.join(" " + getLogic(y.getLogic()) + " ", strList) + ")" : null; } private String calcFieldRegex(String originField, SQLObj tableObj) { @@ -1018,4 +1025,14 @@ public class Db2QueryProvider extends QueryProvider { return sql; } } + + private String getLogic(String logic) { + switch (logic) { + case "and": + return "AND"; + case "or": + return "OR"; + } + return "AND"; + } } diff --git a/backend/src/main/java/io/dataease/provider/query/doris/DorisQueryProvider.java b/backend/src/main/java/io/dataease/provider/query/doris/DorisQueryProvider.java index c4130e0015..3ec5ea30ed 100644 --- a/backend/src/main/java/io/dataease/provider/query/doris/DorisQueryProvider.java +++ b/backend/src/main/java/io/dataease/provider/query/doris/DorisQueryProvider.java @@ -6,7 +6,8 @@ import io.dataease.base.domain.DatasetTableFieldExample; import io.dataease.base.domain.Datasource; import io.dataease.base.mapper.DatasetTableFieldMapper; import io.dataease.controller.request.chart.ChartExtFilterRequest; -import io.dataease.dto.chart.ChartCustomFilterDTO; +import io.dataease.dto.chart.ChartCustomFilterItemDTO; +import io.dataease.dto.chart.ChartFieldCustomFilterDTO; import io.dataease.dto.chart.ChartViewFieldDTO; import io.dataease.dto.sqlObj.SQLObj; import io.dataease.provider.query.QueryProvider; @@ -25,6 +26,7 @@ import java.text.SimpleDateFormat; import java.util.*; import java.util.regex.Matcher; import java.util.regex.Pattern; +import java.util.stream.Collectors; import static io.dataease.provider.query.SQLConstants.TABLE_ALIAS_PREFIX; @@ -78,7 +80,7 @@ public class DorisQueryProvider extends QueryProvider { } @Override - public String createQuerySQL(String table, List fields, boolean isGroup, Datasource ds, List customFilter) { + public String createQuerySQL(String table, List fields, boolean isGroup, Datasource ds, List fieldCustomFilter) { SQLObj tableObj = SQLObj.builder() .tableName((table.startsWith("(") && table.endsWith(")")) ? table : String.format(DorisConstants.KEYWORD_TABLE, table)) .tableAlias(String.format(TABLE_ALIAS_PREFIX, 0)) @@ -140,9 +142,9 @@ public class DorisQueryProvider extends QueryProvider { st_sql.add("isGroup", isGroup); if (CollectionUtils.isNotEmpty(xFields)) st_sql.add("groups", xFields); if (ObjectUtils.isNotEmpty(tableObj)) st_sql.add("table", tableObj); - List customWheres = transCustomFilterList(tableObj, customFilter); - List wheres = new ArrayList<>(); - if (customWheres != null) wheres.addAll(customWheres); + String customWheres = transCustomFilterList(tableObj, fieldCustomFilter); + List wheres = new ArrayList<>(); + if (customWheres != null) wheres.add(customWheres); if (CollectionUtils.isNotEmpty(wheres)) st_sql.add("filters", wheres); if ((fields.size() > 0)) { @@ -157,38 +159,37 @@ public class DorisQueryProvider extends QueryProvider { } @Override - public String createQuerySQLAsTmp(String sql, List fields, boolean isGroup, List customFilter) { - return createQuerySQL("(" + sql + ")", fields, isGroup, null, customFilter); + public String createQuerySQLAsTmp(String sql, List fields, boolean isGroup, List fieldCustomFilter) { + return createQuerySQL("(" + sql + ")", fields, isGroup, null, fieldCustomFilter); } @Override - public String createQueryTableWithPage(String table, List fields, Integer page, Integer pageSize, Integer realSize, boolean isGroup, Datasource ds, List customFilter) { - return createQuerySQL(table, fields, isGroup, null, customFilter) + " LIMIT " + (page - 1) * pageSize + "," + realSize; + public String createQueryTableWithPage(String table, List fields, Integer page, Integer pageSize, Integer realSize, boolean isGroup, Datasource ds, List fieldCustomFilter) { + return createQuerySQL(table, fields, isGroup, null, fieldCustomFilter) + " LIMIT " + (page - 1) * pageSize + "," + realSize; } @Override - public String createQueryTableWithLimit(String table, List fields, Integer limit, boolean isGroup, Datasource ds, List customFilter) { - return createQuerySQL(table, fields, isGroup, null, customFilter) + " LIMIT 0," + limit; + public String createQueryTableWithLimit(String table, List fields, Integer limit, boolean isGroup, Datasource ds, List fieldCustomFilter) { + return createQuerySQL(table, fields, isGroup, null, fieldCustomFilter) + " LIMIT 0," + limit; } @Override - public String createQuerySqlWithLimit(String sql, List fields, Integer limit, boolean isGroup, List customFilter) { - return createQuerySQLAsTmp(sql, fields, isGroup, customFilter) + " LIMIT 0," + limit; + public String createQuerySqlWithLimit(String sql, List fields, Integer limit, boolean isGroup, List fieldCustomFilter) { + return createQuerySQLAsTmp(sql, fields, isGroup, fieldCustomFilter) + " LIMIT 0," + limit; } @Override - public String createQuerySQLWithPage(String sql, List fields, Integer page, Integer pageSize, Integer realSize, boolean isGroup, List customFilter) { - return createQuerySQLAsTmp(sql, fields, isGroup, customFilter) + " LIMIT " + (page - 1) * pageSize + "," + realSize; + public String createQuerySQLWithPage(String sql, List fields, Integer page, Integer pageSize, Integer realSize, boolean isGroup, List fieldCustomFilter) { + return createQuerySQLAsTmp(sql, fields, isGroup, fieldCustomFilter) + " LIMIT " + (page - 1) * pageSize + "," + realSize; } @Override - public String getSQL(String table, List xAxis, List yAxis, List customFilter, List extFilterRequestList, Datasource ds, ChartViewWithBLOBs view) { + public String getSQL(String table, List xAxis, List yAxis, List fieldCustomFilter, List extFilterRequestList, 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 xWheres = new ArrayList<>(); List xOrders = new ArrayList<>(); if (CollectionUtils.isNotEmpty(xAxis)) { for (int i = 0; i < xAxis.size(); i++) { @@ -217,7 +218,7 @@ public class DorisQueryProvider extends QueryProvider { } } List yFields = new ArrayList<>(); - List yWheres = new ArrayList<>(); + List yWheres = new ArrayList<>(); List yOrders = new ArrayList<>(); if (CollectionUtils.isNotEmpty(yAxis)) { for (int i = 0; i < yAxis.size(); i++) { @@ -235,7 +236,7 @@ public class DorisQueryProvider extends QueryProvider { // 处理纵轴字段 yFields.add(getYFields(y, originField, fieldAlias)); // 处理纵轴过滤 - yWheres.addAll(getYWheres(y, originField, fieldAlias)); + yWheres.add(getYWheres(y, originField, fieldAlias)); // 处理纵轴排序 if (StringUtils.isNotEmpty(y.getSort()) && !StringUtils.equalsIgnoreCase(y.getSort(), "none")) { yOrders.add(SQLObj.builder() @@ -247,25 +248,24 @@ public class DorisQueryProvider extends QueryProvider { } } // 处理视图中字段过滤 - List customWheres = transCustomFilterList(tableObj, customFilter); + String customWheres = transCustomFilterList(tableObj, fieldCustomFilter); // 处理仪表板字段过滤 - List extWheres = transExtFilterList(tableObj, extFilterRequestList); + String extWheres = transExtFilterList(tableObj, extFilterRequestList); // 构建sql所有参数 List fields = new ArrayList<>(); fields.addAll(xFields); fields.addAll(yFields); - List wheres = new ArrayList<>(); - wheres.addAll(xWheres); - if (customWheres != null) wheres.addAll(customWheres); - if (extWheres != null) wheres.addAll(extWheres); + List wheres = new ArrayList<>(); + if (customWheres != null) wheres.add(customWheres); + if (extWheres != null) wheres.add(extWheres); 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); + 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"); @@ -287,13 +287,12 @@ public class DorisQueryProvider extends QueryProvider { } @Override - public String getSQLTableInfo(String table, List xAxis, List customFilter, List extFilterRequestList, Datasource ds, ChartViewWithBLOBs view) { + public String getSQLTableInfo(String table, List xAxis, List fieldCustomFilter, List extFilterRequestList, 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 xWheres = new ArrayList<>(); List xOrders = new ArrayList<>(); if (CollectionUtils.isNotEmpty(xAxis)) { for (int i = 0; i < xAxis.size(); i++) { @@ -322,16 +321,15 @@ public class DorisQueryProvider extends QueryProvider { } } // 处理视图中字段过滤 - List customWheres = transCustomFilterList(tableObj, customFilter); + String customWheres = transCustomFilterList(tableObj, fieldCustomFilter); // 处理仪表板字段过滤 - List extWheres = transExtFilterList(tableObj, extFilterRequestList); + String extWheres = transExtFilterList(tableObj, extFilterRequestList); // 构建sql所有参数 List fields = new ArrayList<>(); fields.addAll(xFields); - List wheres = new ArrayList<>(); - wheres.addAll(xWheres); - if (customWheres != null) wheres.addAll(customWheres); - if (extWheres != null) wheres.addAll(extWheres); + List wheres = new ArrayList<>(); + if (customWheres != null) wheres.add(customWheres); + if (extWheres != null) wheres.add(extWheres); List groups = new ArrayList<>(); groups.addAll(xFields); // 外层再次套sql @@ -358,23 +356,22 @@ public class DorisQueryProvider extends QueryProvider { } @Override - public String getSQLAsTmpTableInfo(String sql, List xAxis, List customFilter, List extFilterRequestList, Datasource ds, ChartViewWithBLOBs view) { - return getSQLTableInfo("(" + sqlFix(sql) + ")", xAxis, customFilter, extFilterRequestList, null, view); + public String getSQLAsTmpTableInfo(String sql, List xAxis, List fieldCustomFilter, List extFilterRequestList, Datasource ds, ChartViewWithBLOBs view) { + return getSQLTableInfo("(" + sqlFix(sql) + ")", xAxis, fieldCustomFilter, extFilterRequestList, null, view); } @Override - public String getSQLAsTmp(String sql, List xAxis, List yAxis, List customFilter, List extFilterRequestList, ChartViewWithBLOBs view) { - return getSQL("(" + sql + ")", xAxis, yAxis, customFilter, extFilterRequestList, null, view); + public String getSQLAsTmp(String sql, List xAxis, List yAxis, List fieldCustomFilter, List extFilterRequestList, ChartViewWithBLOBs view) { + return getSQL("(" + sql + ")", xAxis, yAxis, fieldCustomFilter, extFilterRequestList, null, view); } @Override - public String getSQLStack(String table, List xAxis, List yAxis, List customFilter, List extFilterRequestList, List extStack, Datasource ds, ChartViewWithBLOBs view) { + public String getSQLStack(String table, List xAxis, List yAxis, List fieldCustomFilter, 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 xWheres = new ArrayList<>(); List xOrders = new ArrayList<>(); List xList = new ArrayList<>(); xList.addAll(xAxis); @@ -406,7 +403,7 @@ public class DorisQueryProvider extends QueryProvider { } } List yFields = new ArrayList<>(); - List yWheres = new ArrayList<>(); + List yWheres = new ArrayList<>(); List yOrders = new ArrayList<>(); if (CollectionUtils.isNotEmpty(yAxis)) { for (int i = 0; i < yAxis.size(); i++) { @@ -424,7 +421,7 @@ public class DorisQueryProvider extends QueryProvider { // 处理纵轴字段 yFields.add(getYFields(y, originField, fieldAlias)); // 处理纵轴过滤 - yWheres.addAll(getYWheres(y, originField, fieldAlias)); + yWheres.add(getYWheres(y, originField, fieldAlias)); // 处理纵轴排序 if (StringUtils.isNotEmpty(y.getSort()) && !StringUtils.equalsIgnoreCase(y.getSort(), "none")) { yOrders.add(SQLObj.builder() @@ -436,25 +433,24 @@ public class DorisQueryProvider extends QueryProvider { } } // 处理视图中字段过滤 - List customWheres = transCustomFilterList(tableObj, customFilter); + String customWheres = transCustomFilterList(tableObj, fieldCustomFilter); // 处理仪表板字段过滤 - List extWheres = transExtFilterList(tableObj, extFilterRequestList); + String extWheres = transExtFilterList(tableObj, extFilterRequestList); // 构建sql所有参数 List fields = new ArrayList<>(); fields.addAll(xFields); fields.addAll(yFields); - List wheres = new ArrayList<>(); - wheres.addAll(xWheres); - if (customWheres != null) wheres.addAll(customWheres); - if (extWheres != null) wheres.addAll(extWheres); + List wheres = new ArrayList<>(); + if (customWheres != null) wheres.add(customWheres); + if (extWheres != null) wheres.add(extWheres); 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); + 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"); @@ -476,18 +472,17 @@ public class DorisQueryProvider extends QueryProvider { } @Override - public String getSQLAsTmpStack(String table, List xAxis, List yAxis, List customFilter, List extFilterRequestList, List extStack, ChartViewWithBLOBs view) { - return getSQLStack("(" + table + ")", xAxis, yAxis, customFilter, extFilterRequestList, extStack, null, view); + public String getSQLAsTmpStack(String table, List xAxis, List yAxis, List fieldCustomFilter, List extFilterRequestList, List extStack, ChartViewWithBLOBs view) { + return getSQLStack("(" + table + ")", xAxis, yAxis, fieldCustomFilter, extFilterRequestList, extStack, null, view); } @Override - public String getSQLScatter(String table, List xAxis, List yAxis, List customFilter, List extFilterRequestList, List extBubble, Datasource ds, ChartViewWithBLOBs view) { + public String getSQLScatter(String table, List xAxis, List yAxis, List fieldCustomFilter, List extFilterRequestList, List extBubble, 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 xWheres = new ArrayList<>(); List xOrders = new ArrayList<>(); if (CollectionUtils.isNotEmpty(xAxis)) { for (int i = 0; i < xAxis.size(); i++) { @@ -516,7 +511,7 @@ public class DorisQueryProvider extends QueryProvider { } } List yFields = new ArrayList<>(); - List yWheres = new ArrayList<>(); + List yWheres = new ArrayList<>(); List yOrders = new ArrayList<>(); List yList = new ArrayList<>(); yList.addAll(yAxis); @@ -537,7 +532,7 @@ public class DorisQueryProvider extends QueryProvider { // 处理纵轴字段 yFields.add(getYFields(y, originField, fieldAlias)); // 处理纵轴过滤 - yWheres.addAll(getYWheres(y, originField, fieldAlias)); + yWheres.add(getYWheres(y, originField, fieldAlias)); // 处理纵轴排序 if (StringUtils.isNotEmpty(y.getSort()) && !StringUtils.equalsIgnoreCase(y.getSort(), "none")) { yOrders.add(SQLObj.builder() @@ -549,25 +544,24 @@ public class DorisQueryProvider extends QueryProvider { } } // 处理视图中字段过滤 - List customWheres = transCustomFilterList(tableObj, customFilter); + String customWheres = transCustomFilterList(tableObj, fieldCustomFilter); // 处理仪表板字段过滤 - List extWheres = transExtFilterList(tableObj, extFilterRequestList); + String extWheres = transExtFilterList(tableObj, extFilterRequestList); // 构建sql所有参数 List fields = new ArrayList<>(); fields.addAll(xFields); fields.addAll(yFields); - List wheres = new ArrayList<>(); - wheres.addAll(xWheres); - if (customWheres != null) wheres.addAll(customWheres); - if (extWheres != null) wheres.addAll(extWheres); + List wheres = new ArrayList<>(); + if (customWheres != null) wheres.add(customWheres); + if (extWheres != null) wheres.add(extWheres); 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); + 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"); @@ -589,8 +583,8 @@ public class DorisQueryProvider extends QueryProvider { } @Override - public String getSQLAsTmpScatter(String table, List xAxis, List yAxis, List customFilter, List extFilterRequestList, List extBubble, ChartViewWithBLOBs view) { - return getSQLScatter("(" + table + ")", xAxis, yAxis, customFilter, extFilterRequestList, extBubble, null, view); + public String getSQLAsTmpScatter(String table, List xAxis, List yAxis, List fieldCustomFilter, List extFilterRequestList, List extBubble, ChartViewWithBLOBs view) { + return getSQLScatter("(" + table + ")", xAxis, yAxis, fieldCustomFilter, extFilterRequestList, extBubble, null, view); } @Override @@ -599,14 +593,14 @@ public class DorisQueryProvider extends QueryProvider { } @Override - public String getSQLSummary(String table, List yAxis, List customFilter, List extFilterRequestList, ChartViewWithBLOBs view) { + public String getSQLSummary(String table, List yAxis, List fieldCustomFilter, List extFilterRequestList, 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 yFields = new ArrayList<>(); - List yWheres = new ArrayList<>(); + List yWheres = new ArrayList<>(); List yOrders = new ArrayList<>(); if (CollectionUtils.isNotEmpty(yAxis)) { for (int i = 0; i < yAxis.size(); i++) { @@ -624,7 +618,7 @@ public class DorisQueryProvider extends QueryProvider { // 处理纵轴字段 yFields.add(getYFields(y, originField, fieldAlias)); // 处理纵轴过滤 - yWheres.addAll(getYWheres(y, originField, fieldAlias)); + yWheres.add(getYWheres(y, originField, fieldAlias)); // 处理纵轴排序 if (StringUtils.isNotEmpty(y.getSort()) && !StringUtils.equalsIgnoreCase(y.getSort(), "none")) { yOrders.add(SQLObj.builder() @@ -636,21 +630,21 @@ public class DorisQueryProvider extends QueryProvider { } } // 处理视图中字段过滤 - List customWheres = transCustomFilterList(tableObj, customFilter); + String customWheres = transCustomFilterList(tableObj, fieldCustomFilter); // 处理仪表板字段过滤 - List extWheres = transExtFilterList(tableObj, extFilterRequestList); + String extWheres = transExtFilterList(tableObj, extFilterRequestList); // 构建sql所有参数 List fields = new ArrayList<>(); fields.addAll(yFields); - List wheres = new ArrayList<>(); - if (customWheres != null) wheres.addAll(customWheres); - if (extWheres != null) wheres.addAll(extWheres); + List wheres = new ArrayList<>(); + if (customWheres != null) wheres.add(customWheres); + if (extWheres != null) wheres.add(extWheres); List groups = new ArrayList<>(); // 外层再次套sql List orders = new ArrayList<>(); orders.addAll(yOrders); - List aggWheres = new ArrayList<>(); - aggWheres.addAll(yWheres); + 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"); @@ -671,8 +665,8 @@ public class DorisQueryProvider extends QueryProvider { } @Override - public String getSQLSummaryAsTmp(String sql, List yAxis, List customFilter, List extFilterRequestList, ChartViewWithBLOBs view) { - return getSQLSummary("(" + sql + ")", yAxis, customFilter, extFilterRequestList, view); + public String getSQLSummaryAsTmp(String sql, List yAxis, List fieldCustomFilter, List extFilterRequestList, ChartViewWithBLOBs view) { + return getSQLSummary("(" + sql + ")", yAxis, fieldCustomFilter, extFilterRequestList, view); } @Override @@ -749,72 +743,81 @@ public class DorisQueryProvider extends QueryProvider { } } - public List transCustomFilterList(SQLObj tableObj, List requestList) { + public String transCustomFilterList(SQLObj tableObj, List requestList) { if (CollectionUtils.isEmpty(requestList)) { return null; } - List list = new ArrayList<>(); - for (ChartCustomFilterDTO request : requestList) { + List res = new ArrayList<>(); + + for (ChartFieldCustomFilterDTO request : requestList) { + List list = new ArrayList<>(); DatasetTableField field = request.getField(); - if (ObjectUtils.isEmpty(field)) { - continue; - } - String value = request.getValue(); - String whereName = ""; - String whereTerm = transMysqlFilterTerm(request.getTerm()); - String whereValue = ""; - - String originName; - if (ObjectUtils.isNotEmpty(field.getExtField()) && field.getExtField() == 2) { - // 解析origin name中有关联的字段生成sql表达式 - originName = calcFieldRegex(field.getOriginName(), tableObj); - } else if (ObjectUtils.isNotEmpty(field.getExtField()) && field.getExtField() == 1) { - originName = String.format(DorisConstants.KEYWORD_FIX, tableObj.getTableAlias(), field.getDataeaseName()); - } else { - originName = String.format(DorisConstants.KEYWORD_FIX, tableObj.getTableAlias(), field.getDataeaseName()); - } - - if (field.getDeType() == 1) { - if (field.getDeExtractType() == 0 || field.getDeExtractType() == 5 || field.getDeExtractType() == 1) { - whereName = String.format(DorisConstants.STR_TO_DATE, originName, DorisConstants.DEFAULT_DATE_FORMAT); + List filter = request.getFilter(); + for (ChartCustomFilterItemDTO filterItemDTO : filter) { + if (ObjectUtils.isEmpty(field)) { + continue; } - if (field.getDeExtractType() == 2 || field.getDeExtractType() == 3 || field.getDeExtractType() == 4) { - String cast = String.format(DorisConstants.CAST, originName, DorisConstants.DEFAULT_INT_FORMAT) + "/1000"; - whereName = String.format(DorisConstants.FROM_UNIXTIME, cast, DorisConstants.DEFAULT_DATE_FORMAT); - } - } else if (field.getDeType() == 0) { - whereName = String.format(DorisConstants.CAST, originName, DorisConstants.VARCHAR); - } else { - whereName = originName; - } - if (StringUtils.equalsIgnoreCase(request.getTerm(), "null")) { - whereValue = ""; - } else if (StringUtils.equalsIgnoreCase(request.getTerm(), "not_null")) { - whereValue = ""; - } else if (StringUtils.equalsIgnoreCase(request.getTerm(), "empty")) { - whereValue = "''"; - } else if (StringUtils.equalsIgnoreCase(request.getTerm(), "not_empty")) { - whereValue = "''"; - } else if (StringUtils.containsIgnoreCase(request.getTerm(), "in")) { - whereValue = "('" + StringUtils.join(value, "','") + "')"; - } else if (StringUtils.containsIgnoreCase(request.getTerm(), "like")) { - whereValue = "'%" + value + "%'"; - } else { - if (field.getDeExtractType() == 2 || field.getDeExtractType() == 3 || field.getDeExtractType() == 4) { - whereValue = String.format(DorisConstants.WHERE_NUMBER_VALUE, value); + String value = filterItemDTO.getValue(); + String whereName = ""; + String whereTerm = transMysqlFilterTerm(filterItemDTO.getTerm()); + String whereValue = ""; + + String originName; + if (ObjectUtils.isNotEmpty(field.getExtField()) && field.getExtField() == 2) { + // 解析origin name中有关联的字段生成sql表达式 + originName = calcFieldRegex(field.getOriginName(), tableObj); + } else if (ObjectUtils.isNotEmpty(field.getExtField()) && field.getExtField() == 1) { + originName = String.format(DorisConstants.KEYWORD_FIX, tableObj.getTableAlias(), field.getDataeaseName()); } else { - whereValue = String.format(DorisConstants.WHERE_VALUE_VALUE, value); + originName = String.format(DorisConstants.KEYWORD_FIX, tableObj.getTableAlias(), field.getDataeaseName()); } + + if (field.getDeType() == 1) { + if (field.getDeExtractType() == 0 || field.getDeExtractType() == 5 || field.getDeExtractType() == 1) { + whereName = String.format(DorisConstants.STR_TO_DATE, originName, DorisConstants.DEFAULT_DATE_FORMAT); + } + if (field.getDeExtractType() == 2 || field.getDeExtractType() == 3 || field.getDeExtractType() == 4) { + String cast = String.format(DorisConstants.CAST, originName, DorisConstants.DEFAULT_INT_FORMAT) + "/1000"; + whereName = String.format(DorisConstants.FROM_UNIXTIME, cast, DorisConstants.DEFAULT_DATE_FORMAT); + } + } else if (field.getDeType() == 0) { + whereName = String.format(DorisConstants.CAST, originName, DorisConstants.VARCHAR); + } else { + whereName = originName; + } + if (StringUtils.equalsIgnoreCase(filterItemDTO.getTerm(), "null")) { + whereValue = ""; + } else if (StringUtils.equalsIgnoreCase(filterItemDTO.getTerm(), "not_null")) { + whereValue = ""; + } else if (StringUtils.equalsIgnoreCase(filterItemDTO.getTerm(), "empty")) { + whereValue = "''"; + } else if (StringUtils.equalsIgnoreCase(filterItemDTO.getTerm(), "not_empty")) { + whereValue = "''"; + } else if (StringUtils.containsIgnoreCase(filterItemDTO.getTerm(), "in")) { + whereValue = "('" + StringUtils.join(value, "','") + "')"; + } else if (StringUtils.containsIgnoreCase(filterItemDTO.getTerm(), "like")) { + whereValue = "'%" + value + "%'"; + } else { + if (field.getDeExtractType() == 2 || field.getDeExtractType() == 3 || field.getDeExtractType() == 4) { + whereValue = String.format(DorisConstants.WHERE_NUMBER_VALUE, value); + } else { + whereValue = String.format(DorisConstants.WHERE_VALUE_VALUE, value); + } + } + list.add(SQLObj.builder() + .whereField(whereName) + .whereTermAndValue(whereTerm + whereValue) + .build()); } - list.add(SQLObj.builder() - .whereField(whereName) - .whereTermAndValue(whereTerm + whereValue) - .build()); + + List strList = new ArrayList<>(); + list.forEach(ele -> strList.add(ele.getWhereField() + " " + ele.getWhereTermAndValue())); + res.add("(" + String.join(" " + getLogic(request.getLogic()) + " ", strList) + ")"); } - return list; + return "(" + String.join(" AND ", res) + ")"; } - public List transExtFilterList(SQLObj tableObj, List requestList) { + public String transExtFilterList(SQLObj tableObj, List requestList) { if (CollectionUtils.isEmpty(requestList)) { return null; } @@ -879,7 +882,9 @@ public class DorisQueryProvider extends QueryProvider { .whereTermAndValue(whereTerm + whereValue) .build()); } - return list; + List strList = new ArrayList<>(); + list.forEach(ele -> strList.add(ele.getWhereField() + " " + ele.getWhereTermAndValue())); + return "(" + String.join(" AND ", strList) + ")"; } private String transDateFormat(String dateStyle, String datePattern) { @@ -1008,7 +1013,7 @@ public class DorisQueryProvider extends QueryProvider { .build(); } - private List getYWheres(ChartViewFieldDTO y, String originField, String fieldAlias) { + private String getYWheres(ChartViewFieldDTO y, String originField, String fieldAlias) { List list = new ArrayList<>(); if (CollectionUtils.isNotEmpty(y.getFilter()) && y.getFilter().size() > 0) { y.getFilter().forEach(f -> { @@ -1037,7 +1042,9 @@ public class DorisQueryProvider extends QueryProvider { .build()); }); } - return list; + List strList = new ArrayList<>(); + list.forEach(ele -> strList.add(ele.getWhereField() + " " + ele.getWhereTermAndValue())); + return CollectionUtils.isNotEmpty(list) ? "(" + String.join(" " + getLogic(y.getLogic()) + " ", strList) + ")" : null; } private String calcFieldRegex(String originField, SQLObj tableObj) { @@ -1071,4 +1078,14 @@ public class DorisQueryProvider extends QueryProvider { return sql; } } + + private String getLogic(String logic) { + switch (logic) { + case "and": + return "AND"; + case "or": + return "OR"; + } + return "AND"; + } } diff --git a/backend/src/main/java/io/dataease/provider/query/es/EsQueryProvider.java b/backend/src/main/java/io/dataease/provider/query/es/EsQueryProvider.java index 4e2f79bb9e..c4e87b62cd 100644 --- a/backend/src/main/java/io/dataease/provider/query/es/EsQueryProvider.java +++ b/backend/src/main/java/io/dataease/provider/query/es/EsQueryProvider.java @@ -7,7 +7,8 @@ import io.dataease.base.domain.Datasource; import io.dataease.base.mapper.DatasetTableFieldMapper; import io.dataease.commons.constants.DeTypeConstants; import io.dataease.controller.request.chart.ChartExtFilterRequest; -import io.dataease.dto.chart.ChartCustomFilterDTO; +import io.dataease.dto.chart.ChartCustomFilterItemDTO; +import io.dataease.dto.chart.ChartFieldCustomFilterDTO; import io.dataease.dto.chart.ChartViewFieldDTO; import io.dataease.dto.sqlObj.SQLObj; import io.dataease.provider.query.QueryProvider; @@ -26,6 +27,7 @@ import java.text.SimpleDateFormat; import java.util.*; import java.util.regex.Matcher; import java.util.regex.Pattern; +import java.util.stream.Collectors; import static io.dataease.provider.query.SQLConstants.TABLE_ALIAS_PREFIX; @@ -110,7 +112,7 @@ public class EsQueryProvider extends QueryProvider { } @Override - public String createQuerySQL(String table, List fields, boolean isGroup, Datasource ds, List customFilter) { + public String createQuerySQL(String table, List fields, boolean isGroup, Datasource ds, List fieldCustomFilter) { SQLObj tableObj = SQLObj.builder() .tableName((table.startsWith("(") && table.endsWith(")")) ? table : String.format(EsSqlLConstants.KEYWORD_TABLE, table)) .tableAlias(String.format(TABLE_ALIAS_PREFIX, 0)) @@ -170,47 +172,46 @@ public class EsQueryProvider extends QueryProvider { if (CollectionUtils.isNotEmpty(xFields)) st_sql.add("groups", xFields); if (ObjectUtils.isNotEmpty(tableObj)) st_sql.add("table", tableObj); - List customWheres = transCustomFilterList(tableObj, customFilter); - List wheres = new ArrayList<>(); - if (customWheres != null) wheres.addAll(customWheres); + String customWheres = transCustomFilterList(tableObj, fieldCustomFilter); + List wheres = new ArrayList<>(); + if (customWheres != null) wheres.add(customWheres); if (CollectionUtils.isNotEmpty(wheres)) st_sql.add("filters", wheres); return st_sql.render(); } @Override - public String createQuerySQLAsTmp(String sql, List fields, boolean isGroup, List customFilter) { - return createQuerySQL("(" + sqlFix(sql) + ")", fields, isGroup, null, customFilter); + public String createQuerySQLAsTmp(String sql, List fields, boolean isGroup, List fieldCustomFilter) { + return createQuerySQL("(" + sqlFix(sql) + ")", fields, isGroup, null, fieldCustomFilter); } @Override - public String createQueryTableWithPage(String table, List fields, Integer page, Integer pageSize, Integer realSize, boolean isGroup, Datasource ds, List customFilter) { - return createQuerySQL(table, fields, isGroup, null, customFilter); + public String createQueryTableWithPage(String table, List fields, Integer page, Integer pageSize, Integer realSize, boolean isGroup, Datasource ds, List fieldCustomFilter) { + return createQuerySQL(table, fields, isGroup, null, fieldCustomFilter); } @Override - public String createQueryTableWithLimit(String table, List fields, Integer limit, boolean isGroup, Datasource ds, List customFilter) { - return createQuerySQL(table, fields, isGroup, null, customFilter); + public String createQueryTableWithLimit(String table, List fields, Integer limit, boolean isGroup, Datasource ds, List fieldCustomFilter) { + return createQuerySQL(table, fields, isGroup, null, fieldCustomFilter); } @Override - public String createQuerySqlWithLimit(String sql, List fields, Integer limit, boolean isGroup, List customFilter) { - return createQuerySQLAsTmp(sql, fields, isGroup, customFilter); + public String createQuerySqlWithLimit(String sql, List fields, Integer limit, boolean isGroup, List fieldCustomFilter) { + return createQuerySQLAsTmp(sql, fields, isGroup, fieldCustomFilter); } @Override - public String createQuerySQLWithPage(String sql, List fields, Integer page, Integer pageSize, Integer realSize, boolean isGroup, List customFilter) { - return createQuerySQLAsTmp(sql, fields, isGroup, customFilter); + public String createQuerySQLWithPage(String sql, List fields, Integer page, Integer pageSize, Integer realSize, boolean isGroup, List fieldCustomFilter) { + return createQuerySQLAsTmp(sql, fields, isGroup, fieldCustomFilter); } @Override - public String getSQL(String table, List xAxis, List yAxis, List customFilter, List extFilterRequestList, Datasource ds, ChartViewWithBLOBs view) { + public String getSQL(String table, List xAxis, List yAxis, List fieldCustomFilter, List extFilterRequestList, 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 xWheres = new ArrayList<>(); List xOrders = new ArrayList<>(); if (CollectionUtils.isNotEmpty(xAxis)) { for (int i = 0; i < xAxis.size(); i++) { @@ -239,7 +240,7 @@ public class EsQueryProvider extends QueryProvider { } } List yFields = new ArrayList<>(); - List yWheres = new ArrayList<>(); + List yWheres = new ArrayList<>(); List yOrders = new ArrayList<>(); if (CollectionUtils.isNotEmpty(yAxis)) { for (int i = 0; i < yAxis.size(); i++) { @@ -257,7 +258,7 @@ public class EsQueryProvider extends QueryProvider { // 处理纵轴字段 yFields.add(getYFields(y, originField, fieldAlias)); // 处理纵轴过滤 - yWheres.addAll(getYWheres(y, originField, fieldAlias)); + yWheres.add(getYWheres(y, originField, fieldAlias)); // 处理纵轴排序 if (StringUtils.isNotEmpty(y.getSort()) && !StringUtils.equalsIgnoreCase(y.getSort(), "none")) { yOrders.add(SQLObj.builder() @@ -269,25 +270,24 @@ public class EsQueryProvider extends QueryProvider { } } // 处理视图中字段过滤 - List customWheres = transCustomFilterList(tableObj, customFilter); + String customWheres = transCustomFilterList(tableObj, fieldCustomFilter); // 处理仪表板字段过滤 - List extWheres = transExtFilterList(tableObj, extFilterRequestList); + String extWheres = transExtFilterList(tableObj, extFilterRequestList); // 构建sql所有参数 List fields = new ArrayList<>(); fields.addAll(xFields); fields.addAll(yFields); - List wheres = new ArrayList<>(); - wheres.addAll(xWheres); - if (customWheres != null) wheres.addAll(customWheres); - if (extWheres != null) wheres.addAll(extWheres); + List wheres = new ArrayList<>(); + if (customWheres != null) wheres.add(customWheres); + if (extWheres != null) wheres.add(extWheres); 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); + 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"); @@ -310,28 +310,27 @@ public class EsQueryProvider extends QueryProvider { @Override - public String getSQLAsTmp(String sql, List xAxis, List yAxis, List customFilter, List extFilterRequestList, ChartViewWithBLOBs view) { - return getSQL("(" + sqlFix(sql) + ")", xAxis, yAxis, customFilter, extFilterRequestList, null, view); + public String getSQLAsTmp(String sql, List xAxis, List yAxis, List fieldCustomFilter, List extFilterRequestList, ChartViewWithBLOBs view) { + return getSQL("(" + sqlFix(sql) + ")", xAxis, yAxis, fieldCustomFilter, extFilterRequestList, null, view); } @Override - public String getSQLTableInfo(String table, List xAxis, List customFilter, List extFilterRequestList, Datasource ds, ChartViewWithBLOBs view) { + public String getSQLTableInfo(String table, List xAxis, List fieldCustomFilter, List extFilterRequestList, Datasource ds, ChartViewWithBLOBs view) { return null; } @Override - public String getSQLAsTmpTableInfo(String sql, List xAxis, List customFilter, List extFilterRequestList, Datasource ds, ChartViewWithBLOBs view) { + public String getSQLAsTmpTableInfo(String sql, List xAxis, List fieldCustomFilter, List extFilterRequestList, Datasource ds, ChartViewWithBLOBs view) { return null; } @Override - public String getSQLStack(String table, List xAxis, List yAxis, List customFilter, List extFilterRequestList, List extStack, Datasource ds, ChartViewWithBLOBs view) { + public String getSQLStack(String table, List xAxis, List yAxis, List fieldCustomFilter, 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 xWheres = new ArrayList<>(); List xOrders = new ArrayList<>(); List xList = new ArrayList<>(); xList.addAll(xAxis); @@ -363,7 +362,7 @@ public class EsQueryProvider extends QueryProvider { } } List yFields = new ArrayList<>(); - List yWheres = new ArrayList<>(); + List yWheres = new ArrayList<>(); List yOrders = new ArrayList<>(); if (CollectionUtils.isNotEmpty(yAxis)) { for (int i = 0; i < yAxis.size(); i++) { @@ -381,7 +380,7 @@ public class EsQueryProvider extends QueryProvider { // 处理纵轴字段 yFields.add(getYFields(y, originField, fieldAlias)); // 处理纵轴过滤 - yWheres.addAll(getYWheres(y, originField, fieldAlias)); + yWheres.add(getYWheres(y, originField, fieldAlias)); // 处理纵轴排序 if (StringUtils.isNotEmpty(y.getSort()) && !StringUtils.equalsIgnoreCase(y.getSort(), "none")) { yOrders.add(SQLObj.builder() @@ -393,25 +392,24 @@ public class EsQueryProvider extends QueryProvider { } } // 处理视图中字段过滤 - List customWheres = transCustomFilterList(tableObj, customFilter); + String customWheres = transCustomFilterList(tableObj, fieldCustomFilter); // 处理仪表板字段过滤 - List extWheres = transExtFilterList(tableObj, extFilterRequestList); + String extWheres = transExtFilterList(tableObj, extFilterRequestList); // 构建sql所有参数 List fields = new ArrayList<>(); fields.addAll(xFields); fields.addAll(yFields); - List wheres = new ArrayList<>(); - wheres.addAll(xWheres); - if (customWheres != null) wheres.addAll(customWheres); - if (extWheres != null) wheres.addAll(extWheres); + List wheres = new ArrayList<>(); + if (customWheres != null) wheres.add(customWheres); + if (extWheres != null) wheres.add(extWheres); 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); + 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"); @@ -433,18 +431,17 @@ public class EsQueryProvider extends QueryProvider { } @Override - public String getSQLAsTmpStack(String table, List xAxis, List yAxis, List customFilter, List extFilterRequestList, List extStack, ChartViewWithBLOBs view) { - return getSQLStack("(" + sqlFix(table) + ")", xAxis, yAxis, customFilter, extFilterRequestList, extStack, null, view); + public String getSQLAsTmpStack(String table, List xAxis, List yAxis, List fieldCustomFilter, List extFilterRequestList, List extStack, ChartViewWithBLOBs view) { + return getSQLStack("(" + sqlFix(table) + ")", xAxis, yAxis, fieldCustomFilter, extFilterRequestList, extStack, null, view); } @Override - public String getSQLScatter(String table, List xAxis, List yAxis, List customFilter, List extFilterRequestList, List extBubble, Datasource ds, ChartViewWithBLOBs view) { + public String getSQLScatter(String table, List xAxis, List yAxis, List fieldCustomFilter, List extFilterRequestList, List extBubble, 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 xWheres = new ArrayList<>(); List xOrders = new ArrayList<>(); if (CollectionUtils.isNotEmpty(xAxis)) { for (int i = 0; i < xAxis.size(); i++) { @@ -473,7 +470,7 @@ public class EsQueryProvider extends QueryProvider { } } List yFields = new ArrayList<>(); - List yWheres = new ArrayList<>(); + List yWheres = new ArrayList<>(); List yOrders = new ArrayList<>(); List yList = new ArrayList<>(); yList.addAll(yAxis); @@ -494,7 +491,7 @@ public class EsQueryProvider extends QueryProvider { // 处理纵轴字段 yFields.add(getYFields(y, originField, fieldAlias)); // 处理纵轴过滤 - yWheres.addAll(getYWheres(y, originField, fieldAlias)); + yWheres.add(getYWheres(y, originField, fieldAlias)); // 处理纵轴排序 if (StringUtils.isNotEmpty(y.getSort()) && !StringUtils.equalsIgnoreCase(y.getSort(), "none")) { yOrders.add(SQLObj.builder() @@ -506,25 +503,24 @@ public class EsQueryProvider extends QueryProvider { } } // 处理视图中字段过滤 - List customWheres = transCustomFilterList(tableObj, customFilter); + String customWheres = transCustomFilterList(tableObj, fieldCustomFilter); // 处理仪表板字段过滤 - List extWheres = transExtFilterList(tableObj, extFilterRequestList); + String extWheres = transExtFilterList(tableObj, extFilterRequestList); // 构建sql所有参数 List fields = new ArrayList<>(); fields.addAll(xFields); fields.addAll(yFields); - List wheres = new ArrayList<>(); - wheres.addAll(xWheres); - if (customWheres != null) wheres.addAll(customWheres); - if (extWheres != null) wheres.addAll(extWheres); + List wheres = new ArrayList<>(); + if (customWheres != null) wheres.add(customWheres); + if (extWheres != null) wheres.add(extWheres); 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); + 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"); @@ -546,8 +542,8 @@ public class EsQueryProvider extends QueryProvider { } @Override - public String getSQLAsTmpScatter(String table, List xAxis, List yAxis, List customFilter, List extFilterRequestList, List extBubble, ChartViewWithBLOBs view) { - return getSQLScatter("(" + sqlFix(table) + ")", xAxis, yAxis, customFilter, extFilterRequestList, extBubble, null, view); + public String getSQLAsTmpScatter(String table, List xAxis, List yAxis, List fieldCustomFilter, List extFilterRequestList, List extBubble, ChartViewWithBLOBs view) { + return getSQLScatter("(" + sqlFix(table) + ")", xAxis, yAxis, fieldCustomFilter, extFilterRequestList, extBubble, null, view); } @Override @@ -556,14 +552,14 @@ public class EsQueryProvider extends QueryProvider { } @Override - public String getSQLSummary(String table, List yAxis, List customFilter, List extFilterRequestList, ChartViewWithBLOBs view) { + public String getSQLSummary(String table, List yAxis, List fieldCustomFilter, List extFilterRequestList, 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 yFields = new ArrayList<>(); - List yWheres = new ArrayList<>(); + List yWheres = new ArrayList<>(); List yOrders = new ArrayList<>(); if (CollectionUtils.isNotEmpty(yAxis)) { for (int i = 0; i < yAxis.size(); i++) { @@ -581,7 +577,7 @@ public class EsQueryProvider extends QueryProvider { // 处理纵轴字段 yFields.add(getYFields(y, originField, fieldAlias)); // 处理纵轴过滤 - yWheres.addAll(getYWheres(y, originField, fieldAlias)); + yWheres.add(getYWheres(y, originField, fieldAlias)); // 处理纵轴排序 if (StringUtils.isNotEmpty(y.getSort()) && !StringUtils.equalsIgnoreCase(y.getSort(), "none")) { yOrders.add(SQLObj.builder() @@ -593,21 +589,21 @@ public class EsQueryProvider extends QueryProvider { } } // 处理视图中字段过滤 - List customWheres = transCustomFilterList(tableObj, customFilter); + String customWheres = transCustomFilterList(tableObj, fieldCustomFilter); // 处理仪表板字段过滤 - List extWheres = transExtFilterList(tableObj, extFilterRequestList); + String extWheres = transExtFilterList(tableObj, extFilterRequestList); // 构建sql所有参数 List fields = new ArrayList<>(); fields.addAll(yFields); - List wheres = new ArrayList<>(); - if (customWheres != null) wheres.addAll(customWheres); - if (extWheres != null) wheres.addAll(extWheres); + List wheres = new ArrayList<>(); + if (customWheres != null) wheres.add(customWheres); + if (extWheres != null) wheres.add(extWheres); List groups = new ArrayList<>(); // 外层再次套sql List orders = new ArrayList<>(); orders.addAll(yOrders); - List aggWheres = new ArrayList<>(); - aggWheres.addAll(yWheres); + 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"); @@ -628,8 +624,8 @@ public class EsQueryProvider extends QueryProvider { } @Override - public String getSQLSummaryAsTmp(String sql, List yAxis, List customFilter, List extFilterRequestList, ChartViewWithBLOBs view) { - return getSQLSummary("(" + sqlFix(sql) + ")", yAxis, customFilter, extFilterRequestList, view); + public String getSQLSummaryAsTmp(String sql, List yAxis, List fieldCustomFilter, List extFilterRequestList, ChartViewWithBLOBs view) { + return getSQLSummary("(" + sqlFix(sql) + ")", yAxis, fieldCustomFilter, extFilterRequestList, view); } @Override @@ -699,67 +695,76 @@ public class EsQueryProvider extends QueryProvider { } } - public List transCustomFilterList(SQLObj tableObj, List requestList) { + public String transCustomFilterList(SQLObj tableObj, List requestList) { if (CollectionUtils.isEmpty(requestList)) { return null; } - List list = new ArrayList<>(); - for (ChartCustomFilterDTO request : requestList) { + + List res = new ArrayList<>(); + for (ChartFieldCustomFilterDTO request : requestList) { + List list = new ArrayList<>(); DatasetTableField field = request.getField(); - if (ObjectUtils.isEmpty(field)) { - continue; - } - String value = request.getValue(); - String whereName = ""; - String whereTerm = transMysqlFilterTerm(request.getTerm()); - String whereValue = ""; - String originName; - if (ObjectUtils.isNotEmpty(field.getExtField()) && field.getExtField() == 2) { - // 解析origin name中有关联的字段生成sql表达式 - originName = calcFieldRegex(field.getOriginName(), tableObj); - } else if (ObjectUtils.isNotEmpty(field.getExtField()) && field.getExtField() == 1) { - originName = String.format(EsSqlLConstants.KEYWORD_FIX, tableObj.getTableAlias(), field.getOriginName()); - } else { - originName = String.format(EsSqlLConstants.KEYWORD_FIX, tableObj.getTableAlias(), field.getOriginName()); - } - if (field.getDeType() == DeTypeConstants.DE_TIME) { - if (field.getDeExtractType() == 0 || field.getDeExtractType() == 5) { - whereName = String.format(EsSqlLConstants.CAST, originName, "timestamp"); + List filter = request.getFilter(); + for (ChartCustomFilterItemDTO filterItemDTO : filter) { + if (ObjectUtils.isEmpty(field)) { + continue; } - if (field.getDeExtractType() == DeTypeConstants.DE_INT || field.getDeExtractType() == DeTypeConstants.DE_FLOAT || field.getDeExtractType() == DeTypeConstants.DE_BOOL) { - String cast = String.format(EsSqlLConstants.CAST, originName, "timestamp"); - whereName = String.format(EsSqlLConstants.DATETIME_FORMAT, cast, EsSqlLConstants.DEFAULT_DATE_FORMAT); + String value = filterItemDTO.getValue(); + String whereName = ""; + String whereTerm = transMysqlFilterTerm(filterItemDTO.getTerm()); + String whereValue = ""; + String originName; + if (ObjectUtils.isNotEmpty(field.getExtField()) && field.getExtField() == 2) { + // 解析origin name中有关联的字段生成sql表达式 + originName = calcFieldRegex(field.getOriginName(), tableObj); + } else if (ObjectUtils.isNotEmpty(field.getExtField()) && field.getExtField() == 1) { + originName = String.format(EsSqlLConstants.KEYWORD_FIX, tableObj.getTableAlias(), field.getOriginName()); + } else { + originName = String.format(EsSqlLConstants.KEYWORD_FIX, tableObj.getTableAlias(), field.getOriginName()); } - if (field.getDeExtractType() == 1) { + if (field.getDeType() == DeTypeConstants.DE_TIME) { + if (field.getDeExtractType() == 0 || field.getDeExtractType() == 5) { + whereName = String.format(EsSqlLConstants.CAST, originName, "timestamp"); + } + if (field.getDeExtractType() == DeTypeConstants.DE_INT || field.getDeExtractType() == DeTypeConstants.DE_FLOAT || field.getDeExtractType() == DeTypeConstants.DE_BOOL) { + String cast = String.format(EsSqlLConstants.CAST, originName, "timestamp"); + whereName = String.format(EsSqlLConstants.DATETIME_FORMAT, cast, EsSqlLConstants.DEFAULT_DATE_FORMAT); + } + if (field.getDeExtractType() == 1) { + whereName = originName; + } + } else { whereName = originName; } - } else { - whereName = originName; + if (StringUtils.equalsIgnoreCase(filterItemDTO.getTerm(), "null")) { + whereValue = ""; + } else if (StringUtils.equalsIgnoreCase(filterItemDTO.getTerm(), "not_null")) { + whereValue = ""; + } else if (StringUtils.equalsIgnoreCase(filterItemDTO.getTerm(), "empty")) { + whereValue = "''"; + } else if (StringUtils.equalsIgnoreCase(filterItemDTO.getTerm(), "not_empty")) { + whereValue = "''"; + } else if (StringUtils.containsIgnoreCase(filterItemDTO.getTerm(), "in")) { + whereValue = "('" + StringUtils.join(value, "','") + "')"; + } else if (StringUtils.containsIgnoreCase(filterItemDTO.getTerm(), "like")) { + whereValue = "'%" + value + "%'"; + } else { + whereValue = String.format(EsSqlLConstants.WHERE_VALUE_VALUE, value); + } + list.add(SQLObj.builder() + .whereField(whereName) + .whereTermAndValue(whereTerm + whereValue) + .build()); } - if (StringUtils.equalsIgnoreCase(request.getTerm(), "null")) { - whereValue = ""; - } else if (StringUtils.equalsIgnoreCase(request.getTerm(), "not_null")) { - whereValue = ""; - } else if (StringUtils.equalsIgnoreCase(request.getTerm(), "empty")) { - whereValue = "''"; - } else if (StringUtils.equalsIgnoreCase(request.getTerm(), "not_empty")) { - whereValue = "''"; - } else if (StringUtils.containsIgnoreCase(request.getTerm(), "in")) { - whereValue = "('" + StringUtils.join(value, "','") + "')"; - } else if (StringUtils.containsIgnoreCase(request.getTerm(), "like")) { - whereValue = "'%" + value + "%'"; - } else { - whereValue = String.format(EsSqlLConstants.WHERE_VALUE_VALUE, value); - } - list.add(SQLObj.builder() - .whereField(whereName) - .whereTermAndValue(whereTerm + whereValue) - .build()); + + List strList = new ArrayList<>(); + list.forEach(ele -> strList.add(ele.getWhereField() + " " + ele.getWhereTermAndValue())); + res.add("(" + String.join(" " + getLogic(request.getLogic()) + " ", strList) + ")"); } - return list; + return "(" + String.join(" AND ", res) + ")"; } - public List transExtFilterList(SQLObj tableObj, List requestList) { + public String transExtFilterList(SQLObj tableObj, List requestList) { if (CollectionUtils.isEmpty(requestList)) { return null; } @@ -821,7 +826,9 @@ public class EsQueryProvider extends QueryProvider { .whereTermAndValue(whereTerm + whereValue) .build()); } - return list; + List strList = new ArrayList<>(); + list.forEach(ele -> strList.add(ele.getWhereField() + " " + ele.getWhereTermAndValue())); + return "(" + String.join(" AND ", strList) + ")"; } private String sqlFix(String sql) { @@ -916,7 +923,7 @@ public class EsQueryProvider extends QueryProvider { .build(); } - private List getYWheres(ChartViewFieldDTO y, String originField, String fieldAlias) { + private String getYWheres(ChartViewFieldDTO y, String originField, String fieldAlias) { List list = new ArrayList<>(); if (CollectionUtils.isNotEmpty(y.getFilter()) && y.getFilter().size() > 0) { y.getFilter().forEach(f -> { @@ -945,7 +952,9 @@ public class EsQueryProvider extends QueryProvider { .build()); }); } - return list; + List strList = new ArrayList<>(); + list.forEach(ele -> strList.add(ele.getWhereField() + " " + ele.getWhereTermAndValue())); + return CollectionUtils.isNotEmpty(list) ? "(" + String.join(" " + getLogic(y.getLogic()) + " ", strList) + ")" : null; } private String calcFieldRegex(String originField, SQLObj tableObj) { @@ -979,4 +988,14 @@ public class EsQueryProvider extends QueryProvider { return sql; } } + + private String getLogic(String logic) { + switch (logic) { + case "and": + return "AND"; + case "or": + return "OR"; + } + return "AND"; + } } diff --git a/backend/src/main/java/io/dataease/provider/query/hive/HiveQueryProvider.java b/backend/src/main/java/io/dataease/provider/query/hive/HiveQueryProvider.java index e59de722c7..f9eef586e2 100644 --- a/backend/src/main/java/io/dataease/provider/query/hive/HiveQueryProvider.java +++ b/backend/src/main/java/io/dataease/provider/query/hive/HiveQueryProvider.java @@ -7,7 +7,8 @@ import io.dataease.base.domain.Datasource; import io.dataease.base.mapper.DatasetTableFieldMapper; import io.dataease.commons.constants.DeTypeConstants; import io.dataease.controller.request.chart.ChartExtFilterRequest; -import io.dataease.dto.chart.ChartCustomFilterDTO; +import io.dataease.dto.chart.ChartCustomFilterItemDTO; +import io.dataease.dto.chart.ChartFieldCustomFilterDTO; import io.dataease.dto.chart.ChartViewFieldDTO; import io.dataease.dto.sqlObj.SQLObj; import io.dataease.provider.query.QueryProvider; @@ -26,6 +27,7 @@ import java.text.SimpleDateFormat; import java.util.*; import java.util.regex.Matcher; import java.util.regex.Pattern; +import java.util.stream.Collectors; import static io.dataease.provider.query.SQLConstants.TABLE_ALIAS_PREFIX; @@ -71,7 +73,7 @@ public class HiveQueryProvider extends QueryProvider { } @Override - public String createQuerySQL(String table, List fields, boolean isGroup, Datasource ds, List customFilter) { + public String createQuerySQL(String table, List fields, boolean isGroup, Datasource ds, List fieldCustomFilter) { SQLObj tableObj = SQLObj.builder() .tableName((table.startsWith("(") && table.endsWith(")")) ? table : String.format(HiveConstants.KEYWORD_TABLE, table)) .tableAlias(String.format(TABLE_ALIAS_PREFIX, 0)) @@ -130,46 +132,45 @@ public class HiveQueryProvider extends QueryProvider { st_sql.add("isGroup", isGroup); if (CollectionUtils.isNotEmpty(xFields)) st_sql.add("groups", xFields); if (ObjectUtils.isNotEmpty(tableObj)) st_sql.add("table", tableObj); - List customWheres = transCustomFilterList(tableObj, customFilter); - List wheres = new ArrayList<>(); - if (customWheres != null) wheres.addAll(customWheres); + String customWheres = transCustomFilterList(tableObj, fieldCustomFilter); + List wheres = new ArrayList<>(); + if (customWheres != null) wheres.add(customWheres); if (CollectionUtils.isNotEmpty(wheres)) st_sql.add("filters", wheres); return st_sql.render(); } @Override - public String createQuerySQLAsTmp(String sql, List fields, boolean isGroup, List customFilter) { - return createQuerySQL("(" + sqlFix(sql) + ")", fields, isGroup, null, customFilter); + public String createQuerySQLAsTmp(String sql, List fields, boolean isGroup, List fieldCustomFilter) { + return createQuerySQL("(" + sqlFix(sql) + ")", fields, isGroup, null, fieldCustomFilter); } @Override - public String createQueryTableWithPage(String table, List fields, Integer page, Integer pageSize, Integer realSize, boolean isGroup, Datasource ds, List customFilter) { - return createQuerySQL(table, fields, isGroup, null, customFilter) + " LIMIT " + (page - 1) * pageSize + "," + realSize; + public String createQueryTableWithPage(String table, List fields, Integer page, Integer pageSize, Integer realSize, boolean isGroup, Datasource ds, List fieldCustomFilter) { + return createQuerySQL(table, fields, isGroup, null, fieldCustomFilter) + " LIMIT " + (page - 1) * pageSize + "," + realSize; } @Override - public String createQueryTableWithLimit(String table, List fields, Integer limit, boolean isGroup, Datasource ds, List customFilter) { - return createQuerySQL(table, fields, isGroup, null, customFilter) + " LIMIT 0," + limit; + public String createQueryTableWithLimit(String table, List fields, Integer limit, boolean isGroup, Datasource ds, List fieldCustomFilter) { + return createQuerySQL(table, fields, isGroup, null, fieldCustomFilter) + " LIMIT 0," + limit; } @Override - public String createQuerySqlWithLimit(String sql, List fields, Integer limit, boolean isGroup, List customFilter) { - return createQuerySQLAsTmp(sql, fields, isGroup, customFilter) + " LIMIT 0," + limit; + public String createQuerySqlWithLimit(String sql, List fields, Integer limit, boolean isGroup, List fieldCustomFilter) { + return createQuerySQLAsTmp(sql, fields, isGroup, fieldCustomFilter) + " LIMIT 0," + limit; } @Override - public String createQuerySQLWithPage(String sql, List fields, Integer page, Integer pageSize, Integer realSize, boolean isGroup, List customFilter) { - return createQuerySQLAsTmp(sql, fields, isGroup, customFilter) + " LIMIT " + (page - 1) * pageSize + "," + realSize; + public String createQuerySQLWithPage(String sql, List fields, Integer page, Integer pageSize, Integer realSize, boolean isGroup, List fieldCustomFilter) { + return createQuerySQLAsTmp(sql, fields, isGroup, fieldCustomFilter) + " LIMIT " + (page - 1) * pageSize + "," + realSize; } @Override - public String getSQL(String table, List xAxis, List yAxis, List customFilter, List extFilterRequestList, Datasource ds, ChartViewWithBLOBs view) { + public String getSQL(String table, List xAxis, List yAxis, List fieldCustomFilter, List extFilterRequestList, Datasource ds, ChartViewWithBLOBs view) { SQLObj tableObj = SQLObj.builder() .tableName((table.startsWith("(") && table.endsWith(")")) ? table : String.format(HiveConstants.KEYWORD_TABLE, table)) .tableAlias(String.format(TABLE_ALIAS_PREFIX, 0)) .build(); List xFields = new ArrayList<>(); - List xWheres = new ArrayList<>(); List xOrders = new ArrayList<>(); if (CollectionUtils.isNotEmpty(xAxis)) { for (int i = 0; i < xAxis.size(); i++) { @@ -198,7 +199,7 @@ public class HiveQueryProvider extends QueryProvider { } } List yFields = new ArrayList<>(); - List yWheres = new ArrayList<>(); + List yWheres = new ArrayList<>(); List yOrders = new ArrayList<>(); if (CollectionUtils.isNotEmpty(yAxis)) { for (int i = 0; i < yAxis.size(); i++) { @@ -216,7 +217,7 @@ public class HiveQueryProvider extends QueryProvider { // 处理纵轴字段 yFields.add(getYFields(y, originField, fieldAlias)); // 处理纵轴过滤 - yWheres.addAll(getYWheres(y, originField, fieldAlias)); + yWheres.add(getYWheres(y, originField, fieldAlias)); // 处理纵轴排序 if (StringUtils.isNotEmpty(y.getSort()) && !StringUtils.equalsIgnoreCase(y.getSort(), "none")) { yOrders.add(SQLObj.builder() @@ -228,25 +229,24 @@ public class HiveQueryProvider extends QueryProvider { } } // 处理视图中字段过滤 - List customWheres = transCustomFilterList(tableObj, customFilter); + String customWheres = transCustomFilterList(tableObj, fieldCustomFilter); // 处理仪表板字段过滤 - List extWheres = transExtFilterList(tableObj, extFilterRequestList); + String extWheres = transExtFilterList(tableObj, extFilterRequestList); // 构建sql所有参数 List fields = new ArrayList<>(); fields.addAll(xFields); fields.addAll(yFields); - List wheres = new ArrayList<>(); - wheres.addAll(xWheres); - if (customWheres != null) wheres.addAll(customWheres); - if (extWheres != null) wheres.addAll(extWheres); + List wheres = new ArrayList<>(); + if (customWheres != null) wheres.add(customWheres); + if (extWheres != null) wheres.add(extWheres); 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); + 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"); @@ -268,13 +268,12 @@ public class HiveQueryProvider extends QueryProvider { } @Override - public String getSQLTableInfo(String table, List xAxis, List customFilter, List extFilterRequestList, Datasource ds, ChartViewWithBLOBs view) { + public String getSQLTableInfo(String table, List xAxis, List fieldCustomFilter, List extFilterRequestList, Datasource ds, ChartViewWithBLOBs view) { SQLObj tableObj = SQLObj.builder() .tableName((table.startsWith("(") && table.endsWith(")")) ? table : String.format(HiveConstants.KEYWORD_TABLE, table)) .tableAlias(String.format(TABLE_ALIAS_PREFIX, 0)) .build(); List xFields = new ArrayList<>(); - List xWheres = new ArrayList<>(); List xOrders = new ArrayList<>(); if (CollectionUtils.isNotEmpty(xAxis)) { for (int i = 0; i < xAxis.size(); i++) { @@ -303,16 +302,15 @@ public class HiveQueryProvider extends QueryProvider { } } // 处理视图中字段过滤 - List customWheres = transCustomFilterList(tableObj, customFilter); + String customWheres = transCustomFilterList(tableObj, fieldCustomFilter); // 处理仪表板字段过滤 - List extWheres = transExtFilterList(tableObj, extFilterRequestList); + String extWheres = transExtFilterList(tableObj, extFilterRequestList); // 构建sql所有参数 List fields = new ArrayList<>(); fields.addAll(xFields); - List wheres = new ArrayList<>(); - wheres.addAll(xWheres); - if (customWheres != null) wheres.addAll(customWheres); - if (extWheres != null) wheres.addAll(extWheres); + List wheres = new ArrayList<>(); + if (customWheres != null) wheres.add(customWheres); + if (extWheres != null) wheres.add(extWheres); List groups = new ArrayList<>(); groups.addAll(xFields); // 外层再次套sql @@ -339,24 +337,23 @@ public class HiveQueryProvider extends QueryProvider { } @Override - public String getSQLAsTmpTableInfo(String sql, List xAxis, List customFilter, List extFilterRequestList, Datasource ds, ChartViewWithBLOBs view) { - return getSQLTableInfo("(" + sqlFix(sql) + ")", xAxis, customFilter, extFilterRequestList, null, view); + public String getSQLAsTmpTableInfo(String sql, List xAxis, List fieldCustomFilter, List extFilterRequestList, Datasource ds, ChartViewWithBLOBs view) { + return getSQLTableInfo("(" + sqlFix(sql) + ")", xAxis, fieldCustomFilter, extFilterRequestList, null, view); } @Override - public String getSQLAsTmp(String sql, List xAxis, List yAxis, List customFilter, List extFilterRequestList, ChartViewWithBLOBs view) { - return getSQL("(" + sqlFix(sql) + ")", xAxis, yAxis, customFilter, extFilterRequestList, null, view); + public String getSQLAsTmp(String sql, List xAxis, List yAxis, List fieldCustomFilter, List extFilterRequestList, ChartViewWithBLOBs view) { + return getSQL("(" + sqlFix(sql) + ")", xAxis, yAxis, fieldCustomFilter, extFilterRequestList, null, view); } @Override - public String getSQLStack(String table, List xAxis, List yAxis, List customFilter, List extFilterRequestList, List extStack, Datasource ds, ChartViewWithBLOBs view) { + public String getSQLStack(String table, List xAxis, List yAxis, List fieldCustomFilter, 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 xWheres = new ArrayList<>(); List xOrders = new ArrayList<>(); List xList = new ArrayList<>(); xList.addAll(xAxis); @@ -388,7 +385,7 @@ public class HiveQueryProvider extends QueryProvider { } } List yFields = new ArrayList<>(); - List yWheres = new ArrayList<>(); + List yWheres = new ArrayList<>(); List yOrders = new ArrayList<>(); if (CollectionUtils.isNotEmpty(yAxis)) { for (int i = 0; i < yAxis.size(); i++) { @@ -406,7 +403,7 @@ public class HiveQueryProvider extends QueryProvider { // 处理纵轴字段 yFields.add(getYFields(y, originField, fieldAlias)); // 处理纵轴过滤 - yWheres.addAll(getYWheres(y, originField, fieldAlias)); + yWheres.add(getYWheres(y, originField, fieldAlias)); // 处理纵轴排序 if (StringUtils.isNotEmpty(y.getSort()) && !StringUtils.equalsIgnoreCase(y.getSort(), "none")) { yOrders.add(SQLObj.builder() @@ -418,25 +415,24 @@ public class HiveQueryProvider extends QueryProvider { } } // 处理视图中字段过滤 - List customWheres = transCustomFilterList(tableObj, customFilter); + String customWheres = transCustomFilterList(tableObj, fieldCustomFilter); // 处理仪表板字段过滤 - List extWheres = transExtFilterList(tableObj, extFilterRequestList); + String extWheres = transExtFilterList(tableObj, extFilterRequestList); // 构建sql所有参数 List fields = new ArrayList<>(); fields.addAll(xFields); fields.addAll(yFields); - List wheres = new ArrayList<>(); - wheres.addAll(xWheres); - if (customWheres != null) wheres.addAll(customWheres); - if (extWheres != null) wheres.addAll(extWheres); + List wheres = new ArrayList<>(); + if (customWheres != null) wheres.add(customWheres); + if (extWheres != null) wheres.add(extWheres); 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); + 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"); @@ -458,18 +454,17 @@ public class HiveQueryProvider extends QueryProvider { } @Override - public String getSQLAsTmpStack(String table, List xAxis, List yAxis, List customFilter, List extFilterRequestList, List extStack, ChartViewWithBLOBs view) { - return getSQLStack("(" + sqlFix(table) + ")", xAxis, yAxis, customFilter, extFilterRequestList, extStack, null, view); + public String getSQLAsTmpStack(String table, List xAxis, List yAxis, List fieldCustomFilter, List extFilterRequestList, List extStack, ChartViewWithBLOBs view) { + return getSQLStack("(" + sqlFix(table) + ")", xAxis, yAxis, fieldCustomFilter, extFilterRequestList, extStack, null, view); } @Override - public String getSQLScatter(String table, List xAxis, List yAxis, List customFilter, List extFilterRequestList, List extBubble, Datasource ds, ChartViewWithBLOBs view) { + public String getSQLScatter(String table, List xAxis, List yAxis, List fieldCustomFilter, List extFilterRequestList, List extBubble, 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 xWheres = new ArrayList<>(); List xOrders = new ArrayList<>(); if (CollectionUtils.isNotEmpty(xAxis)) { for (int i = 0; i < xAxis.size(); i++) { @@ -498,7 +493,7 @@ public class HiveQueryProvider extends QueryProvider { } } List yFields = new ArrayList<>(); - List yWheres = new ArrayList<>(); + List yWheres = new ArrayList<>(); List yOrders = new ArrayList<>(); List yList = new ArrayList<>(); yList.addAll(yAxis); @@ -519,7 +514,7 @@ public class HiveQueryProvider extends QueryProvider { // 处理纵轴字段 yFields.add(getYFields(y, originField, fieldAlias)); // 处理纵轴过滤 - yWheres.addAll(getYWheres(y, originField, fieldAlias)); + yWheres.add(getYWheres(y, originField, fieldAlias)); // 处理纵轴排序 if (StringUtils.isNotEmpty(y.getSort()) && !StringUtils.equalsIgnoreCase(y.getSort(), "none")) { yOrders.add(SQLObj.builder() @@ -531,25 +526,24 @@ public class HiveQueryProvider extends QueryProvider { } } // 处理视图中字段过滤 - List customWheres = transCustomFilterList(tableObj, customFilter); + String customWheres = transCustomFilterList(tableObj, fieldCustomFilter); // 处理仪表板字段过滤 - List extWheres = transExtFilterList(tableObj, extFilterRequestList); + String extWheres = transExtFilterList(tableObj, extFilterRequestList); // 构建sql所有参数 List fields = new ArrayList<>(); fields.addAll(xFields); fields.addAll(yFields); - List wheres = new ArrayList<>(); - wheres.addAll(xWheres); - if (customWheres != null) wheres.addAll(customWheres); - if (extWheres != null) wheres.addAll(extWheres); + List wheres = new ArrayList<>(); + if (customWheres != null) wheres.add(customWheres); + if (extWheres != null) wheres.add(extWheres); 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); + 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"); @@ -571,8 +565,8 @@ public class HiveQueryProvider extends QueryProvider { } @Override - public String getSQLAsTmpScatter(String table, List xAxis, List yAxis, List customFilter, List extFilterRequestList, List extBubble, ChartViewWithBLOBs view) { - return getSQLScatter("(" + sqlFix(table) + ")", xAxis, yAxis, customFilter, extFilterRequestList, extBubble, null, view); + public String getSQLAsTmpScatter(String table, List xAxis, List yAxis, List fieldCustomFilter, List extFilterRequestList, List extBubble, ChartViewWithBLOBs view) { + return getSQLScatter("(" + sqlFix(table) + ")", xAxis, yAxis, fieldCustomFilter, extFilterRequestList, extBubble, null, view); } @Override @@ -581,14 +575,14 @@ public class HiveQueryProvider extends QueryProvider { } @Override - public String getSQLSummary(String table, List yAxis, List customFilter, List extFilterRequestList, ChartViewWithBLOBs view) { + public String getSQLSummary(String table, List yAxis, List fieldCustomFilter, List extFilterRequestList, 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 yFields = new ArrayList<>(); - List yWheres = new ArrayList<>(); + List yWheres = new ArrayList<>(); List yOrders = new ArrayList<>(); if (CollectionUtils.isNotEmpty(yAxis)) { for (int i = 0; i < yAxis.size(); i++) { @@ -606,7 +600,7 @@ public class HiveQueryProvider extends QueryProvider { // 处理纵轴字段 yFields.add(getYFields(y, originField, fieldAlias)); // 处理纵轴过滤 - yWheres.addAll(getYWheres(y, originField, fieldAlias)); + yWheres.add(getYWheres(y, originField, fieldAlias)); // 处理纵轴排序 if (StringUtils.isNotEmpty(y.getSort()) && !StringUtils.equalsIgnoreCase(y.getSort(), "none")) { yOrders.add(SQLObj.builder() @@ -618,21 +612,21 @@ public class HiveQueryProvider extends QueryProvider { } } // 处理视图中字段过滤 - List customWheres = transCustomFilterList(tableObj, customFilter); + String customWheres = transCustomFilterList(tableObj, fieldCustomFilter); // 处理仪表板字段过滤 - List extWheres = transExtFilterList(tableObj, extFilterRequestList); + String extWheres = transExtFilterList(tableObj, extFilterRequestList); // 构建sql所有参数 List fields = new ArrayList<>(); fields.addAll(yFields); - List wheres = new ArrayList<>(); - if (customWheres != null) wheres.addAll(customWheres); - if (extWheres != null) wheres.addAll(extWheres); + List wheres = new ArrayList<>(); + if (customWheres != null) wheres.add(customWheres); + if (extWheres != null) wheres.add(extWheres); List groups = new ArrayList<>(); // 外层再次套sql List orders = new ArrayList<>(); orders.addAll(yOrders); - List aggWheres = new ArrayList<>(); - aggWheres.addAll(yWheres); + 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"); @@ -653,8 +647,8 @@ public class HiveQueryProvider extends QueryProvider { } @Override - public String getSQLSummaryAsTmp(String sql, List yAxis, List customFilter, List extFilterRequestList, ChartViewWithBLOBs view) { - return getSQLSummary("(" + sqlFix(sql) + ")", yAxis, customFilter, extFilterRequestList, view); + public String getSQLSummaryAsTmp(String sql, List yAxis, List fieldCustomFilter, List extFilterRequestList, ChartViewWithBLOBs view) { + return getSQLSummary("(" + sqlFix(sql) + ")", yAxis, fieldCustomFilter, extFilterRequestList, view); } @Override @@ -728,67 +722,76 @@ public class HiveQueryProvider extends QueryProvider { } } - public List transCustomFilterList(SQLObj tableObj, List requestList) { + public String transCustomFilterList(SQLObj tableObj, List requestList) { if (CollectionUtils.isEmpty(requestList)) { return null; } - List list = new ArrayList<>(); - for (ChartCustomFilterDTO request : requestList) { + + List res = new ArrayList<>(); + for (ChartFieldCustomFilterDTO request : requestList) { + List list = new ArrayList<>(); DatasetTableField field = request.getField(); - if (ObjectUtils.isEmpty(field)) { - continue; - } - String value = request.getValue(); - String whereName = ""; - String whereTerm = transMysqlFilterTerm(request.getTerm()); - String whereValue = ""; - String originName; - if (ObjectUtils.isNotEmpty(field.getExtField()) && field.getExtField() == 2) { - // 解析origin name中有关联的字段生成sql表达式 - originName = calcFieldRegex(field.getOriginName(), tableObj); - } else if (ObjectUtils.isNotEmpty(field.getExtField()) && field.getExtField() == 1) { - originName = String.format(HiveConstants.KEYWORD_FIX, tableObj.getTableAlias(), field.getOriginName()); - } else { - originName = String.format(HiveConstants.KEYWORD_FIX, tableObj.getTableAlias(), field.getOriginName()); - } - if (field.getDeType() == DeTypeConstants.DE_TIME) { - if (field.getDeExtractType() == DeTypeConstants.DE_STRING || field.getDeExtractType() == 5) { - whereName = String.format(HiveConstants.STR_TO_DATE, originName, HiveConstants.DEFAULT_DATE_FORMAT); + List filter = request.getFilter(); + for (ChartCustomFilterItemDTO filterItemDTO : filter) { + if (ObjectUtils.isEmpty(field)) { + continue; } - if (field.getDeExtractType() == DeTypeConstants.DE_INT || field.getDeExtractType() == 3 || field.getDeExtractType() == 4) { - String cast = String.format(HiveConstants.CAST, originName, HiveConstants.DEFAULT_INT_FORMAT) + "/1000"; - whereName = String.format(HiveConstants.FROM_UNIXTIME, cast, HiveConstants.DEFAULT_DATE_FORMAT); + String value = filterItemDTO.getValue(); + String whereName = ""; + String whereTerm = transMysqlFilterTerm(filterItemDTO.getTerm()); + String whereValue = ""; + String originName; + if (ObjectUtils.isNotEmpty(field.getExtField()) && field.getExtField() == 2) { + // 解析origin name中有关联的字段生成sql表达式 + originName = calcFieldRegex(field.getOriginName(), tableObj); + } else if (ObjectUtils.isNotEmpty(field.getExtField()) && field.getExtField() == 1) { + originName = String.format(HiveConstants.KEYWORD_FIX, tableObj.getTableAlias(), field.getOriginName()); + } else { + originName = String.format(HiveConstants.KEYWORD_FIX, tableObj.getTableAlias(), field.getOriginName()); } - if (field.getDeExtractType() == DeTypeConstants.DE_TIME) { + if (field.getDeType() == DeTypeConstants.DE_TIME) { + if (field.getDeExtractType() == DeTypeConstants.DE_STRING || field.getDeExtractType() == 5) { + whereName = String.format(HiveConstants.STR_TO_DATE, originName, HiveConstants.DEFAULT_DATE_FORMAT); + } + if (field.getDeExtractType() == DeTypeConstants.DE_INT || field.getDeExtractType() == 3 || field.getDeExtractType() == 4) { + String cast = String.format(HiveConstants.CAST, originName, HiveConstants.DEFAULT_INT_FORMAT) + "/1000"; + whereName = String.format(HiveConstants.FROM_UNIXTIME, cast, HiveConstants.DEFAULT_DATE_FORMAT); + } + if (field.getDeExtractType() == DeTypeConstants.DE_TIME) { + whereName = originName; + } + } else { whereName = originName; } - } else { - whereName = originName; + if (StringUtils.equalsIgnoreCase(filterItemDTO.getTerm(), "null")) { + whereValue = ""; + } else if (StringUtils.equalsIgnoreCase(filterItemDTO.getTerm(), "not_null")) { + whereValue = ""; + } else if (StringUtils.equalsIgnoreCase(filterItemDTO.getTerm(), "empty")) { + whereValue = "''"; + } else if (StringUtils.equalsIgnoreCase(filterItemDTO.getTerm(), "not_empty")) { + whereValue = "''"; + } else if (StringUtils.containsIgnoreCase(filterItemDTO.getTerm(), "in")) { + whereValue = "('" + StringUtils.join(value, "','") + "')"; + } else if (StringUtils.containsIgnoreCase(filterItemDTO.getTerm(), "like")) { + whereValue = "'%" + value + "%'"; + } else { + whereValue = String.format(HiveConstants.WHERE_VALUE_VALUE, value); + } + list.add(SQLObj.builder() + .whereField(whereName) + .whereTermAndValue(whereTerm + whereValue) + .build()); } - if (StringUtils.equalsIgnoreCase(request.getTerm(), "null")) { - whereValue = ""; - } else if (StringUtils.equalsIgnoreCase(request.getTerm(), "not_null")) { - whereValue = ""; - } else if (StringUtils.equalsIgnoreCase(request.getTerm(), "empty")) { - whereValue = "''"; - } else if (StringUtils.equalsIgnoreCase(request.getTerm(), "not_empty")) { - whereValue = "''"; - } else if (StringUtils.containsIgnoreCase(request.getTerm(), "in")) { - whereValue = "('" + StringUtils.join(value, "','") + "')"; - } else if (StringUtils.containsIgnoreCase(request.getTerm(), "like")) { - whereValue = "'%" + value + "%'"; - } else { - whereValue = String.format(HiveConstants.WHERE_VALUE_VALUE, value); - } - list.add(SQLObj.builder() - .whereField(whereName) - .whereTermAndValue(whereTerm + whereValue) - .build()); + + List strList = new ArrayList<>(); + list.forEach(ele -> strList.add(ele.getWhereField() + " " + ele.getWhereTermAndValue())); + res.add("(" + String.join(" " + getLogic(request.getLogic()) + " ", strList) + ")"); } - return list; + return "(" + String.join(" AND ", res) + ")"; } - public List transExtFilterList(SQLObj tableObj, List requestList) { + public String transExtFilterList(SQLObj tableObj, List requestList) { if (CollectionUtils.isEmpty(requestList)) { return null; } @@ -850,7 +853,9 @@ public class HiveQueryProvider extends QueryProvider { .whereTermAndValue(whereTerm + whereValue) .build()); } - return list; + List strList = new ArrayList<>(); + list.forEach(ele -> strList.add(ele.getWhereField() + " " + ele.getWhereTermAndValue())); + return "(" + String.join(" AND ", strList) + ")"; } private String sqlFix(String sql) { @@ -983,7 +988,7 @@ public class HiveQueryProvider extends QueryProvider { .build(); } - private List getYWheres(ChartViewFieldDTO y, String originField, String fieldAlias) { + private String getYWheres(ChartViewFieldDTO y, String originField, String fieldAlias) { List list = new ArrayList<>(); if (CollectionUtils.isNotEmpty(y.getFilter()) && y.getFilter().size() > 0) { y.getFilter().forEach(f -> { @@ -1012,7 +1017,9 @@ public class HiveQueryProvider extends QueryProvider { .build()); }); } - return list; + List strList = new ArrayList<>(); + list.forEach(ele -> strList.add(ele.getWhereField() + " " + ele.getWhereTermAndValue())); + return CollectionUtils.isNotEmpty(list) ? "(" + String.join(" " + getLogic(y.getLogic()) + " ", strList) + ")" : null; } private String calcFieldRegex(String originField, SQLObj tableObj) { @@ -1046,4 +1053,14 @@ public class HiveQueryProvider extends QueryProvider { return sql; } } + + private String getLogic(String logic) { + switch (logic) { + case "and": + return "AND"; + case "or": + return "OR"; + } + return "AND"; + } } diff --git a/backend/src/main/java/io/dataease/provider/query/mongodb/MongoQueryProvider.java b/backend/src/main/java/io/dataease/provider/query/mongodb/MongoQueryProvider.java index 8e932684e1..eb7c28f770 100644 --- a/backend/src/main/java/io/dataease/provider/query/mongodb/MongoQueryProvider.java +++ b/backend/src/main/java/io/dataease/provider/query/mongodb/MongoQueryProvider.java @@ -7,7 +7,8 @@ import io.dataease.base.domain.Datasource; import io.dataease.base.mapper.DatasetTableFieldMapper; import io.dataease.commons.constants.DeTypeConstants; import io.dataease.controller.request.chart.ChartExtFilterRequest; -import io.dataease.dto.chart.ChartCustomFilterDTO; +import io.dataease.dto.chart.ChartCustomFilterItemDTO; +import io.dataease.dto.chart.ChartFieldCustomFilterDTO; import io.dataease.dto.chart.ChartViewFieldDTO; import io.dataease.dto.sqlObj.SQLObj; import io.dataease.provider.query.QueryProvider; @@ -26,6 +27,7 @@ import java.text.SimpleDateFormat; import java.util.*; import java.util.regex.Matcher; import java.util.regex.Pattern; +import java.util.stream.Collectors; import static io.dataease.provider.query.SQLConstants.TABLE_ALIAS_PREFIX; @@ -81,7 +83,7 @@ public class MongoQueryProvider extends QueryProvider { } @Override - public String createQuerySQL(String table, List fields, boolean isGroup, Datasource ds, List customFilter) { + public String createQuerySQL(String table, List fields, boolean isGroup, Datasource ds, List fieldCustomFilter) { SQLObj tableObj = SQLObj.builder() .tableName((table.startsWith("(") && table.endsWith(")")) ? table : String.format(MongoConstants.KEYWORD_TABLE, table)) .tableAlias(String.format(TABLE_ALIAS_PREFIX, 0)) @@ -114,46 +116,45 @@ public class MongoQueryProvider extends QueryProvider { st_sql.add("isGroup", isGroup); if (CollectionUtils.isNotEmpty(xFields)) st_sql.add("groups", xFields); if (ObjectUtils.isNotEmpty(tableObj)) st_sql.add("table", tableObj); - List customWheres = transCustomFilterList(tableObj, customFilter); - List wheres = new ArrayList<>(); - if (customWheres != null) wheres.addAll(customWheres); + String customWheres = transCustomFilterList(tableObj, fieldCustomFilter); + List wheres = new ArrayList<>(); + if (customWheres != null) wheres.add(customWheres); if (CollectionUtils.isNotEmpty(wheres)) st_sql.add("filters", wheres); return st_sql.render(); } @Override - public String createQuerySQLAsTmp(String sql, List fields, boolean isGroup, List customFilter) { - return createQuerySQL("(" + sqlFix(sql) + ")", fields, isGroup, null, customFilter); + public String createQuerySQLAsTmp(String sql, List fields, boolean isGroup, List fieldCustomFilter) { + return createQuerySQL("(" + sqlFix(sql) + ")", fields, isGroup, null, fieldCustomFilter); } @Override - public String createQueryTableWithPage(String table, List fields, Integer page, Integer pageSize, Integer realSize, boolean isGroup, Datasource ds, List customFilter) { - return createQuerySQL(table, fields, isGroup, null, customFilter) + " LIMIT " + (page - 1) * pageSize + "," + realSize; + public String createQueryTableWithPage(String table, List fields, Integer page, Integer pageSize, Integer realSize, boolean isGroup, Datasource ds, List fieldCustomFilter) { + return createQuerySQL(table, fields, isGroup, null, fieldCustomFilter) + " LIMIT " + (page - 1) * pageSize + "," + realSize; } @Override - public String createQueryTableWithLimit(String table, List fields, Integer limit, boolean isGroup, Datasource ds, List customFilter) { - return createQuerySQL(table, fields, isGroup, null, customFilter) + " LIMIT 0," + limit; + public String createQueryTableWithLimit(String table, List fields, Integer limit, boolean isGroup, Datasource ds, List fieldCustomFilter) { + return createQuerySQL(table, fields, isGroup, null, fieldCustomFilter) + " LIMIT 0," + limit; } @Override - public String createQuerySqlWithLimit(String sql, List fields, Integer limit, boolean isGroup, List customFilter) { - return createQuerySQLAsTmp(sql, fields, isGroup, customFilter) + " LIMIT 0," + limit; + public String createQuerySqlWithLimit(String sql, List fields, Integer limit, boolean isGroup, List fieldCustomFilter) { + return createQuerySQLAsTmp(sql, fields, isGroup, fieldCustomFilter) + " LIMIT 0," + limit; } @Override - public String createQuerySQLWithPage(String sql, List fields, Integer page, Integer pageSize, Integer realSize, boolean isGroup, List customFilter) { - return createQuerySQLAsTmp(sql, fields, isGroup, customFilter) + " LIMIT " + (page - 1) * pageSize + "," + realSize; + public String createQuerySQLWithPage(String sql, List fields, Integer page, Integer pageSize, Integer realSize, boolean isGroup, List fieldCustomFilter) { + return createQuerySQLAsTmp(sql, fields, isGroup, fieldCustomFilter) + " LIMIT " + (page - 1) * pageSize + "," + realSize; } @Override - public String getSQL(String table, List xAxis, List yAxis, List customFilter, List extFilterRequestList, Datasource ds, ChartViewWithBLOBs view) { + public String getSQL(String table, List xAxis, List yAxis, List fieldCustomFilter, List extFilterRequestList, Datasource ds, ChartViewWithBLOBs view) { SQLObj tableObj = SQLObj.builder() .tableName((table.startsWith("(") && table.endsWith(")")) ? table : String.format(MongoConstants.KEYWORD_TABLE, table)) .tableAlias(String.format(TABLE_ALIAS_PREFIX, 0)) .build(); List xFields = new ArrayList<>(); - List xWheres = new ArrayList<>(); List xOrders = new ArrayList<>(); if (CollectionUtils.isNotEmpty(xAxis)) { for (int i = 0; i < xAxis.size(); i++) { @@ -181,7 +182,7 @@ public class MongoQueryProvider extends QueryProvider { } } List yFields = new ArrayList<>(); - List yWheres = new ArrayList<>(); + List yWheres = new ArrayList<>(); List yOrders = new ArrayList<>(); if (CollectionUtils.isNotEmpty(yAxis)) { for (int i = 0; i < yAxis.size(); i++) { @@ -199,7 +200,7 @@ public class MongoQueryProvider extends QueryProvider { // 处理纵轴字段 yFields.add(getYFields(y, originField, fieldAlias)); // 处理纵轴过滤 - yWheres.addAll(getYWheres(y, originField, fieldAlias)); + yWheres.add(getYWheres(y, originField, fieldAlias)); // 处理纵轴排序 if (StringUtils.isNotEmpty(y.getSort()) && !StringUtils.equalsIgnoreCase(y.getSort(), "none")) { yOrders.add(SQLObj.builder() @@ -211,25 +212,24 @@ public class MongoQueryProvider extends QueryProvider { } } // 处理视图中字段过滤 - List customWheres = transCustomFilterList(tableObj, customFilter); + String customWheres = transCustomFilterList(tableObj, fieldCustomFilter); // 处理仪表板字段过滤 - List extWheres = transExtFilterList(tableObj, extFilterRequestList); + String extWheres = transExtFilterList(tableObj, extFilterRequestList); // 构建sql所有参数 List fields = new ArrayList<>(); fields.addAll(xFields); fields.addAll(yFields); - List wheres = new ArrayList<>(); - wheres.addAll(xWheres); - if (customWheres != null) wheres.addAll(customWheres); - if (extWheres != null) wheres.addAll(extWheres); + List wheres = new ArrayList<>(); + if (customWheres != null) wheres.add(customWheres); + if (extWheres != null) wheres.add(extWheres); 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); + 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"); @@ -251,13 +251,12 @@ public class MongoQueryProvider extends QueryProvider { } @Override - public String getSQLTableInfo(String table, List xAxis, List customFilter, List extFilterRequestList, Datasource ds, ChartViewWithBLOBs view) { + public String getSQLTableInfo(String table, List xAxis, List fieldCustomFilter, List extFilterRequestList, Datasource ds, ChartViewWithBLOBs view) { SQLObj tableObj = SQLObj.builder() .tableName((table.startsWith("(") && table.endsWith(")")) ? table : String.format(MongoConstants.KEYWORD_TABLE, table)) .tableAlias(String.format(TABLE_ALIAS_PREFIX, 0)) .build(); List xFields = new ArrayList<>(); - List xWheres = new ArrayList<>(); List xOrders = new ArrayList<>(); if (CollectionUtils.isNotEmpty(xAxis)) { for (int i = 0; i < xAxis.size(); i++) { @@ -285,16 +284,15 @@ public class MongoQueryProvider extends QueryProvider { } } // 处理视图中字段过滤 - List customWheres = transCustomFilterList(tableObj, customFilter); + String customWheres = transCustomFilterList(tableObj, fieldCustomFilter); // 处理仪表板字段过滤 - List extWheres = transExtFilterList(tableObj, extFilterRequestList); + String extWheres = transExtFilterList(tableObj, extFilterRequestList); // 构建sql所有参数 List fields = new ArrayList<>(); fields.addAll(xFields); - List wheres = new ArrayList<>(); - wheres.addAll(xWheres); - if (customWheres != null) wheres.addAll(customWheres); - if (extWheres != null) wheres.addAll(extWheres); + List wheres = new ArrayList<>(); + if (customWheres != null) wheres.add(customWheres); + if (extWheres != null) wheres.add(extWheres); List groups = new ArrayList<>(); groups.addAll(xFields); // 外层再次套sql @@ -321,24 +319,23 @@ public class MongoQueryProvider extends QueryProvider { } @Override - public String getSQLAsTmpTableInfo(String sql, List xAxis, List customFilter, List extFilterRequestList, Datasource ds, ChartViewWithBLOBs view) { - return getSQLTableInfo("(" + sqlFix(sql) + ")", xAxis, customFilter, extFilterRequestList, null, view); + public String getSQLAsTmpTableInfo(String sql, List xAxis, List fieldCustomFilter, List extFilterRequestList, Datasource ds, ChartViewWithBLOBs view) { + return getSQLTableInfo("(" + sqlFix(sql) + ")", xAxis, fieldCustomFilter, extFilterRequestList, null, view); } @Override - public String getSQLAsTmp(String sql, List xAxis, List yAxis, List customFilter, List extFilterRequestList, ChartViewWithBLOBs view) { - return getSQL("(" + sqlFix(sql) + ")", xAxis, yAxis, customFilter, extFilterRequestList, null, view); + public String getSQLAsTmp(String sql, List xAxis, List yAxis, List fieldCustomFilter, List extFilterRequestList, ChartViewWithBLOBs view) { + return getSQL("(" + sqlFix(sql) + ")", xAxis, yAxis, fieldCustomFilter, extFilterRequestList, null, view); } @Override - public String getSQLStack(String table, List xAxis, List yAxis, List customFilter, List extFilterRequestList, List extStack, Datasource ds, ChartViewWithBLOBs view) { + public String getSQLStack(String table, List xAxis, List yAxis, List fieldCustomFilter, 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 xWheres = new ArrayList<>(); List xOrders = new ArrayList<>(); List xList = new ArrayList<>(); xList.addAll(xAxis); @@ -369,7 +366,7 @@ public class MongoQueryProvider extends QueryProvider { } } List yFields = new ArrayList<>(); - List yWheres = new ArrayList<>(); + List yWheres = new ArrayList<>(); List yOrders = new ArrayList<>(); if (CollectionUtils.isNotEmpty(yAxis)) { for (int i = 0; i < yAxis.size(); i++) { @@ -387,7 +384,7 @@ public class MongoQueryProvider extends QueryProvider { // 处理纵轴字段 yFields.add(getYFields(y, originField, fieldAlias)); // 处理纵轴过滤 - yWheres.addAll(getYWheres(y, originField, fieldAlias)); + yWheres.add(getYWheres(y, originField, fieldAlias)); // 处理纵轴排序 if (StringUtils.isNotEmpty(y.getSort()) && !StringUtils.equalsIgnoreCase(y.getSort(), "none")) { yOrders.add(SQLObj.builder() @@ -399,25 +396,24 @@ public class MongoQueryProvider extends QueryProvider { } } // 处理视图中字段过滤 - List customWheres = transCustomFilterList(tableObj, customFilter); + String customWheres = transCustomFilterList(tableObj, fieldCustomFilter); // 处理仪表板字段过滤 - List extWheres = transExtFilterList(tableObj, extFilterRequestList); + String extWheres = transExtFilterList(tableObj, extFilterRequestList); // 构建sql所有参数 List fields = new ArrayList<>(); fields.addAll(xFields); fields.addAll(yFields); - List wheres = new ArrayList<>(); - wheres.addAll(xWheres); - if (customWheres != null) wheres.addAll(customWheres); - if (extWheres != null) wheres.addAll(extWheres); + List wheres = new ArrayList<>(); + if (customWheres != null) wheres.add(customWheres); + if (extWheres != null) wheres.add(extWheres); 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); + 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"); @@ -439,18 +435,17 @@ public class MongoQueryProvider extends QueryProvider { } @Override - public String getSQLAsTmpStack(String table, List xAxis, List yAxis, List customFilter, List extFilterRequestList, List extStack, ChartViewWithBLOBs view) { - return getSQLStack("(" + sqlFix(table) + ")", xAxis, yAxis, customFilter, extFilterRequestList, extStack, null, view); + public String getSQLAsTmpStack(String table, List xAxis, List yAxis, List fieldCustomFilter, List extFilterRequestList, List extStack, ChartViewWithBLOBs view) { + return getSQLStack("(" + sqlFix(table) + ")", xAxis, yAxis, fieldCustomFilter, extFilterRequestList, extStack, null, view); } @Override - public String getSQLScatter(String table, List xAxis, List yAxis, List customFilter, List extFilterRequestList, List extBubble, Datasource ds, ChartViewWithBLOBs view) { + public String getSQLScatter(String table, List xAxis, List yAxis, List fieldCustomFilter, List extFilterRequestList, List extBubble, 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 xWheres = new ArrayList<>(); List xOrders = new ArrayList<>(); if (CollectionUtils.isNotEmpty(xAxis)) { for (int i = 0; i < xAxis.size(); i++) { @@ -478,7 +473,7 @@ public class MongoQueryProvider extends QueryProvider { } } List yFields = new ArrayList<>(); - List yWheres = new ArrayList<>(); + List yWheres = new ArrayList<>(); List yOrders = new ArrayList<>(); List yList = new ArrayList<>(); yList.addAll(yAxis); @@ -499,7 +494,7 @@ public class MongoQueryProvider extends QueryProvider { // 处理纵轴字段 yFields.add(getYFields(y, originField, fieldAlias)); // 处理纵轴过滤 - yWheres.addAll(getYWheres(y, originField, fieldAlias)); + yWheres.add(getYWheres(y, originField, fieldAlias)); // 处理纵轴排序 if (StringUtils.isNotEmpty(y.getSort()) && !StringUtils.equalsIgnoreCase(y.getSort(), "none")) { yOrders.add(SQLObj.builder() @@ -511,25 +506,24 @@ public class MongoQueryProvider extends QueryProvider { } } // 处理视图中字段过滤 - List customWheres = transCustomFilterList(tableObj, customFilter); + String customWheres = transCustomFilterList(tableObj, fieldCustomFilter); // 处理仪表板字段过滤 - List extWheres = transExtFilterList(tableObj, extFilterRequestList); + String extWheres = transExtFilterList(tableObj, extFilterRequestList); // 构建sql所有参数 List fields = new ArrayList<>(); fields.addAll(xFields); fields.addAll(yFields); - List wheres = new ArrayList<>(); - wheres.addAll(xWheres); - if (customWheres != null) wheres.addAll(customWheres); - if (extWheres != null) wheres.addAll(extWheres); + List wheres = new ArrayList<>(); + if (customWheres != null) wheres.add(customWheres); + if (extWheres != null) wheres.add(extWheres); 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); + 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"); @@ -551,8 +545,8 @@ public class MongoQueryProvider extends QueryProvider { } @Override - public String getSQLAsTmpScatter(String table, List xAxis, List yAxis, List customFilter, List extFilterRequestList, List extBubble, ChartViewWithBLOBs view) { - return getSQLScatter("(" + sqlFix(table) + ")", xAxis, yAxis, customFilter, extFilterRequestList, extBubble, null, view); + public String getSQLAsTmpScatter(String table, List xAxis, List yAxis, List fieldCustomFilter, List extFilterRequestList, List extBubble, ChartViewWithBLOBs view) { + return getSQLScatter("(" + sqlFix(table) + ")", xAxis, yAxis, fieldCustomFilter, extFilterRequestList, extBubble, null, view); } @Override @@ -561,14 +555,14 @@ public class MongoQueryProvider extends QueryProvider { } @Override - public String getSQLSummary(String table, List yAxis, List customFilter, List extFilterRequestList, ChartViewWithBLOBs view) { + public String getSQLSummary(String table, List yAxis, List fieldCustomFilter, List extFilterRequestList, 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 yFields = new ArrayList<>(); - List yWheres = new ArrayList<>(); + List yWheres = new ArrayList<>(); List yOrders = new ArrayList<>(); if (CollectionUtils.isNotEmpty(yAxis)) { for (int i = 0; i < yAxis.size(); i++) { @@ -586,7 +580,7 @@ public class MongoQueryProvider extends QueryProvider { // 处理纵轴字段 yFields.add(getYFields(y, originField, fieldAlias)); // 处理纵轴过滤 - yWheres.addAll(getYWheres(y, originField, fieldAlias)); + yWheres.add(getYWheres(y, originField, fieldAlias)); // 处理纵轴排序 if (StringUtils.isNotEmpty(y.getSort()) && !StringUtils.equalsIgnoreCase(y.getSort(), "none")) { yOrders.add(SQLObj.builder() @@ -598,21 +592,21 @@ public class MongoQueryProvider extends QueryProvider { } } // 处理视图中字段过滤 - List customWheres = transCustomFilterList(tableObj, customFilter); + String customWheres = transCustomFilterList(tableObj, fieldCustomFilter); // 处理仪表板字段过滤 - List extWheres = transExtFilterList(tableObj, extFilterRequestList); + String extWheres = transExtFilterList(tableObj, extFilterRequestList); // 构建sql所有参数 List fields = new ArrayList<>(); fields.addAll(yFields); - List wheres = new ArrayList<>(); - if (customWheres != null) wheres.addAll(customWheres); - if (extWheres != null) wheres.addAll(extWheres); + List wheres = new ArrayList<>(); + if (customWheres != null) wheres.add(customWheres); + if (extWheres != null) wheres.add(extWheres); List groups = new ArrayList<>(); // 外层再次套sql List orders = new ArrayList<>(); orders.addAll(yOrders); - List aggWheres = new ArrayList<>(); - aggWheres.addAll(yWheres); + 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"); @@ -633,8 +627,8 @@ public class MongoQueryProvider extends QueryProvider { } @Override - public String getSQLSummaryAsTmp(String sql, List yAxis, List customFilter, List extFilterRequestList, ChartViewWithBLOBs view) { - return getSQLSummary("(" + sqlFix(sql) + ")", yAxis, customFilter, extFilterRequestList, view); + public String getSQLSummaryAsTmp(String sql, List yAxis, List fieldCustomFilter, List extFilterRequestList, ChartViewWithBLOBs view) { + return getSQLSummary("(" + sqlFix(sql) + ")", yAxis, fieldCustomFilter, extFilterRequestList, view); } @Override @@ -708,54 +702,62 @@ public class MongoQueryProvider extends QueryProvider { } } - public List transCustomFilterList(SQLObj tableObj, List requestList) { + public String transCustomFilterList(SQLObj tableObj, List requestList) { if (CollectionUtils.isEmpty(requestList)) { return null; } - List list = new ArrayList<>(); - for (ChartCustomFilterDTO request : requestList) { + List res = new ArrayList<>(); + for (ChartFieldCustomFilterDTO request : requestList) { + List list = new ArrayList<>(); DatasetTableField field = request.getField(); - if (ObjectUtils.isEmpty(field)) { - continue; + List filter = request.getFilter(); + for (ChartCustomFilterItemDTO filterItemDTO : filter) { + if (ObjectUtils.isEmpty(field)) { + continue; + } + String value = filterItemDTO.getValue(); + String whereName = ""; + String whereTerm = transMysqlFilterTerm(filterItemDTO.getTerm()); + String whereValue = ""; + String originName; + if (ObjectUtils.isNotEmpty(field.getExtField()) && field.getExtField() == DeTypeConstants.DE_INT) { + // 解析origin name中有关联的字段生成sql表达式 + originName = calcFieldRegex(field.getOriginName(), tableObj); + } else if (ObjectUtils.isNotEmpty(field.getExtField()) && field.getExtField() == DeTypeConstants.DE_TIME) { + originName = String.format(MongoConstants.KEYWORD_FIX, tableObj.getTableAlias(), field.getOriginName()); + } else { + originName = String.format(MongoConstants.KEYWORD_FIX, tableObj.getTableAlias(), field.getOriginName()); + } + whereName = originName; + if (StringUtils.equalsIgnoreCase(filterItemDTO.getTerm(), "null")) { + whereValue = ""; + } else if (StringUtils.equalsIgnoreCase(filterItemDTO.getTerm(), "not_null")) { + whereValue = ""; + } else if (StringUtils.equalsIgnoreCase(filterItemDTO.getTerm(), "empty")) { + whereValue = "''"; + } else if (StringUtils.equalsIgnoreCase(filterItemDTO.getTerm(), "not_empty")) { + whereValue = "''"; + } else if (StringUtils.containsIgnoreCase(filterItemDTO.getTerm(), "in")) { + whereValue = "('" + StringUtils.join(value, "','") + "')"; + } else if (StringUtils.containsIgnoreCase(filterItemDTO.getTerm(), "like")) { + whereValue = "'%" + value + "%'"; + } else { + whereValue = String.format(MongoConstants.WHERE_VALUE_VALUE, value); + } + list.add(SQLObj.builder() + .whereField(whereName) + .whereTermAndValue(whereTerm + whereValue) + .build()); } - String value = request.getValue(); - String whereName = ""; - String whereTerm = transMysqlFilterTerm(request.getTerm()); - String whereValue = ""; - String originName; - if (ObjectUtils.isNotEmpty(field.getExtField()) && field.getExtField() == DeTypeConstants.DE_INT) { - // 解析origin name中有关联的字段生成sql表达式 - originName = calcFieldRegex(field.getOriginName(), tableObj); - } else if (ObjectUtils.isNotEmpty(field.getExtField()) && field.getExtField() == DeTypeConstants.DE_TIME) { - originName = String.format(MongoConstants.KEYWORD_FIX, tableObj.getTableAlias(), field.getOriginName()); - } else { - originName = String.format(MongoConstants.KEYWORD_FIX, tableObj.getTableAlias(), field.getOriginName()); - } - whereName = originName; - if (StringUtils.equalsIgnoreCase(request.getTerm(), "null")) { - whereValue = ""; - } else if (StringUtils.equalsIgnoreCase(request.getTerm(), "not_null")) { - whereValue = ""; - } else if (StringUtils.equalsIgnoreCase(request.getTerm(), "empty")) { - whereValue = "''"; - } else if (StringUtils.equalsIgnoreCase(request.getTerm(), "not_empty")) { - whereValue = "''"; - } else if (StringUtils.containsIgnoreCase(request.getTerm(), "in")) { - whereValue = "('" + StringUtils.join(value, "','") + "')"; - } else if (StringUtils.containsIgnoreCase(request.getTerm(), "like")) { - whereValue = "'%" + value + "%'"; - } else { - whereValue = String.format(MongoConstants.WHERE_VALUE_VALUE, value); - } - list.add(SQLObj.builder() - .whereField(whereName) - .whereTermAndValue(whereTerm + whereValue) - .build()); + + List strList = new ArrayList<>(); + list.forEach(ele -> strList.add(ele.getWhereField() + " " + ele.getWhereTermAndValue())); + res.add("(" + String.join(" " + getLogic(request.getLogic()) + " ", strList) + ")"); } - return list; + return "(" + String.join(" AND ", res) + ")"; } - public List transExtFilterList(SQLObj tableObj, List requestList) { + public String transExtFilterList(SQLObj tableObj, List requestList) { if (CollectionUtils.isEmpty(requestList)) { return null; } @@ -803,7 +805,9 @@ public class MongoQueryProvider extends QueryProvider { .whereTermAndValue(whereTerm + whereValue) .build()); } - return list; + List strList = new ArrayList<>(); + list.forEach(ele -> strList.add(ele.getWhereField() + " " + ele.getWhereTermAndValue())); + return "(" + String.join(" AND ", strList) + ")"; } private String sqlFix(String sql) { @@ -873,7 +877,7 @@ public class MongoQueryProvider extends QueryProvider { .build(); } - private List getYWheres(ChartViewFieldDTO y, String originField, String fieldAlias) { + private String getYWheres(ChartViewFieldDTO y, String originField, String fieldAlias) { List list = new ArrayList<>(); if (CollectionUtils.isNotEmpty(y.getFilter()) && y.getFilter().size() > 0) { y.getFilter().forEach(f -> { @@ -902,7 +906,9 @@ public class MongoQueryProvider extends QueryProvider { .build()); }); } - return list; + List strList = new ArrayList<>(); + list.forEach(ele -> strList.add(ele.getWhereField() + " " + ele.getWhereTermAndValue())); + return CollectionUtils.isNotEmpty(list) ? "(" + String.join(" " + getLogic(y.getLogic()) + " ", strList) + ")" : null; } private String calcFieldRegex(String originField, SQLObj tableObj) { @@ -936,4 +942,14 @@ public class MongoQueryProvider extends QueryProvider { return sql; } } + + private String getLogic(String logic) { + switch (logic) { + case "and": + return "AND"; + case "or": + return "OR"; + } + return "AND"; + } } diff --git a/backend/src/main/java/io/dataease/provider/query/mysql/MysqlQueryProvider.java b/backend/src/main/java/io/dataease/provider/query/mysql/MysqlQueryProvider.java index 84e0cb1e22..e4e8b2eb90 100644 --- a/backend/src/main/java/io/dataease/provider/query/mysql/MysqlQueryProvider.java +++ b/backend/src/main/java/io/dataease/provider/query/mysql/MysqlQueryProvider.java @@ -6,7 +6,8 @@ import io.dataease.base.domain.DatasetTableFieldExample; import io.dataease.base.domain.Datasource; import io.dataease.base.mapper.DatasetTableFieldMapper; import io.dataease.controller.request.chart.ChartExtFilterRequest; -import io.dataease.dto.chart.ChartCustomFilterDTO; +import io.dataease.dto.chart.ChartCustomFilterItemDTO; +import io.dataease.dto.chart.ChartFieldCustomFilterDTO; import io.dataease.dto.chart.ChartViewFieldDTO; import io.dataease.dto.sqlObj.SQLObj; import io.dataease.provider.query.QueryProvider; @@ -25,6 +26,7 @@ import java.text.SimpleDateFormat; import java.util.*; import java.util.regex.Matcher; import java.util.regex.Pattern; +import java.util.stream.Collectors; import static io.dataease.provider.query.SQLConstants.TABLE_ALIAS_PREFIX; @@ -78,7 +80,7 @@ public class MysqlQueryProvider extends QueryProvider { } @Override - public String createQuerySQL(String table, List fields, boolean isGroup, Datasource ds, List customFilter) { + public String createQuerySQL(String table, List fields, boolean isGroup, Datasource ds, List fieldCustomFilter) { SQLObj tableObj = SQLObj.builder() .tableName((table.startsWith("(") && table.endsWith(")")) ? table : String.format(MySQLConstants.KEYWORD_TABLE, table)) .tableAlias(String.format(TABLE_ALIAS_PREFIX, 0)) @@ -138,47 +140,46 @@ public class MysqlQueryProvider extends QueryProvider { if (CollectionUtils.isNotEmpty(xFields)) st_sql.add("groups", xFields); if (ObjectUtils.isNotEmpty(tableObj)) st_sql.add("table", tableObj); - List customWheres = transCustomFilterList(tableObj, customFilter); - List wheres = new ArrayList<>(); - if (customWheres != null) wheres.addAll(customWheres); + String customWheres = transCustomFilterList(tableObj, fieldCustomFilter); + List wheres = new ArrayList<>(); + if (customWheres != null) wheres.add(customWheres); if (CollectionUtils.isNotEmpty(wheres)) st_sql.add("filters", wheres); return st_sql.render(); } @Override - public String createQuerySQLAsTmp(String sql, List fields, boolean isGroup, List customFilter) { - return createQuerySQL("(" + sqlFix(sql) + ")", fields, isGroup, null, customFilter); + public String createQuerySQLAsTmp(String sql, List fields, boolean isGroup, List fieldCustomFilter) { + return createQuerySQL("(" + sqlFix(sql) + ")", fields, isGroup, null, fieldCustomFilter); } @Override - public String createQueryTableWithPage(String table, List fields, Integer page, Integer pageSize, Integer realSize, boolean isGroup, Datasource ds, List customFilter) { - return createQuerySQL(table, fields, isGroup, null, customFilter) + " LIMIT " + (page - 1) * pageSize + "," + realSize; + public String createQueryTableWithPage(String table, List fields, Integer page, Integer pageSize, Integer realSize, boolean isGroup, Datasource ds, List fieldCustomFilter) { + return createQuerySQL(table, fields, isGroup, null, fieldCustomFilter) + " LIMIT " + (page - 1) * pageSize + "," + realSize; } @Override - public String createQueryTableWithLimit(String table, List fields, Integer limit, boolean isGroup, Datasource ds, List customFilter) { - return createQuerySQL(table, fields, isGroup, null, customFilter) + " LIMIT 0," + limit; + public String createQueryTableWithLimit(String table, List fields, Integer limit, boolean isGroup, Datasource ds, List fieldCustomFilter) { + return createQuerySQL(table, fields, isGroup, null, fieldCustomFilter) + " LIMIT 0," + limit; } @Override - public String createQuerySqlWithLimit(String sql, List fields, Integer limit, boolean isGroup, List customFilter) { - return createQuerySQLAsTmp(sql, fields, isGroup, customFilter) + " LIMIT 0," + limit; + public String createQuerySqlWithLimit(String sql, List fields, Integer limit, boolean isGroup, List fieldCustomFilter) { + return createQuerySQLAsTmp(sql, fields, isGroup, fieldCustomFilter) + " LIMIT 0," + limit; } @Override - public String createQuerySQLWithPage(String sql, List fields, Integer page, Integer pageSize, Integer realSize, boolean isGroup, List customFilter) { - return createQuerySQLAsTmp(sql, fields, isGroup, customFilter) + " LIMIT " + (page - 1) * pageSize + "," + realSize; + public String createQuerySQLWithPage(String sql, List fields, Integer page, Integer pageSize, Integer realSize, boolean isGroup, List fieldCustomFilter) { + return createQuerySQLAsTmp(sql, fields, isGroup, fieldCustomFilter) + " LIMIT " + (page - 1) * pageSize + "," + realSize; } @Override - public String getSQL(String table, List xAxis, List yAxis, List customFilter, List extFilterRequestList, Datasource ds, ChartViewWithBLOBs view) { + public String getSQL(String table, List xAxis, List yAxis, List fieldCustomFilter, List extFilterRequestList, Datasource ds, ChartViewWithBLOBs view) { SQLObj tableObj = SQLObj.builder() .tableName((table.startsWith("(") && table.endsWith(")")) ? table : String.format(MySQLConstants.KEYWORD_TABLE, table)) .tableAlias(String.format(TABLE_ALIAS_PREFIX, 0)) .build(); List xFields = new ArrayList<>(); - List xWheres = new ArrayList<>(); List xOrders = new ArrayList<>(); if (CollectionUtils.isNotEmpty(xAxis)) { for (int i = 0; i < xAxis.size(); i++) { @@ -206,7 +207,7 @@ public class MysqlQueryProvider extends QueryProvider { } } List yFields = new ArrayList<>(); - List yWheres = new ArrayList<>(); + List yWheres = new ArrayList<>(); List yOrders = new ArrayList<>(); if (CollectionUtils.isNotEmpty(yAxis)) { for (int i = 0; i < yAxis.size(); i++) { @@ -224,7 +225,7 @@ public class MysqlQueryProvider extends QueryProvider { // 处理纵轴字段 yFields.add(getYFields(y, originField, fieldAlias)); // 处理纵轴过滤 - yWheres.addAll(getYWheres(y, originField, fieldAlias)); + yWheres.add(getYWheres(y, originField, fieldAlias)); // 处理纵轴排序 if (StringUtils.isNotEmpty(y.getSort()) && !StringUtils.equalsIgnoreCase(y.getSort(), "none")) { yOrders.add(SQLObj.builder() @@ -236,25 +237,24 @@ public class MysqlQueryProvider extends QueryProvider { } } // 处理视图中字段过滤 - List customWheres = transCustomFilterList(tableObj, customFilter); + String customWheres = transCustomFilterList(tableObj, fieldCustomFilter); // 处理仪表板字段过滤 - List extWheres = transExtFilterList(tableObj, extFilterRequestList); + String extWheres = transExtFilterList(tableObj, extFilterRequestList); // 构建sql所有参数 List fields = new ArrayList<>(); fields.addAll(xFields); fields.addAll(yFields); - List wheres = new ArrayList<>(); - wheres.addAll(xWheres); - if (customWheres != null) wheres.addAll(customWheres); - if (extWheres != null) wheres.addAll(extWheres); + List wheres = new ArrayList<>(); + if (customWheres != null) wheres.add(customWheres); + if (extWheres != null) wheres.add(extWheres); 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); + 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"); @@ -276,13 +276,12 @@ public class MysqlQueryProvider extends QueryProvider { } @Override - public String getSQLTableInfo(String table, List xAxis, List customFilter, List extFilterRequestList, Datasource ds, ChartViewWithBLOBs view) { + public String getSQLTableInfo(String table, List xAxis, List fieldCustomFilter, List extFilterRequestList, Datasource ds, ChartViewWithBLOBs view) { SQLObj tableObj = SQLObj.builder() .tableName((table.startsWith("(") && table.endsWith(")")) ? table : String.format(MySQLConstants.KEYWORD_TABLE, table)) .tableAlias(String.format(TABLE_ALIAS_PREFIX, 0)) .build(); List xFields = new ArrayList<>(); - List xWheres = new ArrayList<>(); List xOrders = new ArrayList<>(); if (CollectionUtils.isNotEmpty(xAxis)) { for (int i = 0; i < xAxis.size(); i++) { @@ -310,16 +309,15 @@ public class MysqlQueryProvider extends QueryProvider { } } // 处理视图中字段过滤 - List customWheres = transCustomFilterList(tableObj, customFilter); + String customWheres = transCustomFilterList(tableObj, fieldCustomFilter); // 处理仪表板字段过滤 - List extWheres = transExtFilterList(tableObj, extFilterRequestList); + String extWheres = transExtFilterList(tableObj, extFilterRequestList); // 构建sql所有参数 List fields = new ArrayList<>(); fields.addAll(xFields); - List wheres = new ArrayList<>(); - wheres.addAll(xWheres); - if (customWheres != null) wheres.addAll(customWheres); - if (extWheres != null) wheres.addAll(extWheres); + List wheres = new ArrayList<>(); + if (customWheres != null) wheres.add(customWheres); + if (extWheres != null) wheres.add(extWheres); List groups = new ArrayList<>(); groups.addAll(xFields); // 外层再次套sql @@ -346,24 +344,23 @@ public class MysqlQueryProvider extends QueryProvider { } @Override - public String getSQLAsTmpTableInfo(String sql, List xAxis, List customFilter, List extFilterRequestList, Datasource ds, ChartViewWithBLOBs view) { - return getSQLTableInfo("(" + sqlFix(sql) + ")", xAxis, customFilter, extFilterRequestList, null, view); + public String getSQLAsTmpTableInfo(String sql, List xAxis, List fieldCustomFilter, List extFilterRequestList, Datasource ds, ChartViewWithBLOBs view) { + return getSQLTableInfo("(" + sqlFix(sql) + ")", xAxis, fieldCustomFilter, extFilterRequestList, null, view); } @Override - public String getSQLAsTmp(String sql, List xAxis, List yAxis, List customFilter, List extFilterRequestList, ChartViewWithBLOBs view) { - return getSQL("(" + sqlFix(sql) + ")", xAxis, yAxis, customFilter, extFilterRequestList, null, view); + public String getSQLAsTmp(String sql, List xAxis, List yAxis, List fieldCustomFilter, List extFilterRequestList, ChartViewWithBLOBs view) { + return getSQL("(" + sqlFix(sql) + ")", xAxis, yAxis, fieldCustomFilter, extFilterRequestList, null, view); } @Override - public String getSQLStack(String table, List xAxis, List yAxis, List customFilter, List extFilterRequestList, List extStack, Datasource ds, ChartViewWithBLOBs view) { + public String getSQLStack(String table, List xAxis, List yAxis, List fieldCustomFilter, 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 xWheres = new ArrayList<>(); List xOrders = new ArrayList<>(); List xList = new ArrayList<>(); xList.addAll(xAxis); @@ -394,7 +391,7 @@ public class MysqlQueryProvider extends QueryProvider { } } List yFields = new ArrayList<>(); - List yWheres = new ArrayList<>(); + List yWheres = new ArrayList<>(); List yOrders = new ArrayList<>(); if (CollectionUtils.isNotEmpty(yAxis)) { for (int i = 0; i < yAxis.size(); i++) { @@ -412,7 +409,7 @@ public class MysqlQueryProvider extends QueryProvider { // 处理纵轴字段 yFields.add(getYFields(y, originField, fieldAlias)); // 处理纵轴过滤 - yWheres.addAll(getYWheres(y, originField, fieldAlias)); + yWheres.add(getYWheres(y, originField, fieldAlias)); // 处理纵轴排序 if (StringUtils.isNotEmpty(y.getSort()) && !StringUtils.equalsIgnoreCase(y.getSort(), "none")) { yOrders.add(SQLObj.builder() @@ -424,25 +421,24 @@ public class MysqlQueryProvider extends QueryProvider { } } // 处理视图中字段过滤 - List customWheres = transCustomFilterList(tableObj, customFilter); + String customWheres = transCustomFilterList(tableObj, fieldCustomFilter); // 处理仪表板字段过滤 - List extWheres = transExtFilterList(tableObj, extFilterRequestList); + String extWheres = transExtFilterList(tableObj, extFilterRequestList); // 构建sql所有参数 List fields = new ArrayList<>(); fields.addAll(xFields); fields.addAll(yFields); - List wheres = new ArrayList<>(); - wheres.addAll(xWheres); - if (customWheres != null) wheres.addAll(customWheres); - if (extWheres != null) wheres.addAll(extWheres); + List wheres = new ArrayList<>(); + if (customWheres != null) wheres.add(customWheres); + if (extWheres != null) wheres.add(extWheres); 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); + 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"); @@ -464,18 +460,17 @@ public class MysqlQueryProvider extends QueryProvider { } @Override - public String getSQLAsTmpStack(String table, List xAxis, List yAxis, List customFilter, List extFilterRequestList, List extStack, ChartViewWithBLOBs view) { - return getSQLStack("(" + sqlFix(table) + ")", xAxis, yAxis, customFilter, extFilterRequestList, extStack, null, view); + public String getSQLAsTmpStack(String table, List xAxis, List yAxis, List fieldCustomFilter, List extFilterRequestList, List extStack, ChartViewWithBLOBs view) { + return getSQLStack("(" + sqlFix(table) + ")", xAxis, yAxis, fieldCustomFilter, extFilterRequestList, extStack, null, view); } @Override - public String getSQLScatter(String table, List xAxis, List yAxis, List customFilter, List extFilterRequestList, List extBubble, Datasource ds, ChartViewWithBLOBs view) { + public String getSQLScatter(String table, List xAxis, List yAxis, List fieldCustomFilter, List extFilterRequestList, List extBubble, 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 xWheres = new ArrayList<>(); List xOrders = new ArrayList<>(); if (CollectionUtils.isNotEmpty(xAxis)) { for (int i = 0; i < xAxis.size(); i++) { @@ -503,7 +498,7 @@ public class MysqlQueryProvider extends QueryProvider { } } List yFields = new ArrayList<>(); - List yWheres = new ArrayList<>(); + List yWheres = new ArrayList<>(); List yOrders = new ArrayList<>(); List yList = new ArrayList<>(); yList.addAll(yAxis); @@ -524,7 +519,7 @@ public class MysqlQueryProvider extends QueryProvider { // 处理纵轴字段 yFields.add(getYFields(y, originField, fieldAlias)); // 处理纵轴过滤 - yWheres.addAll(getYWheres(y, originField, fieldAlias)); + yWheres.add(getYWheres(y, originField, fieldAlias)); // 处理纵轴排序 if (StringUtils.isNotEmpty(y.getSort()) && !StringUtils.equalsIgnoreCase(y.getSort(), "none")) { yOrders.add(SQLObj.builder() @@ -536,25 +531,24 @@ public class MysqlQueryProvider extends QueryProvider { } } // 处理视图中字段过滤 - List customWheres = transCustomFilterList(tableObj, customFilter); + String customWheres = transCustomFilterList(tableObj, fieldCustomFilter); // 处理仪表板字段过滤 - List extWheres = transExtFilterList(tableObj, extFilterRequestList); + String extWheres = transExtFilterList(tableObj, extFilterRequestList); // 构建sql所有参数 List fields = new ArrayList<>(); fields.addAll(xFields); fields.addAll(yFields); - List wheres = new ArrayList<>(); - wheres.addAll(xWheres); - if (customWheres != null) wheres.addAll(customWheres); - if (extWheres != null) wheres.addAll(extWheres); + List wheres = new ArrayList<>(); + if (customWheres != null) wheres.add(customWheres); + if (extWheres != null) wheres.add(extWheres); 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); + 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"); @@ -576,8 +570,8 @@ public class MysqlQueryProvider extends QueryProvider { } @Override - public String getSQLAsTmpScatter(String table, List xAxis, List yAxis, List customFilter, List extFilterRequestList, List extBubble, ChartViewWithBLOBs view) { - return getSQLScatter("(" + sqlFix(table) + ")", xAxis, yAxis, customFilter, extFilterRequestList, extBubble, null, view); + public String getSQLAsTmpScatter(String table, List xAxis, List yAxis, List fieldCustomFilter, List extFilterRequestList, List extBubble, ChartViewWithBLOBs view) { + return getSQLScatter("(" + sqlFix(table) + ")", xAxis, yAxis, fieldCustomFilter, extFilterRequestList, extBubble, null, view); } @Override @@ -586,14 +580,14 @@ public class MysqlQueryProvider extends QueryProvider { } @Override - public String getSQLSummary(String table, List yAxis, List customFilter, List extFilterRequestList, ChartViewWithBLOBs view) { + public String getSQLSummary(String table, List yAxis, List fieldCustomFilter, List extFilterRequestList, 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 yFields = new ArrayList<>(); - List yWheres = new ArrayList<>(); + List yWheres = new ArrayList<>(); List yOrders = new ArrayList<>(); if (CollectionUtils.isNotEmpty(yAxis)) { for (int i = 0; i < yAxis.size(); i++) { @@ -611,7 +605,7 @@ public class MysqlQueryProvider extends QueryProvider { // 处理纵轴字段 yFields.add(getYFields(y, originField, fieldAlias)); // 处理纵轴过滤 - yWheres.addAll(getYWheres(y, originField, fieldAlias)); + yWheres.add(getYWheres(y, originField, fieldAlias)); // 处理纵轴排序 if (StringUtils.isNotEmpty(y.getSort()) && !StringUtils.equalsIgnoreCase(y.getSort(), "none")) { yOrders.add(SQLObj.builder() @@ -623,21 +617,21 @@ public class MysqlQueryProvider extends QueryProvider { } } // 处理视图中字段过滤 - List customWheres = transCustomFilterList(tableObj, customFilter); + String customWheres = transCustomFilterList(tableObj, fieldCustomFilter); // 处理仪表板字段过滤 - List extWheres = transExtFilterList(tableObj, extFilterRequestList); + String extWheres = transExtFilterList(tableObj, extFilterRequestList); // 构建sql所有参数 List fields = new ArrayList<>(); fields.addAll(yFields); - List wheres = new ArrayList<>(); - if (customWheres != null) wheres.addAll(customWheres); - if (extWheres != null) wheres.addAll(extWheres); + List wheres = new ArrayList<>(); + if (customWheres != null) wheres.add(customWheres); + if (extWheres != null) wheres.add(extWheres); List groups = new ArrayList<>(); // 外层再次套sql List orders = new ArrayList<>(); orders.addAll(yOrders); - List aggWheres = new ArrayList<>(); - aggWheres.addAll(yWheres); + 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"); @@ -658,8 +652,8 @@ public class MysqlQueryProvider extends QueryProvider { } @Override - public String getSQLSummaryAsTmp(String sql, List yAxis, List customFilter, List extFilterRequestList, ChartViewWithBLOBs view) { - return getSQLSummary("(" + sqlFix(sql) + ")", yAxis, customFilter, extFilterRequestList, view); + public String getSQLSummaryAsTmp(String sql, List yAxis, List fieldCustomFilter, List extFilterRequestList, ChartViewWithBLOBs view) { + return getSQLSummary("(" + sqlFix(sql) + ")", yAxis, fieldCustomFilter, extFilterRequestList, view); } @Override @@ -733,67 +727,74 @@ public class MysqlQueryProvider extends QueryProvider { } } - public List transCustomFilterList(SQLObj tableObj, List requestList) { + public String transCustomFilterList(SQLObj tableObj, List requestList) { if (CollectionUtils.isEmpty(requestList)) { return null; } - List list = new ArrayList<>(); - for (ChartCustomFilterDTO request : requestList) { + List res = new ArrayList<>(); + for (ChartFieldCustomFilterDTO request : requestList) { + List list = new ArrayList<>(); DatasetTableField field = request.getField(); - if (ObjectUtils.isEmpty(field)) { - continue; - } - String value = request.getValue(); - String whereName = ""; - String whereTerm = transMysqlFilterTerm(request.getTerm()); - String whereValue = ""; - String originName; - if (ObjectUtils.isNotEmpty(field.getExtField()) && field.getExtField() == 2) { - // 解析origin name中有关联的字段生成sql表达式 - originName = calcFieldRegex(field.getOriginName(), tableObj); - } else if (ObjectUtils.isNotEmpty(field.getExtField()) && field.getExtField() == 1) { - originName = String.format(MySQLConstants.KEYWORD_FIX, tableObj.getTableAlias(), field.getOriginName()); - } else { - originName = String.format(MySQLConstants.KEYWORD_FIX, tableObj.getTableAlias(), field.getOriginName()); - } - if (field.getDeType() == 1) { - if (field.getDeExtractType() == 0 || field.getDeExtractType() == 5) { - whereName = String.format(MySQLConstants.STR_TO_DATE, originName, MySQLConstants.DEFAULT_DATE_FORMAT); + List filter = request.getFilter(); + for (ChartCustomFilterItemDTO filterItemDTO : filter) { + if (ObjectUtils.isEmpty(field)) { + continue; } - if (field.getDeExtractType() == 2 || field.getDeExtractType() == 3 || field.getDeExtractType() == 4) { - String cast = String.format(MySQLConstants.CAST, originName, MySQLConstants.DEFAULT_INT_FORMAT) + "/1000"; - whereName = String.format(MySQLConstants.FROM_UNIXTIME, cast, MySQLConstants.DEFAULT_DATE_FORMAT); + String value = filterItemDTO.getValue(); + String whereName = ""; + String whereTerm = transMysqlFilterTerm(filterItemDTO.getTerm()); + String whereValue = ""; + String originName; + if (ObjectUtils.isNotEmpty(field.getExtField()) && field.getExtField() == 2) { + // 解析origin name中有关联的字段生成sql表达式 + originName = calcFieldRegex(field.getOriginName(), tableObj); + } else if (ObjectUtils.isNotEmpty(field.getExtField()) && field.getExtField() == 1) { + originName = String.format(MySQLConstants.KEYWORD_FIX, tableObj.getTableAlias(), field.getOriginName()); + } else { + originName = String.format(MySQLConstants.KEYWORD_FIX, tableObj.getTableAlias(), field.getOriginName()); } - if (field.getDeExtractType() == 1) { + if (field.getDeType() == 1) { + if (field.getDeExtractType() == 0 || field.getDeExtractType() == 5) { + whereName = String.format(MySQLConstants.STR_TO_DATE, originName, MySQLConstants.DEFAULT_DATE_FORMAT); + } + if (field.getDeExtractType() == 2 || field.getDeExtractType() == 3 || field.getDeExtractType() == 4) { + String cast = String.format(MySQLConstants.CAST, originName, MySQLConstants.DEFAULT_INT_FORMAT) + "/1000"; + whereName = String.format(MySQLConstants.FROM_UNIXTIME, cast, MySQLConstants.DEFAULT_DATE_FORMAT); + } + if (field.getDeExtractType() == 1) { + whereName = originName; + } + } else { whereName = originName; } - } else { - whereName = originName; + if (StringUtils.equalsIgnoreCase(filterItemDTO.getTerm(), "null")) { + whereValue = ""; + } else if (StringUtils.equalsIgnoreCase(filterItemDTO.getTerm(), "not_null")) { + whereValue = ""; + } else if (StringUtils.equalsIgnoreCase(filterItemDTO.getTerm(), "empty")) { + whereValue = "''"; + } else if (StringUtils.equalsIgnoreCase(filterItemDTO.getTerm(), "not_empty")) { + whereValue = "''"; + } else if (StringUtils.containsIgnoreCase(filterItemDTO.getTerm(), "in")) { + whereValue = "('" + StringUtils.join(value, "','") + "')"; + } else if (StringUtils.containsIgnoreCase(filterItemDTO.getTerm(), "like")) { + whereValue = "'%" + value + "%'"; + } else { + whereValue = String.format(MySQLConstants.WHERE_VALUE_VALUE, value); + } + list.add(SQLObj.builder() + .whereField(whereName) + .whereTermAndValue(whereTerm + whereValue) + .build()); } - if (StringUtils.equalsIgnoreCase(request.getTerm(), "null")) { - whereValue = ""; - } else if (StringUtils.equalsIgnoreCase(request.getTerm(), "not_null")) { - whereValue = ""; - } else if (StringUtils.equalsIgnoreCase(request.getTerm(), "empty")) { - whereValue = "''"; - } else if (StringUtils.equalsIgnoreCase(request.getTerm(), "not_empty")) { - whereValue = "''"; - } else if (StringUtils.containsIgnoreCase(request.getTerm(), "in")) { - whereValue = "('" + StringUtils.join(value, "','") + "')"; - } else if (StringUtils.containsIgnoreCase(request.getTerm(), "like")) { - whereValue = "'%" + value + "%'"; - } else { - whereValue = String.format(MySQLConstants.WHERE_VALUE_VALUE, value); - } - list.add(SQLObj.builder() - .whereField(whereName) - .whereTermAndValue(whereTerm + whereValue) - .build()); + List strList = new ArrayList<>(); + list.forEach(ele -> strList.add(ele.getWhereField() + " " + ele.getWhereTermAndValue())); + res.add("(" + String.join(" " + getLogic(request.getLogic()) + " ", strList) + ")"); } - return list; + return "(" + String.join(" AND ", res) + ")"; } - public List transExtFilterList(SQLObj tableObj, List requestList) { + public String transExtFilterList(SQLObj tableObj, List requestList) { if (CollectionUtils.isEmpty(requestList)) { return null; } @@ -855,7 +856,9 @@ public class MysqlQueryProvider extends QueryProvider { .whereTermAndValue(whereTerm + whereValue) .build()); } - return list; + List strList = new ArrayList<>(); + list.forEach(ele -> strList.add(ele.getWhereField() + " " + ele.getWhereTermAndValue())); + return "(" + String.join(" AND ", strList) + ")"; } private String sqlFix(String sql) { @@ -988,7 +991,7 @@ public class MysqlQueryProvider extends QueryProvider { .build(); } - private List getYWheres(ChartViewFieldDTO y, String originField, String fieldAlias) { + private String getYWheres(ChartViewFieldDTO y, String originField, String fieldAlias) { List list = new ArrayList<>(); if (CollectionUtils.isNotEmpty(y.getFilter()) && y.getFilter().size() > 0) { y.getFilter().forEach(f -> { @@ -1017,7 +1020,9 @@ public class MysqlQueryProvider extends QueryProvider { .build()); }); } - return list; + List strList = new ArrayList<>(); + list.forEach(ele -> strList.add(ele.getWhereField() + " " + ele.getWhereTermAndValue())); + return CollectionUtils.isNotEmpty(list) ? "(" + String.join(" " + getLogic(y.getLogic()) + " ", strList) + ")" : null; } private String calcFieldRegex(String originField, SQLObj tableObj) { @@ -1051,4 +1056,14 @@ public class MysqlQueryProvider extends QueryProvider { return sql; } } + + private String getLogic(String logic) { + switch (logic) { + case "and": + return "AND"; + case "or": + return "OR"; + } + return "AND"; + } } diff --git a/backend/src/main/java/io/dataease/provider/query/oracle/OracleQueryProvider.java b/backend/src/main/java/io/dataease/provider/query/oracle/OracleQueryProvider.java index 334c59dcf7..59abf74362 100644 --- a/backend/src/main/java/io/dataease/provider/query/oracle/OracleQueryProvider.java +++ b/backend/src/main/java/io/dataease/provider/query/oracle/OracleQueryProvider.java @@ -7,10 +7,11 @@ import io.dataease.base.domain.DatasetTableFieldExample; import io.dataease.base.domain.Datasource; import io.dataease.base.mapper.DatasetTableFieldMapper; import io.dataease.controller.request.chart.ChartExtFilterRequest; +import io.dataease.dto.chart.ChartCustomFilterItemDTO; +import io.dataease.dto.chart.ChartFieldCustomFilterDTO; +import io.dataease.dto.chart.ChartViewFieldDTO; import io.dataease.dto.datasource.JdbcConfiguration; import io.dataease.dto.datasource.OracleConfiguration; -import io.dataease.dto.chart.ChartCustomFilterDTO; -import io.dataease.dto.chart.ChartViewFieldDTO; import io.dataease.dto.sqlObj.SQLObj; import io.dataease.provider.query.QueryProvider; import io.dataease.provider.query.SQLConstants; @@ -28,6 +29,7 @@ import java.text.SimpleDateFormat; import java.util.*; import java.util.regex.Matcher; import java.util.regex.Pattern; +import java.util.stream.Collectors; import static io.dataease.provider.query.SQLConstants.TABLE_ALIAS_PREFIX; @@ -93,7 +95,7 @@ public class OracleQueryProvider extends QueryProvider { } @Override - public String createQuerySQL(String table, List fields, boolean isGroup, Datasource ds, List customFilter) { + public String createQuerySQL(String table, List fields, boolean isGroup, Datasource ds, List fieldCustomFilter) { 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))) @@ -107,9 +109,9 @@ public class OracleQueryProvider extends QueryProvider { st_sql.add("isGroup", isGroup); if (CollectionUtils.isNotEmpty(xFields)) st_sql.add("groups", xFields); if (ObjectUtils.isNotEmpty(tableObj)) st_sql.add("table", tableObj); - List customWheres = transCustomFilterList(tableObj, customFilter); - List wheres = new ArrayList<>(); - if (customWheres != null) wheres.addAll(customWheres); + String customWheres = transCustomFilterList(tableObj, fieldCustomFilter); + List wheres = new ArrayList<>(); + if (customWheres != null) wheres.add(customWheres); if (CollectionUtils.isNotEmpty(wheres)) st_sql.add("filters", wheres); return st_sql.render(); } @@ -186,45 +188,44 @@ public class OracleQueryProvider extends QueryProvider { } @Override - public String createQuerySQLAsTmp(String sql, List fields, boolean isGroup, List customFilter) { - return createQuerySQL("(" + sqlFix(sql) + ")", fields, isGroup, null, customFilter); + public String createQuerySQLAsTmp(String sql, List fields, boolean isGroup, List fieldCustomFilter) { + return createQuerySQL("(" + sqlFix(sql) + ")", fields, isGroup, null, fieldCustomFilter); } @Override - public String createQueryTableWithPage(String table, List fields, Integer page, Integer pageSize, Integer realSize, boolean isGroup, Datasource ds, List customFilter) { + public String createQueryTableWithPage(String table, List fields, Integer page, Integer pageSize, Integer realSize, boolean isGroup, Datasource ds, List fieldCustomFilter) { List xFields = xFields(table, fields); return MessageFormat.format("SELECT {0} FROM ( SELECT DE_TMP.*, rownum r FROM ( {1} ) DE_TMP WHERE rownum <= {2} ) WHERE r > {3} ", - sqlColumn(xFields), createQuerySQL(table, fields, isGroup, ds, customFilter), Integer.valueOf(page * realSize).toString(), Integer.valueOf((page - 1) * pageSize).toString()); + sqlColumn(xFields), createQuerySQL(table, fields, isGroup, ds, fieldCustomFilter), Integer.valueOf(page * realSize).toString(), Integer.valueOf((page - 1) * pageSize).toString()); } @Override - public String createQuerySQLWithPage(String sql, List fields, Integer page, Integer pageSize, Integer realSize, boolean isGroup, List customFilter) { + public String createQuerySQLWithPage(String sql, List fields, Integer page, Integer pageSize, Integer realSize, boolean isGroup, List fieldCustomFilter) { List xFields = xFields("(" + sqlFix(sql) + ")", fields); return MessageFormat.format("SELECT {0} FROM ( SELECT DE_TMP.*, rownum r FROM ( {1} ) DE_TMP WHERE rownum <= {2} ) WHERE r > {3} ", - sqlColumn(xFields), createQuerySQLAsTmp(sql, fields, isGroup, customFilter), Integer.valueOf(page * realSize).toString(), Integer.valueOf((page - 1) * pageSize).toString()); + sqlColumn(xFields), createQuerySQLAsTmp(sql, fields, isGroup, fieldCustomFilter), Integer.valueOf(page * realSize).toString(), Integer.valueOf((page - 1) * pageSize).toString()); } @Override - public String createQueryTableWithLimit(String table, List fields, Integer limit, boolean isGroup, Datasource ds, List customFilter) { + public String createQueryTableWithLimit(String table, List fields, Integer limit, boolean isGroup, Datasource ds, List fieldCustomFilter) { String schema = new Gson().fromJson(ds.getConfiguration(), JdbcConfiguration.class).getSchema(); return String.format("SELECT * from %s WHERE rownum <= %s ", schema + "." + String.format(OracleConstants.KEYWORD_TABLE, table), limit.toString()); } @Override - public String createQuerySqlWithLimit(String sql, List fields, Integer limit, boolean isGroup, List customFilter) { + public String createQuerySqlWithLimit(String sql, List fields, Integer limit, boolean isGroup, List fieldCustomFilter) { return String.format("SELECT * from %s WHERE rownum <= %s ", "(" + sqlFix(sql) + ")", limit.toString()); } @Override - public String getSQL(String table, List xAxis, List yAxis, List customFilter, List extFilterRequestList, Datasource ds, ChartViewWithBLOBs view) { + public String getSQL(String table, List xAxis, List yAxis, List fieldCustomFilter, List extFilterRequestList, Datasource ds, ChartViewWithBLOBs view) { SQLObj tableObj = SQLObj.builder() .tableName((table.startsWith("(") && table.endsWith(")")) ? table : String.format(OracleConstants.KEYWORD_TABLE, table)) .tableAlias(String.format(OracleConstants.ALIAS_FIX, String.format(TABLE_ALIAS_PREFIX, 0))) .build(); setSchema(tableObj, ds); List xFields = new ArrayList<>(); - List xWheres = new ArrayList<>(); List xOrders = new ArrayList<>(); if (CollectionUtils.isNotEmpty(xAxis)) { for (int i = 0; i < xAxis.size(); i++) { @@ -252,7 +253,7 @@ public class OracleQueryProvider extends QueryProvider { } } List yFields = new ArrayList<>(); - List yWheres = new ArrayList<>(); + List yWheres = new ArrayList<>(); List yOrders = new ArrayList<>(); if (CollectionUtils.isNotEmpty(yAxis)) { for (int i = 0; i < yAxis.size(); i++) { @@ -270,7 +271,7 @@ public class OracleQueryProvider extends QueryProvider { // 处理纵轴字段 yFields.add(getYFields(y, originField, fieldAlias)); // 处理纵轴过滤 - yWheres.addAll(getYWheres(y, originField, fieldAlias)); + yWheres.add(getYWheres(y, originField, fieldAlias)); // 处理纵轴排序 if (StringUtils.isNotEmpty(y.getSort()) && !StringUtils.equalsIgnoreCase(y.getSort(), "none")) { yOrders.add(SQLObj.builder() @@ -282,25 +283,24 @@ public class OracleQueryProvider extends QueryProvider { } } // 处理视图中字段过滤 - List customWheres = transCustomFilterList(tableObj, customFilter); + String customWheres = transCustomFilterList(tableObj, fieldCustomFilter); // 处理仪表板字段过滤 - List extWheres = transExtFilterList(tableObj, extFilterRequestList); + String extWheres = transExtFilterList(tableObj, extFilterRequestList); // 构建sql所有参数 List fields = new ArrayList<>(); fields.addAll(xFields); fields.addAll(yFields); - List wheres = new ArrayList<>(); - wheres.addAll(xWheres); - if (customWheres != null) wheres.addAll(customWheres); - if (extWheres != null) wheres.addAll(extWheres); + List wheres = new ArrayList<>(); + if (customWheres != null) wheres.add(customWheres); + if (extWheres != null) wheres.add(extWheres); 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); + 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"); @@ -322,14 +322,13 @@ public class OracleQueryProvider extends QueryProvider { } @Override - public String getSQLTableInfo(String table, List xAxis, List customFilter, List extFilterRequestList, Datasource ds, ChartViewWithBLOBs view) { + public String getSQLTableInfo(String table, List xAxis, List fieldCustomFilter, List extFilterRequestList, Datasource ds, ChartViewWithBLOBs view) { SQLObj tableObj = SQLObj.builder() .tableName((table.startsWith("(") && table.endsWith(")")) ? table : String.format(OracleConstants.KEYWORD_TABLE, table)) .tableAlias(String.format(OracleConstants.ALIAS_FIX, String.format(TABLE_ALIAS_PREFIX, 0))) .build(); setSchema(tableObj, ds); List xFields = new ArrayList<>(); - List xWheres = new ArrayList<>(); List xOrders = new ArrayList<>(); if (CollectionUtils.isNotEmpty(xAxis)) { for (int i = 0; i < xAxis.size(); i++) { @@ -357,16 +356,15 @@ public class OracleQueryProvider extends QueryProvider { } } // 处理视图中字段过滤 - List customWheres = transCustomFilterList(tableObj, customFilter); + String customWheres = transCustomFilterList(tableObj, fieldCustomFilter); // 处理仪表板字段过滤 - List extWheres = transExtFilterList(tableObj, extFilterRequestList); + String extWheres = transExtFilterList(tableObj, extFilterRequestList); // 构建sql所有参数 List fields = new ArrayList<>(); fields.addAll(xFields); - List wheres = new ArrayList<>(); - wheres.addAll(xWheres); - if (customWheres != null) wheres.addAll(customWheres); - if (extWheres != null) wheres.addAll(extWheres); + List wheres = new ArrayList<>(); + if (customWheres != null) wheres.add(customWheres); + if (extWheres != null) wheres.add(extWheres); List groups = new ArrayList<>(); groups.addAll(xFields); // 外层再次套sql @@ -393,24 +391,23 @@ public class OracleQueryProvider extends QueryProvider { } @Override - public String getSQLAsTmpTableInfo(String sql, List xAxis, List customFilter, List extFilterRequestList, Datasource ds, ChartViewWithBLOBs view) { - return getSQLTableInfo("(" + sqlFix(sql) + ")", xAxis, customFilter, extFilterRequestList, null, view); + public String getSQLAsTmpTableInfo(String sql, List xAxis, List fieldCustomFilter, List extFilterRequestList, Datasource ds, ChartViewWithBLOBs view) { + return getSQLTableInfo("(" + sqlFix(sql) + ")", xAxis, fieldCustomFilter, extFilterRequestList, null, view); } @Override - public String getSQLAsTmp(String sql, List xAxis, List yAxis, List customFilter, List extFilterRequestList, ChartViewWithBLOBs view) { - return getSQL("(" + sqlFix(sql) + ")", xAxis, yAxis, customFilter, extFilterRequestList, null, view); + public String getSQLAsTmp(String sql, List xAxis, List yAxis, List fieldCustomFilter, List extFilterRequestList, ChartViewWithBLOBs view) { + return getSQL("(" + sqlFix(sql) + ")", xAxis, yAxis, fieldCustomFilter, extFilterRequestList, null, view); } @Override - public String getSQLStack(String table, List xAxis, List yAxis, List customFilter, List extFilterRequestList, List extStack, Datasource ds, ChartViewWithBLOBs view) { + public String getSQLStack(String table, List xAxis, List yAxis, List fieldCustomFilter, 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 xWheres = new ArrayList<>(); List xOrders = new ArrayList<>(); List xList = new ArrayList<>(); xList.addAll(xAxis); @@ -441,7 +438,7 @@ public class OracleQueryProvider extends QueryProvider { } } List yFields = new ArrayList<>(); - List yWheres = new ArrayList<>(); + List yWheres = new ArrayList<>(); List yOrders = new ArrayList<>(); if (CollectionUtils.isNotEmpty(yAxis)) { for (int i = 0; i < yAxis.size(); i++) { @@ -459,7 +456,7 @@ public class OracleQueryProvider extends QueryProvider { // 处理纵轴字段 yFields.add(getYFields(y, originField, fieldAlias)); // 处理纵轴过滤 - yWheres.addAll(getYWheres(y, originField, fieldAlias)); + yWheres.add(getYWheres(y, originField, fieldAlias)); // 处理纵轴排序 if (StringUtils.isNotEmpty(y.getSort()) && !StringUtils.equalsIgnoreCase(y.getSort(), "none")) { yOrders.add(SQLObj.builder() @@ -471,25 +468,24 @@ public class OracleQueryProvider extends QueryProvider { } } // 处理视图中字段过滤 - List customWheres = transCustomFilterList(tableObj, customFilter); + String customWheres = transCustomFilterList(tableObj, fieldCustomFilter); // 处理仪表板字段过滤 - List extWheres = transExtFilterList(tableObj, extFilterRequestList); + String extWheres = transExtFilterList(tableObj, extFilterRequestList); // 构建sql所有参数 List fields = new ArrayList<>(); fields.addAll(xFields); fields.addAll(yFields); - List wheres = new ArrayList<>(); - wheres.addAll(xWheres); - if (customWheres != null) wheres.addAll(customWheres); - if (extWheres != null) wheres.addAll(extWheres); + List wheres = new ArrayList<>(); + if (customWheres != null) wheres.add(customWheres); + if (extWheres != null) wheres.add(extWheres); 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); + 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"); @@ -511,19 +507,18 @@ public class OracleQueryProvider extends QueryProvider { } @Override - public String getSQLAsTmpStack(String table, List xAxis, List yAxis, List customFilter, List extFilterRequestList, List extStack, ChartViewWithBLOBs view) { - return getSQLStack("(" + sqlFix(table) + ")", xAxis, yAxis, customFilter, extFilterRequestList, extStack, null, view); + public String getSQLAsTmpStack(String table, List xAxis, List yAxis, List fieldCustomFilter, List extFilterRequestList, List extStack, ChartViewWithBLOBs view) { + return getSQLStack("(" + sqlFix(table) + ")", xAxis, yAxis, fieldCustomFilter, extFilterRequestList, extStack, null, view); } @Override - public String getSQLScatter(String table, List xAxis, List yAxis, List customFilter, List extFilterRequestList, List extBubble, Datasource ds, ChartViewWithBLOBs view) { + public String getSQLScatter(String table, List xAxis, List yAxis, List fieldCustomFilter, List extFilterRequestList, List extBubble, 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 xWheres = new ArrayList<>(); List xOrders = new ArrayList<>(); if (CollectionUtils.isNotEmpty(xAxis)) { for (int i = 0; i < xAxis.size(); i++) { @@ -551,7 +546,7 @@ public class OracleQueryProvider extends QueryProvider { } } List yFields = new ArrayList<>(); - List yWheres = new ArrayList<>(); + List yWheres = new ArrayList<>(); List yOrders = new ArrayList<>(); List yList = new ArrayList<>(); yList.addAll(yAxis); @@ -572,7 +567,7 @@ public class OracleQueryProvider extends QueryProvider { // 处理纵轴字段 yFields.add(getYFields(y, originField, fieldAlias)); // 处理纵轴过滤 - yWheres.addAll(getYWheres(y, originField, fieldAlias)); + yWheres.add(getYWheres(y, originField, fieldAlias)); // 处理纵轴排序 if (StringUtils.isNotEmpty(y.getSort()) && !StringUtils.equalsIgnoreCase(y.getSort(), "none")) { yOrders.add(SQLObj.builder() @@ -584,25 +579,24 @@ public class OracleQueryProvider extends QueryProvider { } } // 处理视图中字段过滤 - List customWheres = transCustomFilterList(tableObj, customFilter); + String customWheres = transCustomFilterList(tableObj, fieldCustomFilter); // 处理仪表板字段过滤 - List extWheres = transExtFilterList(tableObj, extFilterRequestList); + String extWheres = transExtFilterList(tableObj, extFilterRequestList); // 构建sql所有参数 List fields = new ArrayList<>(); fields.addAll(xFields); fields.addAll(yFields); - List wheres = new ArrayList<>(); - wheres.addAll(xWheres); - if (customWheres != null) wheres.addAll(customWheres); - if (extWheres != null) wheres.addAll(extWheres); + List wheres = new ArrayList<>(); + if (customWheres != null) wheres.add(customWheres); + if (extWheres != null) wheres.add(extWheres); 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); + 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"); @@ -624,8 +618,8 @@ public class OracleQueryProvider extends QueryProvider { } @Override - public String getSQLAsTmpScatter(String table, List xAxis, List yAxis, List customFilter, List extFilterRequestList, List extBubble, ChartViewWithBLOBs view) { - return getSQLScatter("(" + sqlFix(table) + ")", xAxis, yAxis, customFilter, extFilterRequestList, extBubble, null, view); + public String getSQLAsTmpScatter(String table, List xAxis, List yAxis, List fieldCustomFilter, List extFilterRequestList, List extBubble, ChartViewWithBLOBs view) { + return getSQLScatter("(" + sqlFix(table) + ")", xAxis, yAxis, fieldCustomFilter, extFilterRequestList, extBubble, null, view); } @Override @@ -634,14 +628,14 @@ public class OracleQueryProvider extends QueryProvider { } @Override - public String getSQLSummary(String table, List yAxis, List customFilter, List extFilterRequestList, ChartViewWithBLOBs view) { + public String getSQLSummary(String table, List yAxis, List fieldCustomFilter, List extFilterRequestList, 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(); List yFields = new ArrayList<>(); - List yWheres = new ArrayList<>(); + List yWheres = new ArrayList<>(); List yOrders = new ArrayList<>(); if (CollectionUtils.isNotEmpty(yAxis)) { for (int i = 0; i < yAxis.size(); i++) { @@ -659,7 +653,7 @@ public class OracleQueryProvider extends QueryProvider { // 处理纵轴字段 yFields.add(getYFields(y, originField, fieldAlias)); // 处理纵轴过滤 - yWheres.addAll(getYWheres(y, originField, fieldAlias)); + yWheres.add(getYWheres(y, originField, fieldAlias)); // 处理纵轴排序 if (StringUtils.isNotEmpty(y.getSort()) && !StringUtils.equalsIgnoreCase(y.getSort(), "none")) { yOrders.add(SQLObj.builder() @@ -671,20 +665,20 @@ public class OracleQueryProvider extends QueryProvider { } } // 处理视图中字段过滤 - List customWheres = transCustomFilterList(tableObj, customFilter); + String customWheres = transCustomFilterList(tableObj, fieldCustomFilter); // 处理仪表板字段过滤 - List extWheres = transExtFilterList(tableObj, extFilterRequestList); + String extWheres = transExtFilterList(tableObj, extFilterRequestList); // 构建sql所有参数 List fields = new ArrayList<>(); fields.addAll(yFields); - List wheres = new ArrayList<>(); - if (customWheres != null) wheres.addAll(customWheres); - if (extWheres != null) wheres.addAll(extWheres); + List wheres = new ArrayList<>(); + if (customWheres != null) wheres.add(customWheres); + if (extWheres != null) wheres.add(extWheres); // 外层再次套sql List orders = new ArrayList<>(); orders.addAll(yOrders); - List aggWheres = new ArrayList<>(); - aggWheres.addAll(yWheres); + 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"); @@ -705,8 +699,8 @@ public class OracleQueryProvider extends QueryProvider { } @Override - public String getSQLSummaryAsTmp(String sql, List yAxis, List customFilter, List extFilterRequestList, ChartViewWithBLOBs view) { - return getSQLSummary("(" + sqlFix(sql) + ")", yAxis, customFilter, extFilterRequestList, view); + public String getSQLSummaryAsTmp(String sql, List yAxis, List fieldCustomFilter, List extFilterRequestList, ChartViewWithBLOBs view) { + return getSQLSummary("(" + sqlFix(sql) + ")", yAxis, fieldCustomFilter, extFilterRequestList, view); } @Override @@ -784,73 +778,81 @@ public class OracleQueryProvider extends QueryProvider { } } - public List transCustomFilterList(SQLObj tableObj, List requestList) { + public String transCustomFilterList(SQLObj tableObj, List requestList) { if (CollectionUtils.isEmpty(requestList)) { return null; } - List list = new ArrayList<>(); - for (ChartCustomFilterDTO request : requestList) { + List res = new ArrayList<>(); + for (ChartFieldCustomFilterDTO request : requestList) { + List list = new ArrayList<>(); DatasetTableField field = request.getField(); - if (ObjectUtils.isEmpty(field)) { - continue; - } - String value = request.getValue(); - String whereName = ""; - String whereTerm = transMysqlFilterTerm(request.getTerm()); - String whereValue = ""; - - String originName; - if (ObjectUtils.isNotEmpty(field.getExtField()) && field.getExtField() == 2) { - // 解析origin name中有关联的字段生成sql表达式 - originName = calcFieldRegex(field.getOriginName(), tableObj); - } else if (ObjectUtils.isNotEmpty(field.getExtField()) && field.getExtField() == 1) { - originName = String.format(OracleConstants.KEYWORD_FIX, tableObj.getTableAlias(), field.getOriginName()); - } else { - originName = String.format(OracleConstants.KEYWORD_FIX, tableObj.getTableAlias(), field.getOriginName()); - } - - if (field.getDeType() == 1) { - if (field.getDeExtractType() == 0 || field.getDeExtractType() == 5) { - whereName = String.format(OracleConstants.TO_DATE, originName, OracleConstants.DEFAULT_DATE_FORMAT); + List filter = request.getFilter(); + for (ChartCustomFilterItemDTO filterItemDTO : filter) { + if (ObjectUtils.isEmpty(field)) { + continue; } - if (field.getDeExtractType() == 2 || field.getDeExtractType() == 3 || field.getDeExtractType() == 4) { - String cast = String.format(OracleConstants.CAST, originName, OracleConstants.DEFAULT_INT_FORMAT) + "/1000"; - whereName = String.format(OracleConstants.FROM_UNIXTIME, cast, OracleConstants.DEFAULT_DATE_FORMAT); + String value = filterItemDTO.getValue(); + String whereName = ""; + String whereTerm = transMysqlFilterTerm(filterItemDTO.getTerm()); + String whereValue = ""; + + String originName; + if (ObjectUtils.isNotEmpty(field.getExtField()) && field.getExtField() == 2) { + // 解析origin name中有关联的字段生成sql表达式 + originName = calcFieldRegex(field.getOriginName(), tableObj); + } else if (ObjectUtils.isNotEmpty(field.getExtField()) && field.getExtField() == 1) { + originName = String.format(OracleConstants.KEYWORD_FIX, tableObj.getTableAlias(), field.getOriginName()); + } else { + originName = String.format(OracleConstants.KEYWORD_FIX, tableObj.getTableAlias(), field.getOriginName()); } - if (field.getDeExtractType() == 1) { + + if (field.getDeType() == 1) { + if (field.getDeExtractType() == 0 || field.getDeExtractType() == 5) { + whereName = String.format(OracleConstants.TO_DATE, originName, OracleConstants.DEFAULT_DATE_FORMAT); + } + if (field.getDeExtractType() == 2 || field.getDeExtractType() == 3 || field.getDeExtractType() == 4) { + String cast = String.format(OracleConstants.CAST, originName, OracleConstants.DEFAULT_INT_FORMAT) + "/1000"; + whereName = String.format(OracleConstants.FROM_UNIXTIME, cast, OracleConstants.DEFAULT_DATE_FORMAT); + } + if (field.getDeExtractType() == 1) { + whereName = originName; + } + } else { whereName = originName; } - } else { - whereName = originName; - } - if (StringUtils.equalsIgnoreCase(request.getTerm(), "null")) { - whereValue = ""; - } else if (StringUtils.equalsIgnoreCase(request.getTerm(), "not_null")) { - whereValue = ""; - } else if (StringUtils.equalsIgnoreCase(request.getTerm(), "empty")) { - whereValue = "''"; - } else if (StringUtils.equalsIgnoreCase(request.getTerm(), "not_empty")) { - whereValue = "''"; - } else if (StringUtils.containsIgnoreCase(request.getTerm(), "in")) { - whereValue = "('" + StringUtils.join(value, "','") + "')"; - } else if (StringUtils.containsIgnoreCase(request.getTerm(), "like")) { - whereValue = "'%" + value + "%'"; - } else { - if (field.getDeType() == 1) { - whereValue = String.format(OracleConstants.TO_DATE, "'" + value + "'", OracleConstants.DEFAULT_DATE_FORMAT); + if (StringUtils.equalsIgnoreCase(filterItemDTO.getTerm(), "null")) { + whereValue = ""; + } else if (StringUtils.equalsIgnoreCase(filterItemDTO.getTerm(), "not_null")) { + whereValue = ""; + } else if (StringUtils.equalsIgnoreCase(filterItemDTO.getTerm(), "empty")) { + whereValue = "''"; + } else if (StringUtils.equalsIgnoreCase(filterItemDTO.getTerm(), "not_empty")) { + whereValue = "''"; + } else if (StringUtils.containsIgnoreCase(filterItemDTO.getTerm(), "in")) { + whereValue = "('" + StringUtils.join(value, "','") + "')"; + } else if (StringUtils.containsIgnoreCase(filterItemDTO.getTerm(), "like")) { + whereValue = "'%" + value + "%'"; } else { - whereValue = String.format(OracleConstants.WHERE_VALUE_VALUE, value); + if (field.getDeType() == 1) { + whereValue = String.format(OracleConstants.TO_DATE, "'" + value + "'", OracleConstants.DEFAULT_DATE_FORMAT); + } else { + whereValue = String.format(OracleConstants.WHERE_VALUE_VALUE, value); + } } + list.add(SQLObj.builder() + .whereField(whereName) + .whereTermAndValue(whereTerm + whereValue) + .build()); } - list.add(SQLObj.builder() - .whereField(whereName) - .whereTermAndValue(whereTerm + whereValue) - .build()); + + List strList = new ArrayList<>(); + list.forEach(ele -> strList.add(ele.getWhereField() + " " + ele.getWhereTermAndValue())); + res.add("(" + String.join(" " + getLogic(request.getLogic()) + " ", strList) + ")"); } - return list; + return "(" + String.join(" AND ", res) + ")"; } - public List transExtFilterList(SQLObj tableObj, List requestList) { + public String transExtFilterList(SQLObj tableObj, List requestList) { if (CollectionUtils.isEmpty(requestList)) { return null; } @@ -913,7 +915,9 @@ public class OracleQueryProvider extends QueryProvider { .whereTermAndValue(whereTerm + whereValue) .build()); } - return list; + List strList = new ArrayList<>(); + list.forEach(ele -> strList.add(ele.getWhereField() + " " + ele.getWhereTermAndValue())); + return "(" + String.join(" AND ", strList) + ")"; } private String sqlFix(String sql) { @@ -1060,7 +1064,7 @@ public class OracleQueryProvider extends QueryProvider { .build(); } - private List getYWheres(ChartViewFieldDTO y, String originField, String fieldAlias) { + private String getYWheres(ChartViewFieldDTO y, String originField, String fieldAlias) { List list = new ArrayList<>(); if (CollectionUtils.isNotEmpty(y.getFilter()) && y.getFilter().size() > 0) { y.getFilter().forEach(f -> { @@ -1089,7 +1093,9 @@ public class OracleQueryProvider extends QueryProvider { .build()); }); } - return list; + List strList = new ArrayList<>(); + list.forEach(ele -> strList.add(ele.getWhereField() + " " + ele.getWhereTermAndValue())); + return CollectionUtils.isNotEmpty(list) ? "(" + String.join(" " + getLogic(y.getLogic()) + " ", strList) + ")" : null; } private String calcFieldRegex(String originField, SQLObj tableObj) { @@ -1123,4 +1129,14 @@ public class OracleQueryProvider extends QueryProvider { return sql; } } + + private String getLogic(String logic) { + switch (logic) { + case "and": + return "AND"; + case "or": + return "OR"; + } + return "AND"; + } } diff --git a/backend/src/main/java/io/dataease/provider/query/pg/PgQueryProvider.java b/backend/src/main/java/io/dataease/provider/query/pg/PgQueryProvider.java index 1ace294670..21c39311c9 100644 --- a/backend/src/main/java/io/dataease/provider/query/pg/PgQueryProvider.java +++ b/backend/src/main/java/io/dataease/provider/query/pg/PgQueryProvider.java @@ -8,9 +8,10 @@ import io.dataease.base.domain.Datasource; import io.dataease.base.mapper.DatasetTableFieldMapper; import io.dataease.commons.constants.DeTypeConstants; import io.dataease.controller.request.chart.ChartExtFilterRequest; -import io.dataease.dto.datasource.JdbcConfiguration; -import io.dataease.dto.chart.ChartCustomFilterDTO; +import io.dataease.dto.chart.ChartCustomFilterItemDTO; +import io.dataease.dto.chart.ChartFieldCustomFilterDTO; import io.dataease.dto.chart.ChartViewFieldDTO; +import io.dataease.dto.datasource.JdbcConfiguration; import io.dataease.dto.sqlObj.SQLObj; import io.dataease.provider.query.QueryProvider; import io.dataease.provider.query.SQLConstants; @@ -29,6 +30,7 @@ import java.text.SimpleDateFormat; import java.util.*; import java.util.regex.Matcher; import java.util.regex.Pattern; +import java.util.stream.Collectors; import static io.dataease.provider.query.SQLConstants.TABLE_ALIAS_PREFIX; @@ -97,7 +99,7 @@ public class PgQueryProvider extends QueryProvider { } @Override - public String createQuerySQL(String table, List fields, boolean isGroup, Datasource ds, List customFilter) { + public String createQuerySQL(String table, List fields, boolean isGroup, Datasource ds, List fieldCustomFilter) { SQLObj tableObj = SQLObj.builder() .tableName((table.startsWith("(") && table.endsWith(")")) ? table : String.format(PgConstants.KEYWORD_TABLE, table)) .tableAlias(String.format(TABLE_ALIAS_PREFIX, 0)) @@ -158,47 +160,46 @@ public class PgQueryProvider extends QueryProvider { st_sql.add("isGroup", isGroup); if (CollectionUtils.isNotEmpty(xFields)) st_sql.add("groups", xFields); if (ObjectUtils.isNotEmpty(tableObj)) st_sql.add("table", tableObj); - List customWheres = transCustomFilterList(tableObj, customFilter); - List wheres = new ArrayList<>(); - if (customWheres != null) wheres.addAll(customWheres); + String customWheres = transCustomFilterList(tableObj, fieldCustomFilter); + List wheres = new ArrayList<>(); + if (customWheres != null) wheres.add(customWheres); if (CollectionUtils.isNotEmpty(wheres)) st_sql.add("filters", wheres); return st_sql.render(); } @Override - public String createQuerySQLAsTmp(String sql, List fields, boolean isGroup, List customFilter) { - return createQuerySQL("(" + sqlFix(sql) + ")", fields, isGroup, null, customFilter); + public String createQuerySQLAsTmp(String sql, List fields, boolean isGroup, List fieldCustomFilter) { + return createQuerySQL("(" + sqlFix(sql) + ")", fields, isGroup, null, fieldCustomFilter); } @Override - public String createQueryTableWithPage(String table, List fields, Integer page, Integer pageSize, Integer realSize, boolean isGroup, Datasource ds, List customFilter) { - return createQuerySQL(table, fields, isGroup, ds, customFilter) + " LIMIT " + realSize + " offset " + (page - 1) * pageSize; + public String createQueryTableWithPage(String table, List fields, Integer page, Integer pageSize, Integer realSize, boolean isGroup, Datasource ds, List fieldCustomFilter) { + return createQuerySQL(table, fields, isGroup, ds, fieldCustomFilter) + " LIMIT " + realSize + " offset " + (page - 1) * pageSize; } @Override - public String createQuerySQLWithPage(String sql, List fields, Integer page, Integer pageSize, Integer realSize, boolean isGroup, List customFilter) { - return createQuerySQLAsTmp(sql, fields, isGroup, customFilter) + " LIMIT " + realSize + " offset " + (page - 1) * pageSize; + public String createQuerySQLWithPage(String sql, List fields, Integer page, Integer pageSize, Integer realSize, boolean isGroup, List fieldCustomFilter) { + return createQuerySQLAsTmp(sql, fields, isGroup, fieldCustomFilter) + " LIMIT " + realSize + " offset " + (page - 1) * pageSize; } @Override - public String createQueryTableWithLimit(String table, List fields, Integer limit, boolean isGroup, Datasource ds, List customFilter) { - return createQuerySQL(table, fields, isGroup, ds, customFilter) + " LIMIT " + limit + " offset 0"; + public String createQueryTableWithLimit(String table, List fields, Integer limit, boolean isGroup, Datasource ds, List fieldCustomFilter) { + return createQuerySQL(table, fields, isGroup, ds, fieldCustomFilter) + " LIMIT " + limit + " offset 0"; } @Override - public String createQuerySqlWithLimit(String sql, List fields, Integer limit, boolean isGroup, List customFilter) { - return createQuerySQLAsTmp(sql, fields, isGroup, customFilter) + " LIMIT " + limit + " offset 0"; + public String createQuerySqlWithLimit(String sql, List fields, Integer limit, boolean isGroup, List fieldCustomFilter) { + return createQuerySQLAsTmp(sql, fields, isGroup, fieldCustomFilter) + " LIMIT " + limit + " offset 0"; } @Override - public String getSQL(String table, List xAxis, List yAxis, List customFilter, List extFilterRequestList, Datasource ds, ChartViewWithBLOBs view) { + public String getSQL(String table, List xAxis, List yAxis, List fieldCustomFilter, List extFilterRequestList, Datasource ds, ChartViewWithBLOBs view) { SQLObj tableObj = SQLObj.builder() .tableName((table.startsWith("(") && table.endsWith(")")) ? table : String.format(PgConstants.KEYWORD_TABLE, table)) .tableAlias(String.format(TABLE_ALIAS_PREFIX, 0)) .build(); setSchema(tableObj, ds); List xFields = new ArrayList<>(); - List xWheres = new ArrayList<>(); List xOrders = new ArrayList<>(); if (CollectionUtils.isNotEmpty(xAxis)) { for (int i = 0; i < xAxis.size(); i++) { @@ -226,7 +227,7 @@ public class PgQueryProvider extends QueryProvider { } } List yFields = new ArrayList<>(); - List yWheres = new ArrayList<>(); + List yWheres = new ArrayList<>(); List yOrders = new ArrayList<>(); if (CollectionUtils.isNotEmpty(yAxis)) { for (int i = 0; i < yAxis.size(); i++) { @@ -244,7 +245,7 @@ public class PgQueryProvider extends QueryProvider { // 处理纵轴字段 yFields.add(getYFields(y, originField, fieldAlias)); // 处理纵轴过滤 - yWheres.addAll(getYWheres(y, originField, fieldAlias)); + yWheres.add(getYWheres(y, originField, fieldAlias)); // 处理纵轴排序 if (StringUtils.isNotEmpty(y.getSort()) && !StringUtils.equalsIgnoreCase(y.getSort(), "none")) { yOrders.add(SQLObj.builder() @@ -256,25 +257,24 @@ public class PgQueryProvider extends QueryProvider { } } // 处理视图中字段过滤 - List customWheres = transCustomFilterList(tableObj, customFilter); + String customWheres = transCustomFilterList(tableObj, fieldCustomFilter); // 处理仪表板字段过滤 - List extWheres = transExtFilterList(tableObj, extFilterRequestList); + String extWheres = transExtFilterList(tableObj, extFilterRequestList); // 构建sql所有参数 List fields = new ArrayList<>(); fields.addAll(xFields); fields.addAll(yFields); - List wheres = new ArrayList<>(); - wheres.addAll(xWheres); - if (customWheres != null) wheres.addAll(customWheres); - if (extWheres != null) wheres.addAll(extWheres); + List wheres = new ArrayList<>(); + if (customWheres != null) wheres.add(customWheres); + if (extWheres != null) wheres.add(extWheres); 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); + 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"); @@ -296,14 +296,13 @@ public class PgQueryProvider extends QueryProvider { } @Override - public String getSQLTableInfo(String table, List xAxis, List customFilter, List extFilterRequestList, Datasource ds, ChartViewWithBLOBs view) { + public String getSQLTableInfo(String table, List xAxis, List fieldCustomFilter, List extFilterRequestList, Datasource ds, ChartViewWithBLOBs view) { SQLObj tableObj = SQLObj.builder() .tableName((table.startsWith("(") && table.endsWith(")")) ? table : String.format(PgConstants.KEYWORD_TABLE, table)) .tableAlias(String.format(TABLE_ALIAS_PREFIX, 0)) .build(); setSchema(tableObj, ds); List xFields = new ArrayList<>(); - List xWheres = new ArrayList<>(); List xOrders = new ArrayList<>(); if (CollectionUtils.isNotEmpty(xAxis)) { for (int i = 0; i < xAxis.size(); i++) { @@ -331,16 +330,15 @@ public class PgQueryProvider extends QueryProvider { } } // 处理视图中字段过滤 - List customWheres = transCustomFilterList(tableObj, customFilter); + String customWheres = transCustomFilterList(tableObj, fieldCustomFilter); // 处理仪表板字段过滤 - List extWheres = transExtFilterList(tableObj, extFilterRequestList); + String extWheres = transExtFilterList(tableObj, extFilterRequestList); // 构建sql所有参数 List fields = new ArrayList<>(); fields.addAll(xFields); - List wheres = new ArrayList<>(); - wheres.addAll(xWheres); - if (customWheres != null) wheres.addAll(customWheres); - if (extWheres != null) wheres.addAll(extWheres); + List wheres = new ArrayList<>(); + if (customWheres != null) wheres.add(customWheres); + if (extWheres != null) wheres.add(extWheres); List groups = new ArrayList<>(); groups.addAll(xFields); // 外层再次套sql @@ -367,25 +365,24 @@ public class PgQueryProvider extends QueryProvider { } @Override - public String getSQLAsTmpTableInfo(String sql, List xAxis, List customFilter, List extFilterRequestList, Datasource ds, ChartViewWithBLOBs view) { - return getSQLTableInfo("(" + sqlFix(sql) + ")", xAxis, customFilter, extFilterRequestList, null, view); + public String getSQLAsTmpTableInfo(String sql, List xAxis, List fieldCustomFilter, List extFilterRequestList, Datasource ds, ChartViewWithBLOBs view) { + return getSQLTableInfo("(" + sqlFix(sql) + ")", xAxis, fieldCustomFilter, extFilterRequestList, null, view); } @Override - public String getSQLAsTmp(String sql, List xAxis, List yAxis, List customFilter, List extFilterRequestList, ChartViewWithBLOBs view) { - return getSQL("(" + sqlFix(sql) + ")", xAxis, yAxis, customFilter, extFilterRequestList, null, view); + public String getSQLAsTmp(String sql, List xAxis, List yAxis, List fieldCustomFilter, List extFilterRequestList, ChartViewWithBLOBs view) { + return getSQL("(" + sqlFix(sql) + ")", xAxis, yAxis, fieldCustomFilter, extFilterRequestList, null, view); } @Override - public String getSQLStack(String table, List xAxis, List yAxis, List customFilter, List extFilterRequestList, List extStack, Datasource ds, ChartViewWithBLOBs view) { + public String getSQLStack(String table, List xAxis, List yAxis, List fieldCustomFilter, 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 xWheres = new ArrayList<>(); List xOrders = new ArrayList<>(); List xList = new ArrayList<>(); xList.addAll(xAxis); @@ -416,7 +413,7 @@ public class PgQueryProvider extends QueryProvider { } } List yFields = new ArrayList<>(); - List yWheres = new ArrayList<>(); + List yWheres = new ArrayList<>(); List yOrders = new ArrayList<>(); if (CollectionUtils.isNotEmpty(yAxis)) { for (int i = 0; i < yAxis.size(); i++) { @@ -434,7 +431,7 @@ public class PgQueryProvider extends QueryProvider { // 处理纵轴字段 yFields.add(getYFields(y, originField, fieldAlias)); // 处理纵轴过滤 - yWheres.addAll(getYWheres(y, originField, fieldAlias)); + yWheres.add(getYWheres(y, originField, fieldAlias)); // 处理纵轴排序 if (StringUtils.isNotEmpty(y.getSort()) && !StringUtils.equalsIgnoreCase(y.getSort(), "none")) { yOrders.add(SQLObj.builder() @@ -446,25 +443,24 @@ public class PgQueryProvider extends QueryProvider { } } // 处理视图中字段过滤 - List customWheres = transCustomFilterList(tableObj, customFilter); + String customWheres = transCustomFilterList(tableObj, fieldCustomFilter); // 处理仪表板字段过滤 - List extWheres = transExtFilterList(tableObj, extFilterRequestList); + String extWheres = transExtFilterList(tableObj, extFilterRequestList); // 构建sql所有参数 List fields = new ArrayList<>(); fields.addAll(xFields); fields.addAll(yFields); - List wheres = new ArrayList<>(); - wheres.addAll(xWheres); - if (customWheres != null) wheres.addAll(customWheres); - if (extWheres != null) wheres.addAll(extWheres); + List wheres = new ArrayList<>(); + if (customWheres != null) wheres.add(customWheres); + if (extWheres != null) wheres.add(extWheres); 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); + 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"); @@ -486,19 +482,18 @@ public class PgQueryProvider extends QueryProvider { } @Override - public String getSQLAsTmpStack(String table, List xAxis, List yAxis, List customFilter, List extFilterRequestList, List extStack, ChartViewWithBLOBs view) { - return getSQLStack("(" + sqlFix(table) + ")", xAxis, yAxis, customFilter, extFilterRequestList, extStack, null, view); + public String getSQLAsTmpStack(String table, List xAxis, List yAxis, List fieldCustomFilter, List extFilterRequestList, List extStack, ChartViewWithBLOBs view) { + return getSQLStack("(" + sqlFix(table) + ")", xAxis, yAxis, fieldCustomFilter, extFilterRequestList, extStack, null, view); } @Override - public String getSQLScatter(String table, List xAxis, List yAxis, List customFilter, List extFilterRequestList, List extBubble, Datasource ds, ChartViewWithBLOBs view) { + public String getSQLScatter(String table, List xAxis, List yAxis, List fieldCustomFilter, List extFilterRequestList, List extBubble, 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 xWheres = new ArrayList<>(); List xOrders = new ArrayList<>(); if (CollectionUtils.isNotEmpty(xAxis)) { for (int i = 0; i < xAxis.size(); i++) { @@ -526,7 +521,7 @@ public class PgQueryProvider extends QueryProvider { } } List yFields = new ArrayList<>(); - List yWheres = new ArrayList<>(); + List yWheres = new ArrayList<>(); List yOrders = new ArrayList<>(); List yList = new ArrayList<>(); yList.addAll(yAxis); @@ -547,7 +542,7 @@ public class PgQueryProvider extends QueryProvider { // 处理纵轴字段 yFields.add(getYFields(y, originField, fieldAlias)); // 处理纵轴过滤 - yWheres.addAll(getYWheres(y, originField, fieldAlias)); + yWheres.add(getYWheres(y, originField, fieldAlias)); // 处理纵轴排序 if (StringUtils.isNotEmpty(y.getSort()) && !StringUtils.equalsIgnoreCase(y.getSort(), "none")) { yOrders.add(SQLObj.builder() @@ -559,25 +554,24 @@ public class PgQueryProvider extends QueryProvider { } } // 处理视图中字段过滤 - List customWheres = transCustomFilterList(tableObj, customFilter); + String customWheres = transCustomFilterList(tableObj, fieldCustomFilter); // 处理仪表板字段过滤 - List extWheres = transExtFilterList(tableObj, extFilterRequestList); + String extWheres = transExtFilterList(tableObj, extFilterRequestList); // 构建sql所有参数 List fields = new ArrayList<>(); fields.addAll(xFields); fields.addAll(yFields); - List wheres = new ArrayList<>(); - wheres.addAll(xWheres); - if (customWheres != null) wheres.addAll(customWheres); - if (extWheres != null) wheres.addAll(extWheres); + List wheres = new ArrayList<>(); + if (customWheres != null) wheres.add(customWheres); + if (extWheres != null) wheres.add(extWheres); 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); + 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"); @@ -599,8 +593,8 @@ public class PgQueryProvider extends QueryProvider { } @Override - public String getSQLAsTmpScatter(String table, List xAxis, List yAxis, List customFilter, List extFilterRequestList, List extBubble, ChartViewWithBLOBs view) { - return getSQLScatter("(" + sqlFix(table) + ")", xAxis, yAxis, customFilter, extFilterRequestList, extBubble, null, view); + public String getSQLAsTmpScatter(String table, List xAxis, List yAxis, List fieldCustomFilter, List extFilterRequestList, List extBubble, ChartViewWithBLOBs view) { + return getSQLScatter("(" + sqlFix(table) + ")", xAxis, yAxis, fieldCustomFilter, extFilterRequestList, extBubble, null, view); } @Override @@ -609,14 +603,14 @@ public class PgQueryProvider extends QueryProvider { } @Override - public String getSQLSummary(String table, List yAxis, List customFilter, List extFilterRequestList, ChartViewWithBLOBs view) { + public String getSQLSummary(String table, List yAxis, List fieldCustomFilter, List extFilterRequestList, 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(); List yFields = new ArrayList<>(); - List yWheres = new ArrayList<>(); + List yWheres = new ArrayList<>(); List yOrders = new ArrayList<>(); if (CollectionUtils.isNotEmpty(yAxis)) { for (int i = 0; i < yAxis.size(); i++) { @@ -634,7 +628,7 @@ public class PgQueryProvider extends QueryProvider { // 处理纵轴字段 yFields.add(getYFields(y, originField, fieldAlias)); // 处理纵轴过滤 - yWheres.addAll(getYWheres(y, originField, fieldAlias)); + yWheres.add(getYWheres(y, originField, fieldAlias)); // 处理纵轴排序 if (StringUtils.isNotEmpty(y.getSort()) && !StringUtils.equalsIgnoreCase(y.getSort(), "none")) { yOrders.add(SQLObj.builder() @@ -646,21 +640,21 @@ public class PgQueryProvider extends QueryProvider { } } // 处理视图中字段过滤 - List customWheres = transCustomFilterList(tableObj, customFilter); + String customWheres = transCustomFilterList(tableObj, fieldCustomFilter); // 处理仪表板字段过滤 - List extWheres = transExtFilterList(tableObj, extFilterRequestList); + String extWheres = transExtFilterList(tableObj, extFilterRequestList); // 构建sql所有参数 List fields = new ArrayList<>(); fields.addAll(yFields); - List wheres = new ArrayList<>(); - if (customWheres != null) wheres.addAll(customWheres); - if (extWheres != null) wheres.addAll(extWheres); + List wheres = new ArrayList<>(); + if (customWheres != null) wheres.add(customWheres); + if (extWheres != null) wheres.add(extWheres); List groups = new ArrayList<>(); // 外层再次套sql List orders = new ArrayList<>(); orders.addAll(yOrders); - List aggWheres = new ArrayList<>(); - aggWheres.addAll(yWheres); + 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"); @@ -681,8 +675,8 @@ public class PgQueryProvider extends QueryProvider { } @Override - public String getSQLSummaryAsTmp(String sql, List yAxis, List customFilter, List extFilterRequestList, ChartViewWithBLOBs view) { - return getSQLSummary("(" + sqlFix(sql) + ")", yAxis, customFilter, extFilterRequestList, view); + public String getSQLSummaryAsTmp(String sql, List yAxis, List fieldCustomFilter, List extFilterRequestList, ChartViewWithBLOBs view) { + return getSQLSummary("(" + sqlFix(sql) + ")", yAxis, fieldCustomFilter, extFilterRequestList, view); } @Override @@ -760,67 +754,75 @@ public class PgQueryProvider extends QueryProvider { } } - public List transCustomFilterList(SQLObj tableObj, List requestList) { + public String transCustomFilterList(SQLObj tableObj, List requestList) { if (CollectionUtils.isEmpty(requestList)) { return null; } - List list = new ArrayList<>(); - for (ChartCustomFilterDTO request : requestList) { + List res = new ArrayList<>(); + for (ChartFieldCustomFilterDTO request : requestList) { + List list = new ArrayList<>(); DatasetTableField field = request.getField(); - if (ObjectUtils.isEmpty(field)) { - continue; - } - String value = request.getValue(); - String whereName = ""; - String whereTerm = transMysqlFilterTerm(request.getTerm()); - String whereValue = ""; - String originName; - if (ObjectUtils.isNotEmpty(field.getExtField()) && field.getExtField() == 2) { - // 解析origin name中有关联的字段生成sql表达式 - originName = calcFieldRegex(field.getOriginName(), tableObj); - } else if (ObjectUtils.isNotEmpty(field.getExtField()) && field.getExtField() == 1) { - originName = String.format(PgConstants.KEYWORD_FIX, tableObj.getTableAlias(), field.getOriginName()); - } else { - originName = String.format(PgConstants.KEYWORD_FIX, tableObj.getTableAlias(), field.getOriginName()); - } - if (field.getDeType() == 1) { - if (field.getDeExtractType() == 0 || field.getDeExtractType() == 5) { - whereName = String.format(PgConstants.CAST, originName, "timestamp"); + List filter = request.getFilter(); + for (ChartCustomFilterItemDTO filterItemDTO : filter) { + if (ObjectUtils.isEmpty(field)) { + continue; } - if (field.getDeExtractType() == 2 || field.getDeExtractType() == 3 || field.getDeExtractType() == 4) { - String cast = String.format(PgConstants.CAST, originName, "bigint"); - whereName = String.format(PgConstants.FROM_UNIXTIME, cast); + String value = filterItemDTO.getValue(); + String whereName = ""; + String whereTerm = transMysqlFilterTerm(filterItemDTO.getTerm()); + String whereValue = ""; + String originName; + if (ObjectUtils.isNotEmpty(field.getExtField()) && field.getExtField() == 2) { + // 解析origin name中有关联的字段生成sql表达式 + originName = calcFieldRegex(field.getOriginName(), tableObj); + } else if (ObjectUtils.isNotEmpty(field.getExtField()) && field.getExtField() == 1) { + originName = String.format(PgConstants.KEYWORD_FIX, tableObj.getTableAlias(), field.getOriginName()); + } else { + originName = String.format(PgConstants.KEYWORD_FIX, tableObj.getTableAlias(), field.getOriginName()); } - if (field.getDeExtractType() == 1) { + if (field.getDeType() == 1) { + if (field.getDeExtractType() == 0 || field.getDeExtractType() == 5) { + whereName = String.format(PgConstants.CAST, originName, "timestamp"); + } + if (field.getDeExtractType() == 2 || field.getDeExtractType() == 3 || field.getDeExtractType() == 4) { + String cast = String.format(PgConstants.CAST, originName, "bigint"); + whereName = String.format(PgConstants.FROM_UNIXTIME, cast); + } + if (field.getDeExtractType() == 1) { + whereName = originName; + } + } else { whereName = originName; } - } else { - whereName = originName; + if (StringUtils.equalsIgnoreCase(filterItemDTO.getTerm(), "null")) { + whereValue = ""; + } else if (StringUtils.equalsIgnoreCase(filterItemDTO.getTerm(), "not_null")) { + whereValue = ""; + } else if (StringUtils.equalsIgnoreCase(filterItemDTO.getTerm(), "empty")) { + whereValue = "''"; + } else if (StringUtils.equalsIgnoreCase(filterItemDTO.getTerm(), "not_empty")) { + whereValue = "''"; + } else if (StringUtils.containsIgnoreCase(filterItemDTO.getTerm(), "in")) { + whereValue = "('" + StringUtils.join(value, "','") + "')"; + } else if (StringUtils.containsIgnoreCase(filterItemDTO.getTerm(), "like")) { + whereValue = "'%" + value + "%'"; + } else { + whereValue = String.format(PgConstants.WHERE_VALUE_VALUE, value); + } + list.add(SQLObj.builder() + .whereField(whereName) + .whereTermAndValue(whereTerm + whereValue) + .build()); } - if (StringUtils.equalsIgnoreCase(request.getTerm(), "null")) { - whereValue = ""; - } else if (StringUtils.equalsIgnoreCase(request.getTerm(), "not_null")) { - whereValue = ""; - } else if (StringUtils.equalsIgnoreCase(request.getTerm(), "empty")) { - whereValue = "''"; - } else if (StringUtils.equalsIgnoreCase(request.getTerm(), "not_empty")) { - whereValue = "''"; - } else if (StringUtils.containsIgnoreCase(request.getTerm(), "in")) { - whereValue = "('" + StringUtils.join(value, "','") + "')"; - } else if (StringUtils.containsIgnoreCase(request.getTerm(), "like")) { - whereValue = "'%" + value + "%'"; - } else { - whereValue = String.format(PgConstants.WHERE_VALUE_VALUE, value); - } - list.add(SQLObj.builder() - .whereField(whereName) - .whereTermAndValue(whereTerm + whereValue) - .build()); + + List strList = new ArrayList<>(); + list.forEach(ele -> strList.add(ele.getWhereField() + " " + ele.getWhereTermAndValue())); + res.add("(" + String.join(" " + getLogic(request.getLogic()) + " ", strList) + ")"); } - return list; + return "(" + String.join(" AND ", res) + ")"; } - public List transExtFilterList(SQLObj tableObj, List requestList) { + public String transExtFilterList(SQLObj tableObj, List requestList) { if (CollectionUtils.isEmpty(requestList)) { return null; } @@ -881,7 +883,9 @@ public class PgQueryProvider extends QueryProvider { .whereTermAndValue(whereTerm + whereValue) .build()); } - return list; + List strList = new ArrayList<>(); + list.forEach(ele -> strList.add(ele.getWhereField() + " " + ele.getWhereTermAndValue())); + return "(" + String.join(" AND ", strList) + ")"; } private String sqlFix(String sql) { @@ -976,7 +980,7 @@ public class PgQueryProvider extends QueryProvider { .build(); } - private List getYWheres(ChartViewFieldDTO y, String originField, String fieldAlias) { + private String getYWheres(ChartViewFieldDTO y, String originField, String fieldAlias) { List list = new ArrayList<>(); if (CollectionUtils.isNotEmpty(y.getFilter()) && y.getFilter().size() > 0) { y.getFilter().forEach(f -> { @@ -1005,7 +1009,9 @@ public class PgQueryProvider extends QueryProvider { .build()); }); } - return list; + List strList = new ArrayList<>(); + list.forEach(ele -> strList.add(ele.getWhereField() + " " + ele.getWhereTermAndValue())); + return CollectionUtils.isNotEmpty(list) ? "(" + String.join(" " + getLogic(y.getLogic()) + " ", strList) + ")" : null; } private String calcFieldRegex(String originField, SQLObj tableObj) { @@ -1039,4 +1045,14 @@ public class PgQueryProvider extends QueryProvider { return sql; } } + + private String getLogic(String logic) { + switch (logic) { + case "and": + return "AND"; + case "or": + return "OR"; + } + return "AND"; + } } diff --git a/backend/src/main/java/io/dataease/provider/query/redshift/RedshiftQueryProvider.java b/backend/src/main/java/io/dataease/provider/query/redshift/RedshiftQueryProvider.java index 5e1d380933..bf19ddaee7 100644 --- a/backend/src/main/java/io/dataease/provider/query/redshift/RedshiftQueryProvider.java +++ b/backend/src/main/java/io/dataease/provider/query/redshift/RedshiftQueryProvider.java @@ -8,9 +8,10 @@ import io.dataease.base.domain.Datasource; import io.dataease.base.mapper.DatasetTableFieldMapper; import io.dataease.commons.constants.DeTypeConstants; import io.dataease.controller.request.chart.ChartExtFilterRequest; -import io.dataease.dto.datasource.JdbcConfiguration; -import io.dataease.dto.chart.ChartCustomFilterDTO; +import io.dataease.dto.chart.ChartCustomFilterItemDTO; +import io.dataease.dto.chart.ChartFieldCustomFilterDTO; import io.dataease.dto.chart.ChartViewFieldDTO; +import io.dataease.dto.datasource.JdbcConfiguration; import io.dataease.dto.sqlObj.SQLObj; import io.dataease.provider.query.QueryProvider; import io.dataease.provider.query.SQLConstants; @@ -30,6 +31,7 @@ import java.text.SimpleDateFormat; import java.util.*; import java.util.regex.Matcher; import java.util.regex.Pattern; +import java.util.stream.Collectors; import static io.dataease.provider.query.SQLConstants.TABLE_ALIAS_PREFIX; @@ -106,7 +108,7 @@ public class RedshiftQueryProvider extends QueryProvider { } @Override - public String createQuerySQL(String table, List fields, boolean isGroup, Datasource ds, List customFilter) { + public String createQuerySQL(String table, List fields, boolean isGroup, Datasource ds, List fieldCustomFilter) { SQLObj tableObj = SQLObj.builder() .tableName((table.startsWith("(") && table.endsWith(")")) ? table : String.format(PgConstants.KEYWORD_TABLE, table)) .tableAlias(String.format(TABLE_ALIAS_PREFIX, 0)) @@ -167,47 +169,46 @@ public class RedshiftQueryProvider extends QueryProvider { st_sql.add("isGroup", isGroup); if (CollectionUtils.isNotEmpty(xFields)) st_sql.add("groups", xFields); if (ObjectUtils.isNotEmpty(tableObj)) st_sql.add("table", tableObj); - List customWheres = transCustomFilterList(tableObj, customFilter); - List wheres = new ArrayList<>(); - if (customWheres != null) wheres.addAll(customWheres); + String customWheres = transCustomFilterList(tableObj, fieldCustomFilter); + List wheres = new ArrayList<>(); + if (customWheres != null) wheres.add(customWheres); if (CollectionUtils.isNotEmpty(wheres)) st_sql.add("filters", wheres); return st_sql.render(); } @Override - public String createQuerySQLAsTmp(String sql, List fields, boolean isGroup, List customFilter) { - return createQuerySQL("(" + sqlFix(sql) + ")", fields, isGroup, null, customFilter); + public String createQuerySQLAsTmp(String sql, List fields, boolean isGroup, List fieldCustomFilter) { + return createQuerySQL("(" + sqlFix(sql) + ")", fields, isGroup, null, fieldCustomFilter); } @Override - public String createQueryTableWithPage(String table, List fields, Integer page, Integer pageSize, Integer realSize, boolean isGroup, Datasource ds, List customFilter) { - return createQuerySQL(table, fields, isGroup, ds, customFilter) + " LIMIT " + realSize + " offset " + (page - 1) * pageSize; + public String createQueryTableWithPage(String table, List fields, Integer page, Integer pageSize, Integer realSize, boolean isGroup, Datasource ds, List fieldCustomFilter) { + return createQuerySQL(table, fields, isGroup, ds, fieldCustomFilter) + " LIMIT " + realSize + " offset " + (page - 1) * pageSize; } @Override - public String createQuerySQLWithPage(String sql, List fields, Integer page, Integer pageSize, Integer realSize, boolean isGroup, List customFilter) { - return createQuerySQLAsTmp(sql, fields, isGroup, customFilter) + " LIMIT " + realSize + " offset " + (page - 1) * pageSize; + public String createQuerySQLWithPage(String sql, List fields, Integer page, Integer pageSize, Integer realSize, boolean isGroup, List fieldCustomFilter) { + return createQuerySQLAsTmp(sql, fields, isGroup, fieldCustomFilter) + " LIMIT " + realSize + " offset " + (page - 1) * pageSize; } @Override - public String createQueryTableWithLimit(String table, List fields, Integer limit, boolean isGroup, Datasource ds, List customFilter) { - return createQuerySQL(table, fields, isGroup, null, customFilter) + " LIMIT " + limit + " offset 0"; + public String createQueryTableWithLimit(String table, List fields, Integer limit, boolean isGroup, Datasource ds, List fieldCustomFilter) { + return createQuerySQL(table, fields, isGroup, null, fieldCustomFilter) + " LIMIT " + limit + " offset 0"; } @Override - public String createQuerySqlWithLimit(String sql, List fields, Integer limit, boolean isGroup, List customFilter) { - return createQuerySQLAsTmp(sql, fields, isGroup, customFilter) + " LIMIT " + limit + " offset 0"; + public String createQuerySqlWithLimit(String sql, List fields, Integer limit, boolean isGroup, List fieldCustomFilter) { + return createQuerySQLAsTmp(sql, fields, isGroup, fieldCustomFilter) + " LIMIT " + limit + " offset 0"; } @Override - public String getSQL(String table, List xAxis, List yAxis, List customFilter, List extFilterRequestList, Datasource ds, ChartViewWithBLOBs view) { + public String getSQL(String table, List xAxis, List yAxis, List fieldCustomFilter, List extFilterRequestList, Datasource ds, ChartViewWithBLOBs view) { SQLObj tableObj = SQLObj.builder() .tableName((table.startsWith("(") && table.endsWith(")")) ? table : String.format(PgConstants.KEYWORD_TABLE, table)) .tableAlias(String.format(TABLE_ALIAS_PREFIX, 0)) .build(); setSchema(tableObj, ds); List xFields = new ArrayList<>(); - List xWheres = new ArrayList<>(); List xOrders = new ArrayList<>(); if (CollectionUtils.isNotEmpty(xAxis)) { for (int i = 0; i < xAxis.size(); i++) { @@ -235,7 +236,7 @@ public class RedshiftQueryProvider extends QueryProvider { } } List yFields = new ArrayList<>(); - List yWheres = new ArrayList<>(); + List yWheres = new ArrayList<>(); List yOrders = new ArrayList<>(); if (CollectionUtils.isNotEmpty(yAxis)) { for (int i = 0; i < yAxis.size(); i++) { @@ -253,7 +254,7 @@ public class RedshiftQueryProvider extends QueryProvider { // 处理纵轴字段 yFields.add(getYFields(y, originField, fieldAlias)); // 处理纵轴过滤 - yWheres.addAll(getYWheres(y, originField, fieldAlias)); + yWheres.add(getYWheres(y, originField, fieldAlias)); // 处理纵轴排序 if (StringUtils.isNotEmpty(y.getSort()) && !StringUtils.equalsIgnoreCase(y.getSort(), "none")) { yOrders.add(SQLObj.builder() @@ -265,25 +266,24 @@ public class RedshiftQueryProvider extends QueryProvider { } } // 处理视图中字段过滤 - List customWheres = transCustomFilterList(tableObj, customFilter); + String customWheres = transCustomFilterList(tableObj, fieldCustomFilter); // 处理仪表板字段过滤 - List extWheres = transExtFilterList(tableObj, extFilterRequestList); + String extWheres = transExtFilterList(tableObj, extFilterRequestList); // 构建sql所有参数 List fields = new ArrayList<>(); fields.addAll(xFields); fields.addAll(yFields); - List wheres = new ArrayList<>(); - wheres.addAll(xWheres); - if (customWheres != null) wheres.addAll(customWheres); - if (extWheres != null) wheres.addAll(extWheres); + List wheres = new ArrayList<>(); + if (customWheres != null) wheres.add(customWheres); + if (extWheres != null) wheres.add(extWheres); 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); + 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"); @@ -306,29 +306,28 @@ public class RedshiftQueryProvider extends QueryProvider { @Override - public String getSQLAsTmp(String sql, List xAxis, List yAxis, List customFilter, List extFilterRequestList, ChartViewWithBLOBs view) { - return getSQL("(" + sqlFix(sql) + ")", xAxis, yAxis, customFilter, extFilterRequestList, null, view); + public String getSQLAsTmp(String sql, List xAxis, List yAxis, List fieldCustomFilter, List extFilterRequestList, ChartViewWithBLOBs view) { + return getSQL("(" + sqlFix(sql) + ")", xAxis, yAxis, fieldCustomFilter, extFilterRequestList, null, view); } @Override - public String getSQLTableInfo(String table, List xAxis, List customFilter, List extFilterRequestList, Datasource ds, ChartViewWithBLOBs view) { + public String getSQLTableInfo(String table, List xAxis, List fieldCustomFilter, List extFilterRequestList, Datasource ds, ChartViewWithBLOBs view) { return null; } @Override - public String getSQLAsTmpTableInfo(String sql, List xAxis, List customFilter, List extFilterRequestList, Datasource ds, ChartViewWithBLOBs view) { + public String getSQLAsTmpTableInfo(String sql, List xAxis, List fieldCustomFilter, List extFilterRequestList, Datasource ds, ChartViewWithBLOBs view) { return null; } @Override - public String getSQLStack(String table, List xAxis, List yAxis, List customFilter, List extFilterRequestList, List extStack, Datasource ds, ChartViewWithBLOBs view) { + public String getSQLStack(String table, List xAxis, List yAxis, List fieldCustomFilter, 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 xWheres = new ArrayList<>(); List xOrders = new ArrayList<>(); List xList = new ArrayList<>(); xList.addAll(xAxis); @@ -359,7 +358,7 @@ public class RedshiftQueryProvider extends QueryProvider { } } List yFields = new ArrayList<>(); - List yWheres = new ArrayList<>(); + List yWheres = new ArrayList<>(); List yOrders = new ArrayList<>(); if (CollectionUtils.isNotEmpty(yAxis)) { for (int i = 0; i < yAxis.size(); i++) { @@ -377,7 +376,7 @@ public class RedshiftQueryProvider extends QueryProvider { // 处理纵轴字段 yFields.add(getYFields(y, originField, fieldAlias)); // 处理纵轴过滤 - yWheres.addAll(getYWheres(y, originField, fieldAlias)); + yWheres.add(getYWheres(y, originField, fieldAlias)); // 处理纵轴排序 if (StringUtils.isNotEmpty(y.getSort()) && !StringUtils.equalsIgnoreCase(y.getSort(), "none")) { yOrders.add(SQLObj.builder() @@ -389,25 +388,24 @@ public class RedshiftQueryProvider extends QueryProvider { } } // 处理视图中字段过滤 - List customWheres = transCustomFilterList(tableObj, customFilter); + String customWheres = transCustomFilterList(tableObj, fieldCustomFilter); // 处理仪表板字段过滤 - List extWheres = transExtFilterList(tableObj, extFilterRequestList); + String extWheres = transExtFilterList(tableObj, extFilterRequestList); // 构建sql所有参数 List fields = new ArrayList<>(); fields.addAll(xFields); fields.addAll(yFields); - List wheres = new ArrayList<>(); - wheres.addAll(xWheres); - if (customWheres != null) wheres.addAll(customWheres); - if (extWheres != null) wheres.addAll(extWheres); + List wheres = new ArrayList<>(); + if (customWheres != null) wheres.add(customWheres); + if (extWheres != null) wheres.add(extWheres); 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); + 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"); @@ -429,19 +427,18 @@ public class RedshiftQueryProvider extends QueryProvider { } @Override - public String getSQLAsTmpStack(String table, List xAxis, List yAxis, List customFilter, List extFilterRequestList, List extStack, ChartViewWithBLOBs view) { - return getSQLStack("(" + sqlFix(table) + ")", xAxis, yAxis, customFilter, extFilterRequestList, extStack, null, view); + public String getSQLAsTmpStack(String table, List xAxis, List yAxis, List fieldCustomFilter, List extFilterRequestList, List extStack, ChartViewWithBLOBs view) { + return getSQLStack("(" + sqlFix(table) + ")", xAxis, yAxis, fieldCustomFilter, extFilterRequestList, extStack, null, view); } @Override - public String getSQLScatter(String table, List xAxis, List yAxis, List customFilter, List extFilterRequestList, List extBubble, Datasource ds, ChartViewWithBLOBs view) { + public String getSQLScatter(String table, List xAxis, List yAxis, List fieldCustomFilter, List extFilterRequestList, List extBubble, 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 xWheres = new ArrayList<>(); List xOrders = new ArrayList<>(); if (CollectionUtils.isNotEmpty(xAxis)) { for (int i = 0; i < xAxis.size(); i++) { @@ -469,7 +466,7 @@ public class RedshiftQueryProvider extends QueryProvider { } } List yFields = new ArrayList<>(); - List yWheres = new ArrayList<>(); + List yWheres = new ArrayList<>(); List yOrders = new ArrayList<>(); List yList = new ArrayList<>(); yList.addAll(yAxis); @@ -490,7 +487,7 @@ public class RedshiftQueryProvider extends QueryProvider { // 处理纵轴字段 yFields.add(getYFields(y, originField, fieldAlias)); // 处理纵轴过滤 - yWheres.addAll(getYWheres(y, originField, fieldAlias)); + yWheres.add(getYWheres(y, originField, fieldAlias)); // 处理纵轴排序 if (StringUtils.isNotEmpty(y.getSort()) && !StringUtils.equalsIgnoreCase(y.getSort(), "none")) { yOrders.add(SQLObj.builder() @@ -502,25 +499,24 @@ public class RedshiftQueryProvider extends QueryProvider { } } // 处理视图中字段过滤 - List customWheres = transCustomFilterList(tableObj, customFilter); + String customWheres = transCustomFilterList(tableObj, fieldCustomFilter); // 处理仪表板字段过滤 - List extWheres = transExtFilterList(tableObj, extFilterRequestList); + String extWheres = transExtFilterList(tableObj, extFilterRequestList); // 构建sql所有参数 List fields = new ArrayList<>(); fields.addAll(xFields); fields.addAll(yFields); - List wheres = new ArrayList<>(); - wheres.addAll(xWheres); - if (customWheres != null) wheres.addAll(customWheres); - if (extWheres != null) wheres.addAll(extWheres); + List wheres = new ArrayList<>(); + if (customWheres != null) wheres.add(customWheres); + if (extWheres != null) wheres.add(extWheres); 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); + 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"); @@ -542,8 +538,8 @@ public class RedshiftQueryProvider extends QueryProvider { } @Override - public String getSQLAsTmpScatter(String table, List xAxis, List yAxis, List customFilter, List extFilterRequestList, List extBubble, ChartViewWithBLOBs view) { - return getSQLScatter("(" + sqlFix(table) + ")", xAxis, yAxis, customFilter, extFilterRequestList, extBubble, null, view); + public String getSQLAsTmpScatter(String table, List xAxis, List yAxis, List fieldCustomFilter, List extFilterRequestList, List extBubble, ChartViewWithBLOBs view) { + return getSQLScatter("(" + sqlFix(table) + ")", xAxis, yAxis, fieldCustomFilter, extFilterRequestList, extBubble, null, view); } @Override @@ -552,14 +548,14 @@ public class RedshiftQueryProvider extends QueryProvider { } @Override - public String getSQLSummary(String table, List yAxis, List customFilter, List extFilterRequestList, ChartViewWithBLOBs view) { + public String getSQLSummary(String table, List yAxis, List fieldCustomFilter, List extFilterRequestList, 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(); List yFields = new ArrayList<>(); - List yWheres = new ArrayList<>(); + List yWheres = new ArrayList<>(); List yOrders = new ArrayList<>(); if (CollectionUtils.isNotEmpty(yAxis)) { for (int i = 0; i < yAxis.size(); i++) { @@ -577,7 +573,7 @@ public class RedshiftQueryProvider extends QueryProvider { // 处理纵轴字段 yFields.add(getYFields(y, originField, fieldAlias)); // 处理纵轴过滤 - yWheres.addAll(getYWheres(y, originField, fieldAlias)); + yWheres.add(getYWheres(y, originField, fieldAlias)); // 处理纵轴排序 if (StringUtils.isNotEmpty(y.getSort()) && !StringUtils.equalsIgnoreCase(y.getSort(), "none")) { yOrders.add(SQLObj.builder() @@ -589,21 +585,21 @@ public class RedshiftQueryProvider extends QueryProvider { } } // 处理视图中字段过滤 - List customWheres = transCustomFilterList(tableObj, customFilter); + String customWheres = transCustomFilterList(tableObj, fieldCustomFilter); // 处理仪表板字段过滤 - List extWheres = transExtFilterList(tableObj, extFilterRequestList); + String extWheres = transExtFilterList(tableObj, extFilterRequestList); // 构建sql所有参数 List fields = new ArrayList<>(); fields.addAll(yFields); - List wheres = new ArrayList<>(); - if (customWheres != null) wheres.addAll(customWheres); - if (extWheres != null) wheres.addAll(extWheres); + List wheres = new ArrayList<>(); + if (customWheres != null) wheres.add(customWheres); + if (extWheres != null) wheres.add(extWheres); List groups = new ArrayList<>(); // 外层再次套sql List orders = new ArrayList<>(); orders.addAll(yOrders); - List aggWheres = new ArrayList<>(); - aggWheres.addAll(yWheres); + 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"); @@ -624,8 +620,8 @@ public class RedshiftQueryProvider extends QueryProvider { } @Override - public String getSQLSummaryAsTmp(String sql, List yAxis, List customFilter, List extFilterRequestList, ChartViewWithBLOBs view) { - return getSQLSummary("(" + sqlFix(sql) + ")", yAxis, customFilter, extFilterRequestList, view); + public String getSQLSummaryAsTmp(String sql, List yAxis, List fieldCustomFilter, List extFilterRequestList, ChartViewWithBLOBs view) { + return getSQLSummary("(" + sqlFix(sql) + ")", yAxis, fieldCustomFilter, extFilterRequestList, view); } @Override @@ -660,9 +656,9 @@ public class RedshiftQueryProvider extends QueryProvider { } @Override - public String convertTableToSql(String tableName, Datasource ds){ + public String convertTableToSql(String tableName, Datasource ds) { String schema = new Gson().fromJson(ds.getConfiguration(), JdbcConfiguration.class).getSchema(); - schema = String.format( RedshiftConstants.KEYWORD_TABLE, schema); + schema = String.format(RedshiftConstants.KEYWORD_TABLE, schema); return createSQLPreview("SELECT * FROM " + schema + "." + String.format(RedshiftConstants.KEYWORD_TABLE, tableName), null); } @@ -699,63 +695,71 @@ public class RedshiftQueryProvider extends QueryProvider { } } - public List transCustomFilterList(SQLObj tableObj, List requestList) { + public String transCustomFilterList(SQLObj tableObj, List requestList) { if (CollectionUtils.isEmpty(requestList)) { return null; } - List list = new ArrayList<>(); - for (ChartCustomFilterDTO request : requestList) { + List res = new ArrayList<>(); + for (ChartFieldCustomFilterDTO request : requestList) { + List list = new ArrayList<>(); DatasetTableField field = request.getField(); - if (ObjectUtils.isEmpty(field)) { - continue; - } - String value = request.getValue(); - String whereName = ""; - String whereTerm = transMysqlFilterTerm(request.getTerm()); - String whereValue = ""; - String originName; - if (ObjectUtils.isNotEmpty(field.getExtField()) && field.getExtField() == 2) { - // 解析origin name中有关联的字段生成sql表达式 - originName = calcFieldRegex(field.getOriginName(), tableObj); - } else if (ObjectUtils.isNotEmpty(field.getExtField()) && field.getExtField() == 1) { - originName = String.format(PgConstants.KEYWORD_FIX, tableObj.getTableAlias(), field.getOriginName()); - } else { - originName = String.format(PgConstants.KEYWORD_FIX, tableObj.getTableAlias(), field.getOriginName()); - } - if (field.getDeType() == 1) { - if (field.getDeExtractType() == 0 || field.getDeExtractType() == 5) { - whereName = String.format(PgConstants.CAST, originName, "timestamp"); + List filter = request.getFilter(); + for (ChartCustomFilterItemDTO filterItemDTO : filter) { + if (ObjectUtils.isEmpty(field)) { + continue; } - if (field.getDeExtractType() == 2 || field.getDeExtractType() == 3 || field.getDeExtractType() == 4) { - String cast = String.format(PgConstants.CAST, originName, "bigint"); - whereName = String.format(PgConstants.FROM_UNIXTIME, cast); + String value = filterItemDTO.getValue(); + String whereName = ""; + String whereTerm = transMysqlFilterTerm(filterItemDTO.getTerm()); + String whereValue = ""; + String originName; + if (ObjectUtils.isNotEmpty(field.getExtField()) && field.getExtField() == 2) { + // 解析origin name中有关联的字段生成sql表达式 + originName = calcFieldRegex(field.getOriginName(), tableObj); + } else if (ObjectUtils.isNotEmpty(field.getExtField()) && field.getExtField() == 1) { + originName = String.format(PgConstants.KEYWORD_FIX, tableObj.getTableAlias(), field.getOriginName()); + } else { + originName = String.format(PgConstants.KEYWORD_FIX, tableObj.getTableAlias(), field.getOriginName()); } - if (field.getDeExtractType() == 1) { + if (field.getDeType() == 1) { + if (field.getDeExtractType() == 0 || field.getDeExtractType() == 5) { + whereName = String.format(PgConstants.CAST, originName, "timestamp"); + } + if (field.getDeExtractType() == 2 || field.getDeExtractType() == 3 || field.getDeExtractType() == 4) { + String cast = String.format(PgConstants.CAST, originName, "bigint"); + whereName = String.format(PgConstants.FROM_UNIXTIME, cast); + } + if (field.getDeExtractType() == 1) { + whereName = originName; + } + } else { whereName = originName; } - } else { - whereName = originName; + if (StringUtils.equalsIgnoreCase(filterItemDTO.getTerm(), "null")) { + whereValue = PgConstants.WHERE_VALUE_NULL; + } else if (StringUtils.equalsIgnoreCase(filterItemDTO.getTerm(), "not_null")) { + whereTerm = String.format(whereTerm, originName); + } else if (StringUtils.containsIgnoreCase(filterItemDTO.getTerm(), "in")) { + whereValue = "('" + StringUtils.join(value, "','") + "')"; + } else if (StringUtils.containsIgnoreCase(filterItemDTO.getTerm(), "like")) { + whereValue = "'%" + value + "%'"; + } else { + whereValue = String.format(PgConstants.WHERE_VALUE_VALUE, value); + } + list.add(SQLObj.builder() + .whereField(whereName) + .whereTermAndValue(whereTerm + whereValue) + .build()); } - if (StringUtils.equalsIgnoreCase(request.getTerm(), "null")) { - whereValue = PgConstants.WHERE_VALUE_NULL; - } else if (StringUtils.equalsIgnoreCase(request.getTerm(), "not_null")) { - whereTerm = String.format(whereTerm, originName); - } else if (StringUtils.containsIgnoreCase(request.getTerm(), "in")) { - whereValue = "('" + StringUtils.join(value, "','") + "')"; - } else if (StringUtils.containsIgnoreCase(request.getTerm(), "like")) { - whereValue = "'%" + value + "%'"; - } else { - whereValue = String.format(PgConstants.WHERE_VALUE_VALUE, value); - } - list.add(SQLObj.builder() - .whereField(whereName) - .whereTermAndValue(whereTerm + whereValue) - .build()); + + List strList = new ArrayList<>(); + list.forEach(ele -> strList.add(ele.getWhereField() + " " + ele.getWhereTermAndValue())); + res.add("(" + String.join(" " + getLogic(request.getLogic()) + " ", strList) + ")"); } - return list; + return "(" + String.join(" AND ", res) + ")"; } - public List transExtFilterList(SQLObj tableObj, List requestList) { + public String transExtFilterList(SQLObj tableObj, List requestList) { if (CollectionUtils.isEmpty(requestList)) { return null; } @@ -816,7 +820,9 @@ public class RedshiftQueryProvider extends QueryProvider { .whereTermAndValue(whereTerm + whereValue) .build()); } - return list; + List strList = new ArrayList<>(); + list.forEach(ele -> strList.add(ele.getWhereField() + " " + ele.getWhereTermAndValue())); + return "(" + String.join(" AND ", strList) + ")"; } private String sqlFix(String sql) { @@ -905,7 +911,7 @@ public class RedshiftQueryProvider extends QueryProvider { .build(); } - private List getYWheres(ChartViewFieldDTO y, String originField, String fieldAlias) { + private String getYWheres(ChartViewFieldDTO y, String originField, String fieldAlias) { List list = new ArrayList<>(); if (CollectionUtils.isNotEmpty(y.getFilter()) && y.getFilter().size() > 0) { y.getFilter().forEach(f -> { @@ -930,7 +936,9 @@ public class RedshiftQueryProvider extends QueryProvider { .build()); }); } - return list; + List strList = new ArrayList<>(); + list.forEach(ele -> strList.add(ele.getWhereField() + " " + ele.getWhereTermAndValue())); + return CollectionUtils.isNotEmpty(list) ? "(" + String.join(" " + getLogic(y.getLogic()) + " ", strList) + ")" : null; } private String calcFieldRegex(String originField, SQLObj tableObj) { @@ -964,4 +972,14 @@ public class RedshiftQueryProvider extends QueryProvider { return sql; } } + + private String getLogic(String logic) { + switch (logic) { + case "and": + return "AND"; + case "or": + return "OR"; + } + return "AND"; + } } diff --git a/backend/src/main/java/io/dataease/provider/query/sqlserver/SqlserverQueryProvider.java b/backend/src/main/java/io/dataease/provider/query/sqlserver/SqlserverQueryProvider.java index 807b0f893a..b7e5e6a374 100644 --- a/backend/src/main/java/io/dataease/provider/query/sqlserver/SqlserverQueryProvider.java +++ b/backend/src/main/java/io/dataease/provider/query/sqlserver/SqlserverQueryProvider.java @@ -8,7 +8,8 @@ import io.dataease.base.domain.Datasource; import io.dataease.base.mapper.DatasetTableFieldMapper; import io.dataease.commons.constants.DeTypeConstants; import io.dataease.controller.request.chart.ChartExtFilterRequest; -import io.dataease.dto.chart.ChartCustomFilterDTO; +import io.dataease.dto.chart.ChartCustomFilterItemDTO; +import io.dataease.dto.chart.ChartFieldCustomFilterDTO; import io.dataease.dto.chart.ChartViewFieldDTO; import io.dataease.dto.datasource.JdbcConfiguration; import io.dataease.dto.sqlObj.SQLObj; @@ -28,6 +29,7 @@ import java.text.SimpleDateFormat; import java.util.*; import java.util.regex.Matcher; import java.util.regex.Pattern; +import java.util.stream.Collectors; import static io.dataease.provider.query.SQLConstants.TABLE_ALIAS_PREFIX; @@ -86,7 +88,7 @@ public class SqlserverQueryProvider extends QueryProvider { } @Override - public String createQuerySQL(String table, List fields, boolean isGroup, Datasource ds, List customFilter) { + public String createQuerySQL(String table, List fields, boolean isGroup, Datasource ds, List fieldCustomFilter) { SQLObj tableObj = SQLObj.builder() .tableName((table.startsWith("(") && table.endsWith(")")) ? table : String.format(SqlServerSQLConstants.KEYWORD_TABLE, table)) @@ -148,51 +150,50 @@ public class SqlserverQueryProvider extends QueryProvider { st_sql.add("isGroup", isGroup); if (CollectionUtils.isNotEmpty(xFields)) st_sql.add("groups", xFields); if (ObjectUtils.isNotEmpty(tableObj)) st_sql.add("table", tableObj); - List customWheres = transCustomFilterList(tableObj, customFilter); - List wheres = new ArrayList<>(); - if (customWheres != null) wheres.addAll(customWheres); + String customWheres = transCustomFilterList(tableObj, fieldCustomFilter); + List wheres = new ArrayList<>(); + if (customWheres != null) wheres.add(customWheres); if (CollectionUtils.isNotEmpty(wheres)) st_sql.add("filters", wheres); return st_sql.render(); } @Override - public String createQuerySQLAsTmp(String sql, List fields, boolean isGroup, List customFilter) { - return createQuerySQL("(" + sqlFix(sql) + ")", fields, isGroup, null, customFilter); + public String createQuerySQLAsTmp(String sql, List fields, boolean isGroup, List fieldCustomFilter) { + return createQuerySQL("(" + sqlFix(sql) + ")", fields, isGroup, null, fieldCustomFilter); } @Override - public String createQueryTableWithPage(String table, List fields, Integer page, Integer pageSize, Integer realSize, boolean isGroup, Datasource ds, List customFilter) { + public String createQueryTableWithPage(String table, List fields, Integer page, Integer pageSize, Integer realSize, boolean isGroup, Datasource ds, List fieldCustomFilter) { Integer size = (page - 1) * pageSize + realSize; - return String.format("SELECT top %s * from ( %s ) AS DE_SQLSERVER_TMP ", size.toString(), createQuerySQL(table, fields, isGroup, ds, customFilter)); + return String.format("SELECT top %s * from ( %s ) AS DE_SQLSERVER_TMP ", size.toString(), createQuerySQL(table, fields, isGroup, ds, fieldCustomFilter)); } @Override - public String createQueryTableWithLimit(String table, List fields, Integer limit, boolean isGroup, Datasource ds, List customFilter) { + public String createQueryTableWithLimit(String table, List fields, Integer limit, boolean isGroup, Datasource ds, List fieldCustomFilter) { String schema = new Gson().fromJson(ds.getConfiguration(), JdbcConfiguration.class).getSchema(); return String.format("SELECT top %s * from %s ", limit.toString(), schema + "." + table); } @Override - public String createQuerySQLWithPage(String sql, List fields, Integer page, Integer pageSize, Integer realSize, boolean isGroup, List customFilter) { + public String createQuerySQLWithPage(String sql, List fields, Integer page, Integer pageSize, Integer realSize, boolean isGroup, List fieldCustomFilter) { Integer size = (page - 1) * pageSize + realSize; - return String.format("SELECT top %s * from ( %s ) AS DE_SQLSERVER_TMP ", size.toString(), createQuerySQLAsTmp(sql, fields, isGroup, customFilter)); + return String.format("SELECT top %s * from ( %s ) AS DE_SQLSERVER_TMP ", size.toString(), createQuerySQLAsTmp(sql, fields, isGroup, fieldCustomFilter)); } @Override - public String createQuerySqlWithLimit(String sql, List fields, Integer limit, boolean isGroup, List customFilter) { + public String createQuerySqlWithLimit(String sql, List fields, Integer limit, boolean isGroup, List fieldCustomFilter) { return String.format("SELECT top %s * from ( %s ) as DE_SQLSERVER_TMP ", limit.toString(), sqlFix(sql)); } @Override - public String getSQL(String table, List xAxis, List yAxis, List customFilter, List extFilterRequestList, Datasource ds, ChartViewWithBLOBs view) { + public String getSQL(String table, List xAxis, List yAxis, List fieldCustomFilter, List extFilterRequestList, 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 xWheres = new ArrayList<>(); List xOrders = new ArrayList<>(); if (CollectionUtils.isNotEmpty(xAxis)) { for (int i = 0; i < xAxis.size(); i++) { @@ -220,7 +221,7 @@ public class SqlserverQueryProvider extends QueryProvider { } } List yFields = new ArrayList<>(); - List yWheres = new ArrayList<>(); + List yWheres = new ArrayList<>(); List yOrders = new ArrayList<>(); if (CollectionUtils.isNotEmpty(yAxis)) { for (int i = 0; i < yAxis.size(); i++) { @@ -238,7 +239,7 @@ public class SqlserverQueryProvider extends QueryProvider { // 处理纵轴字段 yFields.add(getYFields(y, originField, fieldAlias)); // 处理纵轴过滤 - yWheres.addAll(getYWheres(y, originField, fieldAlias)); + yWheres.add(getYWheres(y, originField, fieldAlias)); // 处理纵轴排序 if (StringUtils.isNotEmpty(y.getSort()) && !StringUtils.equalsIgnoreCase(y.getSort(), "none")) { yOrders.add(SQLObj.builder() @@ -250,25 +251,24 @@ public class SqlserverQueryProvider extends QueryProvider { } } // 处理视图中字段过滤 - List customWheres = transCustomFilterList(tableObj, customFilter); + String customWheres = transCustomFilterList(tableObj, fieldCustomFilter); // 处理仪表板字段过滤 - List extWheres = transExtFilterList(tableObj, extFilterRequestList); + String extWheres = transExtFilterList(tableObj, extFilterRequestList); // 构建sql所有参数 List fields = new ArrayList<>(); fields.addAll(xFields); fields.addAll(yFields); - List wheres = new ArrayList<>(); - wheres.addAll(xWheres); - if (customWheres != null) wheres.addAll(customWheres); - if (extWheres != null) wheres.addAll(extWheres); + List wheres = new ArrayList<>(); + if (customWheres != null) wheres.add(customWheres); + if (extWheres != null) wheres.add(extWheres); 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); + 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"); @@ -294,14 +294,13 @@ public class SqlserverQueryProvider extends QueryProvider { } @Override - public String getSQLTableInfo(String table, List xAxis, List customFilter, List extFilterRequestList, Datasource ds, ChartViewWithBLOBs view) { + public String getSQLTableInfo(String table, List xAxis, List fieldCustomFilter, List extFilterRequestList, 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 xWheres = new ArrayList<>(); List xOrders = new ArrayList<>(); if (CollectionUtils.isNotEmpty(xAxis)) { for (int i = 0; i < xAxis.size(); i++) { @@ -329,16 +328,15 @@ public class SqlserverQueryProvider extends QueryProvider { } } // 处理视图中字段过滤 - List customWheres = transCustomFilterList(tableObj, customFilter); + String customWheres = transCustomFilterList(tableObj, fieldCustomFilter); // 处理仪表板字段过滤 - List extWheres = transExtFilterList(tableObj, extFilterRequestList); + String extWheres = transExtFilterList(tableObj, extFilterRequestList); // 构建sql所有参数 List fields = new ArrayList<>(); fields.addAll(xFields); - List wheres = new ArrayList<>(); - wheres.addAll(xWheres); - if (customWheres != null) wheres.addAll(customWheres); - if (extWheres != null) wheres.addAll(extWheres); + List wheres = new ArrayList<>(); + if (customWheres != null) wheres.add(customWheres); + if (extWheres != null) wheres.add(extWheres); List groups = new ArrayList<>(); groups.addAll(xFields); // 外层再次套sql @@ -369,25 +367,24 @@ public class SqlserverQueryProvider extends QueryProvider { } @Override - public String getSQLAsTmpTableInfo(String sql, List xAxis, List customFilter, List extFilterRequestList, Datasource ds, ChartViewWithBLOBs view) { - return getSQLTableInfo("(" + sqlFix(sql) + ")", xAxis, customFilter, extFilterRequestList, null, view); + public String getSQLAsTmpTableInfo(String sql, List xAxis, List fieldCustomFilter, List extFilterRequestList, Datasource ds, ChartViewWithBLOBs view) { + return getSQLTableInfo("(" + sqlFix(sql) + ")", xAxis, fieldCustomFilter, extFilterRequestList, null, view); } @Override - public String getSQLAsTmp(String sql, List xAxis, List yAxis, List customFilter, List extFilterRequestList, ChartViewWithBLOBs view) { - return getSQL("(" + sqlFix(sql) + ")", xAxis, yAxis, customFilter, extFilterRequestList, null, view); + public String getSQLAsTmp(String sql, List xAxis, List yAxis, List fieldCustomFilter, List extFilterRequestList, ChartViewWithBLOBs view) { + return getSQL("(" + sqlFix(sql) + ")", xAxis, yAxis, fieldCustomFilter, extFilterRequestList, null, view); } @Override - public String getSQLStack(String table, List xAxis, List yAxis, List customFilter, List extFilterRequestList, List extStack, Datasource ds, ChartViewWithBLOBs view) { + public String getSQLStack(String table, List xAxis, List yAxis, List fieldCustomFilter, 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 xWheres = new ArrayList<>(); List xOrders = new ArrayList<>(); List xList = new ArrayList<>(); xList.addAll(xAxis); @@ -418,7 +415,7 @@ public class SqlserverQueryProvider extends QueryProvider { } } List yFields = new ArrayList<>(); - List yWheres = new ArrayList<>(); + List yWheres = new ArrayList<>(); List yOrders = new ArrayList<>(); if (CollectionUtils.isNotEmpty(yAxis)) { for (int i = 0; i < yAxis.size(); i++) { @@ -436,7 +433,7 @@ public class SqlserverQueryProvider extends QueryProvider { // 处理纵轴字段 yFields.add(getYFields(y, originField, fieldAlias)); // 处理纵轴过滤 - yWheres.addAll(getYWheres(y, originField, fieldAlias)); + yWheres.add(getYWheres(y, originField, fieldAlias)); // 处理纵轴排序 if (StringUtils.isNotEmpty(y.getSort()) && !StringUtils.equalsIgnoreCase(y.getSort(), "none")) { yOrders.add(SQLObj.builder() @@ -467,25 +464,24 @@ public class SqlserverQueryProvider extends QueryProvider { } } // 处理视图中字段过滤 - List customWheres = transCustomFilterList(tableObj, customFilter); + String customWheres = transCustomFilterList(tableObj, fieldCustomFilter); // 处理仪表板字段过滤 - List extWheres = transExtFilterList(tableObj, extFilterRequestList); + String extWheres = transExtFilterList(tableObj, extFilterRequestList); // 构建sql所有参数 List fields = new ArrayList<>(); fields.addAll(xFields); fields.addAll(yFields); - List wheres = new ArrayList<>(); - wheres.addAll(xWheres); - if (customWheres != null) wheres.addAll(customWheres); - if (extWheres != null) wheres.addAll(extWheres); + List wheres = new ArrayList<>(); + if (customWheres != null) wheres.add(customWheres); + if (extWheres != null) wheres.add(extWheres); 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); + 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"); @@ -511,19 +507,18 @@ public class SqlserverQueryProvider extends QueryProvider { } @Override - public String getSQLAsTmpStack(String table, List xAxis, List yAxis, List customFilter, List extFilterRequestList, List extStack, ChartViewWithBLOBs view) { - return getSQLStack("(" + sqlFix(table) + ")", xAxis, yAxis, customFilter, extFilterRequestList, extStack, null, view); + public String getSQLAsTmpStack(String table, List xAxis, List yAxis, List fieldCustomFilter, List extFilterRequestList, List extStack, ChartViewWithBLOBs view) { + return getSQLStack("(" + sqlFix(table) + ")", xAxis, yAxis, fieldCustomFilter, extFilterRequestList, extStack, null, view); } @Override - public String getSQLScatter(String table, List xAxis, List yAxis, List customFilter, List extFilterRequestList, List extBubble, Datasource ds, ChartViewWithBLOBs view) { + public String getSQLScatter(String table, List xAxis, List yAxis, List fieldCustomFilter, List extFilterRequestList, List extBubble, 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 xWheres = new ArrayList<>(); List xOrders = new ArrayList<>(); if (CollectionUtils.isNotEmpty(xAxis)) { for (int i = 0; i < xAxis.size(); i++) { @@ -551,7 +546,7 @@ public class SqlserverQueryProvider extends QueryProvider { } } List yFields = new ArrayList<>(); - List yWheres = new ArrayList<>(); + List yWheres = new ArrayList<>(); List yOrders = new ArrayList<>(); List yList = new ArrayList<>(); yList.addAll(yAxis); @@ -572,7 +567,7 @@ public class SqlserverQueryProvider extends QueryProvider { // 处理纵轴字段 yFields.add(getYFields(y, originField, fieldAlias)); // 处理纵轴过滤 - yWheres.addAll(getYWheres(y, originField, fieldAlias)); + yWheres.add(getYWheres(y, originField, fieldAlias)); // 处理纵轴排序 if (StringUtils.isNotEmpty(y.getSort()) && !StringUtils.equalsIgnoreCase(y.getSort(), "none")) { yOrders.add(SQLObj.builder() @@ -584,25 +579,24 @@ public class SqlserverQueryProvider extends QueryProvider { } } // 处理视图中字段过滤 - List customWheres = transCustomFilterList(tableObj, customFilter); + String customWheres = transCustomFilterList(tableObj, fieldCustomFilter); // 处理仪表板字段过滤 - List extWheres = transExtFilterList(tableObj, extFilterRequestList); + String extWheres = transExtFilterList(tableObj, extFilterRequestList); // 构建sql所有参数 List fields = new ArrayList<>(); fields.addAll(xFields); fields.addAll(yFields); - List wheres = new ArrayList<>(); - wheres.addAll(xWheres); - if (customWheres != null) wheres.addAll(customWheres); - if (extWheres != null) wheres.addAll(extWheres); + List wheres = new ArrayList<>(); + if (customWheres != null) wheres.add(customWheres); + if (extWheres != null) wheres.add(extWheres); 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); + 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"); @@ -628,8 +622,8 @@ public class SqlserverQueryProvider extends QueryProvider { } @Override - public String getSQLAsTmpScatter(String table, List xAxis, List yAxis, List customFilter, List extFilterRequestList, List extBubble, ChartViewWithBLOBs view) { - return getSQLScatter("(" + sqlFix(table) + ")", xAxis, yAxis, customFilter, extFilterRequestList, extBubble, null, view); + public String getSQLAsTmpScatter(String table, List xAxis, List yAxis, List fieldCustomFilter, List extFilterRequestList, List extBubble, ChartViewWithBLOBs view) { + return getSQLScatter("(" + sqlFix(table) + ")", xAxis, yAxis, fieldCustomFilter, extFilterRequestList, extBubble, null, view); } @Override @@ -638,14 +632,14 @@ public class SqlserverQueryProvider extends QueryProvider { } @Override - public String getSQLSummary(String table, List yAxis, List customFilter, List extFilterRequestList, ChartViewWithBLOBs view) { + public String getSQLSummary(String table, List yAxis, List fieldCustomFilter, List extFilterRequestList, 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(); List yFields = new ArrayList<>(); - List yWheres = new ArrayList<>(); + List yWheres = new ArrayList<>(); List yOrders = new ArrayList<>(); if (CollectionUtils.isNotEmpty(yAxis)) { for (int i = 0; i < yAxis.size(); i++) { @@ -663,7 +657,7 @@ public class SqlserverQueryProvider extends QueryProvider { // 处理纵轴字段 yFields.add(getYFields(y, originField, fieldAlias)); // 处理纵轴过滤 - yWheres.addAll(getYWheres(y, originField, fieldAlias)); + yWheres.add(getYWheres(y, originField, fieldAlias)); // 处理纵轴排序 if (StringUtils.isNotEmpty(y.getSort()) && !StringUtils.equalsIgnoreCase(y.getSort(), "none")) { yOrders.add(SQLObj.builder() @@ -675,21 +669,21 @@ public class SqlserverQueryProvider extends QueryProvider { } } // 处理视图中字段过滤 - List customWheres = transCustomFilterList(tableObj, customFilter); + String customWheres = transCustomFilterList(tableObj, fieldCustomFilter); // 处理仪表板字段过滤 - List extWheres = transExtFilterList(tableObj, extFilterRequestList); + String extWheres = transExtFilterList(tableObj, extFilterRequestList); // 构建sql所有参数 List fields = new ArrayList<>(); fields.addAll(yFields); - List wheres = new ArrayList<>(); - if (customWheres != null) wheres.addAll(customWheres); - if (extWheres != null) wheres.addAll(extWheres); + List wheres = new ArrayList<>(); + if (customWheres != null) wheres.add(customWheres); + if (extWheres != null) wheres.add(extWheres); List groups = new ArrayList<>(); // 外层再次套sql List orders = new ArrayList<>(); orders.addAll(yOrders); - List aggWheres = new ArrayList<>(); - aggWheres.addAll(yWheres); + 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"); @@ -714,8 +708,8 @@ public class SqlserverQueryProvider extends QueryProvider { } @Override - public String getSQLSummaryAsTmp(String sql, List yAxis, List customFilter, List extFilterRequestList, ChartViewWithBLOBs view) { - return getSQLSummary("(" + sqlFix(sql) + ")", yAxis, customFilter, extFilterRequestList, view); + public String getSQLSummaryAsTmp(String sql, List yAxis, List fieldCustomFilter, List extFilterRequestList, ChartViewWithBLOBs view) { + return getSQLSummary("(" + sqlFix(sql) + ")", yAxis, fieldCustomFilter, extFilterRequestList, view); } @Override @@ -794,67 +788,75 @@ public class SqlserverQueryProvider extends QueryProvider { } - public List transCustomFilterList(SQLObj tableObj, List requestList) { + public String transCustomFilterList(SQLObj tableObj, List requestList) { if (CollectionUtils.isEmpty(requestList)) { return null; } - List list = new ArrayList<>(); - for (ChartCustomFilterDTO request : requestList) { + List res = new ArrayList<>(); + for (ChartFieldCustomFilterDTO request : requestList) { + List list = new ArrayList<>(); DatasetTableField field = request.getField(); - if (ObjectUtils.isEmpty(field)) { - continue; - } - String value = request.getValue(); - String whereName = ""; - String whereTerm = transMysqlFilterTerm(request.getTerm()); - String whereValue = ""; - String originName; - if (ObjectUtils.isNotEmpty(field.getExtField()) && field.getExtField() == 2) { - // 解析origin name中有关联的字段生成sql表达式 - originName = calcFieldRegex(field.getOriginName(), tableObj); - } else if (ObjectUtils.isNotEmpty(field.getExtField()) && field.getExtField() == 1) { - originName = String.format(SqlServerSQLConstants.KEYWORD_FIX, tableObj.getTableAlias(), field.getOriginName()); - } else { - originName = String.format(SqlServerSQLConstants.KEYWORD_FIX, tableObj.getTableAlias(), field.getOriginName()); - } - if (field.getDeType() == 1) { - if (field.getDeExtractType() == 0 || field.getDeExtractType() == 5) { - whereName = String.format(SqlServerSQLConstants.STRING_TO_DATE, originName); + List filter = request.getFilter(); + for (ChartCustomFilterItemDTO filterItemDTO : filter) { + if (ObjectUtils.isEmpty(field)) { + continue; } - if (field.getDeExtractType() == 2 || field.getDeExtractType() == 3 || field.getDeExtractType() == 4) { - String cast = String.format(SqlServerSQLConstants.LONG_TO_DATE, originName + "/1000"); - whereName = String.format(SqlServerSQLConstants.FROM_UNIXTIME, cast); + String value = filterItemDTO.getValue(); + String whereName = ""; + String whereTerm = transMysqlFilterTerm(filterItemDTO.getTerm()); + String whereValue = ""; + String originName; + if (ObjectUtils.isNotEmpty(field.getExtField()) && field.getExtField() == 2) { + // 解析origin name中有关联的字段生成sql表达式 + originName = calcFieldRegex(field.getOriginName(), tableObj); + } else if (ObjectUtils.isNotEmpty(field.getExtField()) && field.getExtField() == 1) { + originName = String.format(SqlServerSQLConstants.KEYWORD_FIX, tableObj.getTableAlias(), field.getOriginName()); + } else { + originName = String.format(SqlServerSQLConstants.KEYWORD_FIX, tableObj.getTableAlias(), field.getOriginName()); } - if (field.getDeExtractType() == 1) { + if (field.getDeType() == 1) { + if (field.getDeExtractType() == 0 || field.getDeExtractType() == 5) { + whereName = String.format(SqlServerSQLConstants.STRING_TO_DATE, originName); + } + if (field.getDeExtractType() == 2 || field.getDeExtractType() == 3 || field.getDeExtractType() == 4) { + String cast = String.format(SqlServerSQLConstants.LONG_TO_DATE, originName + "/1000"); + whereName = String.format(SqlServerSQLConstants.FROM_UNIXTIME, cast); + } + if (field.getDeExtractType() == 1) { + whereName = originName; + } + } else { whereName = originName; } - } else { - whereName = originName; + if (StringUtils.equalsIgnoreCase(filterItemDTO.getTerm(), "null")) { + whereValue = ""; + } else if (StringUtils.equalsIgnoreCase(filterItemDTO.getTerm(), "not_null")) { + whereValue = ""; + } else if (StringUtils.equalsIgnoreCase(filterItemDTO.getTerm(), "empty")) { + whereValue = "''"; + } else if (StringUtils.equalsIgnoreCase(filterItemDTO.getTerm(), "not_empty")) { + whereValue = "''"; + } else if (StringUtils.containsIgnoreCase(filterItemDTO.getTerm(), "in")) { + whereValue = "('" + StringUtils.join(value, "','") + "')"; + } else if (StringUtils.containsIgnoreCase(filterItemDTO.getTerm(), "like")) { + whereValue = "'%" + value + "%'"; + } else { + whereValue = String.format(SqlServerSQLConstants.WHERE_VALUE_VALUE, value); + } + list.add(SQLObj.builder() + .whereField(whereName) + .whereTermAndValue(whereTerm + whereValue) + .build()); } - if (StringUtils.equalsIgnoreCase(request.getTerm(), "null")) { - whereValue = ""; - } else if (StringUtils.equalsIgnoreCase(request.getTerm(), "not_null")) { - whereValue = ""; - } else if (StringUtils.equalsIgnoreCase(request.getTerm(), "empty")) { - whereValue = "''"; - } else if (StringUtils.equalsIgnoreCase(request.getTerm(), "not_empty")) { - whereValue = "''"; - } else if (StringUtils.containsIgnoreCase(request.getTerm(), "in")) { - whereValue = "('" + StringUtils.join(value, "','") + "')"; - } else if (StringUtils.containsIgnoreCase(request.getTerm(), "like")) { - whereValue = "'%" + value + "%'"; - } else { - whereValue = String.format(SqlServerSQLConstants.WHERE_VALUE_VALUE, value); - } - list.add(SQLObj.builder() - .whereField(whereName) - .whereTermAndValue(whereTerm + whereValue) - .build()); + + List strList = new ArrayList<>(); + list.forEach(ele -> strList.add(ele.getWhereField() + " " + ele.getWhereTermAndValue())); + res.add("(" + String.join(" " + getLogic(request.getLogic()) + " ", strList) + ")"); } - return list; + return "(" + String.join(" AND ", res) + ")"; } - public List transExtFilterList(SQLObj tableObj, List requestList) { + public String transExtFilterList(SQLObj tableObj, List requestList) { if (CollectionUtils.isEmpty(requestList)) { return null; } @@ -916,7 +918,9 @@ public class SqlserverQueryProvider extends QueryProvider { .whereTermAndValue(whereTerm + whereValue) .build()); } - return list; + List strList = new ArrayList<>(); + list.forEach(ele -> strList.add(ele.getWhereField() + " " + ele.getWhereTermAndValue())); + return "(" + String.join(" AND ", strList) + ")"; } private String sqlFix(String sql) { @@ -1026,7 +1030,7 @@ public class SqlserverQueryProvider extends QueryProvider { .build(); } - private List getYWheres(ChartViewFieldDTO y, String originField, String fieldAlias) { + private String getYWheres(ChartViewFieldDTO y, String originField, String fieldAlias) { List list = new ArrayList<>(); if (CollectionUtils.isNotEmpty(y.getFilter()) && y.getFilter().size() > 0) { y.getFilter().forEach(f -> { @@ -1055,7 +1059,9 @@ public class SqlserverQueryProvider extends QueryProvider { .build()); }); } - return list; + List strList = new ArrayList<>(); + list.forEach(ele -> strList.add(ele.getWhereField() + " " + ele.getWhereTermAndValue())); + return CollectionUtils.isNotEmpty(list) ? "(" + String.join(" " + getLogic(y.getLogic()) + " ", strList) + ")" : null; } private String calcFieldRegex(String originField, SQLObj tableObj) { @@ -1081,4 +1087,14 @@ public class SqlserverQueryProvider extends QueryProvider { } return originField; } + + private String getLogic(String logic) { + switch (logic) { + case "and": + return "AND"; + case "or": + return "OR"; + } + return "AND"; + } } diff --git a/backend/src/main/java/io/dataease/service/chart/ChartViewService.java b/backend/src/main/java/io/dataease/service/chart/ChartViewService.java index b93d710aaf..395598d620 100644 --- a/backend/src/main/java/io/dataease/service/chart/ChartViewService.java +++ b/backend/src/main/java/io/dataease/service/chart/ChartViewService.java @@ -208,15 +208,8 @@ public class ChartViewService { }.getType()); List drill = new Gson().fromJson(view.getDrillFields(), new TypeToken>() { }.getType()); - List customFilter = new ArrayList<>(); for (ChartFieldCustomFilterDTO ele : fieldCustomFilter) { - List collect = ele.getFilter().stream().map(f -> { - ChartCustomFilterDTO dto = new ChartCustomFilterDTO(); - BeanUtils.copyBean(dto, f); - dto.setField(dataSetTableFieldsService.get(f.getFieldId())); - return dto; - }).collect(Collectors.toList()); - customFilter.addAll(collect); + ele.setField(dataSetTableFieldsService.get(ele.getId())); } if (StringUtils.equalsIgnoreCase("text", view.getType()) @@ -341,42 +334,42 @@ public class ChartViewService { if (StringUtils.equalsIgnoreCase(table.getType(), "db")) { datasourceRequest.setTable(dataTableInfoDTO.getTable()); if (StringUtils.equalsIgnoreCase("text", view.getType()) || StringUtils.equalsIgnoreCase("gauge", view.getType()) || StringUtils.equalsIgnoreCase("liquid", view.getType())) { - datasourceRequest.setQuery(qp.getSQLSummary(dataTableInfoDTO.getTable(), yAxis, customFilter, extFilterList, view)); + datasourceRequest.setQuery(qp.getSQLSummary(dataTableInfoDTO.getTable(), yAxis, fieldCustomFilter, extFilterList, view)); } else if (StringUtils.containsIgnoreCase(view.getType(), "stack")) { - datasourceRequest.setQuery(qp.getSQLStack(dataTableInfoDTO.getTable(), xAxis, yAxis, customFilter, extFilterList, extStack, ds, view)); + datasourceRequest.setQuery(qp.getSQLStack(dataTableInfoDTO.getTable(), xAxis, yAxis, fieldCustomFilter, extFilterList, extStack, ds, view)); } else if (StringUtils.containsIgnoreCase(view.getType(), "scatter")) { - datasourceRequest.setQuery(qp.getSQLScatter(dataTableInfoDTO.getTable(), xAxis, yAxis, customFilter, extFilterList, extBubble, ds, view)); + datasourceRequest.setQuery(qp.getSQLScatter(dataTableInfoDTO.getTable(), xAxis, yAxis, fieldCustomFilter, extFilterList, extBubble, ds, view)); } else if (StringUtils.equalsIgnoreCase("table-info", view.getType())) { - datasourceRequest.setQuery(qp.getSQLTableInfo(dataTableInfoDTO.getTable(), xAxis, customFilter, extFilterList, ds, view)); + datasourceRequest.setQuery(qp.getSQLTableInfo(dataTableInfoDTO.getTable(), xAxis, fieldCustomFilter, extFilterList, ds, view)); } else { - datasourceRequest.setQuery(qp.getSQL(dataTableInfoDTO.getTable(), xAxis, yAxis, customFilter, extFilterList, ds, view)); + datasourceRequest.setQuery(qp.getSQL(dataTableInfoDTO.getTable(), xAxis, yAxis, fieldCustomFilter, extFilterList, ds, view)); } } else if (StringUtils.equalsIgnoreCase(table.getType(), "sql")) { if (StringUtils.equalsIgnoreCase("text", view.getType()) || StringUtils.equalsIgnoreCase("gauge", view.getType()) || StringUtils.equalsIgnoreCase("liquid", view.getType())) { - datasourceRequest.setQuery(qp.getSQLSummaryAsTmp(dataTableInfoDTO.getSql(), yAxis, customFilter, extFilterList, view)); + datasourceRequest.setQuery(qp.getSQLSummaryAsTmp(dataTableInfoDTO.getSql(), yAxis, fieldCustomFilter, extFilterList, view)); } else if (StringUtils.containsIgnoreCase(view.getType(), "stack")) { - datasourceRequest.setQuery(qp.getSQLAsTmpStack(dataTableInfoDTO.getSql(), xAxis, yAxis, customFilter, extFilterList, extStack, view)); + datasourceRequest.setQuery(qp.getSQLAsTmpStack(dataTableInfoDTO.getSql(), xAxis, yAxis, fieldCustomFilter, extFilterList, extStack, view)); } else if (StringUtils.containsIgnoreCase(view.getType(), "scatter")) { - datasourceRequest.setQuery(qp.getSQLAsTmpScatter(dataTableInfoDTO.getSql(), xAxis, yAxis, customFilter, extFilterList, extBubble, view)); + datasourceRequest.setQuery(qp.getSQLAsTmpScatter(dataTableInfoDTO.getSql(), xAxis, yAxis, fieldCustomFilter, extFilterList, extBubble, view)); } else if (StringUtils.equalsIgnoreCase("table-info", view.getType())) { - datasourceRequest.setQuery(qp.getSQLAsTmpTableInfo(dataTableInfoDTO.getSql(), xAxis, customFilter, extFilterList, ds, view)); + datasourceRequest.setQuery(qp.getSQLAsTmpTableInfo(dataTableInfoDTO.getSql(), xAxis, fieldCustomFilter, extFilterList, ds, view)); } else { - datasourceRequest.setQuery(qp.getSQLAsTmp(dataTableInfoDTO.getSql(), xAxis, yAxis, customFilter, extFilterList, view)); + datasourceRequest.setQuery(qp.getSQLAsTmp(dataTableInfoDTO.getSql(), xAxis, yAxis, fieldCustomFilter, extFilterList, view)); } } else if (StringUtils.equalsIgnoreCase(table.getType(), "custom")) { DataTableInfoDTO dt = new Gson().fromJson(table.getInfo(), DataTableInfoDTO.class); List list = dataSetTableUnionService.listByTableId(dt.getList().get(0).getTableId()); String sql = dataSetTableService.getCustomSQLDatasource(dt, list, ds); if (StringUtils.equalsIgnoreCase("text", view.getType()) || StringUtils.equalsIgnoreCase("gauge", view.getType()) || StringUtils.equalsIgnoreCase("liquid", view.getType())) { - datasourceRequest.setQuery(qp.getSQLSummaryAsTmp(sql, yAxis, customFilter, extFilterList, view)); + datasourceRequest.setQuery(qp.getSQLSummaryAsTmp(sql, yAxis, fieldCustomFilter, extFilterList, view)); } else if (StringUtils.containsIgnoreCase(view.getType(), "stack")) { - datasourceRequest.setQuery(qp.getSQLAsTmpStack(sql, xAxis, yAxis, customFilter, extFilterList, extStack, view)); + datasourceRequest.setQuery(qp.getSQLAsTmpStack(sql, xAxis, yAxis, fieldCustomFilter, extFilterList, extStack, view)); } else if (StringUtils.containsIgnoreCase(view.getType(), "scatter")) { - datasourceRequest.setQuery(qp.getSQLAsTmpScatter(sql, xAxis, yAxis, customFilter, extFilterList, extBubble, view)); + datasourceRequest.setQuery(qp.getSQLAsTmpScatter(sql, xAxis, yAxis, fieldCustomFilter, extFilterList, extBubble, view)); } else if (StringUtils.equalsIgnoreCase("table-info", view.getType())) { - datasourceRequest.setQuery(qp.getSQLAsTmpTableInfo(sql, xAxis, customFilter, extFilterList, ds, view)); + datasourceRequest.setQuery(qp.getSQLAsTmpTableInfo(sql, xAxis, fieldCustomFilter, extFilterList, ds, view)); } else { - datasourceRequest.setQuery(qp.getSQLAsTmp(sql, xAxis, yAxis, customFilter, extFilterList, view)); + datasourceRequest.setQuery(qp.getSQLAsTmp(sql, xAxis, yAxis, fieldCustomFilter, extFilterList, view)); } } else if (StringUtils.equalsIgnoreCase(table.getType(), "union")) { DataTableInfoDTO dt = new Gson().fromJson(table.getInfo(), DataTableInfoDTO.class); @@ -384,15 +377,15 @@ public class ChartViewService { String sql = (String) sqlMap.get("sql"); if (StringUtils.equalsIgnoreCase("text", view.getType()) || StringUtils.equalsIgnoreCase("gauge", view.getType()) || StringUtils.equalsIgnoreCase("liquid", view.getType())) { - datasourceRequest.setQuery(qp.getSQLSummaryAsTmp(sql, yAxis, customFilter, extFilterList, view)); + datasourceRequest.setQuery(qp.getSQLSummaryAsTmp(sql, yAxis, fieldCustomFilter, extFilterList, view)); } else if (StringUtils.containsIgnoreCase(view.getType(), "stack")) { - datasourceRequest.setQuery(qp.getSQLAsTmpStack(sql, xAxis, yAxis, customFilter, extFilterList, extStack, view)); + datasourceRequest.setQuery(qp.getSQLAsTmpStack(sql, xAxis, yAxis, fieldCustomFilter, extFilterList, extStack, view)); } else if (StringUtils.containsIgnoreCase(view.getType(), "scatter")) { - datasourceRequest.setQuery(qp.getSQLAsTmpScatter(sql, xAxis, yAxis, customFilter, extFilterList, extBubble, view)); + datasourceRequest.setQuery(qp.getSQLAsTmpScatter(sql, xAxis, yAxis, fieldCustomFilter, extFilterList, extBubble, view)); } else if (StringUtils.equalsIgnoreCase("table-info", view.getType())) { - datasourceRequest.setQuery(qp.getSQLAsTmpTableInfo(sql, xAxis, customFilter, extFilterList, ds, view)); + datasourceRequest.setQuery(qp.getSQLAsTmpTableInfo(sql, xAxis, fieldCustomFilter, extFilterList, ds, view)); } else { - datasourceRequest.setQuery(qp.getSQLAsTmp(sql, xAxis, yAxis, customFilter, extFilterList, view)); + datasourceRequest.setQuery(qp.getSQLAsTmp(sql, xAxis, yAxis, fieldCustomFilter, extFilterList, view)); } } data = datasourceProvider.getData(datasourceRequest); @@ -405,15 +398,15 @@ public class ChartViewService { datasourceRequest.setTable(tableName); QueryProvider qp = ProviderFactory.getQueryProvider(ds.getType()); if (StringUtils.equalsIgnoreCase("text", view.getType()) || StringUtils.equalsIgnoreCase("gauge", view.getType()) || StringUtils.equalsIgnoreCase("liquid", view.getType())) { - datasourceRequest.setQuery(qp.getSQLSummary(tableName, yAxis, customFilter, extFilterList, view)); + datasourceRequest.setQuery(qp.getSQLSummary(tableName, yAxis, fieldCustomFilter, extFilterList, view)); } else if (StringUtils.containsIgnoreCase(view.getType(), "stack")) { - datasourceRequest.setQuery(qp.getSQLStack(tableName, xAxis, yAxis, customFilter, extFilterList, extStack, ds, view)); + datasourceRequest.setQuery(qp.getSQLStack(tableName, xAxis, yAxis, fieldCustomFilter, extFilterList, extStack, ds, view)); } else if (StringUtils.containsIgnoreCase(view.getType(), "scatter")) { - datasourceRequest.setQuery(qp.getSQLScatter(tableName, xAxis, yAxis, customFilter, extFilterList, extBubble, ds, view)); + datasourceRequest.setQuery(qp.getSQLScatter(tableName, xAxis, yAxis, fieldCustomFilter, extFilterList, extBubble, ds, view)); } else if (StringUtils.equalsIgnoreCase("table-info", view.getType())) { - datasourceRequest.setQuery(qp.getSQLTableInfo(tableName, xAxis, customFilter, extFilterList, ds, view)); + datasourceRequest.setQuery(qp.getSQLTableInfo(tableName, xAxis, fieldCustomFilter, extFilterList, ds, view)); } else { - datasourceRequest.setQuery(qp.getSQL(tableName, xAxis, yAxis, customFilter, extFilterList, ds, view)); + datasourceRequest.setQuery(qp.getSQL(tableName, xAxis, yAxis, fieldCustomFilter, extFilterList, ds, view)); } // 仪表板有参数不实用缓存 if (!cache || CollectionUtils.isNotEmpty(requestList.getFilter()) diff --git a/backend/src/main/java/io/dataease/service/dataset/DataSetTableService.java b/backend/src/main/java/io/dataease/service/dataset/DataSetTableService.java index 436c3abf74..f5019db9c3 100644 --- a/backend/src/main/java/io/dataease/service/dataset/DataSetTableService.java +++ b/backend/src/main/java/io/dataease/service/dataset/DataSetTableService.java @@ -18,24 +18,23 @@ import io.dataease.commons.utils.*; import io.dataease.controller.request.dataset.DataSetGroupRequest; import io.dataease.controller.request.dataset.DataSetTableRequest; import io.dataease.controller.request.dataset.DataSetTaskRequest; -import io.dataease.controller.response.DataSetDetail; -import io.dataease.dto.chart.ChartCustomFilterDTO; -import io.dataease.dto.datasource.TableFiled; -import io.dataease.plugins.config.SpringContextUtil; -import io.dataease.plugins.xpack.auth.dto.request.DatasetRowPermissions; -import io.dataease.plugins.xpack.auth.service.RowPermissionService; -import io.dataease.plugins.xpack.oidc.service.OidcXpackService; -import io.dataease.provider.datasource.DatasourceProvider; -import io.dataease.provider.datasource.JdbcProvider; -import io.dataease.provider.ProviderFactory; import io.dataease.controller.request.datasource.DatasourceRequest; +import io.dataease.controller.response.DataSetDetail; +import io.dataease.dto.chart.ChartFieldCustomFilterDTO; import io.dataease.dto.dataset.*; import io.dataease.dto.dataset.union.UnionDTO; import io.dataease.dto.dataset.union.UnionItemDTO; -import io.dataease.dto.dataset.union.UnionParamDTO;; +import io.dataease.dto.dataset.union.UnionParamDTO; +import io.dataease.dto.datasource.TableFiled; import io.dataease.exception.DataEaseException; import io.dataease.i18n.Translator; +import io.dataease.plugins.config.SpringContextUtil; import io.dataease.plugins.loader.ClassloaderResponsity; +import io.dataease.plugins.xpack.auth.dto.request.DatasetRowPermissions; +import io.dataease.plugins.xpack.auth.service.RowPermissionService; +import io.dataease.provider.ProviderFactory; +import io.dataease.provider.datasource.DatasourceProvider; +import io.dataease.provider.datasource.JdbcProvider; import io.dataease.provider.query.DDLProvider; import io.dataease.provider.query.QueryProvider; import org.apache.commons.collections4.CollectionUtils; @@ -67,6 +66,8 @@ import java.text.SimpleDateFormat; import java.util.*; import java.util.stream.Collectors; +; + /** * @Author gin * @Date 2021/2/23 2:54 下午 @@ -439,38 +440,38 @@ public class DataSetTableService { return map; } - private List rowPermissions(String datasetId){ + private List rowPermissions(String datasetId) { List datasetRowPermissions = new ArrayList<>(); Map beansOfType = SpringContextUtil.getApplicationContext().getBeansOfType((RowPermissionService.class)); - if(beansOfType.keySet().size() == 0) { - return new ArrayList<>(); + if (beansOfType.keySet().size() == 0) { + return new ArrayList<>(); } RowPermissionService rowPermissionService = SpringContextUtil.getBean(RowPermissionService.class); datasetRowPermissions.addAll(rowPermissionService.listDatasetRowPermissions(datasetId, Collections.singletonList(AuthUtils.getUser().getUserId()), "user")); - datasetRowPermissions.addAll(rowPermissionService.listDatasetRowPermissions(datasetId, AuthUtils.getUser().getRoles().stream().map(CurrentRoleDto::getId).collect(Collectors.toList()) , "role")); + datasetRowPermissions.addAll(rowPermissionService.listDatasetRowPermissions(datasetId, AuthUtils.getUser().getRoles().stream().map(CurrentRoleDto::getId).collect(Collectors.toList()), "role")); datasetRowPermissions.addAll(rowPermissionService.listDatasetRowPermissions(datasetId, Collections.singletonList(AuthUtils.getUser().getDeptId()), "dept")); return datasetRowPermissions; } - private DatasetTableField getFieldById(List fields, String fieldId){ + private DatasetTableField getFieldById(List fields, String fieldId) { DatasetTableField field = null; for (DatasetTableField datasetTableField : fields) { - if(fieldId.equalsIgnoreCase(datasetTableField.getId())){ - field = datasetTableField; + if (fieldId.equalsIgnoreCase(datasetTableField.getId())) { + field = datasetTableField; } } return field; } - public List getCustomFilters(List fields, DatasetTable datasetTable) { - List customFilter = new ArrayList<>(); + public List getCustomFilters(List fields, DatasetTable datasetTable) { + List customFilter = new ArrayList<>(); rowPermissions(datasetTable.getId()).forEach(datasetRowPermissions -> { - List lists = JSONObject.parseArray(datasetRowPermissions.getFilter(), ChartCustomFilterDTO.class); + List lists = JSONObject.parseArray(datasetRowPermissions.getFilter(), ChartFieldCustomFilterDTO.class); lists.forEach(chartCustomFilterDTO -> { DatasetTableField field = getFieldById(fields, datasetRowPermissions.getDatasetFieldId()); - if(field != null){ - chartCustomFilterDTO.setFieldId(datasetRowPermissions.getDatasetFieldId()); + if (field != null) { + chartCustomFilterDTO.setId(datasetRowPermissions.getDatasetFieldId()); chartCustomFilterDTO.setField(field); } }); @@ -490,7 +491,7 @@ public class DataSetTableService { return map; } DatasetTable datasetTable = datasetTableMapper.selectByPrimaryKey(dataSetTableRequest.getId()); - List customFilter = getCustomFilters(fields, datasetTable); + List customFilter = getCustomFilters(fields, datasetTable); String[] fieldArray = fields.stream().map(DatasetTableField::getDataeaseName).toArray(String[]::new); DataTableInfoDTO dataTableInfoDTO = new Gson().fromJson(dataSetTableRequest.getInfo(), DataTableInfoDTO.class); diff --git a/backend/src/main/java/io/dataease/service/dataset/impl/direct/DirectFieldService.java b/backend/src/main/java/io/dataease/service/dataset/impl/direct/DirectFieldService.java index 196f3a1095..d81ea67e1e 100644 --- a/backend/src/main/java/io/dataease/service/dataset/impl/direct/DirectFieldService.java +++ b/backend/src/main/java/io/dataease/service/dataset/impl/direct/DirectFieldService.java @@ -6,6 +6,7 @@ import io.dataease.base.domain.DatasetTableField; import io.dataease.base.domain.Datasource; import io.dataease.commons.utils.CommonBeanFactory; import io.dataease.dto.chart.ChartCustomFilterDTO; +import io.dataease.dto.chart.ChartFieldCustomFilterDTO; import io.dataease.provider.datasource.DatasourceProvider; import io.dataease.provider.ProviderFactory; import io.dataease.controller.request.datasource.DatasourceRequest; @@ -57,7 +58,7 @@ public class DirectFieldService implements DataSetFieldService { DatasetTableField datasetTableField = DatasetTableField.builder().tableId(tableId).checked(Boolean.TRUE).build(); List fields = dataSetTableFieldsService.list(datasetTableField); - List customFilter = dataSetTableService.getCustomFilters(fields, datasetTable); + List customFilter = dataSetTableService.getCustomFilters(fields, datasetTable); DatasourceRequest datasourceRequest = new DatasourceRequest(); DatasourceProvider datasourceProvider = null; diff --git a/backend/src/main/resources/sql/sqlTemplate.stg b/backend/src/main/resources/sql/sqlTemplate.stg index 0c411ebde8..f101e3471c 100644 --- a/backend/src/main/resources/sql/sqlTemplate.stg +++ b/backend/src/main/resources/sql/sqlTemplate.stg @@ -18,7 +18,7 @@ FROM WHERE - }; separator="\nAND "> + }; separator="\nAND "> GROUP BY @@ -51,7 +51,7 @@ FROM WHERE - }; separator="\nAND "> + }; separator="\nAND "> GROUP BY diff --git a/frontend/src/lang/en.js b/frontend/src/lang/en.js index 8017eb54b6..cebf8c5376 100644 --- a/frontend/src/lang/en.js +++ b/frontend/src/lang/en.js @@ -992,7 +992,9 @@ export default { day_mom: 'Day mom', data_sub: 'Sub', data_percent: 'Percent', - compare_calc_expression: 'Expression' + compare_calc_expression: 'Expression', + and: 'And', + or: 'Or' }, dataset: { sheet_warn: 'There are multiple sheet pages, and the first one is extracted by default', diff --git a/frontend/src/lang/tw.js b/frontend/src/lang/tw.js index 070013d67f..3f8d8291f2 100644 --- a/frontend/src/lang/tw.js +++ b/frontend/src/lang/tw.js @@ -992,7 +992,9 @@ export default { day_mom: '日環比', data_sub: '對比差值', data_percent: '差值百分比', - compare_calc_expression: '計算公式' + compare_calc_expression: '計算公式', + and: '與', + or: '或' }, dataset: { sheet_warn: '有多個 Sheet 頁,默認抽取第一個', diff --git a/frontend/src/lang/zh.js b/frontend/src/lang/zh.js index a334888907..7ee3a045bb 100644 --- a/frontend/src/lang/zh.js +++ b/frontend/src/lang/zh.js @@ -995,7 +995,9 @@ export default { day_mom: '日环比', data_sub: '对比差值', data_percent: '差值百分比', - compare_calc_expression: '计算公式' + compare_calc_expression: '计算公式', + and: '与', + or: '或' }, dataset: { sheet_warn: '有多个 Sheet 页,默认抽取第一个', diff --git a/frontend/src/views/chart/components/filter/QuotaFilterEditor.vue b/frontend/src/views/chart/components/filter/QuotaFilterEditor.vue index 0f80ea826c..855b1ded0f 100644 --- a/frontend/src/views/chart/components/filter/QuotaFilterEditor.vue +++ b/frontend/src/views/chart/components/filter/QuotaFilterEditor.vue @@ -1,6 +1,18 @@