From 10143222d7a7d257037ba9c441704d8ee0472f20 Mon Sep 17 00:00:00 2001 From: taojinlong Date: Wed, 30 Jun 2021 18:56:12 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E6=94=AF=E6=8C=81oracle?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../datasource/provider/JdbcProvider.java | 4 ++ .../io/dataease/provider/QueryProvider.java | 4 ++ .../provider/doris/DorisQueryProvider.java | 10 ++++ .../provider/mysql/MysqlQueryProvider.java | 10 ++++ .../provider/oracle/OracleQueryProvider.java | 48 +++++++++++++++---- .../sqlserver/SqlserverQueryProvider.java | 10 ++++ .../service/chart/ChartViewService.java | 1 + .../service/dataset/DataSetTableService.java | 10 ++-- 8 files changed, 81 insertions(+), 16 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 e4a389f19a..55574da8a6 100644 --- a/backend/src/main/java/io/dataease/datasource/provider/JdbcProvider.java +++ b/backend/src/main/java/io/dataease/datasource/provider/JdbcProvider.java @@ -100,7 +100,9 @@ public class JdbcProvider extends DatasourceProvider { private List fetchResult(ResultSet rs) throws Exception { List list = new LinkedList<>(); ResultSetMetaData metaData = rs.getMetaData(); + System.out.println(metaData.getColumnName(1)); int columnCount = metaData.getColumnCount(); + System.out.println(columnCount); while (rs.next()) { String[] row = new String[columnCount]; for (int j = 0; j < columnCount; j++) { @@ -181,6 +183,7 @@ public class JdbcProvider extends DatasourceProvider { field.setRemarks(l); field.setFieldType(t); field.setFieldSize(metaData.getColumnDisplaySize(j + 1)); + if(t.equalsIgnoreCase("LONG")){field.setFieldSize(65533);} //oracle LONG fieldList.add(field); } return fieldList; @@ -259,6 +262,7 @@ public class JdbcProvider extends DatasourceProvider { tableFiled.setFieldSize(Integer.valueOf(resultSet.getString("COLUMN_SIZE"))); String dbType = resultSet.getString("TYPE_NAME"); tableFiled.setFieldType(dbType); + if(dbType.equalsIgnoreCase("LONG")){tableFiled.setFieldSize(65533);} if(StringUtils.isNotEmpty(dbType) && dbType.toLowerCase().contains("date") && tableFiled.getFieldSize() < 50 ){ tableFiled.setFieldSize(50); } diff --git a/backend/src/main/java/io/dataease/provider/QueryProvider.java b/backend/src/main/java/io/dataease/provider/QueryProvider.java index 41ae0fc455..055679307e 100644 --- a/backend/src/main/java/io/dataease/provider/QueryProvider.java +++ b/backend/src/main/java/io/dataease/provider/QueryProvider.java @@ -26,6 +26,10 @@ public abstract class QueryProvider { public abstract String createQuerySQLWithPage(String table, List fields, Integer page, Integer pageSize, Integer realSize); + public abstract String createQueryTableWithLimit(String table, List fields, Integer limit); + + public abstract String createQuerySqlWithLimit(String sql, List fields, Integer limit); + public abstract String createQuerySQLAsTmpWithPage(String sql, List fields, Integer page, Integer pageSize, Integer realSize); public abstract String getSQL(String table, List xAxis, List yAxis, List customFilter, List extFilterRequestList); 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 aaedfd0524..a32742045b 100644 --- a/backend/src/main/java/io/dataease/provider/doris/DorisQueryProvider.java +++ b/backend/src/main/java/io/dataease/provider/doris/DorisQueryProvider.java @@ -116,6 +116,16 @@ public class DorisQueryProvider extends QueryProvider { 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; 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 1b6362b326..d66fd877a7 100644 --- a/backend/src/main/java/io/dataease/provider/mysql/MysqlQueryProvider.java +++ b/backend/src/main/java/io/dataease/provider/mysql/MysqlQueryProvider.java @@ -117,6 +117,16 @@ public class MysqlQueryProvider extends QueryProvider { 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; 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 819b6634ec..75d6cf1f00 100644 --- a/backend/src/main/java/io/dataease/provider/oracle/OracleQueryProvider.java +++ b/backend/src/main/java/io/dataease/provider/oracle/OracleQueryProvider.java @@ -5,6 +5,7 @@ import io.dataease.controller.request.chart.ChartExtFilterRequest; import io.dataease.dto.chart.ChartCustomFilterDTO; import io.dataease.dto.chart.ChartViewFieldDTO; import io.dataease.provider.QueryProvider; +import io.swagger.models.auth.In; import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.lang3.ObjectUtils; import org.apache.commons.lang3.StringUtils; @@ -33,6 +34,9 @@ public class OracleQueryProvider extends QueryProvider { case "MEDIUMTEXT": case "LONGTEXT": case "ENUM": + case "LONG": + case "NVARCHAR2": + case "NCHAR": return 0;// 文本 case "DATE": case "TIME": @@ -46,6 +50,7 @@ public class OracleQueryProvider extends QueryProvider { case "INTEGER": case "BIGINT": return 2;// 整型 + case "NUMBER": case "FLOAT": case "DOUBLE": case "DECIMAL": @@ -70,7 +75,7 @@ public class OracleQueryProvider extends QueryProvider { @Override public String createSQLPreview(String sql, String orderBy) { - return "SELECT * FROM (" + sqlFix(sql) + ") AS tmp " + " WHERE rownum <= 1000"; + return "SELECT * FROM (" + sqlFix(sql) + ") tmp " + " WHERE rownum <= 1000"; } @Override @@ -80,7 +85,11 @@ public class OracleQueryProvider extends QueryProvider { // 如果原始类型为时间 if (f.getDeExtractType() == 1) { if (f.getDeType() == 2 || f.getDeType() == 3) { - stringBuilder.append("UNIX_TIMESTAMP( ").append(f.getOriginName()).append(" )*1000 AS ").append(f.getDataeaseName()); + if(f.getType().equalsIgnoreCase("DATE")){ + stringBuilder.append("TO_NUMBER( ").append(f.getOriginName()).append(" - TO_DATE('1970-01-01 8:0:0', 'YYYY-MM-DD HH24:MI:SS')) * 24 * 60 * 60 * 1000 AS ").append(f.getDataeaseName()); + }else { + stringBuilder.append("TO_NUMBER(to_date(to_char( ").append(f.getOriginName()).append(" ,'yyyy-mm-dd hh24:mi:ss'),'yyyy-mm-dd hh24:mi:ss') - TO_DATE('1970-01-01 8:0:0', 'YYYY-MM-DD HH24:MI:SS')) * 24 * 60 * 60 * 1000 AS ").append(f.getDataeaseName()); + } } else { stringBuilder.append(" ").append(f.getOriginName()).append(" AS ").append(f.getDataeaseName()); } @@ -90,15 +99,15 @@ public class OracleQueryProvider extends QueryProvider { } 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()); + stringBuilder.append("to_date( ").append(f.getOriginName()).append(" ,'yyyy-mm-dd,hh24:mi:ss') AS ").append(f.getDataeaseName()); } else { - stringBuilder.append(" ").append(f.getOriginName()).append(" AS ").append(f.getDataeaseName()); + 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()); + stringBuilder.append("TO_CHAR( ").append(f.getOriginName()).append(" / (1000 * 60 * 60 * 24) + TO_DATE('1970-01-01 08:00:00', 'YYYY-MM-DD HH24:MI:SS'), 'YYYY-MM-DD HH24:MI:SS') AS ").append(f.getDataeaseName()); } else { - stringBuilder.append(" ").append(f.getOriginName()).append(" AS ").append(f.getDataeaseName()); + stringBuilder.append(" ").append(f.getOriginName()).append(" AS ").append(f.getDataeaseName()); } } return stringBuilder.toString(); @@ -106,19 +115,38 @@ public class OracleQueryProvider extends QueryProvider { return MessageFormat.format("SELECT {0} FROM {1} ", StringUtils.join(array, ","), table); } + private String sqlColumn(List fields){ + String[] array = fields.stream().map(f -> { + return f.getDataeaseName(); + }).toArray(String[]::new); + return StringUtils.join(array, ","); + } + @Override public String createQuerySQLAsTmp(String sql, List fields) { - return createQuerySQL(" (" + sqlFix(sql) + ") AS tmp ", fields); + return createQuerySQL(" (" + sqlFix(sql) + ") sqltmp ", fields); } @Override public String createQuerySQLWithPage(String table, List fields, Integer page, Integer pageSize, Integer realSize) { - return createQuerySQL(table, fields) + " where rownum <= " + page * realSize + " minus " + createQuerySQL(table, fields) + " where rownum <= " + (page - 1) * pageSize; + return MessageFormat.format("SELECT {0} FROM ( SELECT tmp.*, rownum r FROM ( {1} ) tmp WHERE rownum <= {2} ) tmp2 WHERE r > {3} ", + sqlColumn(fields), createQuerySQL(table, fields), Integer.valueOf(page * realSize).toString(), Integer.valueOf((page - 1) * pageSize).toString()); + } + + @Override + public String createQueryTableWithLimit(String table, List fields, Integer limit) { + return createQuerySQL(table, fields) + " WHERE rownum <= " + limit; + } + + @Override + public String createQuerySqlWithLimit(String sql, List fields, Integer limit) { + return createQuerySQLAsTmp(sql, fields) + " WHERE rownum <= " + limit; } @Override public String createQuerySQLAsTmpWithPage(String sql, List fields, Integer page, Integer pageSize, Integer realSize) { - return createQuerySQLAsTmp(sql, fields) + " LIMIT " + (page - 1) * pageSize + "," + realSize; + return MessageFormat.format("SELECT {0} FROM ( SELECT tmp.*, rownum r FROM ( {1} ) tmp WHERE rownum <= {2} ) tmp2 WHERE r > {3} ", + sqlColumn(fields), createQuerySQLAsTmp(sql, fields), Integer.valueOf(page * realSize).toString(), Integer.valueOf((page - 1) * pageSize).toString()); } @Override @@ -455,7 +483,7 @@ public class OracleQueryProvider extends QueryProvider { switch (dateStyle) { case "y": - return "%Y"; + return "Y"; case "y_M": return "%Y" + split + "%m"; case "y_M_d": 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 f12e1e015c..7ca66ecd0d 100644 --- a/backend/src/main/java/io/dataease/provider/sqlserver/SqlserverQueryProvider.java +++ b/backend/src/main/java/io/dataease/provider/sqlserver/SqlserverQueryProvider.java @@ -106,6 +106,16 @@ public class SqlserverQueryProvider extends QueryProvider { return createQuerySQL(table, fields) + " offset " + (page - 1) * pageSize + " rows fetch next " + realSize + " rows only"; } + @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; diff --git a/backend/src/main/java/io/dataease/service/chart/ChartViewService.java b/backend/src/main/java/io/dataease/service/chart/ChartViewService.java index 7f233d6fa5..f65e9ec07a 100644 --- a/backend/src/main/java/io/dataease/service/chart/ChartViewService.java +++ b/backend/src/main/java/io/dataease/service/chart/ChartViewService.java @@ -197,6 +197,7 @@ public class ChartViewService { datasourceRequest.setQuery(qp.getSQLAsTmp(dataTableInfoDTO.getSql(), xAxis, yAxis, customFilter, extFilterList)); } } + System.out.println(datasourceRequest.getQuery()); data = datasourceProvider.getData(datasourceRequest); /** * 直连不实用缓存 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 addb66f675..a0ce7c62ad 100644 --- a/backend/src/main/java/io/dataease/service/dataset/DataSetTableService.java +++ b/backend/src/main/java/io/dataease/service/dataset/DataSetTableService.java @@ -293,14 +293,13 @@ public class DataSetTableService { String table = dataTableInfoDTO.getTable(); QueryProvider qp = ProviderFactory.getQueryProvider(ds.getType()); datasourceRequest.setQuery(qp.createQuerySQLWithPage(table, fields, page, pageSize, realSize)); - System.out.println(datasourceRequest.getQuery()); try { data.addAll(datasourceProvider.getData(datasourceRequest)); } catch (Exception e) { e.printStackTrace(); } try { - datasourceRequest.setQuery(qp.createQuerySQL(table, fields) + " LIMIT 0," + dataSetTableRequest.getRow()); + datasourceRequest.setQuery(qp.createQueryTableWithLimit(table, fields, Integer.valueOf(dataSetTableRequest.getRow()))); dataSetPreviewPage.setTotal(datasourceProvider.getData(datasourceRequest).size()); } catch (Exception e) { e.printStackTrace(); @@ -317,13 +316,15 @@ public class DataSetTableService { String sql = dataTableInfoDTO.getSql(); QueryProvider qp = ProviderFactory.getQueryProvider(ds.getType()); datasourceRequest.setQuery(qp.createQuerySQLAsTmpWithPage(sql, fields, page, pageSize, realSize)); + System.out.println(datasourceRequest.getQuery()); try { data.addAll(datasourceProvider.getData(datasourceRequest)); } catch (Exception e) { e.printStackTrace(); } try { - datasourceRequest.setQuery(qp.createQuerySQLAsTmp(sql, fields) + " LIMIT 0," + dataSetTableRequest.getRow()); + datasourceRequest.setQuery(qp.createQuerySqlWithLimit(sql, fields, Integer.valueOf(dataSetTableRequest.getRow()))); + System.out.println(datasourceRequest.getQuery()); dataSetPreviewPage.setTotal(datasourceProvider.getData(datasourceRequest).size()); } catch (Exception e) { e.printStackTrace(); @@ -418,9 +419,6 @@ public class DataSetTableService { } QueryProvider qp = ProviderFactory.getQueryProvider(ds.getType()); String sqlAsTable = qp.createSQLPreview(sql, null); -// datasourceRequest.setQuery(sqlAsTable); -// List previewFields = datasourceProvider.fetchResultField(datasourceRequest); - // 正式执行 datasourceRequest.setQuery(sqlAsTable); Map result = datasourceProvider.fetchResultAndField(datasourceRequest); List data = result.get("dataList");