diff --git a/backend/pom.xml b/backend/pom.xml index cf9bf9be59..8eb0f12b3f 100644 --- a/backend/pom.xml +++ b/backend/pom.xml @@ -10,7 +10,7 @@ 4.0.0 backend - + UTF-8 @@ -207,7 +207,7 @@ io.dataease dataease-plugin-interface - 1.5 + 1.6 cn.hutool @@ -419,19 +419,19 @@ - - pentaho-public - Pentaho Public - http://nexus.pentaho.org/content/groups/omni - - true - always - - - true - always - - + + pentaho-public + Pentaho Public + http://nexus.pentaho.org/content/groups/omni + + true + always + + + true + always + + diff --git a/backend/src/main/java/io/dataease/base/mapper/ext/ExtDataSetTableMapper.java b/backend/src/main/java/io/dataease/base/mapper/ext/ExtDataSetTableMapper.java index 5261a66430..bca5c5202b 100644 --- a/backend/src/main/java/io/dataease/base/mapper/ext/ExtDataSetTableMapper.java +++ b/backend/src/main/java/io/dataease/base/mapper/ext/ExtDataSetTableMapper.java @@ -9,4 +9,5 @@ public interface ExtDataSetTableMapper { List search(DataSetTableRequest request); DataSetTableDTO searchOne(DataSetTableRequest request); + } diff --git a/backend/src/main/java/io/dataease/base/mapper/ext/ExtDataSetTableMapper.xml b/backend/src/main/java/io/dataease/base/mapper/ext/ExtDataSetTableMapper.xml index d64322478b..91abf6daea 100644 --- a/backend/src/main/java/io/dataease/base/mapper/ext/ExtDataSetTableMapper.xml +++ b/backend/src/main/java/io/dataease/base/mapper/ext/ExtDataSetTableMapper.xml @@ -7,6 +7,12 @@ + + + + + + + diff --git a/backend/src/main/java/io/dataease/base/mapper/ext/ExtPanelLinkJumpMapper.xml b/backend/src/main/java/io/dataease/base/mapper/ext/ExtPanelLinkJumpMapper.xml index 7b0a7ba4ef..28c55e4479 100644 --- a/backend/src/main/java/io/dataease/base/mapper/ext/ExtPanelLinkJumpMapper.xml +++ b/backend/src/main/java/io/dataease/base/mapper/ext/ExtPanelLinkJumpMapper.xml @@ -12,6 +12,7 @@ + @@ -35,6 +36,7 @@ panel_link_jump_info.jump_type, panel_link_jump_info.target_panel_id, panel_link_jump_info.content, + panel_link_mapping.id as publicJumpId, ifnull( panel_link_jump_info.checked, 0 ) AS checked, panel_link_jump_target_view_info.target_view_id, panel_link_jump_target_view_info.target_field_id @@ -45,6 +47,7 @@ LEFT JOIN panel_link_jump_info ON panel_link_jump.id = panel_link_jump_info.link_jump_id AND dataset_table_field.id = panel_link_jump_info.source_field_id LEFT JOIN panel_link_jump_target_view_info ON panel_link_jump_info.id = panel_link_jump_target_view_info.link_jump_info_id + LEFT JOIN panel_link_mapping on panel_link_jump_info.target_panel_id = panel_link_mapping.resource_id WHERE chart_view.id =#{source_view_id} ORDER BY 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/dto/panel/linkJump/PanelLinkJumpInfoDTO.java b/backend/src/main/java/io/dataease/dto/panel/linkJump/PanelLinkJumpInfoDTO.java index dc60b16914..b03c8ceac6 100644 --- a/backend/src/main/java/io/dataease/dto/panel/linkJump/PanelLinkJumpInfoDTO.java +++ b/backend/src/main/java/io/dataease/dto/panel/linkJump/PanelLinkJumpInfoDTO.java @@ -19,6 +19,9 @@ public class PanelLinkJumpInfoDTO extends PanelLinkJumpInfo { private String sourceJumpInfo; + //存在公共链接的目标仪表板 + private String publicJumpId; + private List targetViewInfoList=new ArrayList<>();// linkType = inner 时使用 diff --git a/backend/src/main/java/io/dataease/plugins/server/RowPermissionsController.java b/backend/src/main/java/io/dataease/plugins/server/RowPermissionsController.java new file mode 100644 index 0000000000..378429c9b0 --- /dev/null +++ b/backend/src/main/java/io/dataease/plugins/server/RowPermissionsController.java @@ -0,0 +1,39 @@ +package io.dataease.plugins.server; + +import io.dataease.plugins.config.SpringContextUtil; +import io.dataease.plugins.xpack.auth.dto.request.DataSetRowPermissionsDTO; +import io.dataease.plugins.xpack.auth.dto.request.DatasetRowPermissions; +import io.dataease.plugins.xpack.auth.dto.response.XpackSysAuthDetailDTO; +import io.dataease.plugins.xpack.auth.service.RowPermissionService; +import io.swagger.annotations.ApiOperation; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + + +@RestController +@RequestMapping("plugin/dataset/rowPermissions") +public class RowPermissionsController { + + @ApiOperation("保存") + @PostMapping("save") + public void save(@RequestBody DatasetRowPermissions datasetRowPermissions) throws Exception { + RowPermissionService rowPermissionService = SpringContextUtil.getBean(RowPermissionService.class); + rowPermissionService.save(datasetRowPermissions); + } + + @ApiOperation("分页查询") + @PostMapping("/list") + public List rowPermissions(@RequestBody XpackSysAuthDetailDTO request) { + RowPermissionService rowPermissionService = SpringContextUtil.getBean(RowPermissionService.class); + return rowPermissionService.searchRowPermissions(request); + } + + @ApiOperation("删除") + @GetMapping("/delete/{id}") + public void dataSetRowPermissionInfo(@PathVariable String id) { + RowPermissionService rowPermissionService = SpringContextUtil.getBean(RowPermissionService.class); + rowPermissionService.delete(id); + } + +} diff --git a/backend/src/main/java/io/dataease/plugins/server/XAuthServer.java b/backend/src/main/java/io/dataease/plugins/server/XAuthServer.java index 9121d531d1..9282d72b88 100644 --- a/backend/src/main/java/io/dataease/plugins/server/XAuthServer.java +++ b/backend/src/main/java/io/dataease/plugins/server/XAuthServer.java @@ -41,7 +41,15 @@ public class XAuthServer { @I18n public ListauthDetailsModel(@PathVariable String authType){ AuthXpackService sysAuthService = SpringContextUtil.getBean(AuthXpackService.class); - return sysAuthService.searchAuthDetailsModel(authType); + List authDetails = sysAuthService.searchAuthDetailsModel(authType); + if(authType.equalsIgnoreCase("dataset")){ + XpackSysAuthDetail xpackSysAuthDetail = new XpackSysAuthDetail(); + xpackSysAuthDetail.setPrivilegeName("i18n_auth_row_permission"); + xpackSysAuthDetail.setPrivilegeType(20); + xpackSysAuthDetail.setPrivilegeValue(1); + authDetails.add(0,xpackSysAuthDetail); + } + return authDetails; } @PostMapping("/authChange") 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 9dc0bfeef3..8716317f0b 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); + public abstract String createQuerySQL(String table, List fields, boolean isGroup, Datasource ds, List fieldCustomFilter); - public abstract String createQuerySQLAsTmp(String sql, List fields, boolean isGroup); + 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); + 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); + 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); + 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); + 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,19 @@ 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); } + + public String getLogic(String logic) { + if (logic != null) { + switch (logic) { + case "and": + return "AND"; + case "or": + return "OR"; + } + } + return "AND"; + } } 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 a2e9738d55..9b73bd8fef 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) { + 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,42 +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); + 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) { - return createQuerySQL("(" + sqlFix(sql) + ")", fields, isGroup, null); + 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) { - return createQuerySQL(table, fields, isGroup, null) + " 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) { - return createQuerySQL(table, fields, isGroup, null) + " 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) { - return createQuerySQLAsTmp(sql, fields, isGroup) + " 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) { - return createQuerySQLAsTmp(sql, fields, isGroup) + " 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++) { @@ -234,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++) { @@ -252,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() @@ -264,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"); @@ -304,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++) { @@ -339,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 @@ -375,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); @@ -424,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++) { @@ -442,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() @@ -454,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"); @@ -494,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++) { @@ -534,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); @@ -555,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() @@ -567,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"); @@ -607,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 @@ -617,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++) { @@ -642,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() @@ -654,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"); @@ -689,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 @@ -764,84 +762,92 @@ 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())); + if (CollectionUtils.isNotEmpty(list)) { + res.add("(" + String.join(" " + getLogic(request.getLogic()) + " ", strList) + ")"); } - } - return list; + return CollectionUtils.isNotEmpty(res) ? "(" + String.join(" AND ", res) + ")" : null; } - public List transExtFilterList(SQLObj tableObj, List requestList) { + public String transExtFilterList(SQLObj tableObj, List requestList) { if (CollectionUtils.isEmpty(requestList)) { return null; } @@ -916,7 +922,9 @@ public class CKQueryProvider extends QueryProvider { .build()); } } - return list; + List strList = new ArrayList<>(); + list.forEach(ele -> strList.add(ele.getWhereField() + " " + ele.getWhereTermAndValue())); + return CollectionUtils.isNotEmpty(list) ? "(" + String.join(" AND ", strList) + ")" : null; } private String sqlFix(String sql) { @@ -1014,7 +1022,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 -> { @@ -1058,7 +1066,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) { 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 b580d5f4e1..eeaefb2ef2 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 @@ -1,5 +1,6 @@ package io.dataease.provider.query.db2; +import com.google.gson.Gson; import io.dataease.base.domain.ChartViewWithBLOBs; import io.dataease.base.domain.DatasetTableField; import io.dataease.base.domain.DatasetTableFieldExample; @@ -7,8 +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.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.Db2Configuration; import io.dataease.dto.sqlObj.SQLObj; import io.dataease.provider.query.QueryProvider; import io.dataease.provider.query.SQLConstants; @@ -26,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; @@ -76,11 +80,12 @@ public class Db2QueryProvider extends QueryProvider { } @Override - public String createQuerySQL(String table, List fields, boolean isGroup, Datasource ds) { + 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)) .build(); + setSchema(tableObj, ds); List xFields = new ArrayList<>(); if (CollectionUtils.isNotEmpty(fields)) { for (int i = 0; i < fields.size(); i++) { @@ -139,41 +144,40 @@ public class Db2QueryProvider extends QueryProvider { } @Override - public String createQuerySQLAsTmp(String sql, List fields, boolean isGroup) { - return createQuerySQL("(" + sqlFix(sql) + ")", fields, isGroup, null); + 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) { + 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) + 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) { - return createQuerySQL(table, fields, isGroup, null) + 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) { - return createQuerySQLAsTmp(sql, fields, isGroup) + 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) { + 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) + 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) { - System.out.println(table); + 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(Db2Constants.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++) { @@ -202,7 +206,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 +224,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 +236,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 +275,13 @@ 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(); + 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++) { @@ -307,16 +310,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 +345,24 @@ 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(); + setSchema(tableObj, ds); List xFields = new ArrayList<>(); - List xWheres = new ArrayList<>(); List xOrders = new ArrayList<>(); List xList = new ArrayList<>(); xList.addAll(xAxis); @@ -392,7 +394,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 +412,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 +424,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 +463,18 @@ 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(); + 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++) { @@ -502,7 +503,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 +524,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 +536,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 +575,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 +585,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 +610,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 +622,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 +657,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 @@ -678,7 +678,8 @@ public class Db2QueryProvider extends QueryProvider { stringBuilder.append("\"").append(f.getOriginName()).append("\" AS ").append(f.getDataeaseName()); return stringBuilder.toString(); }).toArray(String[]::new); - return MessageFormat.format("SELECT {0} FROM {1}", StringUtils.join(array, ","), table); + Db2Configuration db2Configuration = new Gson().fromJson(ds.getConfiguration(), Db2Configuration.class); + return MessageFormat.format("SELECT {0} FROM {1}", StringUtils.join(array, ","), db2Configuration.getSchema() + ".\"" + table + "\""); } @Override @@ -728,72 +729,82 @@ 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 strList = new ArrayList<>(); + list.forEach(ele -> strList.add(ele.getWhereField() + " " + ele.getWhereTermAndValue())); + if (CollectionUtils.isNotEmpty(list)) { + res.add("(" + String.join(" " + getLogic(request.getLogic()) + " ", strList) + ")"); } - list.add(SQLObj.builder() - .whereField(whereName) - .whereTermAndValue(whereTerm + whereValue) - .build()); } - return list; + return CollectionUtils.isNotEmpty(res) ? "(" + String.join(" AND ", res) + ")" : null; } - public List transExtFilterList(SQLObj tableObj, List requestList) { + public String transExtFilterList(SQLObj tableObj, List requestList) { if (CollectionUtils.isEmpty(requestList)) { return null; } @@ -856,7 +867,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 CollectionUtils.isNotEmpty(list) ? "(" + String.join(" AND ", strList) + ")" : null; } private String sqlFix(String sql) { @@ -951,7 +964,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 +984,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 +998,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) { 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 ab74c1a3d1..5485ff430b 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) { + 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,6 +142,11 @@ 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); + 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)) { xOrders.add(SQLObj.builder() .orderDirection("asc") @@ -152,38 +159,37 @@ public class DorisQueryProvider extends QueryProvider { } @Override - public String createQuerySQLAsTmp(String sql, List fields, boolean isGroup) { - return createQuerySQL("(" + sql + ")", fields, isGroup, null); + 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) { - return createQuerySQL(table, fields, isGroup, null) + " 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) { - return createQuerySQL(table, fields, isGroup, null) + " 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) { - return createQuerySQLAsTmp(sql, fields, isGroup) + " 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) { - return createQuerySQLAsTmp(sql, fields, isGroup) + " 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++) { @@ -212,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++) { @@ -230,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() @@ -242,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"); @@ -282,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++) { @@ -317,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 @@ -353,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); @@ -401,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++) { @@ -419,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() @@ -431,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"); @@ -471,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++) { @@ -511,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); @@ -532,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() @@ -544,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"); @@ -584,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 @@ -594,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++) { @@ -619,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() @@ -631,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"); @@ -666,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 @@ -744,72 +743,83 @@ 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 strList = new ArrayList<>(); + list.forEach(ele -> strList.add(ele.getWhereField() + " " + ele.getWhereTermAndValue())); + if (CollectionUtils.isNotEmpty(list)) { + res.add("(" + String.join(" " + getLogic(request.getLogic()) + " ", strList) + ")"); } - list.add(SQLObj.builder() - .whereField(whereName) - .whereTermAndValue(whereTerm + whereValue) - .build()); } - return list; + return CollectionUtils.isNotEmpty(res) ? "(" + String.join(" AND ", res) + ")" : null; } - public List transExtFilterList(SQLObj tableObj, List requestList) { + public String transExtFilterList(SQLObj tableObj, List requestList) { if (CollectionUtils.isEmpty(requestList)) { return null; } @@ -874,7 +884,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 CollectionUtils.isNotEmpty(list) ? "(" + String.join(" AND ", strList) + ")" : null; } private String transDateFormat(String dateStyle, String datePattern) { @@ -1003,7 +1015,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 -> { @@ -1032,7 +1044,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) { 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 4c83334771..a8e42128de 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) { + 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)) @@ -169,42 +171,47 @@ public class EsQueryProvider 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); + + 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) { - return createQuerySQL("(" + sqlFix(sql) + ")", fields, isGroup, null); + 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) { - return createQuerySQL(table, fields, isGroup, null); + 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) { - return createQuerySQL(table, fields, isGroup, null); + 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) { - return createQuerySQLAsTmp(sql, fields, isGroup); + 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) { - return createQuerySQLAsTmp(sql, fields, isGroup); + 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++) { @@ -233,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++) { @@ -251,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() @@ -263,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"); @@ -304,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); @@ -357,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++) { @@ -375,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() @@ -387,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"); @@ -427,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++) { @@ -467,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); @@ -488,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() @@ -500,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"); @@ -540,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 @@ -550,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++) { @@ -575,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() @@ -587,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"); @@ -622,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 @@ -693,67 +695,78 @@ 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 strList = new ArrayList<>(); + list.forEach(ele -> strList.add(ele.getWhereField() + " " + ele.getWhereTermAndValue())); + if (CollectionUtils.isNotEmpty(list)) { + res.add("(" + String.join(" " + getLogic(request.getLogic()) + " ", strList) + ")"); } - list.add(SQLObj.builder() - .whereField(whereName) - .whereTermAndValue(whereTerm + whereValue) - .build()); } - return list; + return CollectionUtils.isNotEmpty(res) ? "(" + String.join(" AND ", res) + ")" : null; } - public List transExtFilterList(SQLObj tableObj, List requestList) { + public String transExtFilterList(SQLObj tableObj, List requestList) { if (CollectionUtils.isEmpty(requestList)) { return null; } @@ -815,7 +828,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 CollectionUtils.isNotEmpty(list) ? "(" + String.join(" AND ", strList) + ")" : null; } private String sqlFix(String sql) { @@ -910,7 +925,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 -> { @@ -939,7 +954,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) { 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 dbed986959..8a8293e6a0 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) { + 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,42 +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); + 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) { - return createQuerySQL("(" + sqlFix(sql) + ")", fields, isGroup, null); + 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) { - return createQuerySQL(table, fields, isGroup, null) + " 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) { - return createQuerySQL(table, fields, isGroup, null) + " 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) { - return createQuerySQLAsTmp(sql, fields, isGroup) + " 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) { - return createQuerySQLAsTmp(sql, fields, isGroup) + " 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++) { @@ -194,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++) { @@ -212,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() @@ -224,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"); @@ -264,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++) { @@ -299,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 @@ -335,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); @@ -384,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++) { @@ -402,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() @@ -414,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"); @@ -454,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++) { @@ -494,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); @@ -515,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() @@ -527,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"); @@ -567,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 @@ -577,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++) { @@ -602,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() @@ -614,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"); @@ -649,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 @@ -724,67 +722,78 @@ 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 strList = new ArrayList<>(); + list.forEach(ele -> strList.add(ele.getWhereField() + " " + ele.getWhereTermAndValue())); + if (CollectionUtils.isNotEmpty(list)) { + res.add("(" + String.join(" " + getLogic(request.getLogic()) + " ", strList) + ")"); } - list.add(SQLObj.builder() - .whereField(whereName) - .whereTermAndValue(whereTerm + whereValue) - .build()); } - return list; + return CollectionUtils.isNotEmpty(res) ? "(" + String.join(" AND ", res) + ")" : null; } - public List transExtFilterList(SQLObj tableObj, List requestList) { + public String transExtFilterList(SQLObj tableObj, List requestList) { if (CollectionUtils.isEmpty(requestList)) { return null; } @@ -846,7 +855,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 CollectionUtils.isNotEmpty(list) ? "(" + String.join(" AND ", strList) + ")" : null; } private String sqlFix(String sql) { @@ -979,7 +990,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 -> { @@ -1008,7 +1019,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) { 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 f03a466497..ae50621c29 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) { + 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,42 +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); + 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) { - return createQuerySQL("(" + sqlFix(sql) + ")", fields, isGroup, null); + 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) { - return createQuerySQL(table, fields, isGroup, null) + " 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) { - return createQuerySQL(table, fields, isGroup, null) + " 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) { - return createQuerySQLAsTmp(sql, fields, isGroup) + " 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) { - return createQuerySQLAsTmp(sql, fields, isGroup) + " 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++) { @@ -177,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++) { @@ -195,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() @@ -207,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"); @@ -247,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++) { @@ -281,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 @@ -317,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); @@ -365,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++) { @@ -383,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() @@ -395,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"); @@ -435,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++) { @@ -474,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); @@ -495,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() @@ -507,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"); @@ -547,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 @@ -557,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++) { @@ -582,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() @@ -594,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"); @@ -629,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 @@ -704,54 +702,64 @@ 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()); + + List strList = new ArrayList<>(); + list.forEach(ele -> strList.add(ele.getWhereField() + " " + ele.getWhereTermAndValue())); + if (CollectionUtils.isNotEmpty(list)) { + res.add("(" + String.join(" " + getLogic(request.getLogic()) + " ", strList) + ")"); } - 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()); } - return list; + return CollectionUtils.isNotEmpty(res) ? "(" + String.join(" AND ", res) + ")" : null; } - public List transExtFilterList(SQLObj tableObj, List requestList) { + public String transExtFilterList(SQLObj tableObj, List requestList) { if (CollectionUtils.isEmpty(requestList)) { return null; } @@ -799,7 +807,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 CollectionUtils.isNotEmpty(list) ? "(" + String.join(" AND ", strList) + ")" : null; } private String sqlFix(String sql) { @@ -869,7 +879,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 -> { @@ -898,7 +908,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) { 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 6db5c79d8d..e893451d5f 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) { + 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)) @@ -137,42 +139,47 @@ public class MysqlQueryProvider 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); + + 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) { - return createQuerySQL("(" + sqlFix(sql) + ")", fields, isGroup, null); + 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) { - return createQuerySQL(table, fields, isGroup, null) + " 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) { - return createQuerySQL(table, fields, isGroup, null) + " 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) { - return createQuerySQLAsTmp(sql, fields, isGroup) + " 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) { - return createQuerySQLAsTmp(sql, fields, isGroup) + " 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++) { @@ -200,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++) { @@ -218,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() @@ -230,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"); @@ -270,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++) { @@ -304,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 @@ -340,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); @@ -388,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++) { @@ -406,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() @@ -418,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"); @@ -458,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++) { @@ -497,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); @@ -518,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() @@ -530,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"); @@ -570,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 @@ -580,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++) { @@ -605,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() @@ -617,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"); @@ -652,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 @@ -727,67 +727,76 @@ 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 strList = new ArrayList<>(); + list.forEach(ele -> strList.add(ele.getWhereField() + " " + ele.getWhereTermAndValue())); + if (CollectionUtils.isNotEmpty(list)) { + res.add("(" + String.join(" " + getLogic(request.getLogic()) + " ", strList) + ")"); } - list.add(SQLObj.builder() - .whereField(whereName) - .whereTermAndValue(whereTerm + whereValue) - .build()); } - return list; + return CollectionUtils.isNotEmpty(res) ? "(" + String.join(" AND ", res) + ")" : null; } - public List transExtFilterList(SQLObj tableObj, List requestList) { + public String transExtFilterList(SQLObj tableObj, List requestList) { if (CollectionUtils.isEmpty(requestList)) { return null; } @@ -849,7 +858,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 CollectionUtils.isNotEmpty(list) ? "(" + String.join(" AND ", strList) + ")" : null; } private String sqlFix(String sql) { @@ -982,7 +993,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 -> { @@ -1011,7 +1022,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) { 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 1979ed9058..6df28b1841 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) { + 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,6 +109,10 @@ 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); + 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(); } @@ -182,45 +188,44 @@ public class OracleQueryProvider extends QueryProvider { } @Override - public String createQuerySQLAsTmp(String sql, List fields, boolean isGroup) { - return createQuerySQL("(" + sqlFix(sql) + ")", fields, isGroup, null); + 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) { + 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), 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) { + 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), 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) { + 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) { + 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++) { @@ -248,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++) { @@ -266,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() @@ -278,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"); @@ -318,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++) { @@ -353,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 @@ -389,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); @@ -437,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++) { @@ -455,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() @@ -467,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"); @@ -507,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++) { @@ -547,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); @@ -568,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() @@ -580,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"); @@ -620,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 @@ -630,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++) { @@ -655,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() @@ -667,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"); @@ -701,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 @@ -780,73 +778,83 @@ 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 strList = new ArrayList<>(); + list.forEach(ele -> strList.add(ele.getWhereField() + " " + ele.getWhereTermAndValue())); + if (CollectionUtils.isNotEmpty(list)) { + res.add("(" + String.join(" " + getLogic(request.getLogic()) + " ", strList) + ")"); } - list.add(SQLObj.builder() - .whereField(whereName) - .whereTermAndValue(whereTerm + whereValue) - .build()); } - return list; + return CollectionUtils.isNotEmpty(res) ? "(" + String.join(" AND ", res) + ")" : null; } - public List transExtFilterList(SQLObj tableObj, List requestList) { + public String transExtFilterList(SQLObj tableObj, List requestList) { if (CollectionUtils.isEmpty(requestList)) { return null; } @@ -909,7 +917,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 CollectionUtils.isNotEmpty(list) ? "(" + String.join(" AND ", strList) + ")" : null; } private String sqlFix(String sql) { @@ -1056,7 +1066,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 -> { @@ -1085,7 +1095,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) { 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 a82cbef61b..67d19614e0 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) { + 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,43 +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); + 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) { - return createQuerySQL("(" + sqlFix(sql) + ")", fields, isGroup, null); + 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) { - return createQuerySQL(table, fields, isGroup, ds) + " 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) { - return createQuerySQLAsTmp(sql, fields, isGroup) + " 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) { - return createQuerySQL(table, fields, isGroup, ds) + " 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) { - return createQuerySQLAsTmp(sql, fields, isGroup) + " 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++) { @@ -222,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++) { @@ -240,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() @@ -252,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"); @@ -292,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++) { @@ -327,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 @@ -363,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); @@ -412,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++) { @@ -430,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() @@ -442,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"); @@ -482,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++) { @@ -522,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); @@ -543,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() @@ -555,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"); @@ -595,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 @@ -605,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++) { @@ -630,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() @@ -642,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"); @@ -677,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 @@ -756,67 +754,77 @@ 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 strList = new ArrayList<>(); + list.forEach(ele -> strList.add(ele.getWhereField() + " " + ele.getWhereTermAndValue())); + if (CollectionUtils.isNotEmpty(list)) { + res.add("(" + String.join(" " + getLogic(request.getLogic()) + " ", strList) + ")"); } - list.add(SQLObj.builder() - .whereField(whereName) - .whereTermAndValue(whereTerm + whereValue) - .build()); } - return list; + return CollectionUtils.isNotEmpty(res) ? "(" + String.join(" AND ", res) + ")" : null; } - public List transExtFilterList(SQLObj tableObj, List requestList) { + public String transExtFilterList(SQLObj tableObj, List requestList) { if (CollectionUtils.isEmpty(requestList)) { return null; } @@ -877,7 +885,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 CollectionUtils.isNotEmpty(list) ? "(" + String.join(" AND ", strList) + ")" : null; } private String sqlFix(String sql) { @@ -972,7 +982,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 -> { @@ -1001,7 +1011,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) { 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 078f443178..7fdd3af2c7 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) { + 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,43 +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); + 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) { - return createQuerySQL("(" + sqlFix(sql) + ")", fields, isGroup, null); + 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) { - return createQuerySQL(table, fields, isGroup, ds) + " 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) { - return createQuerySQLAsTmp(sql, fields, isGroup) + " 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) { - return createQuerySQL(table, fields, isGroup, null) + " 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) { - return createQuerySQLAsTmp(sql, fields, isGroup) + " 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++) { @@ -231,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++) { @@ -249,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() @@ -261,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"); @@ -302,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); @@ -355,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++) { @@ -373,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() @@ -385,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"); @@ -425,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++) { @@ -465,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); @@ -486,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() @@ -498,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"); @@ -538,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 @@ -548,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++) { @@ -573,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() @@ -585,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"); @@ -620,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 @@ -656,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); } @@ -695,63 +695,73 @@ 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 strList = new ArrayList<>(); + list.forEach(ele -> strList.add(ele.getWhereField() + " " + ele.getWhereTermAndValue())); + if (CollectionUtils.isNotEmpty(list)) { + res.add("(" + String.join(" " + getLogic(request.getLogic()) + " ", strList) + ")"); } - list.add(SQLObj.builder() - .whereField(whereName) - .whereTermAndValue(whereTerm + whereValue) - .build()); } - return list; + return CollectionUtils.isNotEmpty(res) ? "(" + String.join(" AND ", res) + ")" : null; } - public List transExtFilterList(SQLObj tableObj, List requestList) { + public String transExtFilterList(SQLObj tableObj, List requestList) { if (CollectionUtils.isEmpty(requestList)) { return null; } @@ -812,7 +822,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 CollectionUtils.isNotEmpty(list) ? "(" + String.join(" AND ", strList) + ")" : null; } private String sqlFix(String sql) { @@ -901,7 +913,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 -> { @@ -926,7 +938,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) { 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 d68029c77b..da2e5cbed6 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) { + 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,47 +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); + 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) { - return createQuerySQL("(" + sqlFix(sql) + ")", fields, isGroup, null); + 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) { + 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)); + 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) { + 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) { + 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)); + 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) { + 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++) { @@ -216,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++) { @@ -234,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() @@ -246,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"); @@ -290,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++) { @@ -325,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 @@ -365,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); @@ -414,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++) { @@ -432,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() @@ -463,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"); @@ -507,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++) { @@ -547,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); @@ -568,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() @@ -580,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"); @@ -624,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 @@ -634,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++) { @@ -659,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() @@ -671,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"); @@ -710,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 @@ -790,67 +788,77 @@ 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 strList = new ArrayList<>(); + list.forEach(ele -> strList.add(ele.getWhereField() + " " + ele.getWhereTermAndValue())); + if (CollectionUtils.isNotEmpty(list)) { + res.add("(" + String.join(" " + getLogic(request.getLogic()) + " ", strList) + ")"); } - list.add(SQLObj.builder() - .whereField(whereName) - .whereTermAndValue(whereTerm + whereValue) - .build()); } - return list; + return CollectionUtils.isNotEmpty(res) ? "(" + String.join(" AND ", res) + ")" : null; } - public List transExtFilterList(SQLObj tableObj, List requestList) { + public String transExtFilterList(SQLObj tableObj, List requestList) { if (CollectionUtils.isEmpty(requestList)) { return null; } @@ -912,7 +920,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 CollectionUtils.isNotEmpty(list) ? "(" + String.join(" AND ", strList) + ")" : null; } private String sqlFix(String sql) { @@ -1022,7 +1032,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 -> { @@ -1051,7 +1061,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) { 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..ca84509167 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,15 @@ public class ChartViewService { }.getType()); List drill = new Gson().fromJson(view.getDrillFields(), new TypeToken>() { }.getType()); - List customFilter = new ArrayList<>(); + // 获取对应数据集行权限 + DatasetTableField datasetTableFieldObj = DatasetTableField.builder().tableId(view.getTableId()).checked(Boolean.TRUE).build(); + List fields = dataSetTableFieldsService.list(datasetTableFieldObj); + DatasetTable datasetTable = dataSetTableService.get(view.getTableId()); + List permissionFields = dataSetTableService.getCustomFilters(fields, datasetTable); + fieldCustomFilter.addAll(permissionFields); + 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()) @@ -245,19 +245,29 @@ public class ChartViewService { // 过滤来自仪表板的条件 List extFilterList = new ArrayList<>(); - //组件过滤条件 if (ObjectUtils.isNotEmpty(requestList.getFilter())) { for (ChartExtFilterRequest request : requestList.getFilter()) { - DatasetTableField datasetTableField = dataSetTableFieldsService.get(request.getFieldId()); - request.setDatasetTableField(datasetTableField); - if (StringUtils.equalsIgnoreCase(datasetTableField.getTableId(), view.getTableId())) { - if (CollectionUtils.isNotEmpty(request.getViewIds())) { - if (request.getViewIds().contains(view.getId())) { - extFilterList.add(request); + // 解析多个fieldId,fieldId是一个逗号分隔的字符串 + String fieldId = request.getFieldId(); + if (StringUtils.isNotEmpty(fieldId)) { + String[] fieldIds = fieldId.split(","); + for (String fId : fieldIds) { + ChartExtFilterRequest filterRequest = new ChartExtFilterRequest(); + BeanUtils.copyBean(filterRequest, request); + filterRequest.setFieldId(fId); + + DatasetTableField datasetTableField = dataSetTableFieldsService.get(fId); + filterRequest.setDatasetTableField(datasetTableField); + if (StringUtils.equalsIgnoreCase(datasetTableField.getTableId(), view.getTableId())) { + if (CollectionUtils.isNotEmpty(filterRequest.getViewIds())) { + if (filterRequest.getViewIds().contains(view.getId())) { + extFilterList.add(filterRequest); + } + } else { + extFilterList.add(filterRequest); + } } - } else { - extFilterList.add(request); } } } @@ -341,42 +351,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 +394,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 +415,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 284343fd47..93bc0e9c62 100644 --- a/backend/src/main/java/io/dataease/service/dataset/DataSetTableService.java +++ b/backend/src/main/java/io/dataease/service/dataset/DataSetTableService.java @@ -1,7 +1,10 @@ package io.dataease.service.dataset; +import com.alibaba.fastjson.JSONObject; import com.google.gson.Gson; +import io.dataease.auth.api.dto.CurrentRoleDto; +import io.dataease.auth.api.dto.CurrentUserDto; import io.dataease.base.domain.*; import io.dataease.base.mapper.*; import io.dataease.base.mapper.ext.ExtDataSetGroupMapper; @@ -18,6 +21,8 @@ import io.dataease.controller.request.dataset.DataSetTableRequest; import io.dataease.controller.request.dataset.DataSetTaskRequest; import io.dataease.controller.request.datasource.DatasourceRequest; import io.dataease.controller.response.DataSetDetail; +import io.dataease.dto.chart.ChartCustomFilterItemDTO; +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; @@ -25,7 +30,10 @@ 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; @@ -60,6 +68,8 @@ import java.text.SimpleDateFormat; import java.util.*; import java.util.stream.Collectors; +; + /** * @Author gin * @Date 2021/2/23 2:54 下午 @@ -93,6 +103,7 @@ public class DataSetTableService { private ExtDataSetGroupMapper extDataSetGroupMapper; @Resource private DatasetTableFieldMapper datasetTableFieldMapper; + private static final String lastUpdateTime = "${__last_update_time__}"; private static final String currentUpdateTime = "${__current_update_time__}"; @@ -431,11 +442,55 @@ public class DataSetTableService { return map; } + private List rowPermissions(String datasetId) { + List datasetRowPermissions = new ArrayList<>(); + Map beansOfType = SpringContextUtil.getApplicationContext().getBeansOfType((RowPermissionService.class)); + if (beansOfType.keySet().size() == 0) { + return new ArrayList<>(); + } + RowPermissionService rowPermissionService = SpringContextUtil.getBean(RowPermissionService.class); + CurrentUserDto user = AuthUtils.getUser(); + if (user != null) { + datasetRowPermissions.addAll(rowPermissionService.listDatasetRowPermissions(datasetId, Collections.singletonList(user.getUserId()), "user")); + datasetRowPermissions.addAll(rowPermissionService.listDatasetRowPermissions(datasetId, user.getRoles().stream().map(CurrentRoleDto::getId).collect(Collectors.toList()), "role")); + datasetRowPermissions.addAll(rowPermissionService.listDatasetRowPermissions(datasetId, Collections.singletonList(user.getDeptId()), "dept")); + } + return datasetRowPermissions; + } + + private DatasetTableField getFieldById(List fields, String fieldId) { + DatasetTableField field = null; + for (DatasetTableField datasetTableField : fields) { + if (fieldId.equalsIgnoreCase(datasetTableField.getId())) { + field = datasetTableField; + } + } + return field; + } + + public List getCustomFilters(List fields, DatasetTable datasetTable) { + List customFilter = new ArrayList<>(); + rowPermissions(datasetTable.getId()).forEach(datasetRowPermissions -> { + List lists = JSONObject.parseArray(datasetRowPermissions.getFilter(), ChartCustomFilterItemDTO.class); + ChartFieldCustomFilterDTO dto = new ChartFieldCustomFilterDTO(); + DatasetTableField field = getFieldById(fields, datasetRowPermissions.getDatasetFieldId()); + lists.forEach(chartCustomFilterDTO -> { + chartCustomFilterDTO.setFieldId(field.getId()); + }); + if (field != null) { + dto.setFilter(lists); + dto.setField(field); + dto.setId(field.getId()); + dto.setLogic(datasetRowPermissions.getLogic()); + customFilter.add(dto); + } + }); + return customFilter; + } + public Map getPreviewData(DataSetTableRequest dataSetTableRequest, Integer page, Integer pageSize) throws Exception { Map map = new HashMap<>(); - DatasetTableField datasetTableField = DatasetTableField.builder().build(); - datasetTableField.setTableId(dataSetTableRequest.getId()); - datasetTableField.setChecked(Boolean.TRUE); + DatasetTableField datasetTableField = DatasetTableField.builder().tableId(dataSetTableRequest.getId()).checked(Boolean.TRUE).build(); List fields = dataSetTableFieldsService.list(datasetTableField); if (CollectionUtils.isEmpty(fields)) { map.put("fields", fields); @@ -443,10 +498,12 @@ public class DataSetTableService { map.put("page", new DataSetPreviewPage()); return map; } + DatasetTable datasetTable = datasetTableMapper.selectByPrimaryKey(dataSetTableRequest.getId()); + List customFilter = getCustomFilters(fields, datasetTable); String[] fieldArray = fields.stream().map(DatasetTableField::getDataeaseName).toArray(String[]::new); DataTableInfoDTO dataTableInfoDTO = new Gson().fromJson(dataSetTableRequest.getInfo(), DataTableInfoDTO.class); - DatasetTable datasetTable = datasetTableMapper.selectByPrimaryKey(dataSetTableRequest.getId()); + List data = new ArrayList<>(); DataSetPreviewPage dataSetPreviewPage = new DataSetPreviewPage(); @@ -468,7 +525,10 @@ public class DataSetTableService { datasourceRequest.setDatasource(ds); String table = dataTableInfoDTO.getTable(); QueryProvider qp = ProviderFactory.getQueryProvider(ds.getType()); - datasourceRequest.setQuery(qp.createQueryTableWithPage(table, fields, page, pageSize, realSize, false, ds)); + + + datasourceRequest.setQuery(qp.createQueryTableWithPage(table, fields, page, pageSize, realSize, false, ds, customFilter)); + map.put("sql", datasourceRequest.getQuery()); datasourceRequest.setPage(page); datasourceRequest.setFetchSize(Integer.parseInt(dataSetTableRequest.getRow())); @@ -484,7 +544,7 @@ public class DataSetTableService { } try { - datasourceRequest.setQuery(qp.createQueryTableWithLimit(table, fields, Integer.valueOf(dataSetTableRequest.getRow()), false, ds)); + datasourceRequest.setQuery(qp.createQueryTableWithLimit(table, fields, Integer.valueOf(dataSetTableRequest.getRow()), false, ds, customFilter)); datasourceRequest.setPageable(false); dataSetPreviewPage.setTotal(datasourceProvider.getData(datasourceRequest).size()); } catch (Exception e) { @@ -502,7 +562,7 @@ public class DataSetTableService { datasourceRequest.setDatasource(ds); String table = DorisTableUtils.dorisName(dataSetTableRequest.getId()); QueryProvider qp = ProviderFactory.getQueryProvider(ds.getType()); - datasourceRequest.setQuery(qp.createQueryTableWithPage(table, fields, page, pageSize, realSize, false, ds)); + datasourceRequest.setQuery(qp.createQueryTableWithPage(table, fields, page, pageSize, realSize, false, ds, customFilter)); map.put("sql", datasourceRequest.getQuery()); try { data.addAll(jdbcProvider.getData(datasourceRequest)); @@ -511,7 +571,7 @@ public class DataSetTableService { DEException.throwException(Translator.get("i18n_ds_error")); } try { - datasourceRequest.setQuery(qp.createQueryTableWithLimit(table, fields, Integer.valueOf(dataSetTableRequest.getRow()), false, ds)); + datasourceRequest.setQuery(qp.createQueryTableWithLimit(table, fields, Integer.valueOf(dataSetTableRequest.getRow()), false, ds, customFilter)); dataSetPreviewPage.setTotal(jdbcProvider.getData(datasourceRequest).size()); } catch (Exception e) { logger.error(e.getMessage()); @@ -531,7 +591,7 @@ public class DataSetTableService { String sql = dataTableInfoDTO.getSql(); QueryProvider qp = ProviderFactory.getQueryProvider(ds.getType()); - datasourceRequest.setQuery(qp.createQuerySQLWithPage(sql, fields, page, pageSize, realSize, false)); + datasourceRequest.setQuery(qp.createQuerySQLWithPage(sql, fields, page, pageSize, realSize, false, customFilter)); map.put("sql", datasourceRequest.getQuery()); datasourceRequest.setPage(page); datasourceRequest.setFetchSize(Integer.parseInt(dataSetTableRequest.getRow())); @@ -547,7 +607,7 @@ public class DataSetTableService { } try { datasourceRequest.setPageable(false); - datasourceRequest.setQuery(qp.createQuerySqlWithLimit(sql, fields, Integer.valueOf(dataSetTableRequest.getRow()), false)); + datasourceRequest.setQuery(qp.createQuerySqlWithLimit(sql, fields, Integer.valueOf(dataSetTableRequest.getRow()), false, customFilter)); dataSetPreviewPage.setTotal(datasourceProvider.getData(datasourceRequest).size()); } catch (Exception e) { logger.error(e.getMessage()); @@ -564,7 +624,7 @@ public class DataSetTableService { datasourceRequest.setDatasource(ds); String table = DorisTableUtils.dorisName(dataSetTableRequest.getId()); QueryProvider qp = ProviderFactory.getQueryProvider(ds.getType()); - datasourceRequest.setQuery(qp.createQueryTableWithPage(table, fields, page, pageSize, realSize, false, ds)); + datasourceRequest.setQuery(qp.createQueryTableWithPage(table, fields, page, pageSize, realSize, false, ds, customFilter)); map.put("sql", datasourceRequest.getQuery()); try { data.addAll(jdbcProvider.getData(datasourceRequest)); @@ -573,7 +633,7 @@ public class DataSetTableService { DEException.throwException(Translator.get("i18n_ds_error")); } try { - datasourceRequest.setQuery(qp.createQueryTableWithLimit(table, fields, Integer.valueOf(dataSetTableRequest.getRow()), false, ds)); + datasourceRequest.setQuery(qp.createQueryTableWithLimit(table, fields, Integer.valueOf(dataSetTableRequest.getRow()), false, ds, customFilter)); dataSetPreviewPage.setTotal(jdbcProvider.getData(datasourceRequest).size()); } catch (Exception e) { logger.error(e.getMessage()); @@ -591,7 +651,7 @@ public class DataSetTableService { datasourceRequest.setDatasource(ds); String table = DorisTableUtils.dorisName(dataSetTableRequest.getId()); QueryProvider qp = ProviderFactory.getQueryProvider(ds.getType()); - datasourceRequest.setQuery(qp.createQueryTableWithPage(table, fields, page, pageSize, realSize, false, ds)); + datasourceRequest.setQuery(qp.createQueryTableWithPage(table, fields, page, pageSize, realSize, false, ds, customFilter)); map.put("sql", datasourceRequest.getQuery()); try { data.addAll(jdbcProvider.getData(datasourceRequest)); @@ -600,7 +660,7 @@ public class DataSetTableService { DEException.throwException(Translator.get("i18n_ds_error")); } try { - datasourceRequest.setQuery(qp.createQueryTableWithLimit(table, fields, Integer.valueOf(dataSetTableRequest.getRow()), false, ds)); + datasourceRequest.setQuery(qp.createQueryTableWithLimit(table, fields, Integer.valueOf(dataSetTableRequest.getRow()), false, ds, customFilter)); dataSetPreviewPage.setTotal(jdbcProvider.getData(datasourceRequest).size()); } catch (Exception e) { logger.error(e.getMessage()); @@ -627,7 +687,7 @@ public class DataSetTableService { DEException.throwException(Translator.get("i18n_ds_error")); } QueryProvider qp = ProviderFactory.getQueryProvider(ds.getType()); - datasourceRequest.setQuery(qp.createQuerySQLWithPage(sql, fields, page, pageSize, realSize, false)); + datasourceRequest.setQuery(qp.createQuerySQLWithPage(sql, fields, page, pageSize, realSize, false, customFilter)); map.put("sql", datasourceRequest.getQuery()); datasourceRequest.setPage(page); datasourceRequest.setFetchSize(Integer.parseInt(dataSetTableRequest.getRow())); @@ -643,7 +703,7 @@ public class DataSetTableService { } try { datasourceRequest.setPageable(false); - datasourceRequest.setQuery(qp.createQuerySqlWithLimit(sql, fields, Integer.valueOf(dataSetTableRequest.getRow()), false)); + datasourceRequest.setQuery(qp.createQuerySqlWithLimit(sql, fields, Integer.valueOf(dataSetTableRequest.getRow()), false, customFilter)); dataSetPreviewPage.setTotal(datasourceProvider.getData(datasourceRequest).size()); } catch (Exception e) { logger.error(e.getMessage()); @@ -656,7 +716,7 @@ public class DataSetTableService { datasourceRequest.setDatasource(ds); String table = DorisTableUtils.dorisName(dataSetTableRequest.getId()); QueryProvider qp = ProviderFactory.getQueryProvider(ds.getType()); - datasourceRequest.setQuery(qp.createQueryTableWithPage(table, fields, page, pageSize, realSize, false, ds)); + datasourceRequest.setQuery(qp.createQueryTableWithPage(table, fields, page, pageSize, realSize, false, ds, customFilter)); map.put("sql", datasourceRequest.getQuery()); try { data.addAll(jdbcProvider.getData(datasourceRequest)); @@ -666,7 +726,7 @@ public class DataSetTableService { } try { - datasourceRequest.setQuery(qp.createQueryTableWithLimit(table, fields, Integer.valueOf(dataSetTableRequest.getRow()), false, ds)); + datasourceRequest.setQuery(qp.createQueryTableWithLimit(table, fields, Integer.valueOf(dataSetTableRequest.getRow()), false, ds, customFilter)); dataSetPreviewPage.setTotal(jdbcProvider.getData(datasourceRequest).size()); } catch (Exception e) { logger.error(e.getMessage()); @@ -693,7 +753,7 @@ public class DataSetTableService { DEException.throwException(Translator.get("i18n_ds_error")); } QueryProvider qp = ProviderFactory.getQueryProvider(ds.getType()); - datasourceRequest.setQuery(qp.createQuerySQLWithPage(sql, fields, page, pageSize, realSize, false)); + datasourceRequest.setQuery(qp.createQuerySQLWithPage(sql, fields, page, pageSize, realSize, false, customFilter)); map.put("sql", datasourceRequest.getQuery()); datasourceRequest.setPage(page); datasourceRequest.setFetchSize(Integer.parseInt(dataSetTableRequest.getRow())); @@ -709,7 +769,7 @@ public class DataSetTableService { } try { datasourceRequest.setPageable(false); - datasourceRequest.setQuery(qp.createQuerySqlWithLimit(sql, fields, Integer.valueOf(dataSetTableRequest.getRow()), false)); + datasourceRequest.setQuery(qp.createQuerySqlWithLimit(sql, fields, Integer.valueOf(dataSetTableRequest.getRow()), false, customFilter)); dataSetPreviewPage.setTotal(datasourceProvider.getData(datasourceRequest).size()); } catch (Exception e) { logger.error(e.getMessage()); @@ -722,7 +782,7 @@ public class DataSetTableService { datasourceRequest.setDatasource(ds); String table = DorisTableUtils.dorisName(dataSetTableRequest.getId()); QueryProvider qp = ProviderFactory.getQueryProvider(ds.getType()); - datasourceRequest.setQuery(qp.createQueryTableWithPage(table, fields, page, pageSize, realSize, false, ds)); + datasourceRequest.setQuery(qp.createQueryTableWithPage(table, fields, page, pageSize, realSize, false, ds, customFilter)); map.put("sql", datasourceRequest.getQuery()); try { data.addAll(jdbcProvider.getData(datasourceRequest)); @@ -732,7 +792,7 @@ public class DataSetTableService { } try { - datasourceRequest.setQuery(qp.createQueryTableWithLimit(table, fields, Integer.valueOf(dataSetTableRequest.getRow()), false, ds)); + datasourceRequest.setQuery(qp.createQueryTableWithLimit(table, fields, Integer.valueOf(dataSetTableRequest.getRow()), false, ds, customFilter)); dataSetPreviewPage.setTotal(jdbcProvider.getData(datasourceRequest).size()); } catch (Exception e) { logger.error(e.getMessage()); @@ -1636,6 +1696,7 @@ public class DataSetTableService { dataSetDetail.setTable(table); if (ObjectUtils.isNotEmpty(table)) { Datasource datasource = datasourceMapper.selectByPrimaryKey(table.getDataSourceId()); + Optional.ofNullable(datasource).orElse(new Datasource()).setConfiguration(null); dataSetDetail.setDatasource(datasource); } return dataSetDetail; diff --git a/backend/src/main/java/io/dataease/service/dataset/ExtractDataService.java b/backend/src/main/java/io/dataease/service/dataset/ExtractDataService.java index 4cc425b8bf..f4306972ee 100644 --- a/backend/src/main/java/io/dataease/service/dataset/ExtractDataService.java +++ b/backend/src/main/java/io/dataease/service/dataset/ExtractDataService.java @@ -992,7 +992,7 @@ public class ExtractDataService { String tmp_code = code.replace("handleWraps", handleWraps).replace("handleBinaryType", handleBinaryTypeCode.toString()); String Column_Fields; - if (datasourceType.equals(DatasourceTypes.oracle)) { + if (datasourceType.equals(DatasourceTypes.oracle) || datasourceType.equals(DatasourceTypes.db2)) { Column_Fields = datasetTableFields.stream().map(DatasetTableField::getOriginName).collect(Collectors.joining(",")); } else { Column_Fields = datasetTableFields.stream().map(DatasetTableField::getDataeaseName).collect(Collectors.joining(",")); 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 21493e4175..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 @@ -5,6 +5,8 @@ import io.dataease.base.domain.DatasetTable; 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; @@ -41,8 +43,6 @@ public class DirectFieldService implements DataSetFieldService { @Override public List fieldValues(String fieldId) { - - List list = dataSetTableFieldsService.getListByIds(new ArrayList() {{ add(fieldId); }}); @@ -51,9 +51,14 @@ public class DirectFieldService implements DataSetFieldService { DatasetTableField field = list.get(0); String tableId = field.getTableId(); if (StringUtils.isEmpty(tableId)) return null; + DatasetTable datasetTable = dataSetTableService.get(tableId); if (ObjectUtils.isEmpty(datasetTable) || StringUtils.isEmpty(datasetTable.getName())) return null; - String tableName = datasetTable.getName(); + String tableName; + + DatasetTableField datasetTableField = DatasetTableField.builder().tableId(tableId).checked(Boolean.TRUE).build(); + List fields = dataSetTableFieldsService.list(datasetTableField); + List customFilter = dataSetTableService.getCustomFilters(fields, datasetTable); DatasourceRequest datasourceRequest = new DatasourceRequest(); DatasourceProvider datasourceProvider = null; @@ -67,18 +72,18 @@ public class DirectFieldService implements DataSetFieldService { QueryProvider qp = ProviderFactory.getQueryProvider(ds.getType()); if (StringUtils.equalsIgnoreCase(datasetTable.getType(), "db")) { datasourceRequest.setTable(dataTableInfoDTO.getTable()); - datasourceRequest.setQuery(qp.createQuerySQL(dataTableInfoDTO.getTable(), Collections.singletonList(field), true, ds)); + datasourceRequest.setQuery(qp.createQuerySQL(dataTableInfoDTO.getTable(), Collections.singletonList(field), true, ds, customFilter)); } else if (StringUtils.equalsIgnoreCase(datasetTable.getType(), "sql")) { - datasourceRequest.setQuery(qp.createQuerySQLAsTmp(dataTableInfoDTO.getSql(), Collections.singletonList(field), true)); + datasourceRequest.setQuery(qp.createQuerySQLAsTmp(dataTableInfoDTO.getSql(), Collections.singletonList(field), true, customFilter)); } else if (StringUtils.equalsIgnoreCase(datasetTable.getType(), "custom")) { DataTableInfoDTO dt = new Gson().fromJson(datasetTable.getInfo(), DataTableInfoDTO.class); List listUnion = dataSetTableUnionService.listByTableId(dt.getList().get(0).getTableId()); String sql = dataSetTableService.getCustomSQLDatasource(dt, listUnion, ds); - datasourceRequest.setQuery(qp.createQuerySQLAsTmp(sql, Collections.singletonList(field), true)); + datasourceRequest.setQuery(qp.createQuerySQLAsTmp(sql, Collections.singletonList(field), true, customFilter)); } else if (StringUtils.equalsIgnoreCase(datasetTable.getType(), "union")) { DataTableInfoDTO dt = new Gson().fromJson(datasetTable.getInfo(), DataTableInfoDTO.class); String sql = (String) dataSetTableService.getUnionSQLDatasource(dt, ds).get("sql"); - datasourceRequest.setQuery(qp.createQuerySQLAsTmp(sql, Collections.singletonList(field), true)); + datasourceRequest.setQuery(qp.createQuerySQLAsTmp(sql, Collections.singletonList(field), true, customFilter)); } } else if (datasetTable.getMode() == 1) {// 抽取 // 连接doris,构建doris数据源查询 @@ -89,7 +94,7 @@ public class DirectFieldService implements DataSetFieldService { tableName = "ds_" + datasetTable.getId().replaceAll("-", "_"); datasourceRequest.setTable(tableName); QueryProvider qp = ProviderFactory.getQueryProvider(ds.getType()); - datasourceRequest.setQuery(qp.createQuerySQL(tableName, Collections.singletonList(field), true, null)); + datasourceRequest.setQuery(qp.createQuerySQL(tableName, Collections.singletonList(field), true, null, customFilter)); } try { diff --git a/backend/src/main/resources/db/migration/V29__de1.6.sql b/backend/src/main/resources/db/migration/V29__de1.6.sql new file mode 100644 index 0000000000..79c52a4bcf --- /dev/null +++ b/backend/src/main/resources/db/migration/V29__de1.6.sql @@ -0,0 +1,11 @@ +CREATE TABLE `dataset_row_permissions` ( + `id` varchar(64) NOT NULL COMMENT 'File ID', + `auth_target_type` varchar(255) DEFAULT NULL COMMENT '权限类型:组织/角色/用户', + `auth_target_id` bigint(20) DEFAULT NULL COMMENT '权限对象ID', + `dataset_id` varchar(64) DEFAULT NULL COMMENT '数据集ID', + `dataset_field_id` varchar(64) DEFAULT NULL COMMENT '数据集字段ID', + `logic` varchar(64) DEFAULT NULL COMMENT '与/或', + `filter` longtext DEFAULT NULL COMMENT '数值', + `update_time` bigint(13) NULL DEFAULT NULL, + PRIMARY KEY (`id`) +)ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE utf8mb4_general_ci; \ No newline at end of file diff --git a/backend/src/main/resources/generatorConfig.xml b/backend/src/main/resources/generatorConfig.xml index 71a27e44df..49b7d1fe39 100644 --- a/backend/src/main/resources/generatorConfig.xml +++ b/backend/src/main/resources/generatorConfig.xml @@ -5,7 +5,6 @@ - @@ -37,8 +36,6 @@ - - @@ -63,9 +60,9 @@ - - - +
+ +
diff --git a/backend/src/main/resources/i18n/messages_zh_CN.properties b/backend/src/main/resources/i18n/messages_zh_CN.properties index 2e749e1a5a..bb509a109c 100644 --- a/backend/src/main/resources/i18n/messages_zh_CN.properties +++ b/backend/src/main/resources/i18n/messages_zh_CN.properties @@ -290,3 +290,4 @@ i18n_dataset_field_delete=该自定义数据集有关联字段被删除,请重 i18n_es_limit=Elasticsearch 版本不能小于6.3 i18n_ds_error=预览数据错误:执行SQL失败。可能因相关字段、表、数据集等元素发生变更,请检查 i18n_union_ds_no_checked=当前关联数据集,无选中字段,请重新编辑 +i18n_auth_row_permission=行权限 \ No newline at end of file diff --git a/backend/src/main/resources/sql/sqlTemplate.stg b/backend/src/main/resources/sql/sqlTemplate.stg index 066ab4f350..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 @@ -31,9 +31,12 @@ ORDER BY >> -previewSql(groups, aggregators, filters, orders, table, isGroup) +previewSql(limitFiled, groups, aggregators, filters, orders, table, isGroup) ::=<< SELECT + + + * @@ -48,7 +51,7 @@ FROM WHERE - }; separator="\nAND "> + }; separator="\nAND "> GROUP BY diff --git a/frontend/src/api/dataset/dataset.js b/frontend/src/api/dataset/dataset.js index 2619d3068b..9cc9cc958f 100644 --- a/frontend/src/api/dataset/dataset.js +++ b/frontend/src/api/dataset/dataset.js @@ -173,4 +173,13 @@ export function datasetTaskList(page, size, data, loading) { }) } +export function datasetRowPermissionsList(datasetId, page, size, data, loading) { + return request({ + url: '/dataset/rowpermissions/pageList/' + datasetId + '/' + page + '/' + size, + method: 'post', + data, + loading: loading + }) +} + export default { loadTable, getScene, addGroup, delGroup, addTable, delTable, groupTree } diff --git a/frontend/src/components/DeDrag/index.vue b/frontend/src/components/DeDrag/index.vue index e06ea354ea..bc2065eeaa 100644 --- a/frontend/src/components/DeDrag/index.vue +++ b/frontend/src/components/DeDrag/index.vue @@ -9,6 +9,7 @@ [classNameResizable]: resizable, [classNameRotating]: rotating, [classNameRotatable]: rotatable, + [classNameActive]: enabled , ['linkageSetting']:linkageActive, ['positionChange']:!(dragging || resizing||rotating) }, @@ -22,7 +23,7 @@
+
+ +
+
+ + + + + diff --git a/frontend/src/components/canvas/components/Editor/ComponentWrapper.vue b/frontend/src/components/canvas/components/Editor/ComponentWrapper.vue index 96bae648b8..eb3c142c43 100644 --- a/frontend/src/components/canvas/components/Editor/ComponentWrapper.vue +++ b/frontend/src/components/canvas/components/Editor/ComponentWrapper.vue @@ -5,7 +5,8 @@ @click="handleClick" @mousedown="elementMouseDown" > - + +
-
+
-
+
@@ -26,7 +26,6 @@
-
@@ -54,6 +53,10 @@ export default { type: String, required: false, default: 'preview' + }, + previewVisible: { + type: Boolean, + default: false } }, data() { @@ -70,6 +73,14 @@ export default { mounted() { }, computed: { + // 联动区域按钮显示 + linkageAreaShow() { + return this.linkageSettingStatus && this.element !== this.curLinkageView && this.element.type === 'view' + }, + // 编辑或预览区域显示 + normalAreaShow() { + return !this.linkageSettingStatus + }, existLinkage() { let linkageFiltersCount = 0 this.componentData.forEach(item => { @@ -102,6 +113,9 @@ export default { beforeDestroy() { }, methods: { + closePreview() { + this.$emit('closePreview') + }, createTimer() { if (!this.timer) { this.timer = setInterval(() => { diff --git a/frontend/src/components/canvas/components/Editor/EditBarView.vue b/frontend/src/components/canvas/components/Editor/EditBarView.vue new file mode 100644 index 0000000000..9f03b0daba --- /dev/null +++ b/frontend/src/components/canvas/components/Editor/EditBarView.vue @@ -0,0 +1,92 @@ + + + + + diff --git a/frontend/src/components/canvas/components/Editor/LinkageField.vue b/frontend/src/components/canvas/components/Editor/LinkageField.vue index 0856287423..675becbf5b 100644 --- a/frontend/src/components/canvas/components/Editor/LinkageField.vue +++ b/frontend/src/components/canvas/components/Editor/LinkageField.vue @@ -51,7 +51,7 @@ - {{ itemLinkage.targetField }}-{{ item.name }} + {{ item.name }}
diff --git a/frontend/src/components/canvas/components/Editor/Preview.vue b/frontend/src/components/canvas/components/Editor/Preview.vue index 19a7ea3f1e..f3b09c3441 100644 --- a/frontend/src/components/canvas/components/Editor/Preview.vue +++ b/frontend/src/components/canvas/components/Editor/Preview.vue @@ -19,6 +19,7 @@ :config="item" :search-count="searchCount" :in-screen="inScreen" + :terminal="terminal" /> + + + + +
@@ -52,9 +64,10 @@ import eventBus from '@/components/canvas/utils/eventBus' import elementResizeDetectorMaker from 'element-resize-detector' import UserViewDialog from '@/components/canvas/custom-component/UserViewDialog' import CanvasOptBar from '@/components/canvas/components/Editor/CanvasOptBar' +import UserViewMobileDialog from '@/components/canvas/custom-component/UserViewMobileDialog' export default { - components: { ComponentWrapper, UserViewDialog, CanvasOptBar }, + components: { UserViewMobileDialog, ComponentWrapper, UserViewDialog, CanvasOptBar }, model: { prop: 'show', event: 'change' @@ -102,6 +115,7 @@ export default { mainHeight: '100%', searchCount: 0, chartDetailsVisible: false, + mobileChartDetailsVisible: false, showChartInfo: {}, showChartTableInfo: {}, // 布局展示 1.pc pc端布局 2.mobile 移动端布局 @@ -248,7 +262,11 @@ export default { openChartDetailsDialog(chartInfo) { this.showChartInfo = chartInfo.chart this.showChartTableInfo = chartInfo.tableChart - this.chartDetailsVisible = true + if (this.terminal === 'pc') { + this.chartDetailsVisible = true + } else { + this.mobileChartDetailsVisible + } }, exportExcel() { this.$refs['userViewDialog'].exportExcel() @@ -308,9 +326,16 @@ export default { padding: 10px 20px 20px; } + .mobile-dialog-css > > > .el-dialog__body { + padding: 0px; + } ::-webkit-scrollbar { width: 0px!important; height: 0px!important; } + ::v-deep .el-tabs__nav{ + z-index: 0; + } + diff --git a/frontend/src/components/canvas/components/Editor/SettingMenu.vue b/frontend/src/components/canvas/components/Editor/SettingMenu.vue index 1668d1cf6b..70aea3a8b4 100644 --- a/frontend/src/components/canvas/components/Editor/SettingMenu.vue +++ b/frontend/src/components/canvas/components/Editor/SettingMenu.vue @@ -13,7 +13,7 @@ {{ $t('panel.downComponent') }} {{ $t('panel.linkage_setting') }} {{ $t('panel.add_tab') }} - 跳转设置 + 跳转设置 diff --git a/frontend/src/components/canvas/components/Editor/index.vue b/frontend/src/components/canvas/components/Editor/index.vue index 1b6aee1c66..85b770d1cd 100644 --- a/frontend/src/components/canvas/components/Editor/index.vue +++ b/frontend/src/components/canvas/components/Editor/index.vue @@ -80,6 +80,7 @@ :element="item" :out-style="getShapeStyleInt(item.style)" :active="item === curComponent" + :h="getShapeStyleIntDeDrag(item.style,'height')" /> +
{{ message }},{{ $t('chart.chart_show_error') }} @@ -67,10 +68,11 @@ import { getToken, getLinkToken } from '@/utils/auth' import DrillPath from '@/views/chart/view/DrillPath' import { areaMapping } from '@/api/map/map' import ChartComponentG2 from '@/views/chart/components/ChartComponentG2' +import EditBarView from '@/components/canvas/components/Editor/EditBarView' export default { name: 'UserView', - components: { ChartComponent, TableNormal, LabelNormal, DrillPath, ChartComponentG2 }, + components: { EditBarView, ChartComponent, TableNormal, LabelNormal, DrillPath, ChartComponentG2 }, props: { element: { type: Object, @@ -93,10 +95,19 @@ export default { required: false, default: false }, - // eslint-disable-next-line vue/require-default-prop componentIndex: { type: Number, required: false + }, + inTab: { + type: Boolean, + required: false, + default: false + }, + isEdit: { + type: Boolean, + require: false, + default: true } }, data() { @@ -120,6 +131,9 @@ export default { } }, computed: { + editBarViewShowFlag() { + return this.active && this.inTab + }, charViewShowFlag() { return this.httpRequest.status && this.chart.type && !this.chart.type.includes('table') && !this.chart.type.includes('text') && this.renderComponent() === 'echarts' }, @@ -194,7 +208,8 @@ export default { ...mapState([ 'canvasStyleData', 'nowPanelTrackInfo', - 'nowPanelJumpInfo' + 'nowPanelJumpInfo', + 'publicLinkStatus' ]) }, @@ -385,9 +400,23 @@ export default { // 内部仪表板跳转 if (jumpInfo.linkType === 'inner') { if (jumpInfo.targetPanelId) { - const url = '#/preview/' + jumpInfo.targetPanelId localStorage.setItem('jumpInfoParam', JSON.stringify(param)) - window.open(url, jumpInfo.jumpType) + if (this.publicLinkStatus) { + // 判断是否有公共链接ID + if (jumpInfo.publicJumpId) { + const url = '/link/' + jumpInfo.publicJumpId + window.open(url, jumpInfo.jumpType) + } else { + this.$message({ + type: 'warn', + message: this.$t('panel.public_link_tips'), + showClose: true + }) + } + } else { + const url = '#/preview/' + jumpInfo.targetPanelId + window.open(url, jumpInfo.jumpType) + } } else { this.$message({ type: 'warn', @@ -566,31 +595,31 @@ export default { display: block !important; } - .rect-shape > i { - right: 5px; - color: gray; - position: absolute; - } + /*.rect-shape > i {*/ + /* right: 5px;*/ + /* color: gray;*/ + /* position: absolute;*/ + /*}*/ - .rect-shape > > > i:hover { - color: red; - } + /*.rect-shape > > > i:hover {*/ + /* color: red;*/ + /*}*/ - .rect-shape:hover > > > .icon-fangda { - z-index: 2; - display: block; - } + /*.rect-shape:hover > > > .icon-fangda {*/ + /* z-index: 2;*/ + /* display: block;*/ + /*}*/ - .rect-shape > > > .icon-fangda { - display: none - } + /*.rect-shape > > > .icon-fangda {*/ + /* display: none*/ + /*}*/ - .rect-shape:hover > > > .icon-shezhi { - z-index: 2; - display: block; - } + /*.rect-shape:hover > > > .icon-shezhi {*/ + /* z-index: 2;*/ + /* display: block;*/ + /*}*/ - .rect-shape > > > .icon-shezhi { - display: none - } + /*.rect-shape > > > .icon-shezhi {*/ + /* display: none*/ + /*}*/ diff --git a/frontend/src/components/canvas/custom-component/UserViewMobileDialog.vue b/frontend/src/components/canvas/custom-component/UserViewMobileDialog.vue new file mode 100644 index 0000000000..a864e9852d --- /dev/null +++ b/frontend/src/components/canvas/custom-component/UserViewMobileDialog.vue @@ -0,0 +1,90 @@ + + + + + diff --git a/frontend/src/components/canvas/custom-component/component-list.js b/frontend/src/components/canvas/custom-component/component-list.js index b15f06e30b..906dc42ee5 100644 --- a/frontend/src/components/canvas/custom-component/component-list.js +++ b/frontend/src/components/canvas/custom-component/component-list.js @@ -85,7 +85,7 @@ export const assistList = [ component: 'rect-shape', type: 'rect-shape', label: '矩形', - icon: 'iconfont icon-juxing', + icon: 'iconfont icon-juxing1', defaultClass: 'text-filter' }, { diff --git a/frontend/src/components/canvas/utils/utils.js b/frontend/src/components/canvas/utils/utils.js index b5bd1f942c..24aa4bd627 100644 --- a/frontend/src/components/canvas/utils/utils.js +++ b/frontend/src/components/canvas/utils/utils.js @@ -51,7 +51,7 @@ export function mobile2MainCanvas(mainSource, mobileSource) { top: mobileSource.style.top } mainSource.mobileStyle.x = mobileSource.x - mainSource.mobileStyle.y = mobileSource.x + mainSource.mobileStyle.y = mobileSource.y mainSource.mobileStyle.sizex = mobileSource.sizex mainSource.mobileStyle.sizey = mobileSource.sizey } diff --git a/frontend/src/components/dataease/DeOutWidget.vue b/frontend/src/components/dataease/DeOutWidget.vue index 4863525c90..a3bc506d92 100644 --- a/frontend/src/components/dataease/DeOutWidget.vue +++ b/frontend/src/components/dataease/DeOutWidget.vue @@ -23,6 +23,7 @@ :element="element" :in-draw="inDraw" :in-screen="inScreen" + :size="sizeInfo" />
@@ -49,16 +50,37 @@ export default { type: Boolean, required: false, default: true + }, + h: { + type: Number, + default: 50 } }, data() { return { + inputMaxSize: 46, + inputLargeSize: 42, + inputSmallSize: 38, + inputMiniSize: 34, options: null, showNumber: false, mainClass: '' } }, - + computed: { + sizeInfo() { + let size + if (this.h > this.inputMaxSize) { + } else if (this.h > this.inputLargeSize) { + size = 'medium' + } else if (this.h > this.inputSmallSize) { + size = 'small' + } else { + size = 'mini' + } + return size + } + }, mounted() { this.watchSize() }, diff --git a/frontend/src/components/widget/DeWidget/DeButton.vue b/frontend/src/components/widget/DeWidget/DeButton.vue index b4ccf843a7..0ff872c515 100644 --- a/frontend/src/components/widget/DeWidget/DeButton.vue +++ b/frontend/src/components/widget/DeWidget/DeButton.vue @@ -4,6 +4,7 @@ v-if="options!== null && options.attrs!==null" :type="options.attrs.type" :round="options.attrs.round" + :size="size" > {{ options.value }} @@ -20,7 +21,8 @@ export default { inDraw: { type: Boolean, default: true - } + }, + size: String }, data() { return { diff --git a/frontend/src/components/widget/DeWidget/DeDate.vue b/frontend/src/components/widget/DeWidget/DeDate.vue index 8c89eef9a0..a234224ecd 100644 --- a/frontend/src/components/widget/DeWidget/DeDate.vue +++ b/frontend/src/components/widget/DeWidget/DeDate.vue @@ -9,8 +9,9 @@ :end-placeholder="$t(element.options.attrs.endPlaceholder)" :placeholder="$t(element.options.attrs.placeholder)" :append-to-body="inScreen" - style="min-height: 36px;" value-format="timestamp" + :size="size" + :editable="false" @change="dateChange" /> @@ -33,7 +34,8 @@ export default { type: Boolean, required: false, default: true - } + }, + size: String }, data() { return { diff --git a/frontend/src/components/widget/DeWidget/DeInputSearch.vue b/frontend/src/components/widget/DeWidget/DeInputSearch.vue index 25ed3e071c..f3c010c57e 100644 --- a/frontend/src/components/widget/DeWidget/DeInputSearch.vue +++ b/frontend/src/components/widget/DeWidget/DeInputSearch.vue @@ -8,6 +8,7 @@ @input="valueChange" @keypress.enter.native="search" @dblclick="setEdit" + :size="size" > @@ -26,7 +27,8 @@ export default { inDraw: { type: Boolean, default: true - } + }, + size: String }, data() { return { diff --git a/frontend/src/components/widget/DeWidget/DeQuarter.vue b/frontend/src/components/widget/DeWidget/DeQuarter.vue index 9b6bf243c2..ea4b0be975 100644 --- a/frontend/src/components/widget/DeWidget/DeQuarter.vue +++ b/frontend/src/components/widget/DeWidget/DeQuarter.vue @@ -2,8 +2,9 @@ @@ -18,7 +19,8 @@ export default { inDraw: { type: Boolean, default: true - } + }, + size: String }, data() { return { diff --git a/frontend/src/components/widget/DeWidget/DeSelect.vue b/frontend/src/components/widget/DeWidget/DeSelect.vue index 6061c80d42..53b9c16249 100644 --- a/frontend/src/components/widget/DeWidget/DeSelect.vue +++ b/frontend/src/components/widget/DeWidget/DeSelect.vue @@ -9,6 +9,7 @@ :multiple="element.options.attrs.multiple" :placeholder="$t(element.options.attrs.placeholder)" :popper-append-to-body="inScreen" + :size="size" @change="changeValue" @focus="setOptionWidth" > @@ -42,7 +43,8 @@ export default { type: Boolean, required: false, default: true - } + }, + size: String }, data() { return { diff --git a/frontend/src/components/widget/DeWidget/DeTabs.vue b/frontend/src/components/widget/DeWidget/DeTabs.vue index fbeea71071..2a5e45ed5a 100644 --- a/frontend/src/components/widget/DeWidget/DeTabs.vue +++ b/frontend/src/components/widget/DeWidget/DeTabs.vue @@ -35,7 +35,7 @@
- +
@@ -94,6 +94,7 @@ import ViewSelect from '@/views/panel/ViewSelect' import { uuid } from 'vue-uuid' import bus from '@/utils/bus' import componentList from '@/components/canvas/custom-component/component-list' +import { mapState } from 'vuex' export default { name: 'DeTabls', @@ -107,6 +108,10 @@ export default { type: Boolean, default: true }, + active: { + type: Boolean, + default: false + }, outStyle: { type: Object, required: false, @@ -129,11 +134,24 @@ export default { tabList: [] } }, + watch: { + curComponent: { + handler(newVal, oldVla) { + console.log(newVal) + }, + deep: true + } + }, created() { bus.$on('add-new-tab', this.addNewTab) this.tabList = this.element.options && this.element.options.tabList this.activeTabName = this.tabList[0].name }, + computed: { + ...mapState([ + 'curComponent' + ]) + }, methods: { beforeHandleCommond(item, param) { return { diff --git a/frontend/src/components/widget/DeWidget/DeTreeSelect.vue b/frontend/src/components/widget/DeWidget/DeTreeSelect.vue index 20670bc174..84beff7034 100644 --- a/frontend/src/components/widget/DeWidget/DeTreeSelect.vue +++ b/frontend/src/components/widget/DeWidget/DeTreeSelect.vue @@ -1,6 +1,6 @@