From 8f0eeaff1936daf32abc4eecdfb75fce0ce6d47a Mon Sep 17 00:00:00 2001 From: junjie Date: Mon, 5 Jul 2021 17:24:23 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E8=A7=86=E5=9B=BE=E8=BF=87=E6=BB=A4?= =?UTF-8?q?=E4=B8=8D=E8=83=BD=E8=AE=BE=E7=BD=AE=E6=97=A0=E9=99=90=E5=88=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../provider/doris/DorisQueryProvider.java | 28 ++- .../provider/mysql/MysqlQueryProvider.java | 28 ++- .../provider/oracle/OracleQueryProvider.java | 48 ++-- .../sqlserver/SqlserverQueryProvider.java | 231 ++++++++++++++---- frontend/src/lang/en.js | 8 +- frontend/src/lang/tw.js | 4 +- frontend/src/lang/zh.js | 4 +- .../filter/DimensionFilterEditor.vue | 2 +- .../components/filter/QuotaFilterEditor.vue | 2 +- .../components/filter/ResultFilterEditor.vue | 2 +- frontend/src/views/chart/view/ChartEdit.vue | 30 +++ 11 files changed, 303 insertions(+), 84 deletions(-) diff --git a/backend/src/main/java/io/dataease/provider/doris/DorisQueryProvider.java b/backend/src/main/java/io/dataease/provider/doris/DorisQueryProvider.java index ee6b7a02a4..f87da730f3 100644 --- a/backend/src/main/java/io/dataease/provider/doris/DorisQueryProvider.java +++ b/backend/src/main/java/io/dataease/provider/doris/DorisQueryProvider.java @@ -193,7 +193,10 @@ public class DorisQueryProvider extends QueryProvider { filter.append(" AND ").append(x.getDataeaseName()); } filter.append(transMysqlFilterTerm(f.getTerm())); - if (StringUtils.containsIgnoreCase(f.getTerm(), "null")) { + if (StringUtils.equalsIgnoreCase(f.getTerm(), "null")) { + filter.append("(null,'')"); + } else if (StringUtils.equalsIgnoreCase(f.getTerm(), "not_null")) { + filter.append(" AND ").append(x.getDataeaseName()).append(" <> ''"); } else if (StringUtils.containsIgnoreCase(f.getTerm(), "in")) { filter.append("('").append(StringUtils.join(f.getValue(), "','")).append("')"); } else if (StringUtils.containsIgnoreCase(f.getTerm(), "like")) { @@ -229,7 +232,12 @@ public class DorisQueryProvider extends QueryProvider { filter.append(" AND _").append(y.getSummary()).append("_").append(StringUtils.equalsIgnoreCase(y.getDataeaseName(), "*") ? "" : y.getDataeaseName()); } filter.append(transMysqlFilterTerm(f.getTerm())); - if (StringUtils.containsIgnoreCase(f.getTerm(), "null")) { + if (StringUtils.equalsIgnoreCase(f.getTerm(), "null")) { + filter.append("(null,'')"); + } else if (StringUtils.equalsIgnoreCase(f.getTerm(), "not_null")) { + filter.append(" AND _") + .append(y.getSummary()).append("_").append(StringUtils.equalsIgnoreCase(y.getDataeaseName(), "*") ? "" : y.getDataeaseName()) + .append(" <> ''"); } else if (StringUtils.containsIgnoreCase(f.getTerm(), "in")) { filter.append("('").append(StringUtils.join(f.getValue(), "','")).append("')"); } else if (StringUtils.containsIgnoreCase(f.getTerm(), "like")) { @@ -310,7 +318,12 @@ public class DorisQueryProvider extends QueryProvider { filter.append(" AND _").append(y.getSummary()).append("_").append(StringUtils.equalsIgnoreCase(y.getDataeaseName(), "*") ? "" : y.getDataeaseName()); } filter.append(transMysqlFilterTerm(f.getTerm())); - if (StringUtils.containsIgnoreCase(f.getTerm(), "null")) { + if (StringUtils.equalsIgnoreCase(f.getTerm(), "null")) { + filter.append("(null,'')"); + } else if (StringUtils.equalsIgnoreCase(f.getTerm(), "not_null")) { + filter.append(" AND _") + .append(y.getSummary()).append("_").append(StringUtils.equalsIgnoreCase(y.getDataeaseName(), "*") ? "" : y.getDataeaseName()) + .append(" <> ''"); } else if (StringUtils.containsIgnoreCase(f.getTerm(), "in")) { filter.append("('").append(StringUtils.join(f.getValue(), "','")).append("')"); } else if (StringUtils.containsIgnoreCase(f.getTerm(), "like")) { @@ -349,7 +362,7 @@ public class DorisQueryProvider extends QueryProvider { } @Override - public String createRawQuerySQL(String table, List fields){ + public String createRawQuerySQL(String table, List fields) { String[] array = fields.stream().map(f -> { StringBuilder stringBuilder = new StringBuilder(); stringBuilder.append("`").append(f.getOriginName()).append("` AS ").append(f.getDataeaseName()); @@ -393,7 +406,7 @@ public class DorisQueryProvider extends QueryProvider { case "not like": return " NOT LIKE "; case "null": - return " IS NULL "; + return " IN "; case "not_null": return " IS NOT NULL "; case "between": @@ -424,7 +437,10 @@ public class DorisQueryProvider extends QueryProvider { filter.append(" ") .append(transMysqlFilterTerm(request.getTerm())) .append(" "); - if (StringUtils.containsIgnoreCase(request.getTerm(), "null")) { + if (StringUtils.equalsIgnoreCase(request.getTerm(), "null")) { + filter.append("(null,'')"); + } else if (StringUtils.equalsIgnoreCase(request.getTerm(), "not_null")) { + filter.append(" AND ").append(field.getDataeaseName()).append(" <> ''"); } else if (StringUtils.containsIgnoreCase(request.getTerm(), "in")) { filter.append("('").append(StringUtils.join(value, "','")).append("')"); } else if (StringUtils.containsIgnoreCase(request.getTerm(), "like")) { diff --git a/backend/src/main/java/io/dataease/provider/mysql/MysqlQueryProvider.java b/backend/src/main/java/io/dataease/provider/mysql/MysqlQueryProvider.java index e2cbb61fd7..048e774332 100644 --- a/backend/src/main/java/io/dataease/provider/mysql/MysqlQueryProvider.java +++ b/backend/src/main/java/io/dataease/provider/mysql/MysqlQueryProvider.java @@ -198,7 +198,10 @@ public class MysqlQueryProvider extends QueryProvider { filter.append(" AND `").append(x.getOriginName()).append("`"); } filter.append(transMysqlFilterTerm(f.getTerm())); - if (StringUtils.containsIgnoreCase(f.getTerm(), "null")) { + if (StringUtils.equalsIgnoreCase(f.getTerm(), "null")) { + filter.append("(null,'')"); + } else if (StringUtils.equalsIgnoreCase(f.getTerm(), "not_null")) { + filter.append(" AND `").append(x.getOriginName()).append("`").append(" <> ''"); } else if (StringUtils.containsIgnoreCase(f.getTerm(), "in")) { filter.append("('").append(StringUtils.join(f.getValue(), "','")).append("')"); } else if (StringUtils.containsIgnoreCase(f.getTerm(), "like")) { @@ -235,7 +238,12 @@ public class MysqlQueryProvider extends QueryProvider { filter.append(" AND `_").append(y.getSummary()).append("_").append(StringUtils.equalsIgnoreCase(y.getOriginName(), "*") ? "" : y.getOriginName()).append("`"); } filter.append(transMysqlFilterTerm(f.getTerm())); - if (StringUtils.containsIgnoreCase(f.getTerm(), "null")) { + if (StringUtils.equalsIgnoreCase(f.getTerm(), "null")) { + filter.append("(null,'')"); + } else if (StringUtils.equalsIgnoreCase(f.getTerm(), "not_null")) { + filter.append(" AND `_") + .append(y.getSummary()).append("_").append(StringUtils.equalsIgnoreCase(y.getOriginName(), "*") ? "" : y.getOriginName()) + .append("`").append(" <> ''"); } else if (StringUtils.containsIgnoreCase(f.getTerm(), "in")) { filter.append("('").append(StringUtils.join(f.getValue(), "','")).append("')"); } else if (StringUtils.containsIgnoreCase(f.getTerm(), "like")) { @@ -316,7 +324,12 @@ public class MysqlQueryProvider extends QueryProvider { filter.append(" AND `_").append(y.getSummary()).append("_").append(StringUtils.equalsIgnoreCase(y.getOriginName(), "*") ? "" : y.getOriginName()).append("`"); } filter.append(transMysqlFilterTerm(f.getTerm())); - if (StringUtils.containsIgnoreCase(f.getTerm(), "null")) { + if (StringUtils.equalsIgnoreCase(f.getTerm(), "null")) { + filter.append("(null,'')"); + } else if (StringUtils.equalsIgnoreCase(f.getTerm(), "not_null")) { + filter.append(" AND `_") + .append(y.getSummary()).append("_").append(StringUtils.equalsIgnoreCase(y.getOriginName(), "*") ? "" : y.getOriginName()) + .append("`").append(" <> ''"); } else if (StringUtils.containsIgnoreCase(f.getTerm(), "in")) { filter.append("('").append(StringUtils.join(f.getValue(), "','")).append("')"); } else if (StringUtils.containsIgnoreCase(f.getTerm(), "like")) { @@ -355,7 +368,7 @@ public class MysqlQueryProvider extends QueryProvider { } @Override - public String createRawQuerySQL(String table, List fields){ + public String createRawQuerySQL(String table, List fields) { String[] array = fields.stream().map(f -> { StringBuilder stringBuilder = new StringBuilder(); stringBuilder.append("`").append(f.getOriginName()).append("` AS ").append(f.getDataeaseName()); @@ -392,7 +405,7 @@ public class MysqlQueryProvider extends QueryProvider { case "not like": return " NOT LIKE "; case "null": - return " IS NULL "; + return " IN "; case "not_null": return " IS NOT NULL "; case "between": @@ -423,7 +436,10 @@ public class MysqlQueryProvider extends QueryProvider { filter.append(" ") .append(transMysqlFilterTerm(request.getTerm())) .append(" "); - if (StringUtils.containsIgnoreCase(request.getTerm(), "null")) { + if (StringUtils.equalsIgnoreCase(request.getTerm(), "null")) { + filter.append("(null,'')"); + } else if (StringUtils.equalsIgnoreCase(request.getTerm(), "not_null")) { + filter.append(" AND `").append(field.getOriginName()).append("`").append(" <> ''"); } else if (StringUtils.containsIgnoreCase(request.getTerm(), "in")) { filter.append("('").append(StringUtils.join(value, "','")).append("')"); } else if (StringUtils.containsIgnoreCase(request.getTerm(), "like")) { diff --git a/backend/src/main/java/io/dataease/provider/oracle/OracleQueryProvider.java b/backend/src/main/java/io/dataease/provider/oracle/OracleQueryProvider.java index 6cc986cb0c..4f4f633e82 100644 --- a/backend/src/main/java/io/dataease/provider/oracle/OracleQueryProvider.java +++ b/backend/src/main/java/io/dataease/provider/oracle/OracleQueryProvider.java @@ -1,12 +1,10 @@ package io.dataease.provider.oracle; -import com.google.gson.Gson; import io.dataease.base.domain.DatasetTableField; import io.dataease.controller.request.chart.ChartExtFilterRequest; import io.dataease.dto.chart.ChartCustomFilterDTO; import io.dataease.dto.chart.ChartViewFieldDTO; import io.dataease.provider.QueryProvider; -import io.swagger.models.auth.In; import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.lang3.ObjectUtils; import org.apache.commons.lang3.StringUtils; @@ -93,9 +91,9 @@ public class OracleQueryProvider extends QueryProvider { // 如果原始类型为时间 if (f.getDeExtractType() == TIME) { if (f.getDeType() == INT || f.getDeType() == FLOAT) { //日期转数值 - if(f.getType().equalsIgnoreCase("DATE")){ + if (f.getType().equalsIgnoreCase("DATE")) { stringBuilder.append("TO_NUMBER( ").append(f.getOriginName()).append(" - TO_DATE('1970-01-01 8:0:0', 'YYYY-MM-DD HH24:MI:SS')) * 24 * 60 * 60 * 1000 AS ").append(f.getDataeaseName()); - }else { + } else { stringBuilder.append("TO_NUMBER(to_date(to_char( ").append(f.getOriginName()).append(" ,'yyyy-mm-dd hh24:mi:ss'),'yyyy-mm-dd hh24:mi:ss') - TO_DATE('1970-01-01 8:0:0', 'YYYY-MM-DD HH24:MI:SS')) * 24 * 60 * 60 * 1000 AS ").append(f.getDataeaseName()); } } else { @@ -123,9 +121,9 @@ public class OracleQueryProvider extends QueryProvider { return MessageFormat.format("SELECT {0} FROM {1} ", StringUtils.join(array, ","), table); } - private String sqlColumn(List fields){ + private String sqlColumn(List fields) { String[] array = fields.stream().map(f -> { - return f.getDataeaseName(); + return f.getDataeaseName(); }).toArray(String[]::new); return StringUtils.join(array, ","); } @@ -184,17 +182,17 @@ public class OracleQueryProvider extends QueryProvider { // 如果原始类型为时间 if (x.getDeExtractType() == TIME) { if (x.getDeType() == INT || x.getDeType() == FLOAT) { //时间转数值 - if(x.getType().equalsIgnoreCase("DATE")){ + if (x.getType().equalsIgnoreCase("DATE")) { stringBuilder.append("TO_NUMBER( ").append(x.getOriginName()).append(" - TO_DATE('1970-01-01 8:0:0', 'YYYY-MM-DD HH24:MI:SS')) * 24 * 60 * 60 * 1000 AS \"_").append(x.getDataeaseName()).append("\" "); - }else { + } else { stringBuilder.append("TO_NUMBER(to_date(to_char( ").append(x.getOriginName()).append(" ,'yyyy-mm-dd hh24:mi:ss'),'yyyy-mm-dd hh24:mi:ss') - TO_DATE('1970-01-01 8:0:0', 'YYYY-MM-DD HH24:MI:SS')) * 24 * 60 * 60 * 1000 AS ") .append(x.getDataeaseName()).append("\" "); } } else if (x.getDeType() == TIME) { //格式化显示时间 String format = transDateFormat(x.getDateStyle(), x.getDatePattern()); - if(x.getType().equalsIgnoreCase("DATE")){ + if (x.getType().equalsIgnoreCase("DATE")) { stringBuilder.append("to_char( ").append(x.getOriginName()).append(" ,'").append(format).append("') AS \"_").append(x.getOriginName()).append("\" "); - }else { + } else { stringBuilder.append("to_char(to_date(to_char( ").append(x.getOriginName()).append(" ,'yyyy-mm-dd hh24:mi:ss'),'yyyy-mm-dd hh24:mi:ss'), '").append(format).append("') AS \"_").append(x.getOriginName()).append("\" "); } } else { @@ -206,7 +204,7 @@ public class OracleQueryProvider extends QueryProvider { if (x.getDeExtractType() == STRING) { //字符串转时间 stringBuilder.append("to_char(to_date(").append(x.getOriginName()).append(" , 'yyyy-MM-dd hh24:mi:ss'), '").append(format).append("') AS \"_").append(x.getOriginName()).append("\" "); } else { //数值转时间 - stringBuilder.append("to_char(").append(x.getOriginName()) .append("/ (1000 * 60 * 60 * 24) + TO_DATE('1970-01-01 08:00:00', 'YYYY-MM-DD HH24:MI:SS'), '").append(format).append("') AS \"_").append(x.getOriginName()).append("\" "); + stringBuilder.append("to_char(").append(x.getOriginName()).append("/ (1000 * 60 * 60 * 24) + TO_DATE('1970-01-01 08:00:00', 'YYYY-MM-DD HH24:MI:SS'), '").append(format).append("') AS \"_").append(x.getOriginName()).append("\" "); } } else { stringBuilder.append(" ").append(x.getOriginName()).append(" AS \"_").append(x.getOriginName()).append("\" "); @@ -234,7 +232,10 @@ public class OracleQueryProvider extends QueryProvider { filter.append(" AND ").append(x.getOriginName()).append(" "); } filter.append(transMysqlFilterTerm(f.getTerm())); - if (StringUtils.containsIgnoreCase(f.getTerm(), "null")) { + if (StringUtils.equalsIgnoreCase(f.getTerm(), "null")) { + filter.append("(null,'')"); + } else if (StringUtils.equalsIgnoreCase(f.getTerm(), "not_null")) { + filter.append(" AND ").append(x.getOriginName()).append(" <> ''"); } else if (StringUtils.containsIgnoreCase(f.getTerm(), "in")) { filter.append("('").append(StringUtils.join(f.getValue(), "','")).append("')"); } else if (StringUtils.containsIgnoreCase(f.getTerm(), "like")) { @@ -271,7 +272,12 @@ public class OracleQueryProvider extends QueryProvider { filter.append(" AND _").append(y.getSummary()).append("_").append(StringUtils.equalsIgnoreCase(y.getOriginName(), "*") ? "" : y.getOriginName()).append(" "); } filter.append(transMysqlFilterTerm(f.getTerm())); - if (StringUtils.containsIgnoreCase(f.getTerm(), "null")) { + if (StringUtils.equalsIgnoreCase(f.getTerm(), "null")) { + filter.append("(null,'')"); + } else if (StringUtils.equalsIgnoreCase(f.getTerm(), "not_null")) { + filter.append(" AND _") + .append(y.getSummary()).append("_").append(StringUtils.equalsIgnoreCase(y.getOriginName(), "*") ? "" : y.getOriginName()) + .append(" <> ''"); } else if (StringUtils.containsIgnoreCase(f.getTerm(), "in")) { filter.append("('").append(StringUtils.join(f.getValue(), "','")).append("')"); } else if (StringUtils.containsIgnoreCase(f.getTerm(), "like")) { @@ -352,7 +358,12 @@ public class OracleQueryProvider extends QueryProvider { filter.append(" AND _").append(y.getSummary()).append("_").append(StringUtils.equalsIgnoreCase(y.getOriginName(), "*") ? "" : y.getOriginName()).append(" "); } filter.append(transMysqlFilterTerm(f.getTerm())); - if (StringUtils.containsIgnoreCase(f.getTerm(), "null")) { + if (StringUtils.equalsIgnoreCase(f.getTerm(), "null")) { + filter.append("(null,'')"); + } else if (StringUtils.equalsIgnoreCase(f.getTerm(), "not_null")) { + filter.append(" AND _") + .append(y.getSummary()).append("_").append(StringUtils.equalsIgnoreCase(y.getOriginName(), "*") ? "" : y.getOriginName()).append(" ") + .append(" <> ''"); } else if (StringUtils.containsIgnoreCase(f.getTerm(), "in")) { filter.append("('").append(StringUtils.join(f.getValue(), "','")).append("')"); } else if (StringUtils.containsIgnoreCase(f.getTerm(), "like")) { @@ -391,7 +402,7 @@ public class OracleQueryProvider extends QueryProvider { } @Override - public String createRawQuerySQL(String table, List fields){ + public String createRawQuerySQL(String table, List fields) { String[] array = fields.stream().map(f -> { StringBuilder stringBuilder = new StringBuilder(); stringBuilder.append(" ").append(f.getOriginName()).append(" AS ").append(f.getDataeaseName()); @@ -428,7 +439,7 @@ public class OracleQueryProvider extends QueryProvider { case "not like": return " NOT LIKE "; case "null": - return " IS NULL "; + return " IN "; case "not_null": return " IS NOT NULL "; case "between": @@ -459,7 +470,10 @@ public class OracleQueryProvider extends QueryProvider { filter.append(" ") .append(transMysqlFilterTerm(request.getTerm())) .append(" "); - if (StringUtils.containsIgnoreCase(request.getTerm(), "null")) { + if (StringUtils.equalsIgnoreCase(request.getTerm(), "null")) { + filter.append("(null,'')"); + } else if (StringUtils.equalsIgnoreCase(request.getTerm(), "not_null")) { + filter.append(" AND `").append(field.getOriginName()).append("`").append(" <> ''"); } else if (StringUtils.containsIgnoreCase(request.getTerm(), "in")) { filter.append("('").append(StringUtils.join(value, "','")).append("')"); } else if (StringUtils.containsIgnoreCase(request.getTerm(), "like")) { diff --git a/backend/src/main/java/io/dataease/provider/sqlserver/SqlserverQueryProvider.java b/backend/src/main/java/io/dataease/provider/sqlserver/SqlserverQueryProvider.java index a0005fefc5..9151ad4649 100644 --- a/backend/src/main/java/io/dataease/provider/sqlserver/SqlserverQueryProvider.java +++ b/backend/src/main/java/io/dataease/provider/sqlserver/SqlserverQueryProvider.java @@ -6,31 +6,31 @@ import io.dataease.dto.chart.ChartCustomFilterDTO; import io.dataease.dto.chart.ChartViewFieldDTO; import io.dataease.provider.QueryProvider; import org.apache.commons.collections4.CollectionUtils; +import org.apache.commons.lang3.ObjectUtils; import org.apache.commons.lang3.StringUtils; import org.springframework.stereotype.Service; import java.text.MessageFormat; +import java.text.SimpleDateFormat; import java.util.Arrays; +import java.util.Date; import java.util.List; /** * @Author gin * @Date 2021/5/17 2:43 下午 */ -@Service("sqlserverQuery") +@Service("sqlServerQuery") public class SqlserverQueryProvider extends QueryProvider { @Override public Integer transFieldType(String field) { - switch (field.toUpperCase()) { + switch (field) { case "CHAR": case "VARCHAR": case "TEXT": case "TINYTEXT": case "MEDIUMTEXT": case "LONGTEXT": - case "NCHAR": - case "NVARCHAR": - case "NTEXT": case "ENUM": return 0;// 文本 case "DATE": @@ -59,7 +59,7 @@ public class SqlserverQueryProvider extends QueryProvider { @Override public String createQueryCountSQL(String table) { - return MessageFormat.format("SELECT count(*) FROM {0}", table); + return MessageFormat.format("SELECT COUNT(*) FROM {0}", table); } @Override @@ -69,7 +69,7 @@ public class SqlserverQueryProvider extends QueryProvider { @Override public String createSQLPreview(String sql, String orderBy) { - return "SELECT * FROM (" + sqlFix(sql) + ") AS tmp ORDER BY " + orderBy + " LIMIT 0,1000"; + return "SELECT * FROM (" + sqlFix(sql) + ") AS tmp ORDER BY null " + " LIMIT 0,1000"; } @Override @@ -79,21 +79,30 @@ public class SqlserverQueryProvider extends QueryProvider { // 如果原始类型为时间 if (f.getDeExtractType() == 1) { if (f.getDeType() == 2 || f.getDeType() == 3) { - stringBuilder.append("unix_timestamp(").append(f.getOriginName()).append(")*1000 as ").append(f.getOriginName()); + stringBuilder.append("UNIX_TIMESTAMP(`").append(f.getOriginName()).append("`)*1000 AS ").append(f.getDataeaseName()); } else { - stringBuilder.append(f.getOriginName()); + stringBuilder.append("`").append(f.getOriginName()).append("` AS ").append(f.getDataeaseName()); + } + } else if (f.getDeExtractType() == 0) { + if (f.getDeType() == 2) { + stringBuilder.append("CAST(`").append(f.getOriginName()).append("` AS DECIMAL(20,0)) AS ").append(f.getDataeaseName()); + } else if (f.getDeType() == 3) { + stringBuilder.append("CAST(`").append(f.getOriginName()).append("` AS DECIMAL(20,2)) AS ").append(f.getDataeaseName()); + } else if (f.getDeType() == 1) { + stringBuilder.append("DATE_FORMAT(`").append(f.getOriginName()).append("`,'%Y-%m-%d %H:%i:%S') AS _").append(f.getDataeaseName()); + } else { + stringBuilder.append("`").append(f.getOriginName()).append("` AS ").append(f.getDataeaseName()); } } else { if (f.getDeType() == 1) { - stringBuilder.append("FROM_UNIXTIME(cast(").append(f.getOriginName()).append(" as decimal(20,0))/1000,'%Y-%m-%d %H:%i:%S') as ").append(f.getOriginName()); + stringBuilder.append("FROM_UNIXTIME(CAST(`").append(f.getOriginName()).append("` AS DECIMAL(20,0))/1000,'%Y-%m-%d %H:%i:%S') AS ").append(f.getDataeaseName()); } else { - stringBuilder.append(f.getOriginName()); + stringBuilder.append("`").append(f.getOriginName()).append("` AS ").append(f.getDataeaseName()); } } return stringBuilder.toString(); }).toArray(String[]::new); - - return MessageFormat.format("SELECT {0} FROM {1} ORDER BY " + (fields.size() > 0 ? fields.get(0).getOriginName() : "null"), StringUtils.join(array, ","), table); + return MessageFormat.format("SELECT {0} FROM {1} ORDER BY null", StringUtils.join(array, ","), table); } @Override @@ -103,7 +112,7 @@ public class SqlserverQueryProvider extends QueryProvider { @Override public String createQuerySQLWithPage(String table, List fields, Integer page, Integer pageSize, Integer realSize) { - return createQuerySQL(table, fields) + " offset " + (page - 1) * pageSize + " rows fetch next " + realSize + " rows only"; + return createQuerySQL(table, fields) + " LIMIT " + (page - 1) * pageSize + "," + realSize; } @Override @@ -132,15 +141,15 @@ public class SqlserverQueryProvider extends QueryProvider { if (StringUtils.equalsIgnoreCase(y.getSummary(), "avg") || StringUtils.containsIgnoreCase(y.getSummary(), "pop")) { f.append("CAST(") .append(y.getSummary()).append("(") - .append("CAST(").append(y.getOriginName()).append(" AS ").append(y.getDeType() == 2 ? "DECIMAL(20,0)" : "DECIMAL(20,2)").append(")") + .append("CAST(`").append(y.getOriginName()).append("` AS ").append(y.getDeType() == 2 ? "DECIMAL(20,0)" : "DECIMAL(20,2)").append(")") .append(") AS DECIMAL(20,2)").append(")"); } else { f.append(y.getSummary()).append("(") - .append("CAST(").append(y.getOriginName()).append(" AS ").append(y.getDeType() == 2 ? "DECIMAL(20,0)" : "DECIMAL(20,2)").append(")") + .append("CAST(`").append(y.getOriginName()).append("` AS ").append(y.getDeType() == 2 ? "DECIMAL(20,0)" : "DECIMAL(20,2)").append(")") .append(")"); } } - f.append(" AS _").append(y.getSummary()).append("_").append(StringUtils.equalsIgnoreCase(y.getOriginName(), "*") ? "" : y.getOriginName()); + f.append(" AS `_").append(y.getSummary()).append("_").append(StringUtils.equalsIgnoreCase(y.getOriginName(), "*") ? "" : y.getOriginName()).append("`"); return f.toString(); }).toArray(String[]::new); String[] groupField = xAxis.stream().map(x -> { @@ -148,24 +157,32 @@ public class SqlserverQueryProvider extends QueryProvider { // 如果原始类型为时间 if (x.getDeExtractType() == 1) { if (x.getDeType() == 2 || x.getDeType() == 3) { - stringBuilder.append("unix_timestamp(").append(x.getOriginName()).append(")*1000 as ").append(x.getOriginName()); + stringBuilder.append("UNIX_TIMESTAMP(`").append(x.getOriginName()).append("`)*1000 AS `_").append(x.getOriginName()).append("`"); + } else if (x.getDeType() == 1) { + String format = transDateFormat(x.getDateStyle(), x.getDatePattern()); + stringBuilder.append("DATE_FORMAT(`").append(x.getOriginName()).append("`,'").append(format).append("') AS `_").append(x.getOriginName()).append("`"); } else { - stringBuilder.append(x.getOriginName()); + stringBuilder.append("`").append(x.getOriginName()).append("` AS `_").append(x.getOriginName()).append("`"); } } else { if (x.getDeType() == 1) { - stringBuilder.append("FROM_UNIXTIME(cast(").append(x.getOriginName()).append(" as decimal(20,0))/1000,'%Y-%m-%d %H:%i:%S') as ").append(x.getOriginName()); + String format = transDateFormat(x.getDateStyle(), x.getDatePattern()); + if (x.getDeExtractType() == 0) { + stringBuilder.append("DATE_FORMAT(`").append(x.getOriginName()).append("`,'").append(format).append("') AS `_").append(x.getOriginName()).append("`"); + } else { + stringBuilder.append("DATE_FORMAT(").append("FROM_UNIXTIME(CAST(`").append(x.getOriginName()).append("` AS DECIMAL(20,0))/1000,'%Y-%m-%d %H:%i:%S')").append(",'").append(format).append("') AS `_").append(x.getOriginName()).append("`"); + } } else { - stringBuilder.append(x.getOriginName()); + stringBuilder.append("`").append(x.getOriginName()).append("` AS `_").append(x.getOriginName()).append("`"); } } return stringBuilder.toString(); }).toArray(String[]::new); - String[] group = xAxis.stream().map(ChartViewFieldDTO::getOriginName).toArray(String[]::new); + String[] group = xAxis.stream().map(x -> "`_" + x.getOriginName() + "`").toArray(String[]::new); String[] xOrder = xAxis.stream().filter(f -> StringUtils.isNotEmpty(f.getSort()) && !StringUtils.equalsIgnoreCase(f.getSort(), "none")) - .map(f -> f.getOriginName() + " " + f.getSort()).toArray(String[]::new); + .map(f -> "`_" + f.getOriginName() + "` " + f.getSort()).toArray(String[]::new); String[] yOrder = yAxis.stream().filter(f -> StringUtils.isNotEmpty(f.getSort()) && !StringUtils.equalsIgnoreCase(f.getSort(), "none")) - .map(f -> "_" + f.getSummary() + "_" + (StringUtils.equalsIgnoreCase(f.getOriginName(), "*") ? "" : f.getOriginName()) + " " + f.getSort()).toArray(String[]::new); + .map(f -> "`_" + f.getSummary() + "_" + (StringUtils.equalsIgnoreCase(f.getOriginName(), "*") ? "" : f.getOriginName()) + "` " + f.getSort()).toArray(String[]::new); String[] order = Arrays.copyOf(xOrder, xOrder.length + yOrder.length); System.arraycopy(yOrder, 0, order, xOrder.length, yOrder.length); @@ -174,14 +191,17 @@ public class SqlserverQueryProvider extends QueryProvider { String[] s = x.getFilter().stream().map(f -> { StringBuilder filter = new StringBuilder(); if (x.getDeType() == 1 && x.getDeExtractType() != 1) { - filter.append(" AND FROM_UNIXTIME(cast(") + filter.append(" AND FROM_UNIXTIME(cast(`") .append(x.getOriginName()) - .append(" AS decimal(20,0))/1000,'%Y-%m-%d %H:%i:%S') "); + .append("` AS DECIMAL(20,0))/1000,'%Y-%m-%d %H:%i:%S') "); } else { - filter.append(" AND ").append(x.getOriginName()); + filter.append(" AND `").append(x.getOriginName()).append("`"); } filter.append(transMysqlFilterTerm(f.getTerm())); - if (StringUtils.containsIgnoreCase(f.getTerm(), "null")) { + if (StringUtils.equalsIgnoreCase(f.getTerm(), "null")) { + filter.append("(null,'')"); + } else if (StringUtils.equalsIgnoreCase(f.getTerm(), "not_null")) { + filter.append(" AND `").append(x.getOriginName()).append("`").append(" <> ''"); } else if (StringUtils.containsIgnoreCase(f.getTerm(), "in")) { filter.append("('").append(StringUtils.join(f.getValue(), "','")).append("')"); } else if (StringUtils.containsIgnoreCase(f.getTerm(), "like")) { @@ -211,14 +231,19 @@ public class SqlserverQueryProvider extends QueryProvider { StringBuilder filter = new StringBuilder(); // 原始类型不是时间,在de中被转成时间的字段做处理 if (y.getDeType() == 1 && y.getDeExtractType() != 1) { - filter.append(" AND FROM_UNIXTIME(cast(_") - .append(y.getSummary()).append("_").append(StringUtils.equalsIgnoreCase(y.getOriginName(), "*") ? "" : y.getOriginName()) - .append(" AS decimal(20,0))/1000,'%Y-%m-%d %H:%i:%S') "); + filter.append(" AND FROM_UNIXTIME(CAST(`_") + .append(y.getSummary()).append("_").append(StringUtils.equalsIgnoreCase(y.getOriginName(), "*") ? "" : y.getOriginName()).append("`") + .append(" AS DECIMAL(20,0))/1000,'%Y-%m-%d %H:%i:%S') "); } else { - filter.append(" AND _").append(y.getSummary()).append("_").append(StringUtils.equalsIgnoreCase(y.getOriginName(), "*") ? "" : y.getOriginName()); + filter.append(" AND `_").append(y.getSummary()).append("_").append(StringUtils.equalsIgnoreCase(y.getOriginName(), "*") ? "" : y.getOriginName()).append("`"); } filter.append(transMysqlFilterTerm(f.getTerm())); - if (StringUtils.containsIgnoreCase(f.getTerm(), "null")) { + if (StringUtils.equalsIgnoreCase(f.getTerm(), "null")) { + filter.append("(null,'')"); + } else if (StringUtils.equalsIgnoreCase(f.getTerm(), "not_null")) { + filter.append(" AND `_") + .append(y.getSummary()).append("_").append(StringUtils.equalsIgnoreCase(y.getOriginName(), "*") ? "" : y.getOriginName()) + .append("`").append(" <> ''"); } else if (StringUtils.containsIgnoreCase(f.getTerm(), "in")) { filter.append("('").append(StringUtils.join(f.getValue(), "','")).append("')"); } else if (StringUtils.containsIgnoreCase(f.getTerm(), "like")) { @@ -233,9 +258,10 @@ public class SqlserverQueryProvider extends QueryProvider { if (resultFilter.length == 0) { return sql; } else { - String filterSql = MessageFormat.format("SELECT * FROM {0} WHERE 1=1 {1}", + String filterSql = MessageFormat.format("SELECT * FROM {0} WHERE 1=1 {1} ORDER BY {2}", "(" + sql + ") AS tmp", - StringUtils.join(resultFilter, " ")); + StringUtils.join(resultFilter, " "), + ObjectUtils.isNotEmpty(yOrder) ? StringUtils.join(yOrder, ",") : "null"); return filterSql; } } @@ -252,12 +278,83 @@ public class SqlserverQueryProvider extends QueryProvider { @Override public String getSQLSummary(String table, List yAxis, List customFilter, List extFilterRequestList) { - return null; + // 字段汇总 排序等 + String[] field = yAxis.stream().map(y -> { + StringBuilder f = new StringBuilder(); + if (StringUtils.equalsIgnoreCase(y.getOriginName(), "*")) { + f.append(y.getSummary()).append("(").append(y.getOriginName()).append(")"); + } else { + if (StringUtils.equalsIgnoreCase(y.getSummary(), "avg") || StringUtils.containsIgnoreCase(y.getSummary(), "pop")) { + f.append("CAST(") + .append(y.getSummary()).append("(") + .append("CAST(`").append(y.getOriginName()).append("` AS ").append(y.getDeType() == 2 ? "DECIMAL(20,0)" : "DECIMAL(20,2)").append(")") + .append(") AS DECIMAL(20,2)").append(")"); + } else { + f.append(y.getSummary()).append("(") + .append("CAST(`").append(y.getOriginName()).append("` AS ").append(y.getDeType() == 2 ? "DECIMAL(20,0)" : "DECIMAL(20,2)").append(")") + .append(")"); + } + } + f.append(" AS `_").append(y.getSummary()).append("_").append(StringUtils.equalsIgnoreCase(y.getOriginName(), "*") ? "" : y.getOriginName()).append("`"); + return f.toString(); + }).toArray(String[]::new); + + String[] order = yAxis.stream().filter(f -> StringUtils.isNotEmpty(f.getSort()) && !StringUtils.equalsIgnoreCase(f.getSort(), "none")) + .map(f -> "`_" + f.getSummary() + "_" + (StringUtils.equalsIgnoreCase(f.getOriginName(), "*") ? "" : f.getOriginName()) + "` " + f.getSort()).toArray(String[]::new); + + String sql = MessageFormat.format("SELECT {0} FROM {1} WHERE 1=1 {2} ORDER BY null,{3}", + StringUtils.join(field, ","), + table, + transCustomFilter(customFilter) + transExtFilter(extFilterRequestList),// origin field filter and panel field filter + StringUtils.join(order, ",")); + if (sql.endsWith(",")) { + sql = sql.substring(0, sql.length() - 1); + } + // 如果是对结果字段过滤,则再包裹一层sql + String[] resultFilter = yAxis.stream().filter(y -> CollectionUtils.isNotEmpty(y.getFilter()) && y.getFilter().size() > 0) + .map(y -> { + String[] s = y.getFilter().stream().map(f -> { + StringBuilder filter = new StringBuilder(); + // 原始类型不是时间,在de中被转成时间的字段做处理 + if (y.getDeType() == 1 && y.getDeExtractType() != 1) { + filter.append(" AND FROM_UNIXTIME(CAST(`_") + .append(y.getSummary()).append("_").append(StringUtils.equalsIgnoreCase(y.getOriginName(), "*") ? "" : y.getOriginName()).append("`") + .append(" AS DECIMAL(20,0))/1000,'%Y-%m-%d %H:%i:%S') "); + } else { + filter.append(" AND `_").append(y.getSummary()).append("_").append(StringUtils.equalsIgnoreCase(y.getOriginName(), "*") ? "" : y.getOriginName()).append("`"); + } + filter.append(transMysqlFilterTerm(f.getTerm())); + if (StringUtils.equalsIgnoreCase(f.getTerm(), "null")) { + filter.append("(null,'')"); + } else if (StringUtils.equalsIgnoreCase(f.getTerm(), "not_null")) { + filter.append(" AND `_") + .append(y.getSummary()).append("_").append(StringUtils.equalsIgnoreCase(y.getOriginName(), "*") ? "" : y.getOriginName()) + .append("`").append(" <> ''"); + } else if (StringUtils.containsIgnoreCase(f.getTerm(), "in")) { + filter.append("('").append(StringUtils.join(f.getValue(), "','")).append("')"); + } else if (StringUtils.containsIgnoreCase(f.getTerm(), "like")) { + filter.append("%").append(f.getValue()).append("%"); + } else { + filter.append("'").append(f.getValue()).append("'"); + } + return filter.toString(); + }).toArray(String[]::new); + return StringUtils.join(s, " "); + }).toArray(String[]::new); + if (resultFilter.length == 0) { + return sql; + } else { + String filterSql = MessageFormat.format("SELECT * FROM {0} WHERE 1=1 {1} ORDER BY {2}", + "(" + sql + ") AS tmp", + StringUtils.join(resultFilter, " "), + ObjectUtils.isNotEmpty(order) ? StringUtils.join(order, ",") : "null"); + return filterSql; + } } @Override - public String getSQLSummaryAsTmp(String table, List yAxis, List customFilter, List extFilterRequestList) { - return null; + public String getSQLSummaryAsTmp(String sql, List yAxis, List customFilter, List extFilterRequestList) { + return getSQLSummary(" (" + sqlFix(sql) + ") AS tmp ", yAxis, customFilter, extFilterRequestList); } @Override @@ -271,7 +368,7 @@ public class SqlserverQueryProvider extends QueryProvider { } @Override - public String createRawQuerySQL(String table, List fields){ + public String createRawQuerySQL(String table, List fields) { String[] array = fields.stream().map(f -> { StringBuilder stringBuilder = new StringBuilder(); stringBuilder.append("`").append(f.getOriginName()).append("` AS ").append(f.getDataeaseName()); @@ -308,9 +405,11 @@ public class SqlserverQueryProvider extends QueryProvider { case "not like": return " NOT LIKE "; case "null": - return " IS NULL "; + return " IN "; case "not_null": return " IS NOT NULL "; + case "between": + return " BETWEEN "; default: return ""; } @@ -324,17 +423,24 @@ public class SqlserverQueryProvider extends QueryProvider { for (ChartCustomFilterDTO request : requestList) { String value = request.getValue(); DatasetTableField field = request.getField(); + if (ObjectUtils.isEmpty(field)) { + continue; + } if (field.getDeType() == 1 && field.getDeExtractType() != 1) { - filter.append(" AND FROM_UNIXTIME(cast(") + filter.append(" AND FROM_UNIXTIME(CAST(`") .append(field.getOriginName()) - .append(" AS decimal(20,0))/1000,'%Y-%m-%d %H:%i:%S') "); + .append("` AS DECIMAL(20,0))/1000,'%Y-%m-%d %H:%i:%S') "); } else { - filter.append(" AND ").append(field.getOriginName()); + filter.append(" AND `").append(field.getOriginName()).append("`"); } filter.append(" ") .append(transMysqlFilterTerm(request.getTerm())) .append(" "); - if (StringUtils.containsIgnoreCase(request.getTerm(), "in")) { + if (StringUtils.equalsIgnoreCase(request.getTerm(), "null")) { + filter.append("(null,'')"); + } else if (StringUtils.equalsIgnoreCase(request.getTerm(), "not_null")) { + filter.append(" AND `").append(field.getOriginName()).append("`").append(" <> ''"); + } else if (StringUtils.containsIgnoreCase(request.getTerm(), "in")) { filter.append("('").append(StringUtils.join(value, "','")).append("')"); } else if (StringUtils.containsIgnoreCase(request.getTerm(), "like")) { filter.append("'%").append(value).append("%'"); @@ -357,11 +463,11 @@ public class SqlserverQueryProvider extends QueryProvider { } DatasetTableField field = request.getDatasetTableField(); if (field.getDeType() == 1 && field.getDeExtractType() != 1) { - filter.append(" AND FROM_UNIXTIME(cast(") + filter.append(" AND FROM_UNIXTIME(CAST(`") .append(field.getOriginName()) - .append(" AS decimal(20,0))/1000,'%Y-%m-%d %H:%i:%S') "); + .append("` AS DECIMAL(20,0))/1000,'%Y-%m-%d %H:%i:%S') "); } else { - filter.append(" AND ").append(field.getOriginName()); + filter.append(" AND `").append(field.getOriginName()).append("`"); } filter.append(" ") .append(transMysqlFilterTerm(request.getOperator())) @@ -370,6 +476,11 @@ public class SqlserverQueryProvider extends QueryProvider { filter.append("('").append(StringUtils.join(value, "','")).append("')"); } else if (StringUtils.containsIgnoreCase(request.getOperator(), "like")) { filter.append("'%").append(value.get(0)).append("%'"); + } else if (StringUtils.containsIgnoreCase(request.getOperator(), "between")) { + SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + String startTime = simpleDateFormat.format(new Date(Long.parseLong(value.get(0)))); + String endTime = simpleDateFormat.format(new Date(Long.parseLong(value.get(1)))); + filter.append("'").append(startTime).append("' AND '").append(endTime).append("'"); } else { filter.append("'").append(value.get(0)).append("'"); } @@ -383,4 +494,30 @@ public class SqlserverQueryProvider extends QueryProvider { } return sql; } + + private String transDateFormat(String dateStyle, String datePattern) { + String split = "-"; + if (StringUtils.equalsIgnoreCase(datePattern, "date_sub")) { + split = "-"; + } else if (StringUtils.equalsIgnoreCase(datePattern, "date_split")) { + split = "/"; + } + + switch (dateStyle) { + case "y": + return "%Y"; + case "y_M": + return "%Y" + split + "%m"; + case "y_M_d": + return "%Y" + split + "%m" + split + "%d"; + case "H_m_s": + return "%H:%i:%S"; + case "y_M_d_H_m": + return "%Y" + split + "%m" + split + "%d" + " %H:%i"; + case "y_M_d_H_m_s": + return "%Y" + split + "%m" + split + "%d" + " %H:%i:%S"; + default: + return "%Y-%m-%d %H:%i:%S"; + } + } } diff --git a/frontend/src/lang/en.js b/frontend/src/lang/en.js index 7005db5a13..161ad73a73 100644 --- a/frontend/src/lang/en.js +++ b/frontend/src/lang/en.js @@ -747,8 +747,8 @@ export default { chart_funnel: 'Funnel', chart_radar: 'Radar', chart_gauge: 'Gauge', - dateStyle: '日期顯示', - datePattern: '日期格式', + dateStyle: 'Date Style', + datePattern: 'Date Format', y: 'Year', y_M: 'Year Month', y_M_d: 'Year Month Day', @@ -788,7 +788,9 @@ export default { label_fontsize: 'Label Fontsize', split_line: 'Split Line', split_color: 'Split Color', - shadow: 'Shadow' + shadow: 'Shadow', + condition: 'Filter Value', + filter_value_can_null: 'Filter value can not empty' }, dataset: { sheet_warn: 'There are multiple sheet pages, and the first one is extracted by default', diff --git a/frontend/src/lang/tw.js b/frontend/src/lang/tw.js index a710479e05..d1e2b4ac50 100644 --- a/frontend/src/lang/tw.js +++ b/frontend/src/lang/tw.js @@ -788,7 +788,9 @@ export default { label_fontsize: '標簽大小', split_line: '分割線', split_color: '分割顏色', - shadow: '陰影' + shadow: '陰影', + condition: '過濾值', + filter_value_can_null: '過濾值不能為空' }, dataset: { sheet_warn: '有多個sheet頁面,默認抽取第一個', diff --git a/frontend/src/lang/zh.js b/frontend/src/lang/zh.js index 8ac6f042ea..5c6f80d34e 100644 --- a/frontend/src/lang/zh.js +++ b/frontend/src/lang/zh.js @@ -788,7 +788,9 @@ export default { label_fontsize: '标签大小', split_line: '分割线', split_color: '分割颜色', - shadow: '阴影' + shadow: '阴影', + condition: '过滤值', + filter_value_can_null: '过滤值不能为空' }, dataset: { sheet_warn: '有多个 Sheet 页,默认抽取第一个', diff --git a/frontend/src/views/chart/components/filter/DimensionFilterEditor.vue b/frontend/src/views/chart/components/filter/DimensionFilterEditor.vue index b9c4009f78..d6cca088f0 100644 --- a/frontend/src/views/chart/components/filter/DimensionFilterEditor.vue +++ b/frontend/src/views/chart/components/filter/DimensionFilterEditor.vue @@ -23,7 +23,7 @@ - + diff --git a/frontend/src/views/chart/components/filter/QuotaFilterEditor.vue b/frontend/src/views/chart/components/filter/QuotaFilterEditor.vue index 21eed17c5e..f5d1bf50ec 100644 --- a/frontend/src/views/chart/components/filter/QuotaFilterEditor.vue +++ b/frontend/src/views/chart/components/filter/QuotaFilterEditor.vue @@ -23,7 +23,7 @@ - + diff --git a/frontend/src/views/chart/components/filter/ResultFilterEditor.vue b/frontend/src/views/chart/components/filter/ResultFilterEditor.vue index 8084a27b89..bcbef5f0bb 100644 --- a/frontend/src/views/chart/components/filter/ResultFilterEditor.vue +++ b/frontend/src/views/chart/components/filter/ResultFilterEditor.vue @@ -37,7 +37,7 @@ - + diff --git a/frontend/src/views/chart/view/ChartEdit.vue b/frontend/src/views/chart/view/ChartEdit.vue index a62920ef9d..f6345a8a34 100644 --- a/frontend/src/views/chart/view/ChartEdit.vue +++ b/frontend/src/views/chart/view/ChartEdit.vue @@ -878,6 +878,17 @@ export default { this.dimensionFilterEdit = false }, saveDimensionFilter() { + for (let i = 0; i < this.dimensionItem.filter.length; i++) { + const f = this.dimensionItem.filter[i] + if (!f.term.includes('null') && (!f.value || f.value === '')) { + this.$message({ + message: this.$t('chart.filter_value_can_null'), + type: 'error', + showClose: true + }) + return + } + } this.view.xaxis[this.dimensionItem.index].filter = this.dimensionItem.filter this.save(true) this.closeDimensionFilter() @@ -891,6 +902,17 @@ export default { this.quotaFilterEdit = false }, saveQuotaFilter() { + for (let i = 0; i < this.quotaItem.filter.length; i++) { + const f = this.quotaItem.filter[i] + if (!f.term.includes('null') && (!f.value || f.value === '')) { + this.$message({ + message: this.$t('chart.filter_value_can_null'), + type: 'error', + showClose: true + }) + return + } + } this.view.yaxis[this.quotaItem.index].filter = this.quotaItem.filter this.save(true) this.closeQuotaFilter() @@ -914,6 +936,14 @@ export default { }) return } + if (!f.term.includes('null') && (!f.value || f.value === '')) { + this.$message({ + message: this.$t('chart.filter_value_can_null'), + type: 'error', + showClose: true + }) + return + } } this.view.customFilter = this.chartForFilter.customFilter this.save(true)