From 3293f3a8703af04506b97adcfe7c8c10e1a05783 Mon Sep 17 00:00:00 2001 From: taojinlong Date: Thu, 16 Jun 2022 22:41:09 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E5=8F=82=E6=95=B0=E7=AE=A1=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../service/chart/ChartViewService.java | 36 ++++---- .../service/dataset/DataSetTableService.java | 84 +++++++++++-------- .../impl/direct/DirectFieldService.java | 2 +- .../panel/filter/filterMain/FilterControl.vue | 2 +- .../src/views/system/datasource/ApiBody.vue | 1 - .../views/system/datasource/ApiKeyValue.vue | 1 - .../views/system/datasource/ApiVariable.vue | 1 - 7 files changed, 67 insertions(+), 60 deletions(-) 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 22b0627d34..c7c54149b3 100644 --- a/backend/src/main/java/io/dataease/service/chart/ChartViewService.java +++ b/backend/src/main/java/io/dataease/service/chart/ChartViewService.java @@ -451,9 +451,7 @@ public class ChartViewService { } } else if (StringUtils.equalsIgnoreCase(table.getType(), DatasetType.SQL.name())) { String sql = dataTableInfoDTO.getSql(); - if (CollectionUtils.isNotEmpty(requestList.getFilter())) { - sql = handleVariable(sql, requestList); - } + sql = handleVariable(sql, requestList); if (StringUtils.equalsIgnoreCase("text", view.getType()) || StringUtils.equalsIgnoreCase("gauge", view.getType()) || StringUtils.equalsIgnoreCase("liquid", view.getType())) { datasourceRequest.setQuery(qp.getSQLSummaryAsTmp(sql, yAxis, fieldCustomFilter, extFilterList, view)); } else if (StringUtils.containsIgnoreCase(view.getType(), "stack")) { @@ -824,10 +822,7 @@ public class ChartViewService { } } else if (StringUtils.equalsIgnoreCase(table.getType(), DatasetType.SQL.name())) { String sql = dataTableInfoDTO.getSql(); - if (CollectionUtils.isNotEmpty(requestList.getFilter())) { - sql = handleVariable(sql, requestList); - } - + sql = handleVariable(sql, requestList); if (StringUtils.equalsIgnoreCase("text", view.getType()) || StringUtils.equalsIgnoreCase("gauge", view.getType()) || StringUtils.equalsIgnoreCase("liquid", view.getType())) { datasourceRequest.setQuery(qp.getSQLSummaryAsTmp(sql, yAxis, fieldCustomFilter, extFilterList, view)); } else if (StringUtils.containsIgnoreCase(view.getType(), "stack")) { @@ -839,7 +834,6 @@ public class ChartViewService { } else { datasourceRequest.setQuery(qp.getSQLAsTmp(sql, xAxis, yAxis, fieldCustomFilter, extFilterList, view)); } - System.out.println(datasourceRequest.getQuery()); } else if (StringUtils.equalsIgnoreCase(table.getType(), DatasetType.CUSTOM.name())) { DataTableInfoDTO dt = gson.fromJson(table.getInfo(), DataTableInfoDTO.class); List list = dataSetTableUnionService.listByTableId(dt.getList().get(0).getTableId()); @@ -1498,22 +1492,24 @@ public class ChartViewService { chartViewMapper.updateByPrimaryKeySelective(chartView); } - private String handleVariable(String sql, ChartExtRequest requestList){ - for (ChartExtFilterRequest chartExtFilterRequest : requestList.getFilter()) { - chartExtFilterRequest.getParameters(); - if(CollectionUtils.isEmpty(chartExtFilterRequest.getValue())){ - continue; - } - if(chartExtFilterRequest.getValue().size() > 1){ - for (String parameter : chartExtFilterRequest.getParameters()) { - sql = sql.replace("${" + parameter + "}", String.join(",", chartExtFilterRequest.getValue())); + private String handleVariable(String sql, ChartExtRequest requestList)throws Exception{ + if(requestList !=null &&CollectionUtils.isNotEmpty(requestList.getFilter()) ){ + for (ChartExtFilterRequest chartExtFilterRequest : requestList.getFilter()) { + if(CollectionUtils.isEmpty(chartExtFilterRequest.getValue())){ + continue; } - }else { - for (String parameter : chartExtFilterRequest.getParameters()) { - sql = sql.replace("${" + parameter + "}", chartExtFilterRequest.getValue().get(0)); + if(chartExtFilterRequest.getValue().size() > 1){ + for (String parameter : chartExtFilterRequest.getParameters()) { + sql = sql.replace("${" + parameter + "}", String.join(",", chartExtFilterRequest.getValue())); + } + }else { + for (String parameter : chartExtFilterRequest.getParameters()) { + sql = sql.replace("${" + parameter + "}", chartExtFilterRequest.getValue().get(0)); + } } } } + sql = dataSetTableService.removeVariables(sql); return sql; } } 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 f12e35e3f3..b641f0cd8a 100644 --- a/backend/src/main/java/io/dataease/service/dataset/DataSetTableService.java +++ b/backend/src/main/java/io/dataease/service/dataset/DataSetTableService.java @@ -7,6 +7,7 @@ import com.google.gson.JsonParser; import com.google.gson.reflect.TypeToken; import io.dataease.auth.annotation.DeCleaner; import io.dataease.auth.api.dto.CurrentUserDto; +import io.dataease.controller.request.chart.ChartExtRequest; import io.dataease.dto.SysLogDTO; import io.dataease.ext.ExtDataSetGroupMapper; import io.dataease.ext.ExtDataSetTableMapper; @@ -31,6 +32,7 @@ import io.dataease.plugins.common.constants.DatasetType; import io.dataease.plugins.common.constants.DatasourceTypes; import io.dataease.plugins.common.dto.chart.ChartFieldCustomFilterDTO; import io.dataease.plugins.common.dto.datasource.TableField; +import io.dataease.plugins.common.request.chart.ChartExtFilterRequest; import io.dataease.plugins.common.request.datasource.DatasourceRequest; import io.dataease.plugins.datasource.provider.Provider; import io.dataease.plugins.datasource.query.QueryProvider; @@ -47,6 +49,7 @@ import net.sf.jsqlparser.expression.operators.conditional.AndExpression; import net.sf.jsqlparser.expression.operators.conditional.OrExpression; import net.sf.jsqlparser.expression.operators.relational.ExpressionList; import net.sf.jsqlparser.expression.operators.relational.InExpression; +import net.sf.jsqlparser.expression.operators.relational.LikeExpression; import net.sf.jsqlparser.parser.CCJSqlParserUtil; import net.sf.jsqlparser.statement.Statement; import net.sf.jsqlparser.statement.select.PlainSelect; @@ -922,65 +925,61 @@ public class DataSetTableService { List sqlVariableDetails = new ArrayList<>(); datasetTables.forEach(datasetTable -> { if (StringUtils.isNotEmpty(datasetTable.getSqlVariableDetails())) { - sqlVariableDetails.addAll(new Gson().fromJson(datasetTable.getSqlVariableDetails(), new TypeToken>() { - }.getType())); + sqlVariableDetails.addAll(new Gson().fromJson(datasetTable.getSqlVariableDetails(), new TypeToken>() {}.getType())); } }); return sqlVariableDetails; } - - public String handleVariableDefaultValue(String sql, String sqlVariableDetails) { + public String handleVariableDefaultValue(String sql, String sqlVariableDetails){ if (StringUtils.isEmpty(sql)) { DataEaseException.throwException(Translator.get("i18n_sql_not_empty")); } Pattern pattern = Pattern.compile(regex); Matcher matcher = pattern.matcher(sql); while (matcher.find()) { - boolean customValue = false; -// if (CollectionUtils.isNotEmpty(customSqlVariableDetails)) { -// for (SqlVariableDetails customSqlVariableDetail : customSqlVariableDetails) { -// if (matcher.group().substring(2, matcher.group().length() - 1).equalsIgnoreCase(customSqlVariableDetail.getVariableName())) { -// sql = sql.replace(matcher.group(), customSqlVariableDetail.getDefaultValue()); -// customValue = true; -// break; -// } -// } -// } - if (!customValue) { - SqlVariableDetails defaultsSqlVariableDetail = null; - List defaultsSqlVariableDetails = new Gson().fromJson(sqlVariableDetails, new TypeToken>() { - }.getType()); - for (SqlVariableDetails sqlVariableDetail : defaultsSqlVariableDetails) { - if (matcher.group().substring(2, matcher.group().length() - 1).equalsIgnoreCase(sqlVariableDetail.getVariableName())) { - defaultsSqlVariableDetail = sqlVariableDetail; - break; - } - } - if (defaultsSqlVariableDetail == null || StringUtils.isEmpty(defaultsSqlVariableDetail.getDefaultValue())) { - throw new RuntimeException(matcher.group().substring(2, matcher.group().length() - 1) + "没有默认值!"); + SqlVariableDetails defaultsSqlVariableDetail = null; + List defaultsSqlVariableDetails = new Gson().fromJson(sqlVariableDetails, new TypeToken>() {}.getType()); + for (SqlVariableDetails sqlVariableDetail : defaultsSqlVariableDetails) { + if (matcher.group().substring(2, matcher.group().length() - 1).equalsIgnoreCase(sqlVariableDetail.getVariableName())) { + defaultsSqlVariableDetail = sqlVariableDetail; + break; } + } + if (defaultsSqlVariableDetail != null && StringUtils.isNotEmpty(defaultsSqlVariableDetail.getDefaultValue())) { sql = sql.replace(matcher.group(), defaultsSqlVariableDetail.getDefaultValue()); } } + try { + sql = removeVariables(sql); + }catch (Exception e){ + e.printStackTrace(); + } return sql; } - private String removeVariables(String sql) throws Exception { + public String removeVariables(String sql) throws Exception { Pattern pattern = Pattern.compile(regex); Matcher matcher = pattern.matcher(sql); while (matcher.find()) { sql = sql.replace(matcher.group(), SubstitutedParams); } - CCJSqlParserUtil.parse(sql, parser -> parser.withSquareBracketQuotation(true)); Statement statement = CCJSqlParserUtil.parse(sql); Select select = (Select) statement; - Expression expr = ((PlainSelect) select.getSelectBody()).getWhere(); + PlainSelect plainSelect = ((PlainSelect) select.getSelectBody()); + Expression expr = plainSelect.getWhere(); StringBuilder stringBuilder = new StringBuilder(); - expr.accept(getExpressionDeParser(stringBuilder)); - return stringBuilder.toString(); + BinaryExpression binaryExpression = (BinaryExpression)expr; + + if(!(binaryExpression.getLeftExpression() instanceof BinaryExpression) && !(binaryExpression.getRightExpression() instanceof BinaryExpression) && hasVarible(binaryExpression.toString())){ + stringBuilder.append(SubstitutedSql); + }else { + expr.accept(getExpressionDeParser(stringBuilder)); + } + plainSelect.setWhere(CCJSqlParserUtil.parseCondExpression(stringBuilder.toString())); + return plainSelect.toString(); } public Map getSQLPreview(DataSetTableRequest dataSetTableRequest) throws Exception { @@ -2510,6 +2509,21 @@ public class DataSetTableService { } } + @Override + public void visit(LikeExpression likeExpression) { + if (hasVarible(likeExpression.toString())) { + getBuffer().append(SubstitutedSql); + return; + } + + visitBinaryExpression(likeExpression, (likeExpression.isNot() ? " NOT" : "") + (likeExpression.isCaseInsensitive() ? " ILIKE " : " LIKE ")); + Expression escape = likeExpression.getEscape(); + if (escape != null) { + getBuffer().append(" ESCAPE "); + likeExpression.getEscape().accept(this); + } + } + @Override public void visit(InExpression inExpression) { inExpression.getLeftExpression().accept(this); @@ -2536,7 +2550,7 @@ public class DataSetTableService { StringBuilder stringBuilder = new StringBuilder(); Expression in = ((PlainSelect) subSelect.getSelectBody()).getWhere(); if (in instanceof BinaryExpression && hasVarible(in.toString())) { - stringBuilder.append(SubstitutedSql); + stringBuilder.append(SubstitutedParams); } else { in.accept(getExpressionDeParser(stringBuilder)); } @@ -2550,9 +2564,6 @@ public class DataSetTableService { } } - private boolean hasVarible(String sql) { - return sql.contains(SubstitutedParams); - } private void visitBinaryExpr(BinaryExpression expr, String operator) { boolean hasBinaryExpression = false; @@ -2588,4 +2599,7 @@ public class DataSetTableService { }; return expressionDeParser; } + static private boolean hasVarible(String sql) { + return sql.contains(SubstitutedParams); + } } 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 b3feb61c4b..f47cc35fff 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 @@ -140,7 +140,7 @@ public class DirectFieldService implements DataSetFieldService { } else if (StringUtils.equalsIgnoreCase(datasetTable.getType(), DatasetType.SQL.toString())) { String sql = dataTableInfoDTO.getSql(); if (rowAndColumnMgm) { - sql = ""; + sql = dataSetTableService.removeVariables(sql); } datasourceRequest.setQuery(qp.createQuerySQLAsTmp(sql, permissionFields, true, customFilter, deSortFields)); } else if (StringUtils.equalsIgnoreCase(datasetTable.getType(), DatasetType.CUSTOM.toString())) { diff --git a/frontend/src/views/panel/filter/filterMain/FilterControl.vue b/frontend/src/views/panel/filter/filterMain/FilterControl.vue index 0faf983735..1cdd27034d 100644 --- a/frontend/src/views/panel/filter/filterMain/FilterControl.vue +++ b/frontend/src/views/panel/filter/filterMain/FilterControl.vue @@ -60,7 +60,7 @@ /> - + {{ $t('panel.binding_parameters') }} diff --git a/frontend/src/views/system/datasource/ApiBody.vue b/frontend/src/views/system/datasource/ApiBody.vue index 424f2ead17..8cfce4db2f 100644 --- a/frontend/src/views/system/datasource/ApiBody.vue +++ b/frontend/src/views/system/datasource/ApiBody.vue @@ -207,7 +207,6 @@ export default { case "WWW_FORM": this.setContentType("application/x-www-form-urlencoded"); break; - // todo from data case "BINARY": this.setContentType("application/octet-stream"); break; diff --git a/frontend/src/views/system/datasource/ApiKeyValue.vue b/frontend/src/views/system/datasource/ApiKeyValue.vue index 9758f5e073..a3251b2258 100644 --- a/frontend/src/views/system/datasource/ApiKeyValue.vue +++ b/frontend/src/views/system/datasource/ApiKeyValue.vue @@ -157,7 +157,6 @@ this.items.push(new KeyValue({enable: true})); } this.$emit('change', this.items); - // TODO 检查key重复 }, isDisable: function (index) { return this.items.length - 1 === index; diff --git a/frontend/src/views/system/datasource/ApiVariable.vue b/frontend/src/views/system/datasource/ApiVariable.vue index 78fbb98736..1016add2c2 100644 --- a/frontend/src/views/system/datasource/ApiVariable.vue +++ b/frontend/src/views/system/datasource/ApiVariable.vue @@ -164,7 +164,6 @@ export default { })); } this.$emit('change', this.parameters); - // TODO 检查key重复 }, isDisable: function (index) { return this.parameters.length - 1 == index;