提交 5e9cf037 authored 作者: junjie's avatar junjie

fix: 视图过滤不能设置无限制

上级 d6bd924e
...@@ -190,7 +190,10 @@ public class MysqlQueryProvider extends QueryProvider { ...@@ -190,7 +190,10 @@ public class MysqlQueryProvider extends QueryProvider {
filter.append(" AND `").append(x.getOriginName()).append("`"); filter.append(" AND `").append(x.getOriginName()).append("`");
} }
filter.append(transMysqlFilterTerm(f.getTerm())); 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")) { } else if (StringUtils.containsIgnoreCase(f.getTerm(), "in")) {
filter.append("('").append(StringUtils.join(f.getValue(), "','")).append("')"); filter.append("('").append(StringUtils.join(f.getValue(), "','")).append("')");
} else if (StringUtils.containsIgnoreCase(f.getTerm(), "like")) { } else if (StringUtils.containsIgnoreCase(f.getTerm(), "like")) {
...@@ -227,7 +230,12 @@ public class MysqlQueryProvider extends QueryProvider { ...@@ -227,7 +230,12 @@ public class MysqlQueryProvider extends QueryProvider {
filter.append(" AND `_").append(y.getSummary()).append("_").append(StringUtils.equalsIgnoreCase(y.getOriginName(), "*") ? "" : y.getOriginName()).append("`"); filter.append(" AND `_").append(y.getSummary()).append("_").append(StringUtils.equalsIgnoreCase(y.getOriginName(), "*") ? "" : y.getOriginName()).append("`");
} }
filter.append(transMysqlFilterTerm(f.getTerm())); 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")) { } else if (StringUtils.containsIgnoreCase(f.getTerm(), "in")) {
filter.append("('").append(StringUtils.join(f.getValue(), "','")).append("')"); filter.append("('").append(StringUtils.join(f.getValue(), "','")).append("')");
} else if (StringUtils.containsIgnoreCase(f.getTerm(), "like")) { } else if (StringUtils.containsIgnoreCase(f.getTerm(), "like")) {
...@@ -308,7 +316,12 @@ public class MysqlQueryProvider extends QueryProvider { ...@@ -308,7 +316,12 @@ public class MysqlQueryProvider extends QueryProvider {
filter.append(" AND `_").append(y.getSummary()).append("_").append(StringUtils.equalsIgnoreCase(y.getOriginName(), "*") ? "" : y.getOriginName()).append("`"); filter.append(" AND `_").append(y.getSummary()).append("_").append(StringUtils.equalsIgnoreCase(y.getOriginName(), "*") ? "" : y.getOriginName()).append("`");
} }
filter.append(transMysqlFilterTerm(f.getTerm())); 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")) { } else if (StringUtils.containsIgnoreCase(f.getTerm(), "in")) {
filter.append("('").append(StringUtils.join(f.getValue(), "','")).append("')"); filter.append("('").append(StringUtils.join(f.getValue(), "','")).append("')");
} else if (StringUtils.containsIgnoreCase(f.getTerm(), "like")) { } else if (StringUtils.containsIgnoreCase(f.getTerm(), "like")) {
...@@ -347,7 +360,7 @@ public class MysqlQueryProvider extends QueryProvider { ...@@ -347,7 +360,7 @@ public class MysqlQueryProvider extends QueryProvider {
} }
@Override @Override
public String createRawQuerySQL(String table, List<DatasetTableField> fields){ public String createRawQuerySQL(String table, List<DatasetTableField> fields) {
String[] array = fields.stream().map(f -> { String[] array = fields.stream().map(f -> {
StringBuilder stringBuilder = new StringBuilder(); StringBuilder stringBuilder = new StringBuilder();
stringBuilder.append("`").append(f.getOriginName()).append("` AS ").append(f.getDataeaseName()); stringBuilder.append("`").append(f.getOriginName()).append("` AS ").append(f.getDataeaseName());
...@@ -384,7 +397,7 @@ public class MysqlQueryProvider extends QueryProvider { ...@@ -384,7 +397,7 @@ public class MysqlQueryProvider extends QueryProvider {
case "not like": case "not like":
return " NOT LIKE "; return " NOT LIKE ";
case "null": case "null":
return " IS NULL "; return " IN ";
case "not_null": case "not_null":
return " IS NOT NULL "; return " IS NOT NULL ";
case "between": case "between":
...@@ -415,7 +428,10 @@ public class MysqlQueryProvider extends QueryProvider { ...@@ -415,7 +428,10 @@ public class MysqlQueryProvider extends QueryProvider {
filter.append(" ") filter.append(" ")
.append(transMysqlFilterTerm(request.getTerm())) .append(transMysqlFilterTerm(request.getTerm()))
.append(" "); .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")) { } else if (StringUtils.containsIgnoreCase(request.getTerm(), "in")) {
filter.append("('").append(StringUtils.join(value, "','")).append("')"); filter.append("('").append(StringUtils.join(value, "','")).append("')");
} else if (StringUtils.containsIgnoreCase(request.getTerm(), "like")) { } else if (StringUtils.containsIgnoreCase(request.getTerm(), "like")) {
......
...@@ -6,31 +6,31 @@ import io.dataease.dto.chart.ChartCustomFilterDTO; ...@@ -6,31 +6,31 @@ import io.dataease.dto.chart.ChartCustomFilterDTO;
import io.dataease.dto.chart.ChartViewFieldDTO; import io.dataease.dto.chart.ChartViewFieldDTO;
import io.dataease.provider.QueryProvider; import io.dataease.provider.QueryProvider;
import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.lang3.ObjectUtils;
import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import java.text.MessageFormat; import java.text.MessageFormat;
import java.text.SimpleDateFormat;
import java.util.Arrays; import java.util.Arrays;
import java.util.Date;
import java.util.List; import java.util.List;
/** /**
* @Author gin * @Author gin
* @Date 2021/5/17 2:43 下午 * @Date 2021/5/17 2:43 下午
*/ */
@Service("sqlserverQuery") @Service("sqlServerQuery")
public class SqlserverQueryProvider extends QueryProvider { public class SqlserverQueryProvider extends QueryProvider {
@Override @Override
public Integer transFieldType(String field) { public Integer transFieldType(String field) {
switch (field.toUpperCase()) { switch (field) {
case "CHAR": case "CHAR":
case "VARCHAR": case "VARCHAR":
case "TEXT": case "TEXT":
case "TINYTEXT": case "TINYTEXT":
case "MEDIUMTEXT": case "MEDIUMTEXT":
case "LONGTEXT": case "LONGTEXT":
case "NCHAR":
case "NVARCHAR":
case "NTEXT":
case "ENUM": case "ENUM":
return 0;// 文本 return 0;// 文本
case "DATE": case "DATE":
...@@ -59,7 +59,7 @@ public class SqlserverQueryProvider extends QueryProvider { ...@@ -59,7 +59,7 @@ public class SqlserverQueryProvider extends QueryProvider {
@Override @Override
public String createQueryCountSQL(String table) { public String createQueryCountSQL(String table) {
return MessageFormat.format("SELECT count(*) FROM {0}", table); return MessageFormat.format("SELECT COUNT(*) FROM {0}", table);
} }
@Override @Override
...@@ -69,7 +69,7 @@ public class SqlserverQueryProvider extends QueryProvider { ...@@ -69,7 +69,7 @@ public class SqlserverQueryProvider extends QueryProvider {
@Override @Override
public String createSQLPreview(String sql, String orderBy) { 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 @Override
...@@ -79,21 +79,30 @@ public class SqlserverQueryProvider extends QueryProvider { ...@@ -79,21 +79,30 @@ public class SqlserverQueryProvider extends QueryProvider {
// 如果原始类型为时间 // 如果原始类型为时间
if (f.getDeExtractType() == 1) { if (f.getDeExtractType() == 1) {
if (f.getDeType() == 2 || f.getDeType() == 3) { 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 { } 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 { } else {
if (f.getDeType() == 1) { 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 { } else {
stringBuilder.append(f.getOriginName()); stringBuilder.append("`").append(f.getOriginName()).append("` AS ").append(f.getDataeaseName());
} }
} }
return stringBuilder.toString(); return stringBuilder.toString();
}).toArray(String[]::new); }).toArray(String[]::new);
return MessageFormat.format("SELECT {0} FROM {1} ORDER BY null", StringUtils.join(array, ","), table);
return MessageFormat.format("SELECT {0} FROM {1} ORDER BY " + (fields.size() > 0 ? fields.get(0).getOriginName() : "null"), StringUtils.join(array, ","), table);
} }
@Override @Override
...@@ -103,7 +112,7 @@ public class SqlserverQueryProvider extends QueryProvider { ...@@ -103,7 +112,7 @@ public class SqlserverQueryProvider extends QueryProvider {
@Override @Override
public String createQuerySQLWithPage(String table, List<DatasetTableField> fields, Integer page, Integer pageSize, Integer realSize) { public String createQuerySQLWithPage(String table, List<DatasetTableField> 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 @Override
...@@ -122,15 +131,15 @@ public class SqlserverQueryProvider extends QueryProvider { ...@@ -122,15 +131,15 @@ public class SqlserverQueryProvider extends QueryProvider {
if (StringUtils.equalsIgnoreCase(y.getSummary(), "avg") || StringUtils.containsIgnoreCase(y.getSummary(), "pop")) { if (StringUtils.equalsIgnoreCase(y.getSummary(), "avg") || StringUtils.containsIgnoreCase(y.getSummary(), "pop")) {
f.append("CAST(") f.append("CAST(")
.append(y.getSummary()).append("(") .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(")"); .append(") AS DECIMAL(20,2)").append(")");
} else { } else {
f.append(y.getSummary()).append("(") 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(")"); .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(); return f.toString();
}).toArray(String[]::new); }).toArray(String[]::new);
String[] groupField = xAxis.stream().map(x -> { String[] groupField = xAxis.stream().map(x -> {
...@@ -138,24 +147,32 @@ public class SqlserverQueryProvider extends QueryProvider { ...@@ -138,24 +147,32 @@ public class SqlserverQueryProvider extends QueryProvider {
// 如果原始类型为时间 // 如果原始类型为时间
if (x.getDeExtractType() == 1) { if (x.getDeExtractType() == 1) {
if (x.getDeType() == 2 || x.getDeType() == 3) { 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 { } else {
stringBuilder.append(x.getOriginName()); stringBuilder.append("`").append(x.getOriginName()).append("` AS `_").append(x.getOriginName()).append("`");
} }
} else { } else {
if (x.getDeType() == 1) { 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 { } else {
stringBuilder.append(x.getOriginName()); 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("`").append(x.getOriginName()).append("` AS `_").append(x.getOriginName()).append("`");
} }
} }
return stringBuilder.toString(); return stringBuilder.toString();
}).toArray(String[]::new); }).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")) 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")) 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); String[] order = Arrays.copyOf(xOrder, xOrder.length + yOrder.length);
System.arraycopy(yOrder, 0, order, xOrder.length, yOrder.length); System.arraycopy(yOrder, 0, order, xOrder.length, yOrder.length);
...@@ -164,14 +181,17 @@ public class SqlserverQueryProvider extends QueryProvider { ...@@ -164,14 +181,17 @@ public class SqlserverQueryProvider extends QueryProvider {
String[] s = x.getFilter().stream().map(f -> { String[] s = x.getFilter().stream().map(f -> {
StringBuilder filter = new StringBuilder(); StringBuilder filter = new StringBuilder();
if (x.getDeType() == 1 && x.getDeExtractType() != 1) { if (x.getDeType() == 1 && x.getDeExtractType() != 1) {
filter.append(" AND FROM_UNIXTIME(cast(") filter.append(" AND FROM_UNIXTIME(cast(`")
.append(x.getOriginName()) .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 { } else {
filter.append(" AND ").append(x.getOriginName()); filter.append(" AND `").append(x.getOriginName()).append("`");
} }
filter.append(transMysqlFilterTerm(f.getTerm())); 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")) { } else if (StringUtils.containsIgnoreCase(f.getTerm(), "in")) {
filter.append("('").append(StringUtils.join(f.getValue(), "','")).append("')"); filter.append("('").append(StringUtils.join(f.getValue(), "','")).append("')");
} else if (StringUtils.containsIgnoreCase(f.getTerm(), "like")) { } else if (StringUtils.containsIgnoreCase(f.getTerm(), "like")) {
...@@ -201,14 +221,19 @@ public class SqlserverQueryProvider extends QueryProvider { ...@@ -201,14 +221,19 @@ public class SqlserverQueryProvider extends QueryProvider {
StringBuilder filter = new StringBuilder(); StringBuilder filter = new StringBuilder();
// 原始类型不是时间,在de中被转成时间的字段做处理 // 原始类型不是时间,在de中被转成时间的字段做处理
if (y.getDeType() == 1 && y.getDeExtractType() != 1) { if (y.getDeType() == 1 && y.getDeExtractType() != 1) {
filter.append(" AND FROM_UNIXTIME(cast(_") filter.append(" AND FROM_UNIXTIME(CAST(`_")
.append(y.getSummary()).append("_").append(StringUtils.equalsIgnoreCase(y.getOriginName(), "*") ? "" : y.getOriginName()) .append(y.getSummary()).append("_").append(StringUtils.equalsIgnoreCase(y.getOriginName(), "*") ? "" : y.getOriginName()).append("`")
.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 { } 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())); 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")) { } else if (StringUtils.containsIgnoreCase(f.getTerm(), "in")) {
filter.append("('").append(StringUtils.join(f.getValue(), "','")).append("')"); filter.append("('").append(StringUtils.join(f.getValue(), "','")).append("')");
} else if (StringUtils.containsIgnoreCase(f.getTerm(), "like")) { } else if (StringUtils.containsIgnoreCase(f.getTerm(), "like")) {
...@@ -223,9 +248,10 @@ public class SqlserverQueryProvider extends QueryProvider { ...@@ -223,9 +248,10 @@ public class SqlserverQueryProvider extends QueryProvider {
if (resultFilter.length == 0) { if (resultFilter.length == 0) {
return sql; return sql;
} else { } 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", "(" + sql + ") AS tmp",
StringUtils.join(resultFilter, " ")); StringUtils.join(resultFilter, " "),
ObjectUtils.isNotEmpty(yOrder) ? StringUtils.join(yOrder, ",") : "null");
return filterSql; return filterSql;
} }
} }
...@@ -242,12 +268,83 @@ public class SqlserverQueryProvider extends QueryProvider { ...@@ -242,12 +268,83 @@ public class SqlserverQueryProvider extends QueryProvider {
@Override @Override
public String getSQLSummary(String table, List<ChartViewFieldDTO> yAxis, List<ChartCustomFilterDTO> customFilter, List<ChartExtFilterRequest> extFilterRequestList) { public String getSQLSummary(String table, List<ChartViewFieldDTO> yAxis, List<ChartCustomFilterDTO> customFilter, List<ChartExtFilterRequest> 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 @Override
public String getSQLSummaryAsTmp(String table, List<ChartViewFieldDTO> yAxis, List<ChartCustomFilterDTO> customFilter, List<ChartExtFilterRequest> extFilterRequestList) { public String getSQLSummaryAsTmp(String sql, List<ChartViewFieldDTO> yAxis, List<ChartCustomFilterDTO> customFilter, List<ChartExtFilterRequest> extFilterRequestList) {
return null; return getSQLSummary(" (" + sqlFix(sql) + ") AS tmp ", yAxis, customFilter, extFilterRequestList);
} }
@Override @Override
...@@ -261,7 +358,7 @@ public class SqlserverQueryProvider extends QueryProvider { ...@@ -261,7 +358,7 @@ public class SqlserverQueryProvider extends QueryProvider {
} }
@Override @Override
public String createRawQuerySQL(String table, List<DatasetTableField> fields){ public String createRawQuerySQL(String table, List<DatasetTableField> fields) {
String[] array = fields.stream().map(f -> { String[] array = fields.stream().map(f -> {
StringBuilder stringBuilder = new StringBuilder(); StringBuilder stringBuilder = new StringBuilder();
stringBuilder.append("`").append(f.getOriginName()).append("` AS ").append(f.getDataeaseName()); stringBuilder.append("`").append(f.getOriginName()).append("` AS ").append(f.getDataeaseName());
...@@ -298,9 +395,11 @@ public class SqlserverQueryProvider extends QueryProvider { ...@@ -298,9 +395,11 @@ public class SqlserverQueryProvider extends QueryProvider {
case "not like": case "not like":
return " NOT LIKE "; return " NOT LIKE ";
case "null": case "null":
return " IS NULL "; return " IN ";
case "not_null": case "not_null":
return " IS NOT NULL "; return " IS NOT NULL ";
case "between":
return " BETWEEN ";
default: default:
return ""; return "";
} }
...@@ -314,17 +413,24 @@ public class SqlserverQueryProvider extends QueryProvider { ...@@ -314,17 +413,24 @@ public class SqlserverQueryProvider extends QueryProvider {
for (ChartCustomFilterDTO request : requestList) { for (ChartCustomFilterDTO request : requestList) {
String value = request.getValue(); String value = request.getValue();
DatasetTableField field = request.getField(); DatasetTableField field = request.getField();
if (ObjectUtils.isEmpty(field)) {
continue;
}
if (field.getDeType() == 1 && field.getDeExtractType() != 1) { if (field.getDeType() == 1 && field.getDeExtractType() != 1) {
filter.append(" AND FROM_UNIXTIME(cast(") filter.append(" AND FROM_UNIXTIME(CAST(`")
.append(field.getOriginName()) .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 { } else {
filter.append(" AND ").append(field.getOriginName()); filter.append(" AND `").append(field.getOriginName()).append("`");
} }
filter.append(" ") filter.append(" ")
.append(transMysqlFilterTerm(request.getTerm())) .append(transMysqlFilterTerm(request.getTerm()))
.append(" "); .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("')"); filter.append("('").append(StringUtils.join(value, "','")).append("')");
} else if (StringUtils.containsIgnoreCase(request.getTerm(), "like")) { } else if (StringUtils.containsIgnoreCase(request.getTerm(), "like")) {
filter.append("'%").append(value).append("%'"); filter.append("'%").append(value).append("%'");
...@@ -347,11 +453,11 @@ public class SqlserverQueryProvider extends QueryProvider { ...@@ -347,11 +453,11 @@ public class SqlserverQueryProvider extends QueryProvider {
} }
DatasetTableField field = request.getDatasetTableField(); DatasetTableField field = request.getDatasetTableField();
if (field.getDeType() == 1 && field.getDeExtractType() != 1) { if (field.getDeType() == 1 && field.getDeExtractType() != 1) {
filter.append(" AND FROM_UNIXTIME(cast(") filter.append(" AND FROM_UNIXTIME(CAST(`")
.append(field.getOriginName()) .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 { } else {
filter.append(" AND ").append(field.getOriginName()); filter.append(" AND `").append(field.getOriginName()).append("`");
} }
filter.append(" ") filter.append(" ")
.append(transMysqlFilterTerm(request.getOperator())) .append(transMysqlFilterTerm(request.getOperator()))
...@@ -360,6 +466,11 @@ public class SqlserverQueryProvider extends QueryProvider { ...@@ -360,6 +466,11 @@ public class SqlserverQueryProvider extends QueryProvider {
filter.append("('").append(StringUtils.join(value, "','")).append("')"); filter.append("('").append(StringUtils.join(value, "','")).append("')");
} else if (StringUtils.containsIgnoreCase(request.getOperator(), "like")) { } else if (StringUtils.containsIgnoreCase(request.getOperator(), "like")) {
filter.append("'%").append(value.get(0)).append("%'"); 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 { } else {
filter.append("'").append(value.get(0)).append("'"); filter.append("'").append(value.get(0)).append("'");
} }
...@@ -373,4 +484,30 @@ public class SqlserverQueryProvider extends QueryProvider { ...@@ -373,4 +484,30 @@ public class SqlserverQueryProvider extends QueryProvider {
} }
return sql; 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";
}
}
} }
...@@ -718,7 +718,9 @@ export default { ...@@ -718,7 +718,9 @@ export default {
chartName: 'New Chart', chartName: 'New Chart',
chart_show_error: 'can not show normal', chart_show_error: 'can not show normal',
chart_error_tips: 'Please contact admin ', chart_error_tips: 'Please contact admin ',
title_cannot_empty: 'Title can not be empty' title_cannot_empty: 'Title can not be empty',
condition: 'Filter Value',
filter_value_can_null: 'Filter value can not empty'
}, },
dataset: { dataset: {
sheet_warn: 'There are multiple sheet pages, and the first one is extracted by default', sheet_warn: 'There are multiple sheet pages, and the first one is extracted by default',
......
...@@ -760,7 +760,9 @@ export default { ...@@ -760,7 +760,9 @@ export default {
chartName: '新建視圖', chartName: '新建視圖',
chart_show_error: '無法正常顯示', chart_show_error: '無法正常顯示',
chart_error_tips: '如有疑問請聯系管理員', chart_error_tips: '如有疑問請聯系管理員',
title_cannot_empty: '標題不能為空' title_cannot_empty: '標題不能為空',
condition: '過濾值',
filter_value_can_null: '過濾值不能為空'
}, },
dataset: { dataset: {
sheet_warn: '有多個sheet頁面,默認抽取第一個', sheet_warn: '有多個sheet頁面,默認抽取第一個',
......
...@@ -718,7 +718,9 @@ export default { ...@@ -718,7 +718,9 @@ export default {
chartName: '新建视图', chartName: '新建视图',
chart_show_error: '无法正常显示', chart_show_error: '无法正常显示',
chart_error_tips: '如有疑问请联系管理员', chart_error_tips: '如有疑问请联系管理员',
title_cannot_empty: '标题不能为空' title_cannot_empty: '标题不能为空',
condition: '过滤值',
filter_value_can_null: '过滤值不能为空'
}, },
dataset: { dataset: {
sheet_warn: '有多个 Sheet 页,默认抽取第一个', sheet_warn: '有多个 Sheet 页,默认抽取第一个',
......
...@@ -23,7 +23,7 @@ ...@@ -23,7 +23,7 @@
</el-select> </el-select>
</el-col> </el-col>
<el-col :span="6"> <el-col :span="6">
<el-input v-show="!f.term.includes('null')" v-model="f.value" class="value-item" :placeholder="$t('chart.no_limit')" size="mini" clearable /> <el-input v-show="!f.term.includes('null')" v-model="f.value" class="value-item" :placeholder="$t('chart.condition')" size="mini" clearable />
</el-col> </el-col>
<el-col :span="6"> <el-col :span="6">
<el-button type="text" icon="el-icon-delete" circle style="float: right" @click="removeFilter(index)" /> <el-button type="text" icon="el-icon-delete" circle style="float: right" @click="removeFilter(index)" />
......
...@@ -23,7 +23,7 @@ ...@@ -23,7 +23,7 @@
</el-select> </el-select>
</el-col> </el-col>
<el-col :span="6"> <el-col :span="6">
<el-input v-show="!f.term.includes('null')" v-model="f.value" class="value-item" :placeholder="$t('chart.no_limit')" size="mini" clearable /> <el-input v-show="!f.term.includes('null')" v-model="f.value" class="value-item" :placeholder="$t('chart.condition')" size="mini" clearable />
</el-col> </el-col>
<el-col :span="6"> <el-col :span="6">
<el-button type="text" icon="el-icon-delete" circle style="float: right" @click="removeFilter(index)" /> <el-button type="text" icon="el-icon-delete" circle style="float: right" @click="removeFilter(index)" />
......
...@@ -37,7 +37,7 @@ ...@@ -37,7 +37,7 @@
</el-select> </el-select>
</el-col> </el-col>
<el-col :span="6"> <el-col :span="6">
<el-input v-show="!f.term.includes('null')" v-model="f.value" class="value-item" :placeholder="$t('chart.no_limit')" size="mini" clearable /> <el-input v-show="!f.term.includes('null')" v-model="f.value" class="value-item" :placeholder="$t('chart.condition')" size="mini" clearable />
</el-col> </el-col>
<el-col :span="6"> <el-col :span="6">
<el-button type="text" icon="el-icon-delete" circle style="float: right" @click="removeFilter(index)" /> <el-button type="text" icon="el-icon-delete" circle style="float: right" @click="removeFilter(index)" />
......
...@@ -843,6 +843,17 @@ export default { ...@@ -843,6 +843,17 @@ export default {
this.dimensionFilterEdit = false this.dimensionFilterEdit = false
}, },
saveDimensionFilter() { 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.view.xaxis[this.dimensionItem.index].filter = this.dimensionItem.filter
this.save(true) this.save(true)
this.closeDimensionFilter() this.closeDimensionFilter()
...@@ -856,6 +867,17 @@ export default { ...@@ -856,6 +867,17 @@ export default {
this.quotaFilterEdit = false this.quotaFilterEdit = false
}, },
saveQuotaFilter() { 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.view.yaxis[this.quotaItem.index].filter = this.quotaItem.filter
this.save(true) this.save(true)
this.closeQuotaFilter() this.closeQuotaFilter()
...@@ -879,6 +901,14 @@ export default { ...@@ -879,6 +901,14 @@ export default {
}) })
return 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.view.customFilter = this.chartForFilter.customFilter
this.save(true) this.save(true)
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论