From 96e6ab150c1be9bc144ccda6c4d9c6ef73dfde80 Mon Sep 17 00:00:00 2001 From: taojinlong Date: Mon, 2 Aug 2021 14:30:35 +0800 Subject: [PATCH 01/16] =?UTF-8?q?=E6=94=AF=E6=8C=81=20sqlserver?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../sqlserver/SqlServerSQLConstants.java | 41 + .../sqlserver/SqlserverQueryProvider.java | 1275 ++++++++++------- 2 files changed, 783 insertions(+), 533 deletions(-) create mode 100644 backend/src/main/java/io/dataease/provider/sqlserver/SqlServerSQLConstants.java diff --git a/backend/src/main/java/io/dataease/provider/sqlserver/SqlServerSQLConstants.java b/backend/src/main/java/io/dataease/provider/sqlserver/SqlServerSQLConstants.java new file mode 100644 index 0000000000..3a93536ecd --- /dev/null +++ b/backend/src/main/java/io/dataease/provider/sqlserver/SqlServerSQLConstants.java @@ -0,0 +1,41 @@ +package io.dataease.provider.sqlserver; + +import io.dataease.provider.SQLConstants; + +import static io.dataease.datasource.constants.DatasourceTypes.mysql; + +/** + * @Author gin + * @Date 2021/7/8 7:22 下午 + */ +public class SqlServerSQLConstants extends SQLConstants { + public static final String KEYWORD_TABLE = mysql.getKeywordPrefix() + "%s" + mysql.getKeywordSuffix(); + + public static final String KEYWORD_FIX = "%s." + mysql.getKeywordPrefix() + "%s" + mysql.getKeywordSuffix(); + + public static final String UNIX_TIMESTAMP = "UNIX_TIMESTAMP(%s)"; + + public static final String DATE_FORMAT = "DATE_FORMAT(%s,'%s')"; + + public static final String FROM_UNIXTIME = "FROM_UNIXTIME(%s,'%s')"; + + public static final String CAST = "CAST(%s AS %s)"; + + public static final String DEFAULT_DATE_FORMAT = "%Y-%m-%d %H:%i:%S"; + + public static final String DEFAULT_INT_FORMAT = "DECIMAL(20,0)"; + + public static final String DEFAULT_FLOAT_FORMAT = "DECIMAL(20,2)"; + + public static final String WHERE_VALUE_NULL = "(NULL,'')"; + + public static final String WHERE_VALUE_VALUE = "'%s'"; + + public static final String AGG_COUNT = "COUNT(*)"; + + public static final String AGG_FIELD = "%s(%s)"; + + public static final String WHERE_BETWEEN = "'%s' AND '%s'"; + + public static final String BRACKETS = "(%s)"; +} 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 2096399f82..7c81918cbb 100644 --- a/backend/src/main/java/io/dataease/provider/sqlserver/SqlserverQueryProvider.java +++ b/backend/src/main/java/io/dataease/provider/sqlserver/SqlserverQueryProvider.java @@ -1,533 +1,742 @@ -//package io.dataease.provider.sqlserver; -// -//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 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") -//public class SqlserverQueryProvider extends QueryProvider { -// @Override -// public Integer transFieldType(String field) { -// switch (field) { -// case "CHAR": -// case "VARCHAR": -// case "TEXT": -// case "TINYTEXT": -// case "MEDIUMTEXT": -// case "LONGTEXT": -// case "ENUM": -// return 0;// 文本 -// case "DATE": -// case "TIME": -// case "YEAR": -// case "DATETIME": -// case "TIMESTAMP": -// return 1;// 时间 -// case "INT": -// case "SMALLINT": -// case "MEDIUMINT": -// case "INTEGER": -// case "BIGINT": -// return 2;// 整型 -// case "FLOAT": -// case "DOUBLE": -// case "DECIMAL": -// return 3;// 浮点 -// case "BIT": -// case "TINYINT": -// return 4;// 布尔 -// default: -// return 0; -// } -// } -// -// @Override -// public String createQueryCountSQL(String table) { -// return MessageFormat.format("SELECT COUNT(*) FROM {0}", table); -// } -// -// @Override -// public String createQueryCountSQLAsTmp(String sql) { -// return createQueryCountSQL(" (" + sqlFix(sql) + ") AS tmp "); -// } -// -// @Override -// public String createSQLPreview(String sql, String orderBy) { -// return "SELECT * FROM (" + sqlFix(sql) + ") AS tmp ORDER BY null " + " LIMIT 0,1000"; -// } -// -// @Override -// public String createQuerySQL(String table, List fields) { -// String[] array = fields.stream().map(f -> { -// StringBuilder stringBuilder = new StringBuilder(); -// // 如果原始类型为时间 -// if (f.getDeExtractType() == 1) { -// if (f.getDeType() == 2 || f.getDeType() == 3) { -// stringBuilder.append("UNIX_TIMESTAMP(`").append(f.getOriginName()).append("`)*1000 AS ").append(f.getDataeaseName()); -// } else { -// 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.getDataeaseName()); -// } else { -// 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 null", StringUtils.join(array, ","), table); -// } -// -// @Override -// public String createQuerySQLAsTmp(String sql, List fields) { -// return createQuerySQL(" (" + sqlFix(sql) + ") AS tmp ", fields); -// } -// -// @Override -// public String createQuerySQLWithPage(String table, List fields, Integer page, Integer pageSize, Integer realSize) { -// return createQuerySQL(table, fields) + " LIMIT " + (page - 1) * pageSize + "," + realSize; -// } -// -// @Override -// public String createQueryTableWithLimit(String table, List fields, Integer limit) { -// return createQuerySQL(table, fields) + " LIMIT 0," + limit; -// } -// -// @Override -// public String createQuerySqlWithLimit(String sql, List fields, Integer limit) { -// return createQuerySQLAsTmp(sql, fields) + " LIMIT 0," + limit; -// } -// -// @Override -// public String createQuerySQLAsTmpWithPage(String sql, List fields, Integer page, Integer pageSize, Integer realSize) { -// return createQuerySQLAsTmp(sql, fields) + " LIMIT " + (page - 1) * pageSize + "," + realSize; -// } -// -// @Override -// public String getSQL(String table, List xAxis, List yAxis, List customFilter, List extFilterRequestList) { -// // 字段汇总 排序等 -// 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[] groupField = xAxis.stream().map(x -> { -// StringBuilder stringBuilder = new StringBuilder(); -// // 如果原始类型为时间 -// if (x.getDeExtractType() == 1) { -// if (x.getDeType() == 2 || x.getDeType() == 3) { -// 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("`").append(x.getOriginName()).append("` AS `_").append(x.getOriginName()).append("`"); -// } -// } else { -// if (x.getDeType() == 1) { -// 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("`").append(x.getOriginName()).append("` AS `_").append(x.getOriginName()).append("`"); -// } -// } -// return stringBuilder.toString(); -// }).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); -// 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); -// String[] order = Arrays.copyOf(xOrder, xOrder.length + yOrder.length); -// System.arraycopy(yOrder, 0, order, xOrder.length, yOrder.length); -// -// String[] xFilter = xAxis.stream().filter(x -> CollectionUtils.isNotEmpty(x.getFilter()) && x.getFilter().size() > 0) -// .map(x -> { -// String[] s = x.getFilter().stream().map(f -> { -// StringBuilder filter = new StringBuilder(); -// if (x.getDeType() == 1 && x.getDeExtractType() != 1) { -// filter.append(" AND FROM_UNIXTIME(cast(`") -// .append(x.getOriginName()) -// .append("` AS DECIMAL(20,0))/1000,'%Y-%m-%d %H:%i:%S') "); -// } else { -// filter.append(" AND `").append(x.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(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")) { -// 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); -// -// String sql = MessageFormat.format("SELECT {0},{1} FROM {2} WHERE 1=1 {3} GROUP BY {4} ORDER BY null,{5}", -// StringUtils.join(groupField, ","), -// StringUtils.join(field, ","), -// table, -// (xFilter.length > 0 ? StringUtils.join(xFilter, " ") : "") + transCustomFilter(customFilter) + transExtFilter(extFilterRequestList),// origin field filter and panel field filter -// StringUtils.join(group, ","), -// 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(yOrder) ? StringUtils.join(yOrder, ",") : "null"); -// return filterSql; -// } -// } -// -// @Override -// public String getSQLAsTmp(String sql, List xAxis, List yAxis, List customFilter, List extFilterRequestList) { -// return getSQL(" (" + sqlFix(sql) + ") AS tmp ", xAxis, yAxis, customFilter, extFilterRequestList); -// } -// -// @Override -// public String getSQLStack(String table, List xAxis, List yAxis, List customFilter, List extFilterRequestList, List extStack) { -// return null; -// } -// -// @Override -// public String getSQLAsTmpStack(String table, List xAxis, List yAxis, List customFilter, List extFilterRequestList, List extStack) { -// return null; -// } -// -// @Override -// public String searchTable(String table) { -// return "SELECT table_name FROM information_schema.TABLES WHERE table_name ='" + table + "'"; -// } -// -// @Override -// public String getSQLSummary(String table, List yAxis, List customFilter, List extFilterRequestList) { -// // 字段汇总 排序等 -// 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 sql, List yAxis, List customFilter, List extFilterRequestList) { -// return getSQLSummary(" (" + sqlFix(sql) + ") AS tmp ", yAxis, customFilter, extFilterRequestList); -// } -// -// @Override -// public String wrapSql(String sql) { -// sql = sql.trim(); -// if (sql.lastIndexOf(";") == (sql.length() - 1)) { -// sql = sql.substring(0, sql.length() - 1); -// } -// String tmpSql = "SELECT * FROM (" + sql + ") AS tmp " + " LIMIT 0"; -// return tmpSql; -// } -// -// @Override -// 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()); -// return stringBuilder.toString(); -// }).toArray(String[]::new); -// return MessageFormat.format("SELECT {0} FROM {1} ORDER BY null", StringUtils.join(array, ","), table); -// } -// -// @Override -// public String createRawQuerySQLAsTmp(String sql, List fields) { -// return createRawQuerySQL(" (" + sqlFix(sql) + ") AS tmp ", fields); -// } -// -// public String transMysqlFilterTerm(String term) { -// switch (term) { -// case "eq": -// return " = "; -// case "not_eq": -// return " <> "; -// case "lt": -// return " < "; -// case "le": -// return " <= "; -// case "gt": -// return " > "; -// case "ge": -// return " >= "; -// case "in": -// return " IN "; -// case "not in": -// return " NOT IN "; -// case "like": -// return " LIKE "; -// case "not like": -// return " NOT LIKE "; -// case "null": -// return " IN "; -// case "not_null": -// return " IS NOT NULL "; -// case "between": -// return " BETWEEN "; -// default: -// return ""; -// } -// } -// -// public String transCustomFilter(List requestList) { -// if (CollectionUtils.isEmpty(requestList)) { -// return ""; -// } -// StringBuilder filter = new StringBuilder(); -// 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(`") -// .append(field.getOriginName()) -// .append("` AS DECIMAL(20,0))/1000,'%Y-%m-%d %H:%i:%S') "); -// } else { -// filter.append(" AND `").append(field.getOriginName()).append("`"); -// } -// filter.append(" ") -// .append(transMysqlFilterTerm(request.getTerm())) -// .append(" "); -// 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("%'"); -// } else { -// filter.append("'").append(value).append("'"); -// } -// } -// return filter.toString(); -// } -// -// public String transExtFilter(List requestList) { -// if (CollectionUtils.isEmpty(requestList)) { -// return ""; -// } -// StringBuilder filter = new StringBuilder(); -// for (ChartExtFilterRequest request : requestList) { -// List value = request.getValue(); -// if (CollectionUtils.isEmpty(value)) { -// continue; -// } -// DatasetTableField field = request.getDatasetTableField(); -// if (field.getDeType() == 1 && field.getDeExtractType() != 1) { -// filter.append(" AND FROM_UNIXTIME(CAST(`") -// .append(field.getOriginName()) -// .append("` AS DECIMAL(20,0))/1000,'%Y-%m-%d %H:%i:%S') "); -// } else { -// filter.append(" AND `").append(field.getOriginName()).append("`"); -// } -// filter.append(" ") -// .append(transMysqlFilterTerm(request.getOperator())) -// .append(" "); -// if (StringUtils.containsIgnoreCase(request.getOperator(), "in")) { -// 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("'"); -// } -// } -// return filter.toString(); -// } -// -// private String sqlFix(String sql) { -// if (sql.lastIndexOf(";") == (sql.length() - 1)) { -// sql = sql.substring(0, sql.length() - 1); -// } -// 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"; -// } -// } -//} +package io.dataease.provider.sqlserver; + +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.dto.sqlObj.SQLObj; +import io.dataease.provider.QueryProvider; +import io.dataease.provider.SQLConstants; +import org.apache.commons.collections4.CollectionUtils; +import org.apache.commons.lang3.ObjectUtils; +import org.apache.commons.lang3.StringUtils; +import org.springframework.stereotype.Service; +import org.stringtemplate.v4.ST; +import org.stringtemplate.v4.STGroup; +import org.stringtemplate.v4.STGroupFile; + +import java.text.MessageFormat; +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Date; +import java.util.List; + +import static io.dataease.provider.SQLConstants.TABLE_ALIAS_PREFIX; + +@Service("sqlserverQuery") +public class SqlserverQueryProvider extends QueryProvider { + @Override + public Integer transFieldType(String field) { + switch (field) { + case "CHAR": + case "VARCHAR": + case "TEXT": + case "TINYTEXT": + case "MEDIUMTEXT": + case "LONGTEXT": + case "ENUM": + return 0;// 文本 + case "DATE": + case "TIME": + case "YEAR": + case "DATETIME": + case "TIMESTAMP": + return 1;// 时间 + case "INT": + case "SMALLINT": + case "MEDIUMINT": + case "INTEGER": + case "BIGINT": + return 2;// 整型 + case "FLOAT": + case "DOUBLE": + case "DECIMAL": + return 3;// 浮点 + case "BIT": + case "TINYINT": + return 4;// 布尔 + default: + return 0; + } + } + + @Override + public String createQueryCountSQL(String table) { + return MessageFormat.format("SELECT COUNT(*) FROM {0}", table); + } + + @Override + public String createQueryCountSQLAsTmp(String sql) { + return createQueryCountSQL(" (" + sqlFix(sql) + ") AS tmp "); + } + + @Override + public String createSQLPreview(String sql, String orderBy) { + return "SELECT * FROM (" + sqlFix(sql) + ") AS tmp ORDER BY null " + " LIMIT 0,1000"; + } + + @Override + public String createQuerySQL(String table, List fields, boolean isGroup) { + SQLObj tableObj = SQLObj.builder() + .tableName((table.startsWith("(") && table.endsWith(")")) ? table : String.format(SqlServerSQLConstants.KEYWORD_TABLE, table)) + .tableAlias(String.format(TABLE_ALIAS_PREFIX, 0)) + .build(); + List xFields = new ArrayList<>(); + if (CollectionUtils.isNotEmpty(fields)) { + for (int i = 0; i < fields.size(); i++) { + DatasetTableField f = fields.get(i); + String originField = String.format(SqlServerSQLConstants.KEYWORD_FIX, tableObj.getTableAlias(), f.getOriginName()); + String fieldAlias = String.format(SQLConstants.FIELD_ALIAS_X_PREFIX, i); + String fieldName = ""; + // 处理横轴字段 + if (f.getDeExtractType() == 1) { + if (f.getDeType() == 2 || f.getDeType() == 3) { + fieldName = String.format(SqlServerSQLConstants.UNIX_TIMESTAMP, originField) + "*1000"; + } else { + fieldName = originField; + } + } else if (f.getDeExtractType() == 0) { + if (f.getDeType() == 2) { + fieldName = String.format(SqlServerSQLConstants.CAST, originField, SqlServerSQLConstants.DEFAULT_INT_FORMAT); + } else if (f.getDeType() == 3) { + fieldName = String.format(SqlServerSQLConstants.CAST, originField, SqlServerSQLConstants.DEFAULT_FLOAT_FORMAT); + } else if (f.getDeType() == 1) { + fieldName = String.format(SqlServerSQLConstants.DATE_FORMAT, originField, SqlServerSQLConstants.DEFAULT_DATE_FORMAT); + } else { + fieldName = originField; + } + } else { + if (f.getDeType() == 1) { + String cast = String.format(SqlServerSQLConstants.CAST, originField, SqlServerSQLConstants.DEFAULT_INT_FORMAT) + "/1000"; + fieldName = String.format(SqlServerSQLConstants.FROM_UNIXTIME, cast, SqlServerSQLConstants.DEFAULT_DATE_FORMAT); + } else if (f.getDeType() == 2) { + fieldName = String.format(SqlServerSQLConstants.CAST, originField, SqlServerSQLConstants.DEFAULT_INT_FORMAT); + } else { + fieldName = originField; + } + } + xFields.add(SQLObj.builder() + .fieldName(fieldName) + .fieldAlias(fieldAlias) + .build()); + } + } + + STGroup stg = new STGroupFile(SQLConstants.SQL_TEMPLATE); + ST st_sql = stg.getInstanceOf("previewSql"); + st_sql.add("isGroup", isGroup); + if (CollectionUtils.isNotEmpty(xFields)) st_sql.add("groups", xFields); + if (ObjectUtils.isNotEmpty(tableObj)) st_sql.add("table", tableObj); + return st_sql.render(); + } + + @Override + public String createQuerySQLAsTmp(String sql, List fields, boolean isGroup) { + return createQuerySQL("(" + sqlFix(sql) + ")", fields, isGroup); + } + + @Override + public String createQuerySQLWithPage(String table, List fields, Integer page, Integer pageSize, Integer realSize, boolean isGroup) { + return createQuerySQL(table, fields, isGroup) + " LIMIT " + (page - 1) * pageSize + "," + realSize; + } + + @Override + public String createQueryTableWithLimit(String table, List fields, Integer limit, boolean isGroup) { + return createQuerySQL(table, fields, isGroup) + " LIMIT 0," + limit; + } + + @Override + public String createQuerySqlWithLimit(String sql, List fields, Integer limit, boolean isGroup) { + return createQuerySQLAsTmp(sql, fields, isGroup) + " LIMIT 0," + limit; + } + + @Override + public String createQuerySQLAsTmpWithPage(String sql, List fields, Integer page, Integer pageSize, Integer realSize, boolean isGroup) { + return createQuerySQLAsTmp(sql, fields, isGroup) + " LIMIT " + (page - 1) * pageSize + "," + realSize; + } + + @Override + public String getSQL(String table, List xAxis, List yAxis, List customFilter, List extFilterRequestList) { + SQLObj tableObj = SQLObj.builder() + .tableName((table.startsWith("(") && table.endsWith(")")) ? table : String.format(SqlServerSQLConstants.KEYWORD_TABLE, table)) + .tableAlias(String.format(TABLE_ALIAS_PREFIX, 0)) + .build(); + List xFields = new ArrayList<>(); + List xWheres = new ArrayList<>(); + List xOrders = new ArrayList<>(); + if (CollectionUtils.isNotEmpty(xAxis)) { + for (int i = 0; i < xAxis.size(); i++) { + ChartViewFieldDTO x = xAxis.get(i); + String originField = String.format(SqlServerSQLConstants.KEYWORD_FIX, tableObj.getTableAlias(), x.getOriginName()); + String fieldAlias = String.format(SQLConstants.FIELD_ALIAS_X_PREFIX, i); + // 处理横轴字段 + xFields.add(getXFields(x, originField, fieldAlias)); + // 处理横轴过滤 +// xWheres.addAll(getXWheres(x, originField, fieldAlias)); + // 处理横轴排序 + if (StringUtils.isNotEmpty(x.getSort()) && !StringUtils.equalsIgnoreCase(x.getSort(), "none")) { + xOrders.add(SQLObj.builder() + .orderField(originField) + .orderAlias(fieldAlias) + .orderDirection(x.getSort()) + .build()); + } + } + } + List yFields = new ArrayList<>(); + List yWheres = new ArrayList<>(); + List yOrders = new ArrayList<>(); + if (CollectionUtils.isNotEmpty(yAxis)) { + for (int i = 0; i < yAxis.size(); i++) { + ChartViewFieldDTO y = yAxis.get(i); + String originField = String.format(SqlServerSQLConstants.KEYWORD_FIX, tableObj.getTableAlias(), y.getOriginName()); + String fieldAlias = String.format(SQLConstants.FIELD_ALIAS_Y_PREFIX, i); + // 处理纵轴字段 + yFields.add(getYFields(y, originField, fieldAlias)); + // 处理纵轴过滤 + yWheres.addAll(getYWheres(y, originField, fieldAlias)); + // 处理纵轴排序 + if (StringUtils.isNotEmpty(y.getSort()) && !StringUtils.equalsIgnoreCase(y.getSort(), "none")) { + yOrders.add(SQLObj.builder() + .orderField(originField) + .orderAlias(fieldAlias) + .orderDirection(y.getSort()) + .build()); + } + } + } + // 处理视图中字段过滤 + List customWheres = transCustomFilterList(tableObj, customFilter); + // 处理仪表板字段过滤 + List extWheres = transExtFilterList(tableObj, extFilterRequestList); + // 构建sql所有参数 + List fields = new ArrayList<>(); + fields.addAll(xFields); + fields.addAll(yFields); + List wheres = new ArrayList<>(); + wheres.addAll(xWheres); + if (customWheres != null) wheres.addAll(customWheres); + if (extWheres != null) wheres.addAll(extWheres); + List groups = new ArrayList<>(); + groups.addAll(xFields); + // 外层再次套sql + List orders = new ArrayList<>(); + orders.addAll(xOrders); + orders.addAll(yOrders); + List aggWheres = new ArrayList<>(); + aggWheres.addAll(yWheres); + + STGroup stg = new STGroupFile(SQLConstants.SQL_TEMPLATE); + ST st_sql = stg.getInstanceOf("querySql"); + if (CollectionUtils.isNotEmpty(xFields)) st_sql.add("groups", xFields); + if (CollectionUtils.isNotEmpty(yFields)) st_sql.add("aggregators", yFields); + if (CollectionUtils.isNotEmpty(wheres)) st_sql.add("filters", wheres); + if (ObjectUtils.isNotEmpty(tableObj)) st_sql.add("table", tableObj); + String sql = st_sql.render(); + + ST st = stg.getInstanceOf("querySql"); + SQLObj tableSQL = SQLObj.builder() + .tableName(String.format(SqlServerSQLConstants.BRACKETS, sql)) + .tableAlias(String.format(TABLE_ALIAS_PREFIX, 1)) + .build(); + if (CollectionUtils.isNotEmpty(aggWheres)) st.add("filters", aggWheres); + if (CollectionUtils.isNotEmpty(orders)) st.add("orders", orders); + if (ObjectUtils.isNotEmpty(tableSQL)) st.add("table", tableSQL); + return st.render(); + } + + + @Override + public String getSQLAsTmp(String sql, List xAxis, List yAxis, List customFilter, List extFilterRequestList) { + return getSQL("(" + sqlFix(sql) + ")", xAxis, yAxis, customFilter, extFilterRequestList); + } + + @Override + public String getSQLStack(String table, List xAxis, List yAxis, List customFilter, List extFilterRequestList, List extStack) { + SQLObj tableObj = SQLObj.builder() + .tableName((table.startsWith("(") && table.endsWith(")")) ? table : String.format(SqlServerSQLConstants.KEYWORD_TABLE, table)) + .tableAlias(String.format(TABLE_ALIAS_PREFIX, 0)) + .build(); + List xFields = new ArrayList<>(); + List xWheres = new ArrayList<>(); + List xOrders = new ArrayList<>(); + List xList = new ArrayList<>(); + xList.addAll(xAxis); + xList.addAll(extStack); + if (CollectionUtils.isNotEmpty(xList)) { + for (int i = 0; i < xList.size(); i++) { + ChartViewFieldDTO x = xList.get(i); + String originField = String.format(SqlServerSQLConstants.KEYWORD_FIX, tableObj.getTableAlias(), x.getOriginName()); + String fieldAlias = String.format(SQLConstants.FIELD_ALIAS_X_PREFIX, i); + // 处理横轴字段 + xFields.add(getXFields(x, originField, fieldAlias)); + // 处理横轴过滤 +// xWheres.addAll(getXWheres(x, originField, fieldAlias)); + // 处理横轴排序 + if (StringUtils.isNotEmpty(x.getSort()) && !StringUtils.equalsIgnoreCase(x.getSort(), "none")) { + xOrders.add(SQLObj.builder() + .orderField(originField) + .orderAlias(fieldAlias) + .orderDirection(x.getSort()) + .build()); + } + } + } + List yFields = new ArrayList<>(); + List yWheres = new ArrayList<>(); + List yOrders = new ArrayList<>(); + if (CollectionUtils.isNotEmpty(yAxis)) { + for (int i = 0; i < yAxis.size(); i++) { + ChartViewFieldDTO y = yAxis.get(i); + String originField = String.format(SqlServerSQLConstants.KEYWORD_FIX, tableObj.getTableAlias(), y.getOriginName()); + String fieldAlias = String.format(SQLConstants.FIELD_ALIAS_Y_PREFIX, i); + // 处理纵轴字段 + yFields.add(getYFields(y, originField, fieldAlias)); + // 处理纵轴过滤 + yWheres.addAll(getYWheres(y, originField, fieldAlias)); + // 处理纵轴排序 + if (StringUtils.isNotEmpty(y.getSort()) && !StringUtils.equalsIgnoreCase(y.getSort(), "none")) { + yOrders.add(SQLObj.builder() + .orderField(originField) + .orderAlias(fieldAlias) + .orderDirection(y.getSort()) + .build()); + } + } + } + List stackFields = new ArrayList<>(); + List stackOrders = new ArrayList<>(); + if (CollectionUtils.isNotEmpty(extStack)) { + for (int i = 0; i < extStack.size(); i++) { + ChartViewFieldDTO stack = extStack.get(i); + String originField = String.format(SqlServerSQLConstants.KEYWORD_FIX, tableObj.getTableAlias(), stack.getOriginName()); + String fieldAlias = String.format(SQLConstants.FIELD_ALIAS_X_PREFIX, i); + // 处理横轴字段 + stackFields.add(getXFields(stack, originField, fieldAlias)); + // 处理横轴排序 + if (StringUtils.isNotEmpty(stack.getSort()) && !StringUtils.equalsIgnoreCase(stack.getSort(), "none")) { + stackOrders.add(SQLObj.builder() + .orderField(originField) + .orderAlias(fieldAlias) + .orderDirection(stack.getSort()) + .build()); + } + } + } + // 处理视图中字段过滤 + List customWheres = transCustomFilterList(tableObj, customFilter); + // 处理仪表板字段过滤 + List extWheres = transExtFilterList(tableObj, extFilterRequestList); + // 构建sql所有参数 + List fields = new ArrayList<>(); + fields.addAll(xFields); + fields.addAll(yFields); + List wheres = new ArrayList<>(); + wheres.addAll(xWheres); + if (customWheres != null) wheres.addAll(customWheres); + if (extWheres != null) wheres.addAll(extWheres); + List groups = new ArrayList<>(); + groups.addAll(xFields); + // 外层再次套sql + List orders = new ArrayList<>(); + orders.addAll(xOrders); + orders.addAll(yOrders); + List aggWheres = new ArrayList<>(); + aggWheres.addAll(yWheres); + + STGroup stg = new STGroupFile(SQLConstants.SQL_TEMPLATE); + ST st_sql = stg.getInstanceOf("querySql"); + if (CollectionUtils.isNotEmpty(xFields)) st_sql.add("groups", xFields); + if (CollectionUtils.isNotEmpty(yFields)) st_sql.add("aggregators", yFields); + if (CollectionUtils.isNotEmpty(wheres)) st_sql.add("filters", wheres); + if (ObjectUtils.isNotEmpty(tableObj)) st_sql.add("table", tableObj); + String sql = st_sql.render(); + + ST st = stg.getInstanceOf("querySql"); + SQLObj tableSQL = SQLObj.builder() + .tableName(String.format(SqlServerSQLConstants.BRACKETS, sql)) + .tableAlias(String.format(TABLE_ALIAS_PREFIX, 1)) + .build(); + if (CollectionUtils.isNotEmpty(aggWheres)) st.add("filters", aggWheres); + if (CollectionUtils.isNotEmpty(orders)) st.add("orders", orders); + if (ObjectUtils.isNotEmpty(tableSQL)) st.add("table", tableSQL); + return st.render(); + } + + @Override + public String getSQLAsTmpStack(String table, List xAxis, List yAxis, List customFilter, List extFilterRequestList, List extStack) { + return getSQLStack("(" + sqlFix(table) + ")", xAxis, yAxis, customFilter, extFilterRequestList, extStack); + } + + @Override + public String searchTable(String table) { + return "SELECT table_name FROM information_schema.TABLES WHERE table_name ='" + table + "'"; + } + + @Override + public String getSQLSummary(String table, List yAxis, List customFilter, List extFilterRequestList) { + // 字段汇总 排序等 + SQLObj tableObj = SQLObj.builder() + .tableName((table.startsWith("(") && table.endsWith(")")) ? table : String.format(SqlServerSQLConstants.KEYWORD_TABLE, table)) + .tableAlias(String.format(TABLE_ALIAS_PREFIX, 0)) + .build(); + List yFields = new ArrayList<>(); + List yWheres = new ArrayList<>(); + List yOrders = new ArrayList<>(); + if (CollectionUtils.isNotEmpty(yAxis)) { + for (int i = 0; i < yAxis.size(); i++) { + ChartViewFieldDTO y = yAxis.get(i); + String originField = String.format(SqlServerSQLConstants.KEYWORD_FIX, tableObj.getTableAlias(), y.getOriginName()); + String fieldAlias = String.format(SQLConstants.FIELD_ALIAS_Y_PREFIX, i); + // 处理纵轴字段 + yFields.add(getYFields(y, originField, fieldAlias)); + // 处理纵轴过滤 + yWheres.addAll(getYWheres(y, originField, fieldAlias)); + // 处理纵轴排序 + if (StringUtils.isNotEmpty(y.getSort()) && !StringUtils.equalsIgnoreCase(y.getSort(), "none")) { + yOrders.add(SQLObj.builder() + .orderField(originField) + .orderAlias(fieldAlias) + .orderDirection(y.getSort()) + .build()); + } + } + } + // 处理视图中字段过滤 + List customWheres = transCustomFilterList(tableObj, customFilter); + // 处理仪表板字段过滤 + List extWheres = transExtFilterList(tableObj, extFilterRequestList); + // 构建sql所有参数 + List fields = new ArrayList<>(); + fields.addAll(yFields); + List wheres = new ArrayList<>(); + if (customWheres != null) wheres.addAll(customWheres); + if (extWheres != null) wheres.addAll(extWheres); + List groups = new ArrayList<>(); + // 外层再次套sql + List orders = new ArrayList<>(); + orders.addAll(yOrders); + List aggWheres = new ArrayList<>(); + aggWheres.addAll(yWheres); + + STGroup stg = new STGroupFile(SQLConstants.SQL_TEMPLATE); + ST st_sql = stg.getInstanceOf("querySql"); + if (CollectionUtils.isNotEmpty(yFields)) st_sql.add("aggregators", yFields); + if (CollectionUtils.isNotEmpty(wheres)) st_sql.add("filters", wheres); + if (ObjectUtils.isNotEmpty(tableObj)) st_sql.add("table", tableObj); + String sql = st_sql.render(); + + ST st = stg.getInstanceOf("querySql"); + SQLObj tableSQL = SQLObj.builder() + .tableName(String.format(SqlServerSQLConstants.BRACKETS, sql)) + .tableAlias(String.format(TABLE_ALIAS_PREFIX, 1)) + .build(); + if (CollectionUtils.isNotEmpty(aggWheres)) st.add("filters", aggWheres); + if (CollectionUtils.isNotEmpty(orders)) st.add("orders", orders); + if (ObjectUtils.isNotEmpty(tableSQL)) st.add("table", tableSQL); + return st.render(); + } + + @Override + public String getSQLSummaryAsTmp(String sql, List yAxis, List customFilter, List extFilterRequestList) { + return getSQLSummary("(" + sqlFix(sql) + ")", yAxis, customFilter, extFilterRequestList); + } + + @Override + public String wrapSql(String sql) { + sql = sql.trim(); + if (sql.lastIndexOf(";") == (sql.length() - 1)) { + sql = sql.substring(0, sql.length() - 1); + } + String tmpSql = "SELECT * FROM (" + sql + ") AS tmp " + " LIMIT 0"; + return tmpSql; + } + + @Override + public String createRawQuerySQL(String table, List fields) { + String[] array = fields.stream().map(f -> { + StringBuilder stringBuilder = new StringBuilder(); + if (f.getDeExtractType() == 4) { // 处理 tinyint + stringBuilder.append("concat(`").append(f.getOriginName()).append("`,'') AS ").append(f.getDataeaseName()); + } else { + 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 null", StringUtils.join(array, ","), table); + } + + @Override + public String createRawQuerySQLAsTmp(String sql, List fields) { + return createRawQuerySQL(" (" + sqlFix(sql) + ") AS tmp ", fields); + } + + public String transMysqlFilterTerm(String term) { + switch (term) { + case "eq": + return " = "; + case "not_eq": + return " <> "; + case "lt": + return " < "; + case "le": + return " <= "; + case "gt": + return " > "; + case "ge": + return " >= "; + case "in": + return " IN "; + case "not in": + return " NOT IN "; + case "like": + return " LIKE "; + case "not like": + return " NOT LIKE "; + case "null": + return " IN "; + case "not_null": + return " IS NOT NULL AND %s <> ''"; + case "between": + return " BETWEEN "; + default: + return ""; + } + } + + public List transCustomFilterList(SQLObj tableObj, List requestList) { + if (CollectionUtils.isEmpty(requestList)) { + return null; + } + List list = new ArrayList<>(); + for (ChartCustomFilterDTO request : requestList) { + DatasetTableField field = request.getField(); + if (ObjectUtils.isEmpty(field)) { + continue; + } + String value = request.getValue(); + String whereName = ""; + String whereTerm = transMysqlFilterTerm(request.getTerm()); + String whereValue = ""; + String originName = String.format(SqlServerSQLConstants.KEYWORD_FIX, tableObj.getTableAlias(), field.getOriginName()); + if (field.getDeType() == 1 && field.getDeExtractType() != 1) { + String cast = String.format(SqlServerSQLConstants.CAST, originName, SqlServerSQLConstants.DEFAULT_INT_FORMAT) + "/1000"; + whereName = String.format(SqlServerSQLConstants.FROM_UNIXTIME, cast, SqlServerSQLConstants.DEFAULT_DATE_FORMAT); + } else { + whereName = originName; + } + if (StringUtils.equalsIgnoreCase(request.getTerm(), "null")) { + whereValue = SqlServerSQLConstants.WHERE_VALUE_NULL; + } else if (StringUtils.equalsIgnoreCase(request.getTerm(), "not_null")) { + whereTerm = String.format(whereTerm, originName); + } else if (StringUtils.containsIgnoreCase(request.getTerm(), "in")) { + whereValue = "('" + StringUtils.join(value, "','") + "')"; + } else if (StringUtils.containsIgnoreCase(request.getTerm(), "like")) { + whereValue = "'%" + value + "%'"; + } else { + whereValue = String.format(SqlServerSQLConstants.WHERE_VALUE_VALUE, value); + } + list.add(SQLObj.builder() + .whereField(whereName) + .whereTermAndValue(whereTerm + whereValue) + .build()); + } + return list; + } + + public List transExtFilterList(SQLObj tableObj, List requestList) { + if (CollectionUtils.isEmpty(requestList)) { + return null; + } + List list = new ArrayList<>(); + for (ChartExtFilterRequest request : requestList) { + List value = request.getValue(); + DatasetTableField field = request.getDatasetTableField(); + if (CollectionUtils.isEmpty(value) || ObjectUtils.isEmpty(field)) { + continue; + } + String whereName = ""; + String whereTerm = transMysqlFilterTerm(request.getOperator()); + String whereValue = ""; + String originName = String.format(SqlServerSQLConstants.KEYWORD_FIX, tableObj.getTableAlias(), field.getOriginName()); + + if (field.getDeType() == 1 && field.getDeExtractType() != 1) { + String cast = String.format(SqlServerSQLConstants.CAST, originName, SqlServerSQLConstants.DEFAULT_INT_FORMAT) + "/1000"; + whereName = String.format(SqlServerSQLConstants.FROM_UNIXTIME, cast, SqlServerSQLConstants.DEFAULT_DATE_FORMAT); + } else { + whereName = originName; + } + + + if (StringUtils.containsIgnoreCase(request.getOperator(), "in")) { + whereValue = "('" + StringUtils.join(value, "','") + "')"; + } else if (StringUtils.containsIgnoreCase(request.getOperator(), "like")) { + whereValue = "'%" + value.get(0) + "%'"; + } else if (StringUtils.containsIgnoreCase(request.getOperator(), "between")) { + if (request.getDatasetTableField().getDeType() == 1) { + 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)))); + whereValue = String.format(SqlServerSQLConstants.WHERE_BETWEEN, startTime, endTime); + } else { + whereValue = String.format(SqlServerSQLConstants.WHERE_BETWEEN, value.get(0), value.get(1)); + } + } else { + whereValue = String.format(SqlServerSQLConstants.WHERE_VALUE_VALUE, value.get(0)); + } + list.add(SQLObj.builder() + .whereField(whereName) + .whereTermAndValue(whereTerm + whereValue) + .build()); + } + return list; + } + + private String sqlFix(String sql) { + if (sql.lastIndexOf(";") == (sql.length() - 1)) { + sql = sql.substring(0, sql.length() - 1); + } + 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"; + } + } + + private SQLObj getXFields(ChartViewFieldDTO x, String originField, String fieldAlias) { + String fieldName = ""; + if (x.getDeExtractType() == 1) { + if (x.getDeType() == 2 || x.getDeType() == 3) { + fieldName = String.format(SqlServerSQLConstants.UNIX_TIMESTAMP, originField) + "*1000"; + } else if (x.getDeType() == 1) { + String format = transDateFormat(x.getDateStyle(), x.getDatePattern()); + fieldName = String.format(SqlServerSQLConstants.DATE_FORMAT, originField, format); + } else { + fieldName = originField; + } + } else { + if (x.getDeType() == 1) { + String format = transDateFormat(x.getDateStyle(), x.getDatePattern()); + if (x.getDeExtractType() == 0) { + fieldName = String.format(SqlServerSQLConstants.DATE_FORMAT, originField, format); + } else { + String cast = String.format(SqlServerSQLConstants.CAST, originField, SqlServerSQLConstants.DEFAULT_INT_FORMAT) + "/1000"; + String from_unixtime = String.format(SqlServerSQLConstants.FROM_UNIXTIME, cast, SqlServerSQLConstants.DEFAULT_DATE_FORMAT); + fieldName = String.format(SqlServerSQLConstants.DATE_FORMAT, from_unixtime, format); + } + } else { + fieldName = originField; + } + } + return SQLObj.builder() + .fieldName(fieldName) + .fieldAlias(fieldAlias) + .build(); + } + + private List getXWheres(ChartViewFieldDTO x, String originField, String fieldAlias) { + List list = new ArrayList<>(); + if (CollectionUtils.isNotEmpty(x.getFilter()) && x.getFilter().size() > 0) { + x.getFilter().forEach(f -> { + String whereName = ""; + String whereTerm = transMysqlFilterTerm(f.getTerm()); + String whereValue = ""; + if (x.getDeType() == 1 && x.getDeExtractType() != 1) { + String cast = String.format(SqlServerSQLConstants.CAST, originField, SqlServerSQLConstants.DEFAULT_INT_FORMAT) + "/1000"; + whereName = String.format(SqlServerSQLConstants.FROM_UNIXTIME, cast, SqlServerSQLConstants.DEFAULT_DATE_FORMAT); + } else { + whereName = originField; + } + if (StringUtils.equalsIgnoreCase(f.getTerm(), "null")) { + whereValue = SqlServerSQLConstants.WHERE_VALUE_NULL; + } else if (StringUtils.equalsIgnoreCase(f.getTerm(), "not_null")) { + whereTerm = String.format(whereTerm, originField); + } else if (StringUtils.containsIgnoreCase(f.getTerm(), "in")) { + whereValue = "('" + StringUtils.join(f.getValue(), "','") + "')"; + } else if (StringUtils.containsIgnoreCase(f.getTerm(), "like")) { + whereValue = "'%" + f.getValue() + "%'"; + } else { + whereValue = String.format(SqlServerSQLConstants.WHERE_VALUE_VALUE, f.getValue()); + } + list.add(SQLObj.builder() + .whereField(whereName) + .whereAlias(fieldAlias) + .whereTermAndValue(whereTerm + whereValue) + .build()); + }); + } + return list; + } + + private SQLObj getYFields(ChartViewFieldDTO y, String originField, String fieldAlias) { + String fieldName = ""; + if (StringUtils.equalsIgnoreCase(y.getOriginName(), "*")) { + fieldName = SqlServerSQLConstants.AGG_COUNT; + } else if (SQLConstants.DIMENSION_TYPE.contains(y.getDeType())) { + fieldName = String.format(SqlServerSQLConstants.AGG_FIELD, y.getSummary(), originField); + } else { + if (StringUtils.equalsIgnoreCase(y.getSummary(), "avg") || StringUtils.containsIgnoreCase(y.getSummary(), "pop")) { + String cast = String.format(SqlServerSQLConstants.CAST, originField, y.getDeType() == 2 ? SqlServerSQLConstants.DEFAULT_INT_FORMAT : SqlServerSQLConstants.DEFAULT_FLOAT_FORMAT); + String agg = String.format(SqlServerSQLConstants.AGG_FIELD, y.getSummary(), cast); + fieldName = String.format(SqlServerSQLConstants.CAST, agg, SqlServerSQLConstants.DEFAULT_FLOAT_FORMAT); + } else { + String cast = String.format(SqlServerSQLConstants.CAST, originField, y.getDeType() == 2 ? SqlServerSQLConstants.DEFAULT_INT_FORMAT : SqlServerSQLConstants.DEFAULT_FLOAT_FORMAT); + fieldName = String.format(SqlServerSQLConstants.AGG_FIELD, y.getSummary(), cast); + } + } + return SQLObj.builder() + .fieldName(fieldName) + .fieldAlias(fieldAlias) + .build(); + } + + private List getYWheres(ChartViewFieldDTO y, String originField, String fieldAlias) { + List list = new ArrayList<>(); + if (CollectionUtils.isNotEmpty(y.getFilter()) && y.getFilter().size() > 0) { + y.getFilter().forEach(f -> { + String whereTerm = transMysqlFilterTerm(f.getTerm()); + String whereValue = ""; + // 原始类型不是时间,在de中被转成时间的字段做处理 + if (StringUtils.equalsIgnoreCase(f.getTerm(), "null")) { + whereValue = SqlServerSQLConstants.WHERE_VALUE_NULL; + } else if (StringUtils.equalsIgnoreCase(f.getTerm(), "not_null")) { + whereTerm = String.format(whereTerm, originField); + } else if (StringUtils.containsIgnoreCase(f.getTerm(), "in")) { + whereValue = "('" + StringUtils.join(f.getValue(), "','") + "')"; + } else if (StringUtils.containsIgnoreCase(f.getTerm(), "like")) { + whereValue = "'%" + f.getValue() + "%'"; + } else { + whereValue = String.format(SqlServerSQLConstants.WHERE_VALUE_VALUE, f.getValue()); + } + list.add(SQLObj.builder() + .whereField(fieldAlias) + .whereAlias(fieldAlias) + .whereTermAndValue(whereTerm + whereValue) + .build()); + }); + } + return list; + } +} From d86531967fa54418dfecbc604168bbba3d14e1e5 Mon Sep 17 00:00:00 2001 From: taojinlong Date: Tue, 3 Aug 2021 17:29:38 +0800 Subject: [PATCH 02/16] feat: sqlserver --- .../datasource/provider/JdbcProvider.java | 2 +- .../io/dataease/provider/QueryProvider.java | 4 --- .../provider/doris/DorisQueryProvider.java | 10 ------- .../provider/mysql/MysqlQueryProvider.java | 10 ------- .../provider/oracle/OracleQueryProvider.java | 10 ------- .../sqlserver/SqlServerSQLConstants.java | 6 ++-- .../sqlserver/SqlserverQueryProvider.java | 30 ++++++++++--------- 7 files changed, 20 insertions(+), 52 deletions(-) diff --git a/backend/src/main/java/io/dataease/datasource/provider/JdbcProvider.java b/backend/src/main/java/io/dataease/datasource/provider/JdbcProvider.java index d2bc037a38..45f4854820 100644 --- a/backend/src/main/java/io/dataease/datasource/provider/JdbcProvider.java +++ b/backend/src/main/java/io/dataease/datasource/provider/JdbcProvider.java @@ -287,7 +287,7 @@ public class JdbcProvider extends DatasourceProvider { } tableFiled.setRemarks(remarks); tableFiled.setFieldSize(Integer.valueOf(resultSet.getString("COLUMN_SIZE"))); - String dbType = resultSet.getString("TYPE_NAME"); + String dbType = resultSet.getString("TYPE_NAME").toUpperCase(); tableFiled.setFieldType(dbType); if(dbType.equalsIgnoreCase("LONG")){tableFiled.setFieldSize(65533);} if(StringUtils.isNotEmpty(dbType) && dbType.toLowerCase().contains("date") && tableFiled.getFieldSize() < 50 ){ diff --git a/backend/src/main/java/io/dataease/provider/QueryProvider.java b/backend/src/main/java/io/dataease/provider/QueryProvider.java index b6c97d0a31..0847ed6dd2 100644 --- a/backend/src/main/java/io/dataease/provider/QueryProvider.java +++ b/backend/src/main/java/io/dataease/provider/QueryProvider.java @@ -14,10 +14,6 @@ import java.util.List; public abstract class QueryProvider { public abstract Integer transFieldType(String field); - public abstract String createQueryCountSQL(String table); - - public abstract String createQueryCountSQLAsTmp(String sql); - public abstract String createSQLPreview(String sql, String orderBy); public abstract String createQuerySQL(String table, List fields, boolean isGroup); 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 fc995d6e11..eb40e3cb96 100644 --- a/backend/src/main/java/io/dataease/provider/doris/DorisQueryProvider.java +++ b/backend/src/main/java/io/dataease/provider/doris/DorisQueryProvider.java @@ -70,16 +70,6 @@ public class DorisQueryProvider extends QueryProvider { } } - @Override - public String createQueryCountSQL(String table) { - return MessageFormat.format("SELECT count(*) FROM {0}", table); - } - - @Override - public String createQueryCountSQLAsTmp(String sql) { - return createQueryCountSQL(" (" + sql + ") AS tmp "); - } - @Override public String createSQLPreview(String sql, String orderBy) { return "SELECT * FROM (" + sql + ") AS tmp ORDER BY " + orderBy + " LIMIT 0,1000"; 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 13ba47b27f..fdbcb7d98d 100644 --- a/backend/src/main/java/io/dataease/provider/mysql/MysqlQueryProvider.java +++ b/backend/src/main/java/io/dataease/provider/mysql/MysqlQueryProvider.java @@ -70,16 +70,6 @@ public class MysqlQueryProvider extends QueryProvider { } } - @Override - public String createQueryCountSQL(String table) { - return MessageFormat.format("SELECT COUNT(*) FROM {0}", table); - } - - @Override - public String createQueryCountSQLAsTmp(String sql) { - return createQueryCountSQL(" (" + sqlFix(sql) + ") AS tmp "); - } - @Override public String createSQLPreview(String sql, String orderBy) { return "SELECT * FROM (" + sqlFix(sql) + ") AS tmp ORDER BY null " + " LIMIT 0,1000"; 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 124c383736..2e97ec068b 100644 --- a/backend/src/main/java/io/dataease/provider/oracle/OracleQueryProvider.java +++ b/backend/src/main/java/io/dataease/provider/oracle/OracleQueryProvider.java @@ -82,16 +82,6 @@ public class OracleQueryProvider extends QueryProvider { } } - @Override - public String createQueryCountSQL(String table) { - return MessageFormat.format("SELECT COUNT(*) FROM {0}", table); - } - - @Override - public String createQueryCountSQLAsTmp(String sql) { - return createQueryCountSQL(" (" + sqlFix(sql) + ") DE_TMP "); - } - @Override public String createSQLPreview(String sql, String orderBy) { return "SELECT * FROM (" + sqlFix(sql) + ") DE_TMP " + " WHERE rownum <= 1000"; diff --git a/backend/src/main/java/io/dataease/provider/sqlserver/SqlServerSQLConstants.java b/backend/src/main/java/io/dataease/provider/sqlserver/SqlServerSQLConstants.java index 3a93536ecd..3f7a47d704 100644 --- a/backend/src/main/java/io/dataease/provider/sqlserver/SqlServerSQLConstants.java +++ b/backend/src/main/java/io/dataease/provider/sqlserver/SqlServerSQLConstants.java @@ -2,16 +2,16 @@ package io.dataease.provider.sqlserver; import io.dataease.provider.SQLConstants; -import static io.dataease.datasource.constants.DatasourceTypes.mysql; +import static io.dataease.datasource.constants.DatasourceTypes.sqlServer; /** * @Author gin * @Date 2021/7/8 7:22 下午 */ public class SqlServerSQLConstants extends SQLConstants { - public static final String KEYWORD_TABLE = mysql.getKeywordPrefix() + "%s" + mysql.getKeywordSuffix(); + public static final String KEYWORD_TABLE = sqlServer.getKeywordPrefix() + "%s" + sqlServer.getKeywordSuffix(); - public static final String KEYWORD_FIX = "%s." + mysql.getKeywordPrefix() + "%s" + mysql.getKeywordSuffix(); + public static final String KEYWORD_FIX = "%s." + sqlServer.getKeywordPrefix() + "%s" + sqlServer.getKeywordSuffix(); public static final String UNIX_TIMESTAMP = "UNIX_TIMESTAMP(%s)"; 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 7c81918cbb..c70cb49ad7 100644 --- a/backend/src/main/java/io/dataease/provider/sqlserver/SqlserverQueryProvider.java +++ b/backend/src/main/java/io/dataease/provider/sqlserver/SqlserverQueryProvider.java @@ -29,28 +29,35 @@ public class SqlserverQueryProvider extends QueryProvider { public Integer transFieldType(String field) { switch (field) { case "CHAR": + case "NCHAR": + case "NTEXT": case "VARCHAR": case "TEXT": case "TINYTEXT": case "MEDIUMTEXT": case "LONGTEXT": case "ENUM": + case "XML": return 0;// 文本 case "DATE": case "TIME": case "YEAR": case "DATETIME": + case "DATETIME2": + case "DATETIMEOFFSET": case "TIMESTAMP": return 1;// 时间 case "INT": - case "SMALLINT": case "MEDIUMINT": case "INTEGER": case "BIGINT": + case "SMALLINT": return 2;// 整型 case "FLOAT": case "DOUBLE": case "DECIMAL": + case "MONEY": + case "NUMERIC": return 3;// 浮点 case "BIT": case "TINYINT": @@ -60,19 +67,14 @@ public class SqlserverQueryProvider extends QueryProvider { } } - @Override - public String createQueryCountSQL(String table) { - return MessageFormat.format("SELECT COUNT(*) FROM {0}", table); - } - - @Override - public String createQueryCountSQLAsTmp(String sql) { - return createQueryCountSQL(" (" + sqlFix(sql) + ") AS tmp "); - } - + private static Integer DE_STRING = 0; + private static Integer DE_TIME = 1; + private static Integer DE_INT = 2; + private static Integer DE_FLOAT = 3; + private static Integer DE_BOOL = 4; @Override public String createSQLPreview(String sql, String orderBy) { - return "SELECT * FROM (" + sqlFix(sql) + ") AS tmp ORDER BY null " + " LIMIT 0,1000"; + return "SELECT top 1000 * FROM (" + sqlFix(sql) + ") AS tmp"; } @Override @@ -89,8 +91,8 @@ public class SqlserverQueryProvider extends QueryProvider { String fieldAlias = String.format(SQLConstants.FIELD_ALIAS_X_PREFIX, i); String fieldName = ""; // 处理横轴字段 - if (f.getDeExtractType() == 1) { - if (f.getDeType() == 2 || f.getDeType() == 3) { + if (f.getDeExtractType() == DE_TIME) { // 时间 转为 数值 + if (f.getDeType() == DE_INT || f.getDeType() == DE_FLOAT) { fieldName = String.format(SqlServerSQLConstants.UNIX_TIMESTAMP, originField) + "*1000"; } else { fieldName = originField; From dfe654c547351e344271ec3ba99c4148d34ee69f Mon Sep 17 00:00:00 2001 From: taojinlong Date: Wed, 4 Aug 2021 21:27:37 +0800 Subject: [PATCH 03/16] feat: sqlserver --- .../sqlserver/SqlServerSQLConstants.java | 7 +- .../sqlserver/SqlserverQueryProvider.java | 175 +++++++++++++----- 2 files changed, 134 insertions(+), 48 deletions(-) diff --git a/backend/src/main/java/io/dataease/provider/sqlserver/SqlServerSQLConstants.java b/backend/src/main/java/io/dataease/provider/sqlserver/SqlServerSQLConstants.java index 3f7a47d704..1f42fbee4a 100644 --- a/backend/src/main/java/io/dataease/provider/sqlserver/SqlServerSQLConstants.java +++ b/backend/src/main/java/io/dataease/provider/sqlserver/SqlServerSQLConstants.java @@ -13,14 +13,17 @@ public class SqlServerSQLConstants extends SQLConstants { public static final String KEYWORD_FIX = "%s." + sqlServer.getKeywordPrefix() + "%s" + sqlServer.getKeywordSuffix(); - public static final String UNIX_TIMESTAMP = "UNIX_TIMESTAMP(%s)"; + public static final String UNIX_TIMESTAMP = "(CAST(DATEDIFF(SS, '1970-01-01 00:00:00', s ) as bigint) - 8 * 3600 ) * 1000"; - public static final String DATE_FORMAT = "DATE_FORMAT(%s,'%s')"; + public static final String DATE_FORMAT = "CONVERT(varchar(100), %s, %s)"; public static final String FROM_UNIXTIME = "FROM_UNIXTIME(%s,'%s')"; public static final String CAST = "CAST(%s AS %s)"; + public static final String LONG_TO_DATE = "DATEADD(second,%s,'1970-01-01 08:00:00') ,120)"; + public static final String STRING_TO_DATE = "CONVERT(datetime, %s ,120)"; + public static final String DEFAULT_DATE_FORMAT = "%Y-%m-%d %H:%i:%S"; public static final String DEFAULT_INT_FORMAT = "DECIMAL(20,0)"; 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 c70cb49ad7..63de709a80 100644 --- a/backend/src/main/java/io/dataease/provider/sqlserver/SqlserverQueryProvider.java +++ b/backend/src/main/java/io/dataease/provider/sqlserver/SqlserverQueryProvider.java @@ -93,26 +93,31 @@ public class SqlserverQueryProvider extends QueryProvider { // 处理横轴字段 if (f.getDeExtractType() == DE_TIME) { // 时间 转为 数值 if (f.getDeType() == DE_INT || f.getDeType() == DE_FLOAT) { - fieldName = String.format(SqlServerSQLConstants.UNIX_TIMESTAMP, originField) + "*1000"; + fieldName = String.format(SqlServerSQLConstants.UNIX_TIMESTAMP, originField); } else { fieldName = originField; } - } else if (f.getDeExtractType() == 0) { - if (f.getDeType() == 2) { - fieldName = String.format(SqlServerSQLConstants.CAST, originField, SqlServerSQLConstants.DEFAULT_INT_FORMAT); - } else if (f.getDeType() == 3) { - fieldName = String.format(SqlServerSQLConstants.CAST, originField, SqlServerSQLConstants.DEFAULT_FLOAT_FORMAT); - } else if (f.getDeType() == 1) { - fieldName = String.format(SqlServerSQLConstants.DATE_FORMAT, originField, SqlServerSQLConstants.DEFAULT_DATE_FORMAT); + } else if (f.getDeExtractType() == DE_STRING) { //字符串转时间 + if (f.getDeType() == DE_INT) { + fieldName = originField; +// String.format(SqlServerSQLConstants.CAST, originField, SqlServerSQLConstants.DEFAULT_INT_FORMAT); + } else if (f.getDeType() == DE_FLOAT) { + fieldName = originField; +// String.format(SqlServerSQLConstants.CAST, originField, SqlServerSQLConstants.DEFAULT_FLOAT_FORMAT); + } else if (f.getDeType() == DE_TIME) { + fieldName = originField; +// String.format(SqlServerSQLConstants.DATE_FORMAT, originField, SqlServerSQLConstants.DEFAULT_DATE_FORMAT); } else { fieldName = originField; } } else { - if (f.getDeType() == 1) { + if (f.getDeType() == DE_TIME) { // String cast = String.format(SqlServerSQLConstants.CAST, originField, SqlServerSQLConstants.DEFAULT_INT_FORMAT) + "/1000"; - fieldName = String.format(SqlServerSQLConstants.FROM_UNIXTIME, cast, SqlServerSQLConstants.DEFAULT_DATE_FORMAT); - } else if (f.getDeType() == 2) { - fieldName = String.format(SqlServerSQLConstants.CAST, originField, SqlServerSQLConstants.DEFAULT_INT_FORMAT); + fieldName = originField; +// String.format(SqlServerSQLConstants.FROM_UNIXTIME, cast, SqlServerSQLConstants.DEFAULT_DATE_FORMAT); + } else if (f.getDeType() == DE_INT) { + fieldName = originField; +// String.format(SqlServerSQLConstants.CAST, originField, SqlServerSQLConstants.DEFAULT_INT_FORMAT); } else { fieldName = originField; } @@ -139,22 +144,22 @@ public class SqlserverQueryProvider extends QueryProvider { @Override public String createQuerySQLWithPage(String table, List fields, Integer page, Integer pageSize, Integer realSize, boolean isGroup) { - return createQuerySQL(table, fields, isGroup) + " LIMIT " + (page - 1) * pageSize + "," + realSize; - } - - @Override - public String createQueryTableWithLimit(String table, List fields, Integer limit, boolean isGroup) { - return createQuerySQL(table, fields, isGroup) + " LIMIT 0," + limit; - } - - @Override - public String createQuerySqlWithLimit(String sql, List fields, Integer limit, boolean isGroup) { - return createQuerySQLAsTmp(sql, fields, isGroup) + " LIMIT 0," + limit; + return createQuerySQL(table, fields, isGroup) + " ORDER BY " + fields.get(0).getOriginName() + " offset " + (page - 1) * pageSize + " rows fetch next " + realSize + " rows only"; } @Override public String createQuerySQLAsTmpWithPage(String sql, List fields, Integer page, Integer pageSize, Integer realSize, boolean isGroup) { - return createQuerySQLAsTmp(sql, fields, isGroup) + " LIMIT " + (page - 1) * pageSize + "," + realSize; + return createQuerySQLAsTmp(sql, fields, isGroup) + " ORDER BY " + fields.get(0).getOriginName() + " offset " + (page - 1) * pageSize + " rows fetch next " + realSize + " rows only"; + } + + @Override + public String createQueryTableWithLimit(String table, List fields, Integer limit, boolean isGroup) { + return createQuerySQL(table, fields, isGroup) + " ORDER BY " + fields.get(0).getOriginName() + " offset 0 rows fetch next " + limit + " rows only"; + } + + @Override + public String createQuerySqlWithLimit(String sql, List fields, Integer limit, boolean isGroup) { + return createQuerySQLAsTmp(sql, fields, isGroup) + " ORDER BY " + fields.get(0).getOriginName() + " offset 0 rows fetch next " + limit + " rows only"; } @Override @@ -601,7 +606,34 @@ public class SqlserverQueryProvider extends QueryProvider { return sql; } - private String transDateFormat(String dateStyle, String datePattern) { + //日期格式化 +// 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 "yyyy"; +// case "y_M": +// return "yyyy" + split + "MM"; +// case "y_M_d": +// return "yyyy" + split + "MM" + split + "dd"; +// 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"; +// } +// } + //日期格式化 + private String transDateFormat(String dateStyle, String datePattern, String originField) { String split = "-"; if (StringUtils.equalsIgnoreCase(datePattern, "date_sub")) { split = "-"; @@ -611,42 +643,93 @@ public class SqlserverQueryProvider extends QueryProvider { switch (dateStyle) { case "y": - return "%Y"; + return "CONVERT(varchar(100), datepart(yy, " + originField + "))"; case "y_M": - return "%Y" + split + "%m"; + return "CONVERT(varchar(100), datepart(yy, " + originField + ")) N'" + split + "'CONVERT(varchar(100), datepart(mm, " + originField + "))"; case "y_M_d": - return "%Y" + split + "%m" + split + "%d"; + if(split.equalsIgnoreCase("-")){ + return "CONVERT(varchar(100), " + originField + ", 23)"; + }else { + return "CONVERT(varchar(100), " + originField + ", 111)"; + } case "H_m_s": - return "%H:%i:%S"; + return "CONVERT(varchar(100), " + originField + ", 24)"; case "y_M_d_H_m": - return "%Y" + split + "%m" + split + "%d" + " %H:%i"; + if(split.equalsIgnoreCase("-")){ + return "substring( convert(varchar," + originField + ",120),1,16)"; + }else { + return "replace("+ "substring( convert(varchar," + originField + ",120),1,16), '-','/')"; + } case "y_M_d_H_m_s": - return "%Y" + split + "%m" + split + "%d" + " %H:%i:%S"; + if(split.equalsIgnoreCase("-")){ + return "convert(varchar," + originField + ",120)"; + }else { + return "replace("+ "convert(varchar," + originField + ",120), '-','/')"; + } default: - return "%Y-%m-%d %H:%i:%S"; + return "convert(varchar," + originField + ",120)"; + } + } + + private String transStringToDateFormat(String dateStyle, String datePattern, String originField) { + String split = "-"; + if (StringUtils.equalsIgnoreCase(datePattern, "date_sub")) { + split = "-"; + } else if (StringUtils.equalsIgnoreCase(datePattern, "date_split")) { + split = "/"; + } + switch (dateStyle) { + case "y": + return "CONVERT(varchar(100), datepart(yy, " + "SELECT CONVERT(datetime, " + originField + " ,120)" + "))"; + case "y_M": + if(split.equalsIgnoreCase("-")){ + return "substring( convert(varchar," + "SELECT CONVERT(datetime, " + originField + " ,120)" + ",120),1,7)"; + }else { + return "replace("+ "substring( convert(varchar," + "SELECT CONVERT(datetime, " + originField + " ,120)" + ",120),1,7), '-','/')"; + } + case "y_M_d": + if(split.equalsIgnoreCase("-")){ + return "CONVERT(varchar(100), " + "SELECT CONVERT(datetime, " + originField + " ,120)" + ", 23)"; + }else { + return "CONVERT(varchar(100), " + "SELECT CONVERT(datetime, " + originField + " ,120)" + ", 111)"; + } + case "H_m_s": + return "CONVERT(varchar(100), " + "SELECT CONVERT(datetime, " + originField + " ,120)" + ", 24)"; + case "y_M_d_H_m": + if(split.equalsIgnoreCase("-")){ + return "substring( convert(varchar," + "SELECT CONVERT(datetime, " + originField + " ,120)" + ",120),1,16)"; + }else { + return "replace("+ "substring( convert(varchar," + "SELECT CONVERT(datetime, " + originField + " ,120)" + ",120),1,16), '-','/')"; + } + case "y_M_d_H_m_s": + if(split.equalsIgnoreCase("-")){ + return "convert(varchar," + "SELECT CONVERT(datetime, " + originField + " ,120)" + ",120)"; + }else { + return "replace("+ "convert(varchar," + "SELECT CONVERT(datetime, " + originField + " ,120)" + ",120), '-','/')"; + } + default: + return "convert(varchar," + "SELECT CONVERT(datetime, " + originField + " ,120)" + ",120)"; } } private SQLObj getXFields(ChartViewFieldDTO x, String originField, String fieldAlias) { String fieldName = ""; - if (x.getDeExtractType() == 1) { - if (x.getDeType() == 2 || x.getDeType() == 3) { - fieldName = String.format(SqlServerSQLConstants.UNIX_TIMESTAMP, originField) + "*1000"; - } else if (x.getDeType() == 1) { - String format = transDateFormat(x.getDateStyle(), x.getDatePattern()); - fieldName = String.format(SqlServerSQLConstants.DATE_FORMAT, originField, format); + if (x.getDeExtractType() == DE_TIME) { + if (x.getDeType() == DE_INT || x.getDeType() == DE_FLOAT) { //时间转数值 + fieldName = String.format(SqlServerSQLConstants.UNIX_TIMESTAMP, originField); + } else if (x.getDeType() == DE_TIME) { //时间格式化 + fieldName = transDateFormat(x.getDateStyle(), x.getDatePattern(), originField); } else { fieldName = originField; } } else { - if (x.getDeType() == 1) { - String format = transDateFormat(x.getDateStyle(), x.getDatePattern()); - if (x.getDeExtractType() == 0) { - fieldName = String.format(SqlServerSQLConstants.DATE_FORMAT, originField, format); - } else { - String cast = String.format(SqlServerSQLConstants.CAST, originField, SqlServerSQLConstants.DEFAULT_INT_FORMAT) + "/1000"; - String from_unixtime = String.format(SqlServerSQLConstants.FROM_UNIXTIME, cast, SqlServerSQLConstants.DEFAULT_DATE_FORMAT); - fieldName = String.format(SqlServerSQLConstants.DATE_FORMAT, from_unixtime, format); + if (x.getDeType() == DE_TIME) { + if (x.getDeExtractType() == DE_STRING) {// 字符串转时间 + String cast = String.format(SqlServerSQLConstants.STRING_TO_DATE, originField); + fieldName = transDateFormat(x.getDateStyle(), x.getDatePattern(), cast); + } else {// 数值转时间 + String cast = String.format(SqlServerSQLConstants.LONG_TO_DATE, originField+ "/1000"); + fieldName = transDateFormat(x.getDateStyle(), x.getDatePattern(), cast); } } else { fieldName = originField; From ddb6e767fdfbc7b52fdd7c8fe1c70d68fe071d7d Mon Sep 17 00:00:00 2001 From: taojinlong Date: Thu, 5 Aug 2021 13:43:33 +0800 Subject: [PATCH 04/16] feat: sqlserver --- .../sqlserver/SqlServerSQLConstants.java | 6 +- .../sqlserver/SqlserverQueryProvider.java | 87 ++++--------------- 2 files changed, 18 insertions(+), 75 deletions(-) diff --git a/backend/src/main/java/io/dataease/provider/sqlserver/SqlServerSQLConstants.java b/backend/src/main/java/io/dataease/provider/sqlserver/SqlServerSQLConstants.java index 1f42fbee4a..783c185082 100644 --- a/backend/src/main/java/io/dataease/provider/sqlserver/SqlServerSQLConstants.java +++ b/backend/src/main/java/io/dataease/provider/sqlserver/SqlServerSQLConstants.java @@ -17,11 +17,11 @@ public class SqlServerSQLConstants extends SQLConstants { public static final String DATE_FORMAT = "CONVERT(varchar(100), %s, %s)"; - public static final String FROM_UNIXTIME = "FROM_UNIXTIME(%s,'%s')"; + public static final String FROM_UNIXTIME = "convert(varchar, %s ,120)"; - public static final String CAST = "CAST(%s AS %s)"; + public static final String CONVERT = "CONVERT(%s, %s)"; - public static final String LONG_TO_DATE = "DATEADD(second,%s,'1970-01-01 08:00:00') ,120)"; + public static final String LONG_TO_DATE = "DATEADD(second,%s,'1970-01-01 08:00:00')"; public static final String STRING_TO_DATE = "CONVERT(datetime, %s ,120)"; public static final String DEFAULT_DATE_FORMAT = "%Y-%m-%d %H:%i:%S"; 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 63de709a80..c1983357db 100644 --- a/backend/src/main/java/io/dataease/provider/sqlserver/SqlserverQueryProvider.java +++ b/backend/src/main/java/io/dataease/provider/sqlserver/SqlserverQueryProvider.java @@ -112,7 +112,7 @@ public class SqlserverQueryProvider extends QueryProvider { } } else { if (f.getDeType() == DE_TIME) { // - String cast = String.format(SqlServerSQLConstants.CAST, originField, SqlServerSQLConstants.DEFAULT_INT_FORMAT) + "/1000"; +// String cast = String.format(SqlServerSQLConstants.CAST, originField, SqlServerSQLConstants.DEFAULT_INT_FORMAT) + "/1000"; fieldName = originField; // String.format(SqlServerSQLConstants.FROM_UNIXTIME, cast, SqlServerSQLConstants.DEFAULT_DATE_FORMAT); } else if (f.getDeType() == DE_INT) { @@ -511,6 +511,7 @@ public class SqlserverQueryProvider extends QueryProvider { } } + public List transCustomFilterList(SQLObj tableObj, List requestList) { if (CollectionUtils.isEmpty(requestList)) { return null; @@ -526,9 +527,9 @@ public class SqlserverQueryProvider extends QueryProvider { String whereTerm = transMysqlFilterTerm(request.getTerm()); String whereValue = ""; String originName = String.format(SqlServerSQLConstants.KEYWORD_FIX, tableObj.getTableAlias(), field.getOriginName()); - if (field.getDeType() == 1 && field.getDeExtractType() != 1) { - String cast = String.format(SqlServerSQLConstants.CAST, originName, SqlServerSQLConstants.DEFAULT_INT_FORMAT) + "/1000"; - whereName = String.format(SqlServerSQLConstants.FROM_UNIXTIME, cast, SqlServerSQLConstants.DEFAULT_DATE_FORMAT); + if (field.getDeType() == DE_TIME && field.getDeExtractType() != DE_TIME) { + String cast = String.format(SqlServerSQLConstants.LONG_TO_DATE, originName + "/1000"); + whereName = String.format(SqlServerSQLConstants.FROM_UNIXTIME, cast); } else { whereName = originName; } @@ -568,8 +569,8 @@ public class SqlserverQueryProvider extends QueryProvider { String originName = String.format(SqlServerSQLConstants.KEYWORD_FIX, tableObj.getTableAlias(), field.getOriginName()); if (field.getDeType() == 1 && field.getDeExtractType() != 1) { - String cast = String.format(SqlServerSQLConstants.CAST, originName, SqlServerSQLConstants.DEFAULT_INT_FORMAT) + "/1000"; - whereName = String.format(SqlServerSQLConstants.FROM_UNIXTIME, cast, SqlServerSQLConstants.DEFAULT_DATE_FORMAT); + String cast = String.format(SqlServerSQLConstants.LONG_TO_DATE, originName + "/1000"); + whereName = String.format(SqlServerSQLConstants.FROM_UNIXTIME, cast); } else { whereName = originName; } @@ -580,7 +581,7 @@ public class SqlserverQueryProvider extends QueryProvider { } else if (StringUtils.containsIgnoreCase(request.getOperator(), "like")) { whereValue = "'%" + value.get(0) + "%'"; } else if (StringUtils.containsIgnoreCase(request.getOperator(), "between")) { - if (request.getDatasetTableField().getDeType() == 1) { + if (request.getDatasetTableField().getDeType() == DE_TIME) { 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)))); @@ -607,32 +608,6 @@ public class SqlserverQueryProvider extends QueryProvider { } //日期格式化 -// 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 "yyyy"; -// case "y_M": -// return "yyyy" + split + "MM"; -// case "y_M_d": -// return "yyyy" + split + "MM" + split + "dd"; -// 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"; -// } -// } - //日期格式化 private String transDateFormat(String dateStyle, String datePattern, String originField) { String split = "-"; if (StringUtils.equalsIgnoreCase(datePattern, "date_sub")) { @@ -741,40 +716,6 @@ public class SqlserverQueryProvider extends QueryProvider { .build(); } - private List getXWheres(ChartViewFieldDTO x, String originField, String fieldAlias) { - List list = new ArrayList<>(); - if (CollectionUtils.isNotEmpty(x.getFilter()) && x.getFilter().size() > 0) { - x.getFilter().forEach(f -> { - String whereName = ""; - String whereTerm = transMysqlFilterTerm(f.getTerm()); - String whereValue = ""; - if (x.getDeType() == 1 && x.getDeExtractType() != 1) { - String cast = String.format(SqlServerSQLConstants.CAST, originField, SqlServerSQLConstants.DEFAULT_INT_FORMAT) + "/1000"; - whereName = String.format(SqlServerSQLConstants.FROM_UNIXTIME, cast, SqlServerSQLConstants.DEFAULT_DATE_FORMAT); - } else { - whereName = originField; - } - if (StringUtils.equalsIgnoreCase(f.getTerm(), "null")) { - whereValue = SqlServerSQLConstants.WHERE_VALUE_NULL; - } else if (StringUtils.equalsIgnoreCase(f.getTerm(), "not_null")) { - whereTerm = String.format(whereTerm, originField); - } else if (StringUtils.containsIgnoreCase(f.getTerm(), "in")) { - whereValue = "('" + StringUtils.join(f.getValue(), "','") + "')"; - } else if (StringUtils.containsIgnoreCase(f.getTerm(), "like")) { - whereValue = "'%" + f.getValue() + "%'"; - } else { - whereValue = String.format(SqlServerSQLConstants.WHERE_VALUE_VALUE, f.getValue()); - } - list.add(SQLObj.builder() - .whereField(whereName) - .whereAlias(fieldAlias) - .whereTermAndValue(whereTerm + whereValue) - .build()); - }); - } - return list; - } - private SQLObj getYFields(ChartViewFieldDTO y, String originField, String fieldAlias) { String fieldName = ""; if (StringUtils.equalsIgnoreCase(y.getOriginName(), "*")) { @@ -783,12 +724,12 @@ public class SqlserverQueryProvider extends QueryProvider { fieldName = String.format(SqlServerSQLConstants.AGG_FIELD, y.getSummary(), originField); } else { if (StringUtils.equalsIgnoreCase(y.getSummary(), "avg") || StringUtils.containsIgnoreCase(y.getSummary(), "pop")) { - String cast = String.format(SqlServerSQLConstants.CAST, originField, y.getDeType() == 2 ? SqlServerSQLConstants.DEFAULT_INT_FORMAT : SqlServerSQLConstants.DEFAULT_FLOAT_FORMAT); - String agg = String.format(SqlServerSQLConstants.AGG_FIELD, y.getSummary(), cast); - fieldName = String.format(SqlServerSQLConstants.CAST, agg, SqlServerSQLConstants.DEFAULT_FLOAT_FORMAT); + String convert = String.format(SqlServerSQLConstants.CONVERT, y.getDeType() == DE_INT ? SqlServerSQLConstants.DEFAULT_INT_FORMAT : SqlServerSQLConstants.DEFAULT_FLOAT_FORMAT, originField); + String agg = String.format(SqlServerSQLConstants.AGG_FIELD, y.getSummary(), convert); + fieldName = String.format(SqlServerSQLConstants.CONVERT, SqlServerSQLConstants.DEFAULT_FLOAT_FORMAT, agg); } else { - String cast = String.format(SqlServerSQLConstants.CAST, originField, y.getDeType() == 2 ? SqlServerSQLConstants.DEFAULT_INT_FORMAT : SqlServerSQLConstants.DEFAULT_FLOAT_FORMAT); - fieldName = String.format(SqlServerSQLConstants.AGG_FIELD, y.getSummary(), cast); + String convert = String.format(SqlServerSQLConstants.CONVERT, y.getDeType() == 2 ? SqlServerSQLConstants.DEFAULT_INT_FORMAT : SqlServerSQLConstants.DEFAULT_FLOAT_FORMAT, originField); + fieldName = String.format(SqlServerSQLConstants.AGG_FIELD, y.getSummary(), convert); } } return SQLObj.builder() @@ -824,4 +765,6 @@ public class SqlserverQueryProvider extends QueryProvider { } return list; } + + } From 74b849d0b99e624cd8781c3e181e09786ac58e6d Mon Sep 17 00:00:00 2001 From: taojinlong Date: Fri, 6 Aug 2021 10:21:50 +0800 Subject: [PATCH 05/16] feat: sqlserver --- frontend/src/views/system/datasource/form.vue | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/frontend/src/views/system/datasource/form.vue b/frontend/src/views/system/datasource/form.vue index 9fab06d9e5..bc8fb00755 100644 --- a/frontend/src/views/system/datasource/form.vue +++ b/frontend/src/views/system/datasource/form.vue @@ -105,7 +105,9 @@ export default { 'configuration.host': [{ required: true, message: this.$t('datasource.please_input_host'), trigger: 'change' }], 'configuration.port': [{ required: true, message: this.$t('datasource.please_input_port'), trigger: 'change' }] }, - allTypes: [{ name: 'mysql', label: 'MySQL', type: 'jdbc' }, { name: 'oracle', label: 'Oracle', type: 'jdbc' }], + allTypes: [{ name: 'mysql', label: 'MySQL', type: 'jdbc' }, + { name: 'oracle', label: 'Oracle', type: 'jdbc' }, + { name: 'sqlserver', label: 'SQLSERVER', type: 'jdbc' }], schemas: [], canEdit: false, originConfiguration: {} From c983b661ff83a0f7583c096954aa51661cfd2402 Mon Sep 17 00:00:00 2001 From: taojinlong Date: Fri, 6 Aug 2021 12:19:25 +0800 Subject: [PATCH 06/16] feat: sqlserver --- .../datasource/dto/SqlServerConfigration.java | 1 + .../datasource/provider/JdbcProvider.java | 46 ++++++++++++------- .../service/dataset/DataSetTableService.java | 1 + frontend/src/views/system/datasource/form.vue | 19 +++++++- 4 files changed, 50 insertions(+), 17 deletions(-) diff --git a/backend/src/main/java/io/dataease/datasource/dto/SqlServerConfigration.java b/backend/src/main/java/io/dataease/datasource/dto/SqlServerConfigration.java index 7282704586..1cbe90c83a 100644 --- a/backend/src/main/java/io/dataease/datasource/dto/SqlServerConfigration.java +++ b/backend/src/main/java/io/dataease/datasource/dto/SqlServerConfigration.java @@ -8,6 +8,7 @@ import lombok.Setter; @Setter public class SqlServerConfigration extends JdbcDTO { private String driver = "com.microsoft.sqlserver.jdbc.SQLServerDriver"; + private String schema; public String getJdbc(){ return "jdbc:sqlserver://HOSTNAME:PORT;DatabaseName=DATABASE".replace("HOSTNAME", getHost()).replace("PORT", getPort().toString()).replace("DATABASE", getDataBase()); diff --git a/backend/src/main/java/io/dataease/datasource/provider/JdbcProvider.java b/backend/src/main/java/io/dataease/datasource/provider/JdbcProvider.java index 45f4854820..a3e4c0deff 100644 --- a/backend/src/main/java/io/dataease/datasource/provider/JdbcProvider.java +++ b/backend/src/main/java/io/dataease/datasource/provider/JdbcProvider.java @@ -42,20 +42,25 @@ public class JdbcProvider extends DatasourceProvider { public List getData(DatasourceRequest dsr) throws Exception { List list = new LinkedList<>(); Connection connection = null; - try { - connection = getConnectionFromPool(dsr); - Statement stat = connection.createStatement(); - ResultSet rs = stat.executeQuery(dsr.getQuery()); - list = fetchResult(rs); - } catch (SQLException e) { - DataEaseException.throwException(e); - } catch (Exception e) { - DataEaseException.throwException(e); - } finally { - if(connection != null){ - connection.close(); - } - } + connection = getConnectionFromPool(dsr); + Statement stat = connection.createStatement(); + ResultSet rs = stat.executeQuery(dsr.getQuery()); + System.out.println(rs == null); + list = fetchResult(rs); +// try { +// connection = getConnectionFromPool(dsr); +// Statement stat = connection.createStatement(); +// ResultSet rs = stat.executeQuery(dsr.getQuery()); +// list = fetchResult(rs); +// } catch (SQLException e) { +// DataEaseException.throwException(e); +// } catch (Exception e) { +// DataEaseException.throwException(e); +// } finally { +// if(connection != null){ +// connection.close(); +// } +// } return list; } @@ -102,18 +107,23 @@ public class JdbcProvider extends DatasourceProvider { List list = new LinkedList<>(); ResultSetMetaData metaData = rs.getMetaData(); int columnCount = metaData.getColumnCount(); + System.out.println("columnCount: " + columnCount); while (rs.next()) { String[] row = new String[columnCount]; for (int j = 0; j < columnCount; j++) { int columType = metaData.getColumnType(j + 1); + switch (columType) { case Types.DATE: - row[j] = rs.getDate(j + 1).toString(); + if(rs.getDate(j + 1) != null){ + row[j] = rs.getDate(j + 1).toString(); + } break; default: row[j] = rs.getString(j + 1); break; } + System.out.println(j + " " + columType + " " + row[j]); } list.add(row); } @@ -506,7 +516,9 @@ public class JdbcProvider extends DatasourceProvider { return "show tables;"; case sqlServer: SqlServerConfigration sqlServerConfigration = new Gson().fromJson(datasourceRequest.getDatasource().getConfiguration(), SqlServerConfigration.class); - return "SELECT TABLE_NAME FROM DATABASE.INFORMATION_SCHEMA.TABLES WHERE TABLE_TYPE = 'BASE TABLE';".replace("DATABASE", sqlServerConfigration.getDataBase()); + return "SELECT TABLE_NAME FROM DATABASE.INFORMATION_SCHEMA.TABLES WHERE TABLE_TYPE = 'BASE TABLE' AND TABLE_SCHEMA = 'DS_SCHEMA' ;" + .replace("DATABASE", sqlServerConfigration.getDataBase()) + .replace("DS_SCHEMA", sqlServerConfigration.getSchema()); case oracle: OracleConfigration oracleConfigration = new Gson().fromJson(datasourceRequest.getDatasource().getConfiguration(), OracleConfigration.class); if(StringUtils.isEmpty(oracleConfigration.getSchema())){ @@ -523,6 +535,8 @@ public class JdbcProvider extends DatasourceProvider { switch (datasourceType) { case oracle: return "select * from all_users"; + case sqlServer: + return "select name from sys.schemas;"; default: return "show tables;"; } 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 2bb34dce5b..c8ae09aad9 100644 --- a/backend/src/main/java/io/dataease/service/dataset/DataSetTableService.java +++ b/backend/src/main/java/io/dataease/service/dataset/DataSetTableService.java @@ -378,6 +378,7 @@ public class DataSetTableService { String table = dataTableInfoDTO.getTable(); QueryProvider qp = ProviderFactory.getQueryProvider(ds.getType()); datasourceRequest.setQuery(qp.createQuerySQLWithPage(table, fields, page, pageSize, realSize, false)); + System.out.println(datasourceRequest.getQuery()); map.put("sql", datasourceRequest.getQuery()); try { data.addAll(datasourceProvider.getData(datasourceRequest)); diff --git a/frontend/src/views/system/datasource/form.vue b/frontend/src/views/system/datasource/form.vue index bc8fb00755..e2ee45c109 100644 --- a/frontend/src/views/system/datasource/form.vue +++ b/frontend/src/views/system/datasource/form.vue @@ -63,6 +63,23 @@ + + + + {{ $t('datasource.get_schema') }} + + + + + + + +