From 11a24505a33fa49cb4622e5a2b691e349e1d89ad Mon Sep 17 00:00:00 2001 From: taojinlong Date: Thu, 2 Sep 2021 15:18:38 +0800 Subject: [PATCH 01/19] =?UTF-8?q?fix:=20=E6=A0=A1=E9=AA=8Csqlserver=20sche?= =?UTF-8?q?ma=20=E9=9D=9E=E7=A9=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/io/dataease/datasource/provider/JdbcProvider.java | 3 +++ 1 file changed, 3 insertions(+) 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 5918a7f361..1f79523b62 100644 --- a/backend/src/main/java/io/dataease/datasource/provider/JdbcProvider.java +++ b/backend/src/main/java/io/dataease/datasource/provider/JdbcProvider.java @@ -528,6 +528,9 @@ public class JdbcProvider extends DatasourceProvider { return "show tables;"; case sqlServer: SqlServerConfigration sqlServerConfigration = new Gson().fromJson(datasourceRequest.getDatasource().getConfiguration(), SqlServerConfigration.class); + if(StringUtils.isEmpty(sqlServerConfigration.getSchema())){ + throw new Exception(Translator.get("i18n_schema_is_empty")); + } 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()); From d995dd10d688971e86dc05d3ee9bcf893437a92b Mon Sep 17 00:00:00 2001 From: junjie Date: Fri, 3 Sep 2021 16:36:19 +0800 Subject: [PATCH 02/19] =?UTF-8?q?fix:=20=E8=BF=87=E6=BB=A4=E6=97=B6?= =?UTF-8?q?=E9=97=B4=E7=B1=BB=E5=9E=8B=E5=AD=97=E6=AE=B5=E5=8F=AF=E8=83=BD?= =?UTF-8?q?=E5=87=BA=E9=94=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/io/dataease/provider/mysql/MysqlQueryProvider.java | 6 ++++++ .../io/dataease/provider/oracle/OracleQueryProvider.java | 6 ++++++ .../main/java/io/dataease/provider/pg/PgQueryProvider.java | 6 ++++++ .../dataease/provider/sqlserver/SqlserverQueryProvider.java | 6 ++++++ 4 files changed, 24 insertions(+) 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 8661579cf1..37d12ed755 100644 --- a/backend/src/main/java/io/dataease/provider/mysql/MysqlQueryProvider.java +++ b/backend/src/main/java/io/dataease/provider/mysql/MysqlQueryProvider.java @@ -679,6 +679,9 @@ public class MysqlQueryProvider extends QueryProvider { String cast = String.format(MySQLConstants.CAST, originName, MySQLConstants.DEFAULT_INT_FORMAT) + "/1000"; whereName = String.format(MySQLConstants.FROM_UNIXTIME, cast, MySQLConstants.DEFAULT_DATE_FORMAT); } + if (field.getDeExtractType() == 1) { + whereName = originName; + } } else { whereName = originName; } @@ -734,6 +737,9 @@ public class MysqlQueryProvider extends QueryProvider { String cast = String.format(MySQLConstants.CAST, originName, MySQLConstants.DEFAULT_INT_FORMAT) + "/1000"; whereName = String.format(MySQLConstants.FROM_UNIXTIME, cast, MySQLConstants.DEFAULT_DATE_FORMAT); } + if (field.getDeExtractType() == 1) { + whereName = originName; + } } else { whereName = originName; } 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 4750b06fe7..baac76d25c 100644 --- a/backend/src/main/java/io/dataease/provider/oracle/OracleQueryProvider.java +++ b/backend/src/main/java/io/dataease/provider/oracle/OracleQueryProvider.java @@ -714,6 +714,9 @@ public class OracleQueryProvider extends QueryProvider { String cast = String.format(OracleConstants.CAST, originName, OracleConstants.DEFAULT_INT_FORMAT) + "/1000"; whereName = String.format(OracleConstants.FROM_UNIXTIME, cast, OracleConstants.DEFAULT_DATE_FORMAT); } + if (field.getDeExtractType() == 1) { + whereName = originName; + } } else { whereName = originName; } @@ -773,6 +776,9 @@ public class OracleQueryProvider extends QueryProvider { String cast = String.format(OracleConstants.CAST, originName, OracleConstants.DEFAULT_INT_FORMAT) + "/1000"; whereName = String.format(OracleConstants.FROM_UNIXTIME, cast, OracleConstants.DEFAULT_DATE_FORMAT); } + if (field.getDeExtractType() == 1) { + whereName = originName; + } } else { whereName = originName; } diff --git a/backend/src/main/java/io/dataease/provider/pg/PgQueryProvider.java b/backend/src/main/java/io/dataease/provider/pg/PgQueryProvider.java index 5bdc712e38..475d5f4583 100644 --- a/backend/src/main/java/io/dataease/provider/pg/PgQueryProvider.java +++ b/backend/src/main/java/io/dataease/provider/pg/PgQueryProvider.java @@ -706,6 +706,9 @@ public class PgQueryProvider extends QueryProvider { String cast = String.format(PgConstants.CAST, originName, "bigint"); whereName = String.format(PgConstants.FROM_UNIXTIME, cast); } + if (field.getDeExtractType() == 1) { + whereName = originName; + } } else { whereName = originName; } @@ -761,6 +764,9 @@ public class PgQueryProvider extends QueryProvider { String cast = String.format(PgConstants.CAST, originName, "bigint"); whereName = String.format(PgConstants.FROM_UNIXTIME, cast); } + if (field.getDeExtractType() == 1) { + whereName = originName; + } } else { whereName = originName; } 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 6753379231..c51820febb 100644 --- a/backend/src/main/java/io/dataease/provider/sqlserver/SqlserverQueryProvider.java +++ b/backend/src/main/java/io/dataease/provider/sqlserver/SqlserverQueryProvider.java @@ -661,6 +661,9 @@ public class SqlserverQueryProvider extends QueryProvider { String cast = String.format(SqlServerSQLConstants.LONG_TO_DATE, originName + "/1000"); whereName = String.format(SqlServerSQLConstants.FROM_UNIXTIME, cast); } + if (field.getDeExtractType() == 1) { + whereName = originName; + } } else { whereName = originName; } @@ -707,6 +710,9 @@ public class SqlserverQueryProvider extends QueryProvider { String cast = String.format(SqlServerSQLConstants.LONG_TO_DATE, originName + "/1000"); whereName = String.format(SqlServerSQLConstants.FROM_UNIXTIME, cast); } + if (field.getDeExtractType() == 1) { + whereName = originName; + } } else { whereName = originName; } From 5b0fe3b1f387de842a5194b110c7f8113fa45866 Mon Sep 17 00:00:00 2001 From: junjie Date: Fri, 3 Sep 2021 16:55:26 +0800 Subject: [PATCH 03/19] =?UTF-8?q?fix:=20=E8=BF=87=E6=BB=A4=E6=97=B6?= =?UTF-8?q?=E9=97=B4=E7=B1=BB=E5=9E=8B=E5=AD=97=E6=AE=B5=E5=8F=AF=E8=83=BD?= =?UTF-8?q?=E5=87=BA=E9=94=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/io/dataease/provider/doris/DorisQueryProvider.java | 4 ++-- .../java/io/dataease/provider/mysql/MysqlQueryProvider.java | 4 ++-- .../java/io/dataease/provider/oracle/OracleQueryProvider.java | 4 ++-- .../main/java/io/dataease/provider/pg/PgQueryProvider.java | 4 ++-- .../dataease/provider/sqlserver/SqlserverQueryProvider.java | 4 ++-- 5 files changed, 10 insertions(+), 10 deletions(-) diff --git a/backend/src/main/java/io/dataease/provider/doris/DorisQueryProvider.java b/backend/src/main/java/io/dataease/provider/doris/DorisQueryProvider.java index c1169c8fb5..05cf2142c3 100644 --- a/backend/src/main/java/io/dataease/provider/doris/DorisQueryProvider.java +++ b/backend/src/main/java/io/dataease/provider/doris/DorisQueryProvider.java @@ -690,7 +690,7 @@ public class DorisQueryProvider extends QueryProvider { if (field.getDeExtractType() == 0 || field.getDeExtractType() == 5 || field.getDeExtractType() == 1) { whereName = String.format(DorisConstants.STR_TO_DATE, originName, DorisConstants.DEFAULT_DATE_FORMAT); } - if (field.getDeExtractType() == 2 || field.getDeExtractType() == 3) { + if (field.getDeExtractType() == 2 || field.getDeExtractType() == 3 || field.getDeExtractType() == 4) { String cast = String.format(DorisConstants.CAST, originName, DorisConstants.DEFAULT_INT_FORMAT) + "/1000"; whereName = String.format(DorisConstants.FROM_UNIXTIME, cast, DorisConstants.DEFAULT_DATE_FORMAT); } @@ -747,7 +747,7 @@ public class DorisQueryProvider extends QueryProvider { if (field.getDeExtractType() == 0 || field.getDeExtractType() == 5 || field.getDeExtractType() == 1) { whereName = String.format(DorisConstants.STR_TO_DATE, originName, DorisConstants.DEFAULT_DATE_FORMAT); } - if (field.getDeExtractType() == 2 || field.getDeExtractType() == 3) { + if (field.getDeExtractType() == 2 || field.getDeExtractType() == 3 || field.getDeExtractType() == 4) { String cast = String.format(DorisConstants.CAST, originName, DorisConstants.DEFAULT_INT_FORMAT) + "/1000"; whereName = String.format(DorisConstants.FROM_UNIXTIME, cast, DorisConstants.DEFAULT_DATE_FORMAT); } 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 37d12ed755..a102e894d2 100644 --- a/backend/src/main/java/io/dataease/provider/mysql/MysqlQueryProvider.java +++ b/backend/src/main/java/io/dataease/provider/mysql/MysqlQueryProvider.java @@ -675,7 +675,7 @@ public class MysqlQueryProvider extends QueryProvider { if (field.getDeExtractType() == 0 || field.getDeExtractType() == 5) { whereName = String.format(MySQLConstants.STR_TO_DATE, originName, MySQLConstants.DEFAULT_DATE_FORMAT); } - if (field.getDeExtractType() == 2 || field.getDeExtractType() == 3) { + if (field.getDeExtractType() == 2 || field.getDeExtractType() == 3 || field.getDeExtractType() == 4) { String cast = String.format(MySQLConstants.CAST, originName, MySQLConstants.DEFAULT_INT_FORMAT) + "/1000"; whereName = String.format(MySQLConstants.FROM_UNIXTIME, cast, MySQLConstants.DEFAULT_DATE_FORMAT); } @@ -733,7 +733,7 @@ public class MysqlQueryProvider extends QueryProvider { if (field.getDeExtractType() == 0 || field.getDeExtractType() == 5) { whereName = String.format(MySQLConstants.STR_TO_DATE, originName, MySQLConstants.DEFAULT_DATE_FORMAT); } - if (field.getDeExtractType() == 2 || field.getDeExtractType() == 3) { + if (field.getDeExtractType() == 2 || field.getDeExtractType() == 3 || field.getDeExtractType() == 4) { String cast = String.format(MySQLConstants.CAST, originName, MySQLConstants.DEFAULT_INT_FORMAT) + "/1000"; whereName = String.format(MySQLConstants.FROM_UNIXTIME, cast, MySQLConstants.DEFAULT_DATE_FORMAT); } 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 baac76d25c..5af732800e 100644 --- a/backend/src/main/java/io/dataease/provider/oracle/OracleQueryProvider.java +++ b/backend/src/main/java/io/dataease/provider/oracle/OracleQueryProvider.java @@ -710,7 +710,7 @@ public class OracleQueryProvider extends QueryProvider { if (field.getDeExtractType() == 0 || field.getDeExtractType() == 5) { whereName = String.format(OracleConstants.TO_DATE, originName, OracleConstants.DEFAULT_DATE_FORMAT); } - if (field.getDeExtractType() == 2 || field.getDeExtractType() == 3) { + if (field.getDeExtractType() == 2 || field.getDeExtractType() == 3 || field.getDeExtractType() == 4) { String cast = String.format(OracleConstants.CAST, originName, OracleConstants.DEFAULT_INT_FORMAT) + "/1000"; whereName = String.format(OracleConstants.FROM_UNIXTIME, cast, OracleConstants.DEFAULT_DATE_FORMAT); } @@ -772,7 +772,7 @@ public class OracleQueryProvider extends QueryProvider { if (field.getDeExtractType() == 0 || field.getDeExtractType() == 5) { whereName = String.format(OracleConstants.TO_DATE, originName, OracleConstants.DEFAULT_DATE_FORMAT); } - if (field.getDeExtractType() == 2 || field.getDeExtractType() == 3) { + if (field.getDeExtractType() == 2 || field.getDeExtractType() == 3 || field.getDeExtractType() == 4) { String cast = String.format(OracleConstants.CAST, originName, OracleConstants.DEFAULT_INT_FORMAT) + "/1000"; whereName = String.format(OracleConstants.FROM_UNIXTIME, cast, OracleConstants.DEFAULT_DATE_FORMAT); } diff --git a/backend/src/main/java/io/dataease/provider/pg/PgQueryProvider.java b/backend/src/main/java/io/dataease/provider/pg/PgQueryProvider.java index 475d5f4583..6e8da1477f 100644 --- a/backend/src/main/java/io/dataease/provider/pg/PgQueryProvider.java +++ b/backend/src/main/java/io/dataease/provider/pg/PgQueryProvider.java @@ -702,7 +702,7 @@ public class PgQueryProvider extends QueryProvider { if (field.getDeExtractType() == 0 || field.getDeExtractType() == 5) { whereName = String.format(PgConstants.TO_DATE, originName, PgConstants.DEFAULT_DATE_FORMAT); } - if (field.getDeExtractType() == 2 || field.getDeExtractType() == 3) { + if (field.getDeExtractType() == 2 || field.getDeExtractType() == 3 || field.getDeExtractType() == 4) { String cast = String.format(PgConstants.CAST, originName, "bigint"); whereName = String.format(PgConstants.FROM_UNIXTIME, cast); } @@ -760,7 +760,7 @@ public class PgQueryProvider extends QueryProvider { if (field.getDeExtractType() == 0 || field.getDeExtractType() == 5) { whereName = String.format(PgConstants.TO_DATE, originName, PgConstants.DEFAULT_DATE_FORMAT); } - if (field.getDeExtractType() == 2 || field.getDeExtractType() == 3) { + if (field.getDeExtractType() == 2 || field.getDeExtractType() == 3 || field.getDeExtractType() == 4) { String cast = String.format(PgConstants.CAST, originName, "bigint"); whereName = String.format(PgConstants.FROM_UNIXTIME, cast); } 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 c51820febb..5645597100 100644 --- a/backend/src/main/java/io/dataease/provider/sqlserver/SqlserverQueryProvider.java +++ b/backend/src/main/java/io/dataease/provider/sqlserver/SqlserverQueryProvider.java @@ -657,7 +657,7 @@ public class SqlserverQueryProvider extends QueryProvider { if (field.getDeExtractType() == 0 || field.getDeExtractType() == 5) { whereName = String.format(SqlServerSQLConstants.STRING_TO_DATE, originName); } - if (field.getDeExtractType() == 2 || field.getDeExtractType() == 3) { + if (field.getDeExtractType() == 2 || field.getDeExtractType() == 3 || field.getDeExtractType() == 4) { String cast = String.format(SqlServerSQLConstants.LONG_TO_DATE, originName + "/1000"); whereName = String.format(SqlServerSQLConstants.FROM_UNIXTIME, cast); } @@ -706,7 +706,7 @@ public class SqlserverQueryProvider extends QueryProvider { if (field.getDeExtractType() == 0 || field.getDeExtractType() == 5) { whereName = String.format(SqlServerSQLConstants.STRING_TO_DATE, originName); } - if (field.getDeExtractType() == 2 || field.getDeExtractType() == 3) { + if (field.getDeExtractType() == 2 || field.getDeExtractType() == 3 || field.getDeExtractType() == 4) { String cast = String.format(SqlServerSQLConstants.LONG_TO_DATE, originName + "/1000"); whereName = String.format(SqlServerSQLConstants.FROM_UNIXTIME, cast); } From 6b125a65abcffefd4330e4cf2fc030c4dd8e6693 Mon Sep 17 00:00:00 2001 From: taojinlong Date: Fri, 3 Sep 2021 17:27:50 +0800 Subject: [PATCH 04/19] =?UTF-8?q?fix:=20=E5=A4=84=E7=90=86=E4=BA=8C?= =?UTF-8?q?=E8=BF=9B=E5=88=B6=E7=B1=BB=E5=9E=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/io/dataease/service/dataset/ExtractDataService.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/backend/src/main/java/io/dataease/service/dataset/ExtractDataService.java b/backend/src/main/java/io/dataease/service/dataset/ExtractDataService.java index 4f70c0b40c..30fb81e8ef 100644 --- a/backend/src/main/java/io/dataease/service/dataset/ExtractDataService.java +++ b/backend/src/main/java/io/dataease/service/dataset/ExtractDataService.java @@ -1006,7 +1006,7 @@ public class ExtractDataService { String excelCompletion = ""; for (DatasetTableField datasetTableField : datasetTableFields) { - if(datasetTableField.getDeExtractType() == 5){ + if(datasetTableField.getDeExtractType() == DeTypeConstants.DE_BINARY){ handleBinaryTypeCode = handleBinaryTypeCode + "\n" + this.handleBinaryType.replace("FEILD", datasetTableField.getDataeaseName()); } } From c838e4d18bbb161db7e4592cf4c56aa7f6f84de7 Mon Sep 17 00:00:00 2001 From: junjie Date: Tue, 7 Sep 2021 10:26:45 +0800 Subject: [PATCH 05/19] =?UTF-8?q?fix(=E6=95=B0=E6=8D=AE=E9=9B=86):=20?= =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E8=87=AA=E5=AE=9A=E4=B9=89=E6=95=B0=E6=8D=AE?= =?UTF-8?q?=E9=9B=86=E5=AD=97=E6=AE=B5=E6=A0=A1=E9=AA=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit # Conflicts: # backend/src/main/resources/i18n/messages_en_US.properties # backend/src/main/resources/i18n/messages_zh_TW.properties --- .../service/dataset/DataSetTableService.java | 39 +++++++++++-------- .../resources/i18n/messages_en_US.properties | 3 +- .../resources/i18n/messages_zh_CN.properties | 1 + .../resources/i18n/messages_zh_TW.properties | 3 +- 4 files changed, 27 insertions(+), 19 deletions(-) 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 93e1158b4a..e52d9b4299 100644 --- a/backend/src/main/java/io/dataease/service/dataset/DataSetTableService.java +++ b/backend/src/main/java/io/dataease/service/dataset/DataSetTableService.java @@ -1,7 +1,6 @@ package io.dataease.service.dataset; -import com.fit2cloud.quartz.anno.QuartzScheduled; import com.google.gson.Gson; import io.dataease.base.domain.*; import io.dataease.base.mapper.*; @@ -115,9 +114,9 @@ public class DataSetTableService { } } - public void saveExcel(DataSetTableRequest datasetTable)throws Exception { + public void saveExcel(DataSetTableRequest datasetTable) throws Exception { if (StringUtils.isEmpty(datasetTable.getId())) { - if(datasetTable.isMergeSheet()){ + if (datasetTable.isMergeSheet()) { Map> map = datasetTable.getSheets().stream().collect(Collectors.groupingBy(ExcelSheetData::getFieldsMd5)); for (String s : map.keySet()) { DataSetTableRequest sheetTable = new DataSetTableRequest(); @@ -147,7 +146,7 @@ public class DataSetTableService { }); } } - }else { + } else { for (ExcelSheetData sheet : datasetTable.getSheets()) { String[] fieldArray = sheet.getFields().stream().map(TableFiled::getFieldName).toArray(String[]::new); if (checkIsRepeat(fieldArray)) { @@ -183,7 +182,7 @@ public class DataSetTableService { List oldFields = datasetTable.getSheets().get(0).getFields().stream().map(TableFiled::getRemarks).collect(Collectors.toList()); for (ExcelSheetData sheet : datasetTable.getSheets()) { //替换时, - if(datasetTable.getEditType() == 0){ + if (datasetTable.getEditType() == 0) { List newFields = sheet.getFields().stream().map(TableFiled::getRemarks).collect(Collectors.toList()); if (!oldFields.equals(newFields)) { DataEaseException.throwException(Translator.get("i18n_excel_colume_change")); @@ -240,7 +239,7 @@ public class DataSetTableService { if (datasetTable.getIsRename() == null || !datasetTable.getIsRename()) { // 更新数据和字段 if (update == 1) { - if (StringUtils.equalsIgnoreCase(datasetTable.getType(), "sql") || StringUtils.equalsIgnoreCase(datasetTable.getType(), "custom") ) { + if (StringUtils.equalsIgnoreCase(datasetTable.getType(), "sql") || StringUtils.equalsIgnoreCase(datasetTable.getType(), "custom")) { // 删除所有字段,重新抽象 dataSetTableFieldsService.deleteByTableId(datasetTable.getId()); saveTableField(datasetTable); @@ -251,7 +250,7 @@ public class DataSetTableService { return datasetTable; } - public void alter(DataSetTableRequest request)throws Exception { + public void alter(DataSetTableRequest request) throws Exception { checkName(request); datasetTableMapper.updateByPrimaryKeySelective(request); } @@ -804,6 +803,9 @@ public class DataSetTableService { if (StringUtils.equals(dto.getTargetTableId(), dataTableInfoCustomUnion.getTableId())) { DatasetTableField sourceField = dataSetTableFieldsService.get(dto.getSourceTableFieldId()); DatasetTableField targetField = dataSetTableFieldsService.get(dto.getTargetTableFieldId()); + if (ObjectUtils.isEmpty(sourceField) || ObjectUtils.isEmpty(targetField)) { + DEException.throwException(Translator.get("i18n_dataset_field_delete")); + } join.append(convertUnionTypeToSQL(dto.getSourceUnionRelation())) .append(DorisTableUtils.dorisName(dto.getTargetTableId())) .append(" ON ") @@ -861,6 +863,9 @@ public class DataSetTableService { if (StringUtils.equals(dto.getTargetTableId(), dataTableInfoCustomUnion.getTableId())) { DatasetTableField sourceField = dataSetTableFieldsService.get(dto.getSourceTableFieldId()); DatasetTableField targetField = dataSetTableFieldsService.get(dto.getTargetTableFieldId()); + if (ObjectUtils.isEmpty(sourceField) || ObjectUtils.isEmpty(targetField)) { + DEException.throwException(Translator.get("i18n_dataset_field_delete")); + } DatasetTable sourceTable = datasetTableMapper.selectByPrimaryKey(dto.getSourceTableId()); String sourceTableName = new Gson().fromJson(sourceTable.getInfo(), DataTableInfoDTO.class).getTable(); DatasetTable targetTable = datasetTableMapper.selectByPrimaryKey(dto.getTargetTableId()); @@ -901,7 +906,7 @@ public class DataSetTableService { } } - public List saveExcelTableField(String datasetTableId, List fields, boolean insert){ + public List saveExcelTableField(String datasetTableId, List fields, boolean insert) { List datasetTableFields = new ArrayList<>(); if (CollectionUtils.isNotEmpty(fields)) { for (int i = 0; i < fields.size(); i++) { @@ -920,7 +925,7 @@ public class DataSetTableService { datasetTableField.setLastSyncTime(System.currentTimeMillis()); datasetTableField.setExtField(0); datasetTableField.setGroupType(datasetTableField.getDeType() < 2 ? "d" : "q"); - if(insert){ + if (insert) { dataSetTableFieldsService.save(datasetTableField); } datasetTableFields.add(datasetTableField); @@ -1120,11 +1125,11 @@ public class DataSetTableService { .replace(currentUpdateTime, Long.valueOf(System.currentTimeMillis()).toString()); datasourceRequest.setQuery(qp.wrapSql(sql)); List sqlFileds = new ArrayList<>(); - try{ + try { datasourceProvider.fetchResultField(datasourceRequest).stream().map(TableFiled::getFieldName).forEach(filed -> { sqlFileds.add(filed); }); - }catch (Exception e){ + } catch (Exception e) { DataEaseException.throwException(Translator.get("i18n_check_sql_error") + e.getMessage()); } @@ -1137,11 +1142,11 @@ public class DataSetTableService { .replace(currentUpdateTime, Long.valueOf(System.currentTimeMillis()).toString()); datasourceRequest.setQuery(qp.wrapSql(sql)); List sqlFileds = new ArrayList<>(); - try{ + try { datasourceProvider.fetchResultField(datasourceRequest).stream().map(TableFiled::getFieldName).forEach(filed -> { sqlFileds.add(filed); }); - }catch (Exception e){ + } catch (Exception e) { DataEaseException.throwException(Translator.get("i18n_check_sql_error") + e.getMessage()); } @@ -1186,7 +1191,7 @@ public class DataSetTableService { List excelSheetDataList = parseExcel2(filename, file.getInputStream(), true); List retrunSheetDataList = new ArrayList<>(); - if (StringUtils.isNotEmpty(tableId) && editType == 1 ) { + if (StringUtils.isNotEmpty(tableId) && editType == 1) { List datasetTableFields = dataSetTableFieldsService.getFieldsByTableId(tableId); datasetTableFields.stream().filter(datasetTableField -> datasetTableField.getExtField() == 0).collect(Collectors.toList()); datasetTableFields.sort((o1, o2) -> { @@ -1210,7 +1215,7 @@ public class DataSetTableService { if (retrunSheetDataList.size() == 0) { DataEaseException.throwException(Translator.get("i18n_excel_colume_change")); } - }else { + } else { retrunSheetDataList = excelSheetDataList; } @@ -1223,12 +1228,12 @@ public class DataSetTableService { excelFileData.setPath(filePath); filename = filename.substring(0, filename.lastIndexOf('.')); - if(retrunSheetDataList.size() == 1){ + if (retrunSheetDataList.size() == 1) { retrunSheetDataList.get(0).setDatasetName(filename); retrunSheetDataList.get(0).setSheetExcelId(excelId); retrunSheetDataList.get(0).setId(UUID.randomUUID().toString()); retrunSheetDataList.get(0).setPath(filePath); - }else { + } else { for (ExcelSheetData excelSheetData : retrunSheetDataList) { excelSheetData.setDatasetName(filename + "-" + excelSheetData.getExcelLable()); excelSheetData.setSheetExcelId(excelId); diff --git a/backend/src/main/resources/i18n/messages_en_US.properties b/backend/src/main/resources/i18n/messages_en_US.properties index 9ad714f65d..b4bc566569 100644 --- a/backend/src/main/resources/i18n/messages_en_US.properties +++ b/backend/src/main/resources/i18n/messages_en_US.properties @@ -281,4 +281,5 @@ i18n_check_sql_error=Check incremental SQL exception, i18n_change_task_status_error=Suspension is not allowed. The task status is: i18n_Stopped=END i18n_Exec=Running -i18n_no_trigger=The current setting does not trigger task generation. \ No newline at end of file +i18n_no_trigger=The current setting does not trigger task generation. +i18n_dataset_field_delete=Union field deleted,please set again and redo. diff --git a/backend/src/main/resources/i18n/messages_zh_CN.properties b/backend/src/main/resources/i18n/messages_zh_CN.properties index ac52f22368..09e3c5db08 100644 --- a/backend/src/main/resources/i18n/messages_zh_CN.properties +++ b/backend/src/main/resources/i18n/messages_zh_CN.properties @@ -281,4 +281,5 @@ i18n_change_task_status_error=不允许暂停,任务状态为: i18n_Stopped=执行结束 i18n_Exec=运行中 i18n_no_trigger=当前设置没有触发任务生成 +i18n_dataset_field_delete=该自定义数据集有关联字段被删除,请重新确认关联关系并重做该数据集 diff --git a/backend/src/main/resources/i18n/messages_zh_TW.properties b/backend/src/main/resources/i18n/messages_zh_TW.properties index de243c1861..01dce5faa9 100644 --- a/backend/src/main/resources/i18n/messages_zh_TW.properties +++ b/backend/src/main/resources/i18n/messages_zh_TW.properties @@ -283,4 +283,5 @@ i18n_check_sql_error=校驗增量SQL異常, i18n_change_task_status_error=不允許暫停,任務狀態為: i18n_Stopped=執行結束 i18n_Exec=運行中 -i18n_no_trigger=当前设置没有触发任务生成 當前設置沒有觸發任務生成. \ No newline at end of file +i18n_no_trigger=当前设置没有触发任务生成 當前設置沒有觸發任務生成. +i18n_dataset_field_delete=該自定義數據集有關聯字段被刪除,請重新確認關聯關系並重做該數據集 From e161c8ff0eacaf0b853f87519d2f4a5f283033d8 Mon Sep 17 00:00:00 2001 From: junjie Date: Tue, 7 Sep 2021 14:08:16 +0800 Subject: [PATCH 06/19] =?UTF-8?q?refactor(=E8=A7=86=E5=9B=BE)=EF=BC=9A?= =?UTF-8?q?=E5=8E=BB=E9=99=A4=E7=9F=A9=E5=BD=A2=E6=A0=91=E5=9B=BE=E5=9B=BE?= =?UTF-8?q?=E4=BE=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- frontend/src/views/chart/chart/common/common.js | 3 +++ 1 file changed, 3 insertions(+) diff --git a/frontend/src/views/chart/chart/common/common.js b/frontend/src/views/chart/chart/common/common.js index e1e496e758..235af1d18c 100644 --- a/frontend/src/views/chart/chart/common/common.js +++ b/frontend/src/views/chart/chart/common/common.js @@ -50,6 +50,9 @@ export function componentStyle(chart_option, chart) { chart_option.legend.orient = customStyle.legend.orient chart_option.legend.icon = customStyle.legend.icon chart_option.legend.textStyle = customStyle.legend.textStyle + if (chart.type === 'treemap') { + chart_option.legend.show = false + } } if (customStyle.xAxis && (chart.type.includes('bar') || chart.type.includes('line') || chart.type.includes('scatter'))) { chart_option.xAxis.show = customStyle.xAxis.show From 73e7b9f771cbf6da428c780a697f1f79d53496c5 Mon Sep 17 00:00:00 2001 From: junjie Date: Wed, 8 Sep 2021 17:45:58 +0800 Subject: [PATCH 07/19] =?UTF-8?q?fix:=20doris=E6=97=A5=E6=9C=9F=E8=BF=87?= =?UTF-8?q?=E6=BB=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../io/dataease/provider/doris/DorisQueryProvider.java | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) 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 05cf2142c3..26c9de8965 100644 --- a/backend/src/main/java/io/dataease/provider/doris/DorisQueryProvider.java +++ b/backend/src/main/java/io/dataease/provider/doris/DorisQueryProvider.java @@ -772,7 +772,13 @@ public class DorisQueryProvider extends QueryProvider { whereValue = String.format(DorisConstants.WHERE_BETWEEN, value.get(0), value.get(1)); } } else { - whereValue = String.format(DorisConstants.WHERE_VALUE_VALUE, value.get(0)); + if (request.getDatasetTableField().getDeType() == 1) { + SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + String time = simpleDateFormat.format(new Date(Long.parseLong(value.get(0)))); + whereValue = String.format(DorisConstants.WHERE_VALUE_VALUE, time); + } else { + whereValue = String.format(DorisConstants.WHERE_VALUE_VALUE, value.get(0)); + } } list.add(SQLObj.builder() .whereField(whereName) From ac0da75502f00a4246363892802dd37facfcd2b6 Mon Sep 17 00:00:00 2001 From: junjie Date: Wed, 8 Sep 2021 18:38:30 +0800 Subject: [PATCH 08/19] fix: rollback --- .../io/dataease/provider/doris/DorisQueryProvider.java | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/backend/src/main/java/io/dataease/provider/doris/DorisQueryProvider.java b/backend/src/main/java/io/dataease/provider/doris/DorisQueryProvider.java index 26c9de8965..05cf2142c3 100644 --- a/backend/src/main/java/io/dataease/provider/doris/DorisQueryProvider.java +++ b/backend/src/main/java/io/dataease/provider/doris/DorisQueryProvider.java @@ -772,13 +772,7 @@ public class DorisQueryProvider extends QueryProvider { whereValue = String.format(DorisConstants.WHERE_BETWEEN, value.get(0), value.get(1)); } } else { - if (request.getDatasetTableField().getDeType() == 1) { - SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); - String time = simpleDateFormat.format(new Date(Long.parseLong(value.get(0)))); - whereValue = String.format(DorisConstants.WHERE_VALUE_VALUE, time); - } else { - whereValue = String.format(DorisConstants.WHERE_VALUE_VALUE, value.get(0)); - } + whereValue = String.format(DorisConstants.WHERE_VALUE_VALUE, value.get(0)); } list.add(SQLObj.builder() .whereField(whereName) From 4d2a7919b8eecf848e20ad7e3ed82a9c7dd16053 Mon Sep 17 00:00:00 2001 From: fit2cloud-chenyw Date: Thu, 9 Sep 2021 18:18:56 +0800 Subject: [PATCH 09/19] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E6=9C=89lic?= =?UTF-8?q?=E4=BD=86=E6=B2=A1=E6=9C=89=E9=AA=8C=E8=AF=81=E5=99=A8=E6=8A=A5?= =?UTF-8?q?=E9=94=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../io/dataease/commons/license/DefaultLicenseService.java | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/backend/src/main/java/io/dataease/commons/license/DefaultLicenseService.java b/backend/src/main/java/io/dataease/commons/license/DefaultLicenseService.java index f79f9afc54..fd30061367 100644 --- a/backend/src/main/java/io/dataease/commons/license/DefaultLicenseService.java +++ b/backend/src/main/java/io/dataease/commons/license/DefaultLicenseService.java @@ -45,9 +45,12 @@ public class DefaultLicenseService { } return f2CLicenseResponse; }catch (Exception e){ - e.printStackTrace(); - return F2CLicenseResponse.invalid(e.getMessage()); + LogUtil.error(e.getMessage()); + // e.printStackTrace(); + // return F2CLicenseResponse.invalid(e.getMessage()); + return F2CLicenseResponse.noRecord(); } + } From f041b088ba982dbe1377676f3b27cd1a66dbffa1 Mon Sep 17 00:00:00 2001 From: wangjiahao <1522128093@qq.com> Date: Fri, 10 Sep 2021 11:25:04 +0800 Subject: [PATCH 10/19] =?UTF-8?q?fix:=E8=A7=86=E5=9B=BE=E6=9B=B4=E6=8D=A2?= =?UTF-8?q?=E6=95=B0=E6=8D=AE=E9=9B=86=E5=8F=AF=E8=83=BD=E5=AF=BC=E8=87=B4?= =?UTF-8?q?=E8=81=94=E5=8A=A8=E5=A4=B1=E6=95=88=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/io/dataease/service/chart/ChartViewService.java | 3 +++ frontend/src/components/canvas/custom-component/UserView.vue | 2 +- 2 files changed, 4 insertions(+), 1 deletion(-) 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 206eaf5eee..47bcbd0ded 100644 --- a/backend/src/main/java/io/dataease/service/chart/ChartViewService.java +++ b/backend/src/main/java/io/dataease/service/chart/ChartViewService.java @@ -436,6 +436,9 @@ public class ChartViewService { map.putAll(mapChart); map.putAll(mapTableNormal); + List sourceFields = dataSetTableFieldsService.getFieldsByTableId(view.getTableId()); + map.put("sourceFields",sourceFields); + ChartViewDTO dto = new ChartViewDTO(); BeanUtils.copyBean(dto, view); dto.setData(map); diff --git a/frontend/src/components/canvas/custom-component/UserView.vue b/frontend/src/components/canvas/custom-component/UserView.vue index c31f829010..f9e27fd393 100644 --- a/frontend/src/components/canvas/custom-component/UserView.vue +++ b/frontend/src/components/canvas/custom-component/UserView.vue @@ -119,7 +119,7 @@ export default { trackMenu() { const trackMenuInfo = [] let linkageCount = 0 - this.chart.data && this.chart.data.fields && this.chart.data.fields.forEach(item => { + this.chart.data && this.chart.data.sourceFields && this.chart.data.sourceFields.forEach(item => { const sourceInfo = this.chart.id + '#' + item.id if (this.nowPanelTrackInfo[sourceInfo]) { linkageCount++ From be1c979d472824a4f8fbd596f960d53950c5bd0a Mon Sep 17 00:00:00 2001 From: fit2cloud-chenyw Date: Fri, 10 Sep 2021 16:59:54 +0800 Subject: [PATCH 11/19] =?UTF-8?q?fix:=20=E6=96=B0=E5=A2=9E=E7=94=A8?= =?UTF-8?q?=E6=88=B7=E9=82=AE=E7=AE=B1=E9=87=8D=E5=A4=8D=E6=8A=A5=E9=94=99?= =?UTF-8?q?=E6=8F=90=E7=A4=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 1 + .../io/dataease/service/sys/SysUserService.java | 17 +++++++++++++++++ .../resources/i18n/messages_en_US.properties | 1 + .../resources/i18n/messages_zh_CN.properties | 1 + .../resources/i18n/messages_zh_TW.properties | 1 + 5 files changed, 21 insertions(+) diff --git a/.gitignore b/.gitignore index 7647865be8..d7a4223552 100644 --- a/.gitignore +++ b/.gitignore @@ -40,6 +40,7 @@ yarn-error.log* pnpm-debug.log* # Editor directories and files +.lh .idea .vscode *.suo diff --git a/backend/src/main/java/io/dataease/service/sys/SysUserService.java b/backend/src/main/java/io/dataease/service/sys/SysUserService.java index bfc1871ec8..e334aac2dd 100644 --- a/backend/src/main/java/io/dataease/service/sys/SysUserService.java +++ b/backend/src/main/java/io/dataease/service/sys/SysUserService.java @@ -80,6 +80,7 @@ public class SysUserService { @Transactional public int save(SysUserCreateRequest request) { checkUsername(request); + checkEmail(request); SysUser user = BeanUtils.copyBean(new SysUser(), request); long now = System.currentTimeMillis(); user.setCreateTime(now); @@ -109,6 +110,7 @@ public class SysUserService { @Transactional public int update(SysUserCreateRequest request) { checkUsername(request); + checkEmail(request); if (StringUtils.isEmpty(request.getPassword())) { request.setPassword(null); } @@ -251,4 +253,19 @@ public class SysUserService { throw new RuntimeException(Translator.get("i18n_username_exists")); } } + + private void checkEmail(SysUserCreateRequest request) { + SysUserExample sysUserExample = new SysUserExample(); + SysUserExample.Criteria criteria = sysUserExample.createCriteria(); + if (request.getUserId() != null) { + criteria.andUserIdNotEqualTo(request.getUserId()); + } + criteria.andEmailEqualTo(request.getEmail()); + List sysUsers = sysUserMapper.selectByExample(sysUserExample); + if (CollectionUtils.isNotEmpty(sysUsers)) { + throw new RuntimeException(Translator.get("i18n_email_exists")); + } + } + + } diff --git a/backend/src/main/resources/i18n/messages_en_US.properties b/backend/src/main/resources/i18n/messages_en_US.properties index b4bc566569..9bd6b01a75 100644 --- a/backend/src/main/resources/i18n/messages_en_US.properties +++ b/backend/src/main/resources/i18n/messages_en_US.properties @@ -242,6 +242,7 @@ i18n_union_field_exists=The same field can't in two dataset i18n_cron_time_error=Start time can't greater then end time i18n_auth_source_be_canceled=This Auth Resource Already Be Canceled,Please Connect Admin i18n_username_exists=ID is already exists +i18n_email_exists=Email is already exists i18n_ds_name_exists=Datasource name used i18n_sync_job_exists=There is already a synchronization task running, please try again later i18n_datasource_check_fail=Invalid,please check config diff --git a/backend/src/main/resources/i18n/messages_zh_CN.properties b/backend/src/main/resources/i18n/messages_zh_CN.properties index 09e3c5db08..33c82a1a5b 100644 --- a/backend/src/main/resources/i18n/messages_zh_CN.properties +++ b/backend/src/main/resources/i18n/messages_zh_CN.properties @@ -241,6 +241,7 @@ i18n_union_field_exists=两个数据集之间关联不能出现多次相同字 i18n_cron_time_error=开始时间不能大于结束时间 i18n_auth_source_be_canceled=本用户当前资源所有授权权限已经被取消,如需再次开通,请联系管理员 i18n_username_exists=用户 ID 已存在 +i18n_email_exists=邮箱已存在 i18n_ds_name_exists=数据源名称已被使用 i18n_sync_job_exists=已经有同步任务在运行,稍后重试 i18n_datasource_check_fail=校验失败,请检查配置信息 diff --git a/backend/src/main/resources/i18n/messages_zh_TW.properties b/backend/src/main/resources/i18n/messages_zh_TW.properties index 01dce5faa9..6f21695ef3 100644 --- a/backend/src/main/resources/i18n/messages_zh_TW.properties +++ b/backend/src/main/resources/i18n/messages_zh_TW.properties @@ -244,6 +244,7 @@ i18n_union_field_exists=兩個數據集之間關聯不能出現多次相同字 i18n_cron_time_error=開始時間不能大於結束時間 i18n_auth_source_be_canceled=本用户当前资源所有授权权限已经被取消,如需再次开通,请联系管理员 i18n_username_exists=用戶ID已存在 +i18n_email_exists=郵箱已存在 i18n_ds_name_exists=數據源名稱已被使用 i18n_sync_job_exists=已經有同步任務在運行,稍後重試 i18n_datasource_check_fail=校驗失敗,請檢查配置信息 From 005bb6bb21fd58efbef657c1fcd6e2f6ab5546a7 Mon Sep 17 00:00:00 2001 From: fit2cloud-chenyw Date: Wed, 15 Sep 2021 16:35:14 +0800 Subject: [PATCH 12/19] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=20=E6=95=B0?= =?UTF-8?q?=E6=8D=AE=E6=B2=A1=E6=9C=89=E9=92=BB=E5=8F=96=E4=BD=86=E5=9C=B0?= =?UTF-8?q?=E5=9B=BE=E5=88=87=E6=8D=A2=E4=BA=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- frontend/src/components/canvas/custom-component/UserView.vue | 1 + frontend/src/views/chart/view/ChartEdit.vue | 2 ++ 2 files changed, 3 insertions(+) diff --git a/frontend/src/components/canvas/custom-component/UserView.vue b/frontend/src/components/canvas/custom-component/UserView.vue index f9e27fd393..3301634403 100644 --- a/frontend/src/components/canvas/custom-component/UserView.vue +++ b/frontend/src/components/canvas/custom-component/UserView.vue @@ -262,6 +262,7 @@ export default { this.chart.drillFields = this.chart.drillFields ? JSON.parse(this.chart.drillFields) : [] if (!response.data.drill) { this.drillClickDimensionList.splice(this.drillClickDimensionList.length - 1, 1) + this.resetDrill() } this.drillFilters = JSON.parse(JSON.stringify(response.data.drillFilters)) this.drillFields = JSON.parse(JSON.stringify(response.data.drillFields)) diff --git a/frontend/src/views/chart/view/ChartEdit.vue b/frontend/src/views/chart/view/ChartEdit.vue index fd511aecd1..9d91c1adce 100644 --- a/frontend/src/views/chart/view/ChartEdit.vue +++ b/frontend/src/views/chart/view/ChartEdit.vue @@ -982,6 +982,8 @@ export default { } if (!response.data.drill) { this.drillClickDimensionList.splice(this.drillClickDimensionList.length - 1, 1) + + this.resetDrill() } this.drillFilters = JSON.parse(JSON.stringify(response.data.drillFilters ? response.data.drillFilters : [])) }).catch(err => { From ec94ee9139de14b8710eff433e38e7e15c217114 Mon Sep 17 00:00:00 2001 From: junjie Date: Wed, 15 Sep 2021 16:59:43 +0800 Subject: [PATCH 13/19] =?UTF-8?q?fix:=20=E5=A0=86=E5=8F=A0=E9=A1=B9?= =?UTF-8?q?=E4=B8=BA=E6=97=B6=E9=97=B4=E7=B1=BB=E5=9E=8B=E9=94=99=E8=AF=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../components/drag-item/ChartDragItem.vue | 61 ++++++++++++++++++- frontend/src/views/chart/view/ChartEdit.vue | 6 ++ 2 files changed, 66 insertions(+), 1 deletion(-) diff --git a/frontend/src/views/chart/components/drag-item/ChartDragItem.vue b/frontend/src/views/chart/components/drag-item/ChartDragItem.vue index 0b5ba92f6f..400fadab32 100644 --- a/frontend/src/views/chart/components/drag-item/ChartDragItem.vue +++ b/frontend/src/views/chart/components/drag-item/ChartDragItem.vue @@ -49,7 +49,45 @@ - + + + + + + + {{ $t('chart.dateStyle') }} + ({{ $t('chart.'+item.dateStyle) }}) + + + + + {{ $t('chart.y') }} + {{ $t('chart.y_M') }} + {{ $t('chart.y_M_d') }} + {{ $t('chart.H_m_s') }} + {{ $t('chart.y_M_d_H_m') }} + {{ $t('chart.y_M_d_H_m_s') }} + + + + + + + + + {{ $t('chart.datePattern') }} + ({{ $t('chart.'+item.datePattern) }}) + + + + + {{ $t('chart.date_sub') }}(1990-01-01) + {{ $t('chart.date_split') }}(1990/01/01) + + + + + @@ -143,6 +181,27 @@ export default { removeItem() { this.item.index = this.index this.$emit('onItemRemove', this.item) + }, + + dateStyle(param) { + // console.log(param) + this.item.dateStyle = param.type + this.$emit('onItemChange', this.item) + }, + beforeDateStyle(type) { + return { + type: type + } + }, + datePattern(param) { + // console.log(param) + this.item.datePattern = param.type + this.$emit('onItemChange', this.item) + }, + beforeDatePattern(type) { + return { + type: type + } } } } diff --git a/frontend/src/views/chart/view/ChartEdit.vue b/frontend/src/views/chart/view/ChartEdit.vue index fd511aecd1..0ec2435abe 100644 --- a/frontend/src/views/chart/view/ChartEdit.vue +++ b/frontend/src/views/chart/view/ChartEdit.vue @@ -875,6 +875,12 @@ export default { } }) view.extStack.forEach(function(ele) { + if (!ele.dateStyle || ele.dateStyle === '') { + ele.dateStyle = 'y_M_d' + } + if (!ele.datePattern || ele.datePattern === '') { + ele.datePattern = 'date_sub' + } if (!ele.sort || ele.sort === '') { ele.sort = 'none' } From b5b94752d58ad7a0d0a8319b1e07779e0c3aa07e Mon Sep 17 00:00:00 2001 From: junjie Date: Wed, 15 Sep 2021 17:44:17 +0800 Subject: [PATCH 14/19] =?UTF-8?q?fix:=20=E4=B8=A4=E4=B8=AA=E8=A1=A8?= =?UTF-8?q?=E5=A4=9A=E5=AD=97=E6=AE=B5=E5=85=B3=E8=81=94=E5=90=8E=EF=BC=8C?= =?UTF-8?q?=E5=88=9B=E5=BB=BA=E8=87=AA=E5=AE=9A=E4=B9=89=E6=95=B0=E6=8D=AE?= =?UTF-8?q?=E9=9B=86=E5=87=BA=E9=94=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../service/dataset/DataSetTableService.java | 56 ++++++++++++++----- 1 file changed, 42 insertions(+), 14 deletions(-) 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 e52d9b4299..9a84d58fb0 100644 --- a/backend/src/main/java/io/dataease/service/dataset/DataSetTableService.java +++ b/backend/src/main/java/io/dataease/service/dataset/DataSetTableService.java @@ -797,21 +797,35 @@ public class DataSetTableService { String f = field.substring(0, field.length() - 1); StringBuilder join = new StringBuilder(); + List unions = new ArrayList<>(); for (DataTableInfoCustomUnion dataTableInfoCustomUnion : dataTableInfoDTO.getList()) { for (DataSetTableUnionDTO dto : list) { // 被关联表和自助数据集的表相等 if (StringUtils.equals(dto.getTargetTableId(), dataTableInfoCustomUnion.getTableId())) { - DatasetTableField sourceField = dataSetTableFieldsService.get(dto.getSourceTableFieldId()); - DatasetTableField targetField = dataSetTableFieldsService.get(dto.getTargetTableFieldId()); - if (ObjectUtils.isEmpty(sourceField) || ObjectUtils.isEmpty(targetField)) { - DEException.throwException(Translator.get("i18n_dataset_field_delete")); - } + unions.add(dto); + } + } + } + if (CollectionUtils.isNotEmpty(unions)) { + for (int i = 0; i < unions.size(); i++) { + DataSetTableUnionDTO dto = unions.get(i); + DatasetTableField sourceField = dataSetTableFieldsService.get(dto.getSourceTableFieldId()); + DatasetTableField targetField = dataSetTableFieldsService.get(dto.getTargetTableFieldId()); + if (ObjectUtils.isEmpty(sourceField) || ObjectUtils.isEmpty(targetField)) { + DEException.throwException(Translator.get("i18n_dataset_field_delete")); + } + if (i == 0) { join.append(convertUnionTypeToSQL(dto.getSourceUnionRelation())) .append(DorisTableUtils.dorisName(dto.getTargetTableId())) .append(" ON ") .append(DorisTableUtils.dorisName(dto.getSourceTableId())).append(".").append(sourceField.getDataeaseName()) .append(" = ") .append(DorisTableUtils.dorisName(dto.getTargetTableId())).append(".").append(targetField.getDataeaseName()); + } else { + join.append(" AND ") + .append(DorisTableUtils.dorisName(dto.getSourceTableId())).append(".").append(sourceField.getDataeaseName()) + .append(" = ") + .append(DorisTableUtils.dorisName(dto.getTargetTableId())).append(".").append(targetField.getDataeaseName()); } } } @@ -857,25 +871,39 @@ public class DataSetTableService { String f = field.substring(0, field.length() - 1); StringBuilder join = new StringBuilder(); + List unions = new ArrayList<>(); for (DataTableInfoCustomUnion dataTableInfoCustomUnion : dataTableInfoDTO.getList()) { for (DataSetTableUnionDTO dto : list) { // 被关联表和自助数据集的表相等 if (StringUtils.equals(dto.getTargetTableId(), dataTableInfoCustomUnion.getTableId())) { - DatasetTableField sourceField = dataSetTableFieldsService.get(dto.getSourceTableFieldId()); - DatasetTableField targetField = dataSetTableFieldsService.get(dto.getTargetTableFieldId()); - if (ObjectUtils.isEmpty(sourceField) || ObjectUtils.isEmpty(targetField)) { - DEException.throwException(Translator.get("i18n_dataset_field_delete")); - } - DatasetTable sourceTable = datasetTableMapper.selectByPrimaryKey(dto.getSourceTableId()); - String sourceTableName = new Gson().fromJson(sourceTable.getInfo(), DataTableInfoDTO.class).getTable(); - DatasetTable targetTable = datasetTableMapper.selectByPrimaryKey(dto.getTargetTableId()); - String targetTableName = new Gson().fromJson(targetTable.getInfo(), DataTableInfoDTO.class).getTable(); + unions.add(dto); + } + } + } + if (CollectionUtils.isNotEmpty(unions)) { + for (int i = 0; i < unions.size(); i++) { + DataSetTableUnionDTO dto = unions.get(i); + DatasetTableField sourceField = dataSetTableFieldsService.get(dto.getSourceTableFieldId()); + DatasetTableField targetField = dataSetTableFieldsService.get(dto.getTargetTableFieldId()); + if (ObjectUtils.isEmpty(sourceField) || ObjectUtils.isEmpty(targetField)) { + DEException.throwException(Translator.get("i18n_dataset_field_delete")); + } + DatasetTable sourceTable = datasetTableMapper.selectByPrimaryKey(dto.getSourceTableId()); + String sourceTableName = new Gson().fromJson(sourceTable.getInfo(), DataTableInfoDTO.class).getTable(); + DatasetTable targetTable = datasetTableMapper.selectByPrimaryKey(dto.getTargetTableId()); + String targetTableName = new Gson().fromJson(targetTable.getInfo(), DataTableInfoDTO.class).getTable(); + if (i == 0) { join.append(convertUnionTypeToSQL(dto.getSourceUnionRelation())) .append(String.format(keyword, targetTableName)) .append(" ON ") .append(String.format(keyword, sourceTableName)).append(".").append(String.format(keyword, sourceField.getOriginName())) .append(" = ") .append(String.format(keyword, targetTableName)).append(".").append(String.format(keyword, targetField.getOriginName())); + } else { + join.append(" AND ") + .append(String.format(keyword, sourceTableName)).append(".").append(String.format(keyword, sourceField.getOriginName())) + .append(" = ") + .append(String.format(keyword, targetTableName)).append(".").append(String.format(keyword, targetField.getOriginName())); } } } From 206be1c202e69ae714f920ee5b8ecf564c48e3bc Mon Sep 17 00:00:00 2001 From: junjie Date: Wed, 15 Sep 2021 18:23:58 +0800 Subject: [PATCH 15/19] =?UTF-8?q?fix:=20=E8=AE=A1=E7=AE=97=E5=AD=97?= =?UTF-8?q?=E6=AE=B5=E4=B8=8D=E5=8F=82=E4=B8=8E=E5=85=B3=E8=81=94=E4=BA=8E?= =?UTF-8?q?=E5=88=B6=E4=BD=9C=E8=87=AA=E5=AE=9A=E4=B9=89=E6=95=B0=E6=8D=AE?= =?UTF-8?q?=E9=9B=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- frontend/src/views/dataset/common/DatasetCustomField.vue | 4 ++-- frontend/src/views/dataset/data/UnionView.vue | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/frontend/src/views/dataset/common/DatasetCustomField.vue b/frontend/src/views/dataset/common/DatasetCustomField.vue index 3ec843512f..1de987d639 100644 --- a/frontend/src/views/dataset/common/DatasetCustomField.vue +++ b/frontend/src/views/dataset/common/DatasetCustomField.vue @@ -57,7 +57,7 @@ export default { watch: { 'table': function() { fieldList(this.table.id).then(response => { - this.fields = response.data + this.fields = JSON.parse(JSON.stringify(response.data)).filter(ele => ele.extField === 0) this.checkedFields = [] this.checkedList.forEach(ele => { @@ -78,7 +78,7 @@ export default { initField() { if (this.table.id) { fieldList(this.table.id).then(response => { - this.fields = response.data + this.fields = JSON.parse(JSON.stringify(response.data)).filter(ele => ele.extField === 0) }) } }, diff --git a/frontend/src/views/dataset/data/UnionView.vue b/frontend/src/views/dataset/data/UnionView.vue index 466556fcf3..fcc08d37e2 100644 --- a/frontend/src/views/dataset/data/UnionView.vue +++ b/frontend/src/views/dataset/data/UnionView.vue @@ -222,7 +222,7 @@ export default { // if (response.data) { this.union.sourceTableId = this.table.id fieldList(this.table.id).then(response => { - this.sourceFieldOption = response.data + this.sourceFieldOption = JSON.parse(JSON.stringify(response.data)).filter(ele => ele.extField === 0) }) this.editUnion = true // } else { @@ -320,7 +320,7 @@ export default { this.union.targetTableId = param.id this.union.targetTableFieldId = '' fieldList(param.id).then(response => { - this.targetFieldOption = response.data + this.targetFieldOption = JSON.parse(JSON.stringify(response.data)).filter(ele => ele.extField === 0) }) this.$refs['targetTable'].doClose() } From 3cb889a4921222033bdaa50bf187339ff255f7e4 Mon Sep 17 00:00:00 2001 From: taojinlong Date: Thu, 16 Sep 2021 15:03:23 +0800 Subject: [PATCH 16/19] =?UTF-8?q?fix:=20mysql=20=E6=95=B0=E6=8D=AE?= =?UTF-8?q?=E6=BA=90=E5=8F=82=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/io/dataease/datasource/dto/MysqlConfigration.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/backend/src/main/java/io/dataease/datasource/dto/MysqlConfigration.java b/backend/src/main/java/io/dataease/datasource/dto/MysqlConfigration.java index a94e3d0c4a..fcaeec3906 100644 --- a/backend/src/main/java/io/dataease/datasource/dto/MysqlConfigration.java +++ b/backend/src/main/java/io/dataease/datasource/dto/MysqlConfigration.java @@ -11,7 +11,7 @@ public class MysqlConfigration extends JdbcDTO { public String getJdbc() { // 连接参数先写死,后边要把编码、时区等参数放到数据源的设置中 - return "jdbc:mysql://HOSTNAME:PORT/DATABASE?characterEncoding=UTF-8&connectTimeout=5000" + return "jdbc:mysql://HOSTNAME:PORT/DATABASE?characterEncoding=UTF-8&connectTimeout=5000&useSSL=false" .replace("HOSTNAME", getHost().trim()) .replace("PORT", getPort().toString().trim()) .replace("DATABASE", getDataBase().trim()); From ecd13b5fa7a2ba0eaf806f369d49b27f1d5220e2 Mon Sep 17 00:00:00 2001 From: junjie Date: Wed, 22 Sep 2021 15:40:12 +0800 Subject: [PATCH 17/19] =?UTF-8?q?fix:=20Doris=E7=B1=BB=E5=9E=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../io/dataease/provider/doris/DorisConstants.java | 2 ++ .../dataease/provider/doris/DorisQueryProvider.java | 12 ++++++++++-- 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/backend/src/main/java/io/dataease/provider/doris/DorisConstants.java b/backend/src/main/java/io/dataease/provider/doris/DorisConstants.java index 22792a429e..6f9a65f1c8 100644 --- a/backend/src/main/java/io/dataease/provider/doris/DorisConstants.java +++ b/backend/src/main/java/io/dataease/provider/doris/DorisConstants.java @@ -33,6 +33,8 @@ public class DorisConstants extends SQLConstants { public static final String WHERE_VALUE_VALUE = "'%s'"; + public static final String WHERE_NUMBER_VALUE = "%s"; + public static final String AGG_COUNT = "COUNT(*)"; public static final String AGG_FIELD = "%s(%s)"; 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 05cf2142c3..4a51f4988d 100644 --- a/backend/src/main/java/io/dataease/provider/doris/DorisQueryProvider.java +++ b/backend/src/main/java/io/dataease/provider/doris/DorisQueryProvider.java @@ -708,7 +708,11 @@ public class DorisQueryProvider extends QueryProvider { } else if (StringUtils.containsIgnoreCase(request.getTerm(), "like")) { whereValue = "'%" + value + "%'"; } else { - whereValue = String.format(DorisConstants.WHERE_VALUE_VALUE, value); + if (field.getDeExtractType() == 2 || field.getDeExtractType() == 3 || field.getDeExtractType() == 4) { + whereValue = String.format(DorisConstants.WHERE_NUMBER_VALUE, value); + } else { + whereValue = String.format(DorisConstants.WHERE_VALUE_VALUE, value); + } } list.add(SQLObj.builder() .whereField(whereName) @@ -772,7 +776,11 @@ public class DorisQueryProvider extends QueryProvider { whereValue = String.format(DorisConstants.WHERE_BETWEEN, value.get(0), value.get(1)); } } else { - whereValue = String.format(DorisConstants.WHERE_VALUE_VALUE, value.get(0)); + if (field.getDeExtractType() == 2 || field.getDeExtractType() == 3 || field.getDeExtractType() == 4) { + whereValue = String.format(DorisConstants.WHERE_NUMBER_VALUE, value.get(0)); + } else { + whereValue = String.format(DorisConstants.WHERE_VALUE_VALUE, value.get(0)); + } } list.add(SQLObj.builder() .whereField(whereName) From b8ab1d74851f971f972efee9fe6dc921fdeafd97 Mon Sep 17 00:00:00 2001 From: junjie Date: Tue, 28 Sep 2021 15:04:28 +0800 Subject: [PATCH 18/19] fix: rollback --- .../service/dataset/DataSetTableService.java | 57 +++++-------------- 1 file changed, 15 insertions(+), 42 deletions(-) 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 9a84d58fb0..87b08eb13a 100644 --- a/backend/src/main/java/io/dataease/service/dataset/DataSetTableService.java +++ b/backend/src/main/java/io/dataease/service/dataset/DataSetTableService.java @@ -797,35 +797,22 @@ public class DataSetTableService { String f = field.substring(0, field.length() - 1); StringBuilder join = new StringBuilder(); - List unions = new ArrayList<>(); for (DataTableInfoCustomUnion dataTableInfoCustomUnion : dataTableInfoDTO.getList()) { for (DataSetTableUnionDTO dto : list) { // 被关联表和自助数据集的表相等 if (StringUtils.equals(dto.getTargetTableId(), dataTableInfoCustomUnion.getTableId())) { - unions.add(dto); - } - } - } - if (CollectionUtils.isNotEmpty(unions)) { - for (int i = 0; i < unions.size(); i++) { - DataSetTableUnionDTO dto = unions.get(i); - DatasetTableField sourceField = dataSetTableFieldsService.get(dto.getSourceTableFieldId()); - DatasetTableField targetField = dataSetTableFieldsService.get(dto.getTargetTableFieldId()); - if (ObjectUtils.isEmpty(sourceField) || ObjectUtils.isEmpty(targetField)) { - DEException.throwException(Translator.get("i18n_dataset_field_delete")); - } - if (i == 0) { + DatasetTableField sourceField = dataSetTableFieldsService.get(dto.getSourceTableFieldId()); + DatasetTableField targetField = dataSetTableFieldsService.get(dto.getTargetTableFieldId()); + if (ObjectUtils.isEmpty(sourceField) || ObjectUtils.isEmpty(targetField)) { + DEException.throwException(Translator.get("i18n_dataset_field_delete")); + } + join.append(convertUnionTypeToSQL(dto.getSourceUnionRelation())) .append(DorisTableUtils.dorisName(dto.getTargetTableId())) .append(" ON ") .append(DorisTableUtils.dorisName(dto.getSourceTableId())).append(".").append(sourceField.getDataeaseName()) .append(" = ") .append(DorisTableUtils.dorisName(dto.getTargetTableId())).append(".").append(targetField.getDataeaseName()); - } else { - join.append(" AND ") - .append(DorisTableUtils.dorisName(dto.getSourceTableId())).append(".").append(sourceField.getDataeaseName()) - .append(" = ") - .append(DorisTableUtils.dorisName(dto.getTargetTableId())).append(".").append(targetField.getDataeaseName()); } } } @@ -871,39 +858,25 @@ public class DataSetTableService { String f = field.substring(0, field.length() - 1); StringBuilder join = new StringBuilder(); - List unions = new ArrayList<>(); for (DataTableInfoCustomUnion dataTableInfoCustomUnion : dataTableInfoDTO.getList()) { for (DataSetTableUnionDTO dto : list) { // 被关联表和自助数据集的表相等 if (StringUtils.equals(dto.getTargetTableId(), dataTableInfoCustomUnion.getTableId())) { - unions.add(dto); - } - } - } - if (CollectionUtils.isNotEmpty(unions)) { - for (int i = 0; i < unions.size(); i++) { - DataSetTableUnionDTO dto = unions.get(i); - DatasetTableField sourceField = dataSetTableFieldsService.get(dto.getSourceTableFieldId()); - DatasetTableField targetField = dataSetTableFieldsService.get(dto.getTargetTableFieldId()); - if (ObjectUtils.isEmpty(sourceField) || ObjectUtils.isEmpty(targetField)) { - DEException.throwException(Translator.get("i18n_dataset_field_delete")); - } - DatasetTable sourceTable = datasetTableMapper.selectByPrimaryKey(dto.getSourceTableId()); - String sourceTableName = new Gson().fromJson(sourceTable.getInfo(), DataTableInfoDTO.class).getTable(); - DatasetTable targetTable = datasetTableMapper.selectByPrimaryKey(dto.getTargetTableId()); - String targetTableName = new Gson().fromJson(targetTable.getInfo(), DataTableInfoDTO.class).getTable(); - if (i == 0) { + DatasetTableField sourceField = dataSetTableFieldsService.get(dto.getSourceTableFieldId()); + DatasetTableField targetField = dataSetTableFieldsService.get(dto.getTargetTableFieldId()); + if (ObjectUtils.isEmpty(sourceField) || ObjectUtils.isEmpty(targetField)) { + DEException.throwException(Translator.get("i18n_dataset_field_delete")); + } + DatasetTable sourceTable = datasetTableMapper.selectByPrimaryKey(dto.getSourceTableId()); + String sourceTableName = new Gson().fromJson(sourceTable.getInfo(), DataTableInfoDTO.class).getTable(); + DatasetTable targetTable = datasetTableMapper.selectByPrimaryKey(dto.getTargetTableId()); + String targetTableName = new Gson().fromJson(targetTable.getInfo(), DataTableInfoDTO.class).getTable(); join.append(convertUnionTypeToSQL(dto.getSourceUnionRelation())) .append(String.format(keyword, targetTableName)) .append(" ON ") .append(String.format(keyword, sourceTableName)).append(".").append(String.format(keyword, sourceField.getOriginName())) .append(" = ") .append(String.format(keyword, targetTableName)).append(".").append(String.format(keyword, targetField.getOriginName())); - } else { - join.append(" AND ") - .append(String.format(keyword, sourceTableName)).append(".").append(String.format(keyword, sourceField.getOriginName())) - .append(" = ") - .append(String.format(keyword, targetTableName)).append(".").append(String.format(keyword, targetField.getOriginName())); } } } From 1fd0fa65ec9293502290e8efe942f4b9a60a8eee Mon Sep 17 00:00:00 2001 From: yanjiantao Date: Mon, 11 Oct 2021 18:23:51 +0800 Subject: [PATCH 19/19] feat: add redshift datasource --- backend/pom.xml | 7 + .../datasource/constants/DatasourceTypes.java | 3 +- .../datasource/dto/RedshiftConfigration.java | 19 + .../datasource/provider/JdbcProvider.java | 25 + .../datasource/provider/ProviderFactory.java | 4 + .../provider/redshift/RedshiftConstants.java | 49 + .../redshift/RedshiftQueryProvider.java | 944 ++++++++++++++++++ .../src/views/system/datasource/DsTree.vue | 2 + frontend/src/views/system/datasource/form.vue | 7 +- 9 files changed, 1056 insertions(+), 4 deletions(-) create mode 100644 backend/src/main/java/io/dataease/datasource/dto/RedshiftConfigration.java create mode 100644 backend/src/main/java/io/dataease/provider/redshift/RedshiftConstants.java create mode 100644 backend/src/main/java/io/dataease/provider/redshift/RedshiftQueryProvider.java diff --git a/backend/pom.xml b/backend/pom.xml index 5415073b33..2445c8124b 100644 --- a/backend/pom.xml +++ b/backend/pom.xml @@ -151,6 +151,13 @@ postgresql 42.2.14 + + + com.amazon.redshift + redshift-jdbc42 + 2.1.0.1 + + org.apache.curator curator-framework diff --git a/backend/src/main/java/io/dataease/datasource/constants/DatasourceTypes.java b/backend/src/main/java/io/dataease/datasource/constants/DatasourceTypes.java index 3724c7f8ea..ecede575b5 100644 --- a/backend/src/main/java/io/dataease/datasource/constants/DatasourceTypes.java +++ b/backend/src/main/java/io/dataease/datasource/constants/DatasourceTypes.java @@ -6,7 +6,8 @@ public enum DatasourceTypes { pg("pg", "pg", "org.postgresql.Driver", "\"", "\"", "\"", "\""), sqlServer("sqlServer", "sqlServer", "com.microsoft.sqlserver.jdbc.SQLServerDriver", "\"", "\"", "\"", "\""), doris("doris", "doris", "com.mysql.jdbc.Driver", "`", "`", "", ""), - oracle("oracle", "oracle", "oracle.jdbc.driver.OracleDriver", "\"", "\"", "\"", "\""); + oracle("oracle", "oracle", "oracle.jdbc.driver.OracleDriver", "\"", "\"", "\"", "\""), + redshift("redshift", "redshift", "org.postgresql.Driver", "\"", "\"", "\"", "\""); private String feature; private String desc; diff --git a/backend/src/main/java/io/dataease/datasource/dto/RedshiftConfigration.java b/backend/src/main/java/io/dataease/datasource/dto/RedshiftConfigration.java new file mode 100644 index 0000000000..bca114431b --- /dev/null +++ b/backend/src/main/java/io/dataease/datasource/dto/RedshiftConfigration.java @@ -0,0 +1,19 @@ +package io.dataease.datasource.dto; + +import lombok.Getter; +import lombok.Setter; + +@Getter +@Setter +public class RedshiftConfigration extends JdbcDTO { + + private String driver = "com.amazon.redshift.jdbc42.Driver"; + + public String getJdbc() { + // 连接参数先写死,后边要把编码、时区等参数放到数据源的设置中 + return "jdbc:redshift://HOSTNAME:PORT/DATABASE" + .replace("HOSTNAME", getHost().trim()) + .replace("PORT", getPort().toString().trim()) + .replace("DATABASE", getDataBase().trim()); + } +} \ No newline at end of file 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 1f79523b62..9a092375c3 100644 --- a/backend/src/main/java/io/dataease/datasource/provider/JdbcProvider.java +++ b/backend/src/main/java/io/dataease/datasource/provider/JdbcProvider.java @@ -436,6 +436,12 @@ public class JdbcProvider extends DatasourceProvider { password = pgConfigration.getPassword(); driver = pgConfigration.getDriver(); jdbcurl = pgConfigration.getJdbc(); + case redshift: + RedshiftConfigration redshiftConfigration = new Gson().fromJson(datasourceRequest.getDatasource().getConfiguration(), RedshiftConfigration.class); + username = redshiftConfigration.getUsername(); + password = redshiftConfigration.getPassword(); + driver = redshiftConfigration.getDriver(); + jdbcurl = redshiftConfigration.getJdbc(); default: break; } @@ -493,6 +499,13 @@ public class JdbcProvider extends DatasourceProvider { dataSource.setJdbcUrl(pgConfigration.getJdbc()); jdbcDTO = pgConfigration; break; + case redshift: + RedshiftConfigration redshiftConfigration = new Gson().fromJson(datasourceRequest.getDatasource().getConfiguration(), RedshiftConfigration.class); + dataSource.setUser(redshiftConfigration.getUsername()); + dataSource.setDriverClass(redshiftConfigration.getDriver()); + dataSource.setPassword(redshiftConfigration.getPassword()); + dataSource.setJdbcUrl(redshiftConfigration.getJdbc()); + jdbcDTO = redshiftConfigration; default: break; } @@ -514,6 +527,9 @@ public class JdbcProvider extends DatasourceProvider { case pg: PgConfigration pgConfigration = new Gson().fromJson(datasourceRequest.getDatasource().getConfiguration(), PgConfigration.class); return pgConfigration.getDataBase(); + case redshift: + RedshiftConfigration redshiftConfigration = new Gson().fromJson(datasourceRequest.getDatasource().getConfiguration(), RedshiftConfigration.class); + return redshiftConfigration.getDataBase(); default: return null; } @@ -546,6 +562,13 @@ public class JdbcProvider extends DatasourceProvider { throw new Exception(Translator.get("i18n_schema_is_empty")); } return "SELECT tablename FROM pg_tables WHERE tablename NOT LIKE 'pg%' AND tablename NOT LIKE 'sql_%' AND schemaname='SCHEMA' ;".replace("SCHEMA", pgConfigration.getSchema()); + case redshift: + RedshiftConfigration redshiftConfigration = new Gson().fromJson(datasourceRequest.getDatasource().getConfiguration(), RedshiftConfigration.class); + if(StringUtils.isEmpty(redshiftConfigration.getSchema())){ + throw new Exception(Translator.get("i18n_schema_is_empty")); + } + return "SELECT tablename FROM pg_tables WHERE tablename NOT LIKE 'pg%' AND tablename NOT LIKE 'sql_%' AND schemaname='SCHEMA' ;".replace("SCHEMA", redshiftConfigration.getSchema()); + default: return "show tables;"; } @@ -560,6 +583,8 @@ public class JdbcProvider extends DatasourceProvider { return "select name from sys.schemas;"; case pg: return "SELECT nspname FROM pg_namespace;"; + case redshift: + return "SELECT nspname FROM pg_namespace;"; default: return "show tables;"; } diff --git a/backend/src/main/java/io/dataease/datasource/provider/ProviderFactory.java b/backend/src/main/java/io/dataease/datasource/provider/ProviderFactory.java index d780399648..1938ee796c 100644 --- a/backend/src/main/java/io/dataease/datasource/provider/ProviderFactory.java +++ b/backend/src/main/java/io/dataease/datasource/provider/ProviderFactory.java @@ -30,6 +30,8 @@ public class ProviderFactory implements ApplicationContextAware { return context.getBean("jdbc", DatasourceProvider.class); case pg: return context.getBean("jdbc", DatasourceProvider.class); + case redshift: + return context.getBean("jdbc", DatasourceProvider.class); default: return context.getBean("jdbc", DatasourceProvider.class); } @@ -48,6 +50,8 @@ public class ProviderFactory implements ApplicationContextAware { return context.getBean("pgQuery", QueryProvider.class); case oracle: return context.getBean("oracleQuery", QueryProvider.class); + case redshift: + return context.getBean("redshiftQuery", QueryProvider.class); default: return context.getBean("mysqlQuery", QueryProvider.class); } diff --git a/backend/src/main/java/io/dataease/provider/redshift/RedshiftConstants.java b/backend/src/main/java/io/dataease/provider/redshift/RedshiftConstants.java new file mode 100644 index 0000000000..3913db7ed8 --- /dev/null +++ b/backend/src/main/java/io/dataease/provider/redshift/RedshiftConstants.java @@ -0,0 +1,49 @@ +package io.dataease.provider.redshift; + +import io.dataease.provider.SQLConstants; + +import static io.dataease.datasource.constants.DatasourceTypes.pg; + +/** + * Redshift 静态变量 + * + * @className: RedshiftConstants + * @description: Redshift 静态变量 + * @author: Jiantao Yan + * @date: 2021/10/11 17:12 + **/ +public class RedshiftConstants extends SQLConstants { + public static final String KEYWORD_TABLE = pg.getKeywordPrefix() + "%s" + pg.getKeywordSuffix(); + + public static final String KEYWORD_FIX = "%s." + pg.getKeywordPrefix() + "%s" + pg.getKeywordSuffix(); + + public static final String UNIX_TIMESTAMP = "floor(extract(epoch from(( %s - timestamp '1970-01-01 00:00:00')*1000))) "; + + public static final String DATE_FORMAT = "to_char(%s, %s)"; + + public static final String FROM_UNIXTIME = "to_timestamp(%s)"; + + public static final String TO_DATE = "to_date(%s,'%s')"; + + public static final String CAST = "CAST(%s AS %s)"; + + public static final String DEFAULT_DATE_FORMAT = "'YYYY-MM-DD HH24:MI:SS'"; + + public static final String DEFAULT_INT_FORMAT = "numeric(18,0)"; + + public static final String DEFAULT_FLOAT_FORMAT = "numeric(18,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/redshift/RedshiftQueryProvider.java b/backend/src/main/java/io/dataease/provider/redshift/RedshiftQueryProvider.java new file mode 100644 index 0000000000..18759697bb --- /dev/null +++ b/backend/src/main/java/io/dataease/provider/redshift/RedshiftQueryProvider.java @@ -0,0 +1,944 @@ +package io.dataease.provider.redshift; + +import com.google.gson.Gson; +import io.dataease.base.domain.DatasetTableField; +import io.dataease.base.domain.DatasetTableFieldExample; +import io.dataease.base.domain.Datasource; +import io.dataease.base.mapper.DatasetTableFieldMapper; +import io.dataease.commons.constants.DeTypeConstants; +import io.dataease.controller.request.chart.ChartExtFilterRequest; +import io.dataease.datasource.dto.JdbcDTO; +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 io.dataease.provider.pg.PgConstants; +import io.dataease.provider.sqlserver.SqlServerSQLConstants; +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 javax.annotation.Resource; +import java.text.MessageFormat; +import java.text.SimpleDateFormat; +import java.util.*; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +import static io.dataease.provider.SQLConstants.TABLE_ALIAS_PREFIX; + + +/** + * Redshift 查询器 + * + * @className: RedshiftConstants + * @description: Redshift 查询器 + * @author: Jiantao Yan + * @date: 2021/10/11 17:12 + **/ +@Service("redshiftQuery") +public class RedshiftQueryProvider extends QueryProvider { + @Resource + private DatasetTableFieldMapper datasetTableFieldMapper; + + @Override + public Integer transFieldType(String field) { + field = field.toLowerCase(); + switch (field) { + case "bpchar": + case "varchar": + case "text": + case "tsquery": + case "tsvector": + case "uuid": + case "xml": + case "json": + case "bit": + case "jsonb": + case "cidr": + case "inet": + case "macaddr": + case "txid_snapshot": + case "box": + case "circle": + case "line": + case "lseg": + case "path": + case "point": + case "polygon": + case "bool": + case "interval": + return DeTypeConstants.DE_STRING;// 文本 + case "date": + case "time": + case "timestamp": + case "timestamptz": + return DeTypeConstants.DE_TIME;// 时间 + case "int2": + case "int4": + case "int8": + case "INTEGER": + case "BIGINT": + return DeTypeConstants.DE_INT;// 整型 + case "numeric": + case "float4": + case "float8": + case "money": + return DeTypeConstants.DE_FLOAT;// 浮点 +// case "bool": + case "TINYINT": + return DeTypeConstants.DE_BOOL;// 布尔 + case "bytea": + return DeTypeConstants.DE_BINARY;// 二进制 + default: + return DeTypeConstants.DE_STRING; + } + } + + @Override + public String createSQLPreview(String sql, String orderBy) { + return "SELECT * FROM (" + sqlFix(sql) + ") AS tmp " + " LIMIT 1000 offset 0"; + } + + @Override + public String createQuerySQL(String table, List fields, boolean isGroup, Datasource ds) { + SQLObj tableObj = SQLObj.builder() + .tableName((table.startsWith("(") && table.endsWith(")")) ? table : String.format(PgConstants.KEYWORD_TABLE, table)) + .tableAlias(String.format(TABLE_ALIAS_PREFIX, 0)) + .build(); + + setSchema(tableObj, ds); + List xFields = new ArrayList<>(); + if (CollectionUtils.isNotEmpty(fields)) { + for (int i = 0; i < fields.size(); i++) { + DatasetTableField f = fields.get(i); + String originField; + if (ObjectUtils.isNotEmpty(f.getExtField()) && f.getExtField() == 2) { + // 解析origin name中有关联的字段生成sql表达式 + originField = calcFieldRegex(f.getOriginName(), tableObj); + } else if (ObjectUtils.isNotEmpty(f.getExtField()) && f.getExtField() == 1) { + originField = String.format(PgConstants.KEYWORD_FIX, tableObj.getTableAlias(), f.getOriginName()); + } else { + originField = String.format(PgConstants.KEYWORD_FIX, tableObj.getTableAlias(), f.getOriginName()); + } + String fieldAlias = String.format(SQLConstants.FIELD_ALIAS_X_PREFIX, i); + String fieldName = ""; + // 处理横轴字段 + if (f.getDeExtractType() == DeTypeConstants.DE_TIME) { + if (f.getDeType() == DeTypeConstants.DE_INT || f.getDeType() == DeTypeConstants.DE_FLOAT) { + fieldName = String.format(PgConstants.UNIX_TIMESTAMP, originField); + } else { + fieldName = originField; + } + } else if (f.getDeExtractType() == DeTypeConstants.DE_STRING) { + if (f.getDeType() == DeTypeConstants.DE_INT) { + fieldName = String.format(PgConstants.CAST, originField, PgConstants.DEFAULT_INT_FORMAT); + } else if (f.getDeType() == DeTypeConstants.DE_FLOAT) { + fieldName = String.format(PgConstants.CAST, originField, PgConstants.DEFAULT_FLOAT_FORMAT); + } else if (f.getDeType() == DeTypeConstants.DE_TIME) { + fieldName = String.format(PgConstants.CAST, originField, "timestamp"); + } else { + fieldName = originField; + } + } else { + if (f.getDeType() == DeTypeConstants.DE_TIME) { + String cast = String.format(PgConstants.CAST, originField, "bigint"); + fieldName = String.format(PgConstants.FROM_UNIXTIME, cast); + } else if (f.getDeType() == DeTypeConstants.DE_INT) { + fieldName = String.format(PgConstants.CAST, originField, PgConstants.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, null); + } + + @Override + public String createQuerySQLWithPage(String table, List fields, Integer page, Integer pageSize, Integer realSize, boolean isGroup, Datasource ds) { + return createQuerySQL(table, fields, isGroup, null) + " LIMIT " + realSize + " offset " + (page - 1) * pageSize; + } + + @Override + public String createQueryTableWithLimit(String table, List fields, Integer limit, boolean isGroup, Datasource ds) { + return createQuerySQL(table, fields, isGroup, null) + " LIMIT " + limit + " offset 0"; + } + + @Override + public String createQuerySqlWithLimit(String sql, List fields, Integer limit, boolean isGroup) { + return createQuerySQLAsTmp(sql, fields, isGroup) + " LIMIT " + limit + " offset 0"; + } + + @Override + public String createQuerySQLAsTmpWithPage(String sql, List fields, Integer page, Integer pageSize, Integer realSize, boolean isGroup) { + return createQuerySQLAsTmp(sql, fields, isGroup) + " LIMIT " + realSize + " offset " + (page - 1) * pageSize; + } + + @Override + public String getSQL(String table, List xAxis, List yAxis, List customFilter, List extFilterRequestList, Datasource ds) { + SQLObj tableObj = SQLObj.builder() + .tableName((table.startsWith("(") && table.endsWith(")")) ? table : String.format(PgConstants.KEYWORD_TABLE, table)) + .tableAlias(String.format(TABLE_ALIAS_PREFIX, 0)) + .build(); + setSchema(tableObj, ds); + 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; + if (ObjectUtils.isNotEmpty(x.getExtField()) && x.getExtField() == 2) { + // 解析origin name中有关联的字段生成sql表达式 + originField = calcFieldRegex(x.getOriginName(), tableObj); + } else if (ObjectUtils.isNotEmpty(x.getExtField()) && x.getExtField() == 1) { + originField = String.format(PgConstants.KEYWORD_FIX, tableObj.getTableAlias(), x.getOriginName()); + } else { + originField = String.format(PgConstants.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; + if (ObjectUtils.isNotEmpty(y.getExtField()) && y.getExtField() == 2) { + // 解析origin name中有关联的字段生成sql表达式 + originField = calcFieldRegex(y.getOriginName(), tableObj); + } else if (ObjectUtils.isNotEmpty(y.getExtField()) && y.getExtField() == 1) { + originField = String.format(PgConstants.KEYWORD_FIX, tableObj.getTableAlias(), y.getOriginName()); + } else { + originField = String.format(PgConstants.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(PgConstants.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, null); + } + + @Override + public String getSQLStack(String table, List xAxis, List yAxis, List customFilter, List extFilterRequestList, List extStack, Datasource ds) { + SQLObj tableObj = SQLObj.builder() + .tableName((table.startsWith("(") && table.endsWith(")")) ? table : String.format(PgConstants.KEYWORD_TABLE, table)) + .tableAlias(String.format(TABLE_ALIAS_PREFIX, 0)) + .build(); + setSchema(tableObj, ds); + 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; + if (ObjectUtils.isNotEmpty(x.getExtField()) && x.getExtField() == 2) { + // 解析origin name中有关联的字段生成sql表达式 + originField = calcFieldRegex(x.getOriginName(), tableObj); + } else if (ObjectUtils.isNotEmpty(x.getExtField()) && x.getExtField() == 1) { + originField = String.format(PgConstants.KEYWORD_FIX, tableObj.getTableAlias(), x.getOriginName()); + } else { + originField = String.format(PgConstants.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; + if (ObjectUtils.isNotEmpty(y.getExtField()) && y.getExtField() == 2) { + // 解析origin name中有关联的字段生成sql表达式 + originField = calcFieldRegex(y.getOriginName(), tableObj); + } else if (ObjectUtils.isNotEmpty(y.getExtField()) && y.getExtField() == 1) { + originField = String.format(PgConstants.KEYWORD_FIX, tableObj.getTableAlias(), y.getOriginName()); + } else { + originField = String.format(PgConstants.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(PgConstants.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, null); + } + + @Override + public String getSQLScatter(String table, List xAxis, List yAxis, List customFilter, List extFilterRequestList, List extBubble, Datasource ds) { + SQLObj tableObj = SQLObj.builder() + .tableName((table.startsWith("(") && table.endsWith(")")) ? table : String.format(PgConstants.KEYWORD_TABLE, table)) + .tableAlias(String.format(TABLE_ALIAS_PREFIX, 0)) + .build(); + setSchema(tableObj, ds); + 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; + if (ObjectUtils.isNotEmpty(x.getExtField()) && x.getExtField() == 2) { + // 解析origin name中有关联的字段生成sql表达式 + originField = calcFieldRegex(x.getOriginName(), tableObj); + } else if (ObjectUtils.isNotEmpty(x.getExtField()) && x.getExtField() == 1) { + originField = String.format(PgConstants.KEYWORD_FIX, tableObj.getTableAlias(), x.getOriginName()); + } else { + originField = String.format(PgConstants.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<>(); + List yList = new ArrayList<>(); + yList.addAll(yAxis); + yList.addAll(extBubble); + if (CollectionUtils.isNotEmpty(yList)) { + for (int i = 0; i < yList.size(); i++) { + ChartViewFieldDTO y = yList.get(i); + String originField; + if (ObjectUtils.isNotEmpty(y.getExtField()) && y.getExtField() == 2) { + // 解析origin name中有关联的字段生成sql表达式 + originField = calcFieldRegex(y.getOriginName(), tableObj); + } else if (ObjectUtils.isNotEmpty(y.getExtField()) && y.getExtField() == 1) { + originField = String.format(PgConstants.KEYWORD_FIX, tableObj.getTableAlias(), y.getOriginName()); + } else { + originField = String.format(PgConstants.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(PgConstants.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 getSQLAsTmpScatter(String table, List xAxis, List yAxis, List customFilter, List extFilterRequestList, List extBubble) { + return getSQLScatter("(" + sqlFix(table) + ")", xAxis, yAxis, customFilter, extFilterRequestList, extBubble, 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) { + // 字段汇总 排序等 + SQLObj tableObj = SQLObj.builder() + .tableName((table.startsWith("(") && table.endsWith(")")) ? table : String.format(PgConstants.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; + if (ObjectUtils.isNotEmpty(y.getExtField()) && y.getExtField() == 2) { + // 解析origin name中有关联的字段生成sql表达式 + originField = calcFieldRegex(y.getOriginName(), tableObj); + } else if (ObjectUtils.isNotEmpty(y.getExtField()) && y.getExtField() == 1) { + originField = String.format(PgConstants.KEYWORD_FIX, tableObj.getTableAlias(), y.getOriginName()); + } else { + originField = String.format(PgConstants.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(PgConstants.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, Datasource ds) { + 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); + if (ds != null) { + String schema = new Gson().fromJson(ds.getConfiguration(), JdbcDTO.class).getSchema(); + String tableWithSchema = String.format(SqlServerSQLConstants.KEYWORD_TABLE, schema) + "." + String.format(SqlServerSQLConstants.KEYWORD_TABLE, table); + return MessageFormat.format("SELECT {0} FROM {1} ", StringUtils.join(array, ","), tableWithSchema); + } else { + return MessageFormat.format("SELECT {0} FROM {1} ", StringUtils.join(array, ","), table); + } + } + + @Override + public String createRawQuerySQLAsTmp(String sql, List fields) { + return createRawQuerySQL(" (" + sqlFix(sql) + ") AS tmp ", fields, null); + } + + 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; + if (ObjectUtils.isNotEmpty(field.getExtField()) && field.getExtField() == 2) { + // 解析origin name中有关联的字段生成sql表达式 + originName = calcFieldRegex(field.getOriginName(), tableObj); + } else if (ObjectUtils.isNotEmpty(field.getExtField()) && field.getExtField() == 1) { + originName = String.format(PgConstants.KEYWORD_FIX, tableObj.getTableAlias(), field.getOriginName()); + } else { + originName = String.format(PgConstants.KEYWORD_FIX, tableObj.getTableAlias(), field.getOriginName()); + } + if (field.getDeType() == 1) { + if (field.getDeExtractType() == 0 || field.getDeExtractType() == 5) { + whereName = String.format(PgConstants.TO_DATE, originName, PgConstants.DEFAULT_DATE_FORMAT); + } + if (field.getDeExtractType() == 2 || field.getDeExtractType() == 3 || field.getDeExtractType() == 4) { + String cast = String.format(PgConstants.CAST, originName, "bigint"); + whereName = String.format(PgConstants.FROM_UNIXTIME, cast); + } + if (field.getDeExtractType() == 1) { + whereName = originName; + } + } else { + whereName = originName; + } + if (StringUtils.equalsIgnoreCase(request.getTerm(), "null")) { + whereValue = PgConstants.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(PgConstants.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; + if (ObjectUtils.isNotEmpty(field.getExtField()) && field.getExtField() == 2) { + // 解析origin name中有关联的字段生成sql表达式 + originName = calcFieldRegex(field.getOriginName(), tableObj); + } else if (ObjectUtils.isNotEmpty(field.getExtField()) && field.getExtField() == 1) { + originName = String.format(PgConstants.KEYWORD_FIX, tableObj.getTableAlias(), field.getOriginName()); + } else { + originName = String.format(PgConstants.KEYWORD_FIX, tableObj.getTableAlias(), field.getOriginName()); + } + + if (field.getDeType() == 1) { + if (field.getDeExtractType() == 0 || field.getDeExtractType() == 5) { + whereName = String.format(PgConstants.TO_DATE, originName, PgConstants.DEFAULT_DATE_FORMAT); + } + if (field.getDeExtractType() == 2 || field.getDeExtractType() == 3 || field.getDeExtractType() == 4) { + String cast = String.format(PgConstants.CAST, originName, "bigint"); + whereName = String.format(PgConstants.FROM_UNIXTIME, cast); + } + if (field.getDeExtractType() == 1) { + whereName = originName; + } + } 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(PgConstants.WHERE_BETWEEN, startTime, endTime); + } else { + whereValue = String.format(PgConstants.WHERE_BETWEEN, value.get(0), value.get(1)); + } + } else { + whereValue = String.format(PgConstants.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 "'YYYY'"; + case "y_M": + return "'YYYY" + split + "MM'"; + case "y_M_d": + return "'YYYY" + split + "MM" + split + "DD'"; + case "H_m_s": + return "'HH24:MI:SS'"; + case "y_M_d_H_m": + return "'YYYY" + split + "MM" + split + "DD" + " HH24:MI'"; + case "y_M_d_H_m_s": + return "'YYYY" + split + "MM" + split + "DD" + " HH24:MI:SS'"; + default: + return "'YYYY-MM-DD HH24:MI:SS'"; + } + } + + private SQLObj getXFields(ChartViewFieldDTO x, String originField, String fieldAlias) { + String fieldName = ""; + if (x.getDeExtractType() == DeTypeConstants.DE_TIME) { + if (x.getDeType() == 2 || x.getDeType() == 3) { + fieldName = String.format(PgConstants.UNIX_TIMESTAMP, originField); + } else if (x.getDeType() == DeTypeConstants.DE_TIME) { + String format = transDateFormat(x.getDateStyle(), x.getDatePattern()); + fieldName = String.format(PgConstants.DATE_FORMAT, originField, format); + } else { + fieldName = originField; + } + } else { + if (x.getDeType() == DeTypeConstants.DE_TIME) { + String format = transDateFormat(x.getDateStyle(), x.getDatePattern()); + if (x.getDeExtractType() == DeTypeConstants.DE_STRING) { + fieldName = String.format(PgConstants.DATE_FORMAT, originField, format); + } else { + String cast = String.format(PgConstants.CAST, originField, "bigint"); + String from_unixtime = String.format(PgConstants.FROM_UNIXTIME, cast); + fieldName = String.format(PgConstants.DATE_FORMAT, from_unixtime, format); + } + } else { + fieldName = originField; + } + } + return SQLObj.builder() + .fieldName(fieldName) + .fieldAlias(fieldAlias) + .build(); + } + + private SQLObj getYFields(ChartViewFieldDTO y, String originField, String fieldAlias) { + String fieldName = ""; + if (StringUtils.equalsIgnoreCase(y.getOriginName(), "*")) { + fieldName = PgConstants.AGG_COUNT; + } else if (SQLConstants.DIMENSION_TYPE.contains(y.getDeType())) { + fieldName = String.format(PgConstants.AGG_FIELD, y.getSummary(), originField); + } else { + if (StringUtils.equalsIgnoreCase(y.getSummary(), "avg") || StringUtils.containsIgnoreCase(y.getSummary(), "pop")) { + String cast = String.format(PgConstants.CAST, originField, y.getDeType() == DeTypeConstants.DE_INT ? PgConstants.DEFAULT_INT_FORMAT : PgConstants.DEFAULT_FLOAT_FORMAT); + String agg = String.format(PgConstants.AGG_FIELD, y.getSummary(), cast); + fieldName = String.format(PgConstants.CAST, agg, PgConstants.DEFAULT_FLOAT_FORMAT); + } else { + String cast = String.format(PgConstants.CAST, originField, y.getDeType() == DeTypeConstants.DE_INT ? PgConstants.DEFAULT_INT_FORMAT : PgConstants.DEFAULT_FLOAT_FORMAT); + fieldName = String.format(PgConstants.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 = PgConstants.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(PgConstants.WHERE_VALUE_VALUE, f.getValue()); + } + list.add(SQLObj.builder() + .whereField(fieldAlias) + .whereAlias(fieldAlias) + .whereTermAndValue(whereTerm + whereValue) + .build()); + }); + } + return list; + } + + private String calcFieldRegex(String originField, SQLObj tableObj) { + originField = originField.replaceAll("[\\t\\n\\r]]", ""); + // 正则提取[xxx] + String regex = "\\[(.*?)]"; + Pattern pattern = Pattern.compile(regex); + Matcher matcher = pattern.matcher(originField); + Set ids = new HashSet<>(); + while (matcher.find()) { + String id = matcher.group(1); + ids.add(id); + } + if (CollectionUtils.isEmpty(ids)) { + return originField; + } + DatasetTableFieldExample datasetTableFieldExample = new DatasetTableFieldExample(); + datasetTableFieldExample.createCriteria().andIdIn(new ArrayList<>(ids)); + List calcFields = datasetTableFieldMapper.selectByExample(datasetTableFieldExample); + for (DatasetTableField ele : calcFields) { + originField = originField.replaceAll("\\[" + ele.getId() + "]", + String.format(PgConstants.KEYWORD_FIX, tableObj.getTableAlias(), ele.getOriginName())); + } + return originField; + } +} diff --git a/frontend/src/views/system/datasource/DsTree.vue b/frontend/src/views/system/datasource/DsTree.vue index a0ebafc2d9..126e1cb1da 100644 --- a/frontend/src/views/system/datasource/DsTree.vue +++ b/frontend/src/views/system/datasource/DsTree.vue @@ -149,6 +149,8 @@ export default { return 'Oracle' }else if (type === 'pg') { return 'PostgreSQL' + }else if (type === 'redshift') { + return 'AWS Redshift' } }, diff --git a/frontend/src/views/system/datasource/form.vue b/frontend/src/views/system/datasource/form.vue index 7583b04b44..cbddec0c97 100644 --- a/frontend/src/views/system/datasource/form.vue +++ b/frontend/src/views/system/datasource/form.vue @@ -45,13 +45,13 @@ - + {{ $t('datasource.get_schema') }} - +