From 10d7bfa0dbcbbf841acf145869835a030346913b Mon Sep 17 00:00:00 2001 From: taojinlong Date: Wed, 8 Jun 2022 10:46:12 +0800 Subject: [PATCH 1/4] =?UTF-8?q?feat:=20sql=20=E6=95=B0=E6=8D=AE=E9=9B=86?= =?UTF-8?q?=E5=8F=82=E6=95=B0=E4=BC=A0=E9=80=92?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/resources/db/migration/V36__1.12.sql | 14 ++++++++ frontend/src/lang/zh.js | 3 ++ frontend/src/views/dataset/add/AddSQL.vue | 32 ++++++++++++++++++- 3 files changed, 48 insertions(+), 1 deletion(-) diff --git a/backend/src/main/resources/db/migration/V36__1.12.sql b/backend/src/main/resources/db/migration/V36__1.12.sql index 5ded5a0267..908b821a69 100644 --- a/backend/src/main/resources/db/migration/V36__1.12.sql +++ b/backend/src/main/resources/db/migration/V36__1.12.sql @@ -19,3 +19,17 @@ CREATE TABLE `chart_view_field` `last_sync_time` bigint(13) DEFAULT NULL COMMENT '同步时间', PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE utf8mb4_general_ci; + +DROP TABLE IF EXISTS `sql_variable`; +CREATE TABLE `sql_variable` +( + `id` varchar(50) NOT NULL COMMENT 'ID', + `table_id` varchar(50) NOT NULL COMMENT '数据集ID', + `variable_name` varchar(255) NOT NULL COMMENT '名称', + `alias` varchar(255) NOT NULL COMMENT '别名', + `type` varchar(50) NOT NULL COMMENT '类型', + `details` longtext DEFAULT NULL COMMENT '明细', + `default_value` longtext DEFAULT NULL COMMENT '默认值', + `required` tinyint(1) NOT NULL DEFAULT '0' COMMENT '是否必填', + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE utf8mb4_general_ci; \ No newline at end of file diff --git a/frontend/src/lang/zh.js b/frontend/src/lang/zh.js index 2d9678c76b..64c76e1e8c 100644 --- a/frontend/src/lang/zh.js +++ b/frontend/src/lang/zh.js @@ -2080,5 +2080,8 @@ export default { }, plugin_style: { border: '边框' + }, + sql_variable: { + variable_mgm: '参数设置' } } diff --git a/frontend/src/views/dataset/add/AddSQL.vue b/frontend/src/views/dataset/add/AddSQL.vue index b52b880061..80c161e7a6 100644 --- a/frontend/src/views/dataset/add/AddSQL.vue +++ b/frontend/src/views/dataset/add/AddSQL.vue @@ -46,6 +46,7 @@ + {{ $t('sql_variable.variable_mgm') }} @@ -94,6 +95,20 @@ + + + + + + + + + + + + + + @@ -161,6 +176,10 @@ export default { selectedDatasource: {}, engineMode: 'local', disabledSync: true, + showVariableMgm: false, + dialogTitle: '', + variables: [], + variablesTmp: [] } }, computed: { @@ -335,7 +354,18 @@ export default { this.fields = [] this.mode = '0' this.syncType = 'sync_now' - } + }, + + variableMgm() { + var reg = new RegExp("${(.*?)}", "gim"); + var match = this.sql.match(reg); + console.log(match) + this.dialogTitle = this.$t('sql_variable.variable_mgm') + this.showVariableMgm = true + }, + closeVariableMgm() { + this.showVariableMgm = false + }, } } From 9637bef10921d497547f4b15787ed83b18fef4a4 Mon Sep 17 00:00:00 2001 From: taojinlong Date: Wed, 8 Jun 2022 10:56:21 +0800 Subject: [PATCH 2/4] =?UTF-8?q?refactor:=20=E5=8D=87=E7=BA=A7=E7=89=88?= =?UTF-8?q?=E6=9C=AC=E5=8F=B7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- backend/pom.xml | 8 ++++---- frontend/package.json | 2 +- frontend/pom.xml | 2 +- mobile/pom.xml | 2 +- pom.xml | 2 +- 5 files changed, 8 insertions(+), 8 deletions(-) diff --git a/backend/pom.xml b/backend/pom.xml index 2049f49faf..0b94144982 100644 --- a/backend/pom.xml +++ b/backend/pom.xml @@ -5,7 +5,7 @@ dataease-server io.dataease - 1.11.1 + 1.12.0 4.0.0 @@ -241,17 +241,17 @@ io.dataease dataease-plugin-interface - 1.11.1 + 1.12.0 io.dataease dataease-plugin-view - 1.11.1 + 1.12.0 io.dataease dataease-plugin-datasource - 1.11.1 + 1.12.0 diff --git a/frontend/package.json b/frontend/package.json index 3d86709b2b..96f493c2f5 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -1,6 +1,6 @@ { "name": "dataease", - "version": "1.11.1", + "version": "1.12.0", "description": "dataease front", "private": true, "scripts": { diff --git a/frontend/pom.xml b/frontend/pom.xml index 2f0f4294a0..fd70bc4ba4 100644 --- a/frontend/pom.xml +++ b/frontend/pom.xml @@ -6,7 +6,7 @@ dataease-server io.dataease - 1.11.1 + 1.12.0 4.0.0 diff --git a/mobile/pom.xml b/mobile/pom.xml index a1753f6557..9c1f46f476 100644 --- a/mobile/pom.xml +++ b/mobile/pom.xml @@ -6,7 +6,7 @@ dataease-server io.dataease - 1.11.1 + 1.12.0 4.0.0 diff --git a/pom.xml b/pom.xml index 495dd8cf5d..a1f5c61cca 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ 4.0.0 io.dataease dataease-server - 1.11.1 + 1.12.0 pom From 4b5788b63c7a92e3ed4d9a27cc1b1e936e2569b8 Mon Sep 17 00:00:00 2001 From: taojinlong Date: Thu, 16 Jun 2022 14:04:39 +0800 Subject: [PATCH 3/4] =?UTF-8?q?feat:=20=E5=8F=82=E6=95=B0=E7=AE=A1?= =?UTF-8?q?=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- backend/pom.xml | 6 + .../dataset/DataSetTableController.java | 8 + .../dataset/DataSetTableFieldController.java | 9 - .../dataset/DataSetTableTaskController.java | 1 - .../dto/dataset/SqlVariableDetails.java | 13 + .../io/dataease/ext/ExtDataSetTableMapper.xml | 2 +- .../listener/DatasetCheckListener.java | 2 +- .../provider/datasource/EsProvider.java | 2 +- .../engine/doris/DorisQueryProvider.java | 6 +- .../engine/mysql/MysqlQueryProvider.java | 4 +- .../provider/query/ck/CKQueryProvider.java | 8 +- .../provider/query/db2/Db2QueryProvider.java | 7 +- .../provider/query/es/EsQueryProvider.java | 8 +- .../query/hive/HiveQueryProvider.java | 8 +- .../query/impala/ImpalaQueryProvider.java | 8 +- .../query/mongodb/MongoQueryProvider.java | 9 +- .../query/mysql/MysqlQueryProvider.java | 7 +- .../query/oracle/OracleQueryProvider.java | 8 +- .../provider/query/pg/PgQueryProvider.java | 5 +- .../query/redshift/RedshiftQueryProvider.java | 6 +- .../sqlserver/SqlserverQueryProvider.java | 8 +- .../service/chart/ChartViewService.java | 88 ++++--- .../chart/ViewPluginBaseServiceImpl.java | 29 +-- .../service/dataset/DataSetTableService.java | 244 ++++++++++++++++-- .../service/dataset/ExtractDataService.java | 7 +- .../impl/direct/DirectFieldService.java | 17 +- .../service/datasource/DatasourceService.java | 7 +- .../service/datasource/DriverService.java | 8 +- .../main/resources/db/migration/V36__1.12.sql | 16 +- frontend/src/api/panel/view.js | 9 + .../components/widget/DeWidget/DeSelect.vue | 1 + .../src/components/widget/bean/Condition.js | 3 +- .../serviceImpl/TextInputServiceImpl.js | 1 + .../serviceImpl/TextSelectGridServiceImpl.js | 1 + .../serviceImpl/TextSelectServiceImpl.js | 1 + .../serviceImpl/TextSelectTreeServiceImpl.js | 1 + frontend/src/lang/zh.js | 1 + frontend/src/store/index.js | 7 + frontend/src/utils/conditionUtil.js | 3 +- frontend/src/views/dataset/add/AddExcel.vue | 3 - frontend/src/views/dataset/add/AddSQL.vue | 153 +++++++---- .../src/views/panel/filter/filterDialog.vue | 10 + .../panel/filter/filterMain/FilterControl.vue | 43 ++- 43 files changed, 586 insertions(+), 202 deletions(-) create mode 100644 backend/src/main/java/io/dataease/dto/dataset/SqlVariableDetails.java diff --git a/backend/pom.xml b/backend/pom.xml index 0b94144982..9ccf4596e2 100644 --- a/backend/pom.xml +++ b/backend/pom.xml @@ -336,6 +336,12 @@ org.apache.commons commons-pool2 + + + com.github.jsqlparser + jsqlparser + 4.4 + diff --git a/backend/src/main/java/io/dataease/controller/dataset/DataSetTableController.java b/backend/src/main/java/io/dataease/controller/dataset/DataSetTableController.java index b42ff15fb9..ab78958599 100644 --- a/backend/src/main/java/io/dataease/controller/dataset/DataSetTableController.java +++ b/backend/src/main/java/io/dataease/controller/dataset/DataSetTableController.java @@ -11,6 +11,8 @@ import io.dataease.controller.request.dataset.DataSetTableRequest; import io.dataease.controller.response.DataSetDetail; import io.dataease.dto.dataset.DataSetTableDTO; import io.dataease.dto.dataset.ExcelFileData; +import io.dataease.dto.dataset.SqlVariableDetails; +import io.dataease.plugins.common.base.domain.ChartView; import io.dataease.plugins.common.base.domain.DatasetTable; import io.dataease.plugins.common.base.domain.DatasetTableField; import io.dataease.plugins.common.base.domain.DatasetTableIncrementalConfig; @@ -203,4 +205,10 @@ public class DataSetTableController { public Map unionPreview(@RequestBody DataSetTableRequest dataSetTableRequest) throws Exception { return dataSetTableService.getUnionPreview(dataSetTableRequest); } + + @ApiOperation("根据仪表板视图ID查询数据集变量") + @PostMapping("/paramsWithIds") + List paramsWithIds(@RequestBody List viewIds){ + return dataSetTableService.paramsWithIds(viewIds); + }; } diff --git a/backend/src/main/java/io/dataease/controller/dataset/DataSetTableFieldController.java b/backend/src/main/java/io/dataease/controller/dataset/DataSetTableFieldController.java index 3947f2acac..b1644ab116 100644 --- a/backend/src/main/java/io/dataease/controller/dataset/DataSetTableFieldController.java +++ b/backend/src/main/java/io/dataease/controller/dataset/DataSetTableFieldController.java @@ -167,15 +167,6 @@ public class DataSetTableFieldController { } List list = results.stream().distinct().collect(Collectors.toList()); - /*ArrayList list = results.stream().collect( - Collectors.collectingAndThen( - Collectors.toCollection( - () -> new TreeSet<>(Comparator.comparing(t -> { - if (ObjectUtils.isEmpty(t)) - return ""; - return t.toString(); - }))), - ArrayList::new));*/ return list; } diff --git a/backend/src/main/java/io/dataease/controller/dataset/DataSetTableTaskController.java b/backend/src/main/java/io/dataease/controller/dataset/DataSetTableTaskController.java index 1b6b65b8a0..b00f4df30b 100644 --- a/backend/src/main/java/io/dataease/controller/dataset/DataSetTableTaskController.java +++ b/backend/src/main/java/io/dataease/controller/dataset/DataSetTableTaskController.java @@ -43,7 +43,6 @@ public class DataSetTableTaskController { return dataSetTableTaskService.save(dataSetTaskRequest); } - //TODO @ApiOperation("删除") @PostMapping("delete/{id}") public void delete(@PathVariable String id) { diff --git a/backend/src/main/java/io/dataease/dto/dataset/SqlVariableDetails.java b/backend/src/main/java/io/dataease/dto/dataset/SqlVariableDetails.java new file mode 100644 index 0000000000..583f7bc56b --- /dev/null +++ b/backend/src/main/java/io/dataease/dto/dataset/SqlVariableDetails.java @@ -0,0 +1,13 @@ +package io.dataease.dto.dataset; + +import lombok.Data; + +@Data +public class SqlVariableDetails { + private String variableName; + private String alias; + private String type; + private String details; + private String defaultValue; + +} diff --git a/backend/src/main/java/io/dataease/ext/ExtDataSetTableMapper.xml b/backend/src/main/java/io/dataease/ext/ExtDataSetTableMapper.xml index b67aaa5e2e..a088a58d34 100644 --- a/backend/src/main/java/io/dataease/ext/ExtDataSetTableMapper.xml +++ b/backend/src/main/java/io/dataease/ext/ExtDataSetTableMapper.xml @@ -3,7 +3,7 @@ + extends="io.dataease.plugins.common.base.mapper.DatasetTableMapper.BaseResultMap"> diff --git a/backend/src/main/java/io/dataease/listener/DatasetCheckListener.java b/backend/src/main/java/io/dataease/listener/DatasetCheckListener.java index bbd01c5c38..f37831e077 100644 --- a/backend/src/main/java/io/dataease/listener/DatasetCheckListener.java +++ b/backend/src/main/java/io/dataease/listener/DatasetCheckListener.java @@ -33,7 +33,7 @@ public class DatasetCheckListener implements ApplicationListener datasetTables = datasetTableMapper.selectByExampleWithBLOBs(datasetTableExample); + List datasetTables = datasetTableMapper.selectByExample(datasetTableExample); CacheUtils.put(CACHE_NAME, CACHE_KEY, CollectionUtils.isEmpty(datasetTables), null, null); } } diff --git a/backend/src/main/java/io/dataease/provider/datasource/EsProvider.java b/backend/src/main/java/io/dataease/provider/datasource/EsProvider.java index ba59e98207..6d7eb58bd5 100644 --- a/backend/src/main/java/io/dataease/provider/datasource/EsProvider.java +++ b/backend/src/main/java/io/dataease/provider/datasource/EsProvider.java @@ -10,7 +10,7 @@ import io.dataease.controller.request.datasource.es.RequestWithCursor; import io.dataease.dto.datasource.EsConfiguration; import io.dataease.exception.DataEaseException; import io.dataease.i18n.Translator; -import io.dataease.plugins.common.constants.EsSqlLConstants; +import io.dataease.plugins.common.constants.datasource.EsSqlLConstants; import io.dataease.plugins.common.dto.datasource.TableDesc; import io.dataease.plugins.common.dto.datasource.TableField; import io.dataease.plugins.common.request.datasource.DatasourceRequest; diff --git a/backend/src/main/java/io/dataease/provider/engine/doris/DorisQueryProvider.java b/backend/src/main/java/io/dataease/provider/engine/doris/DorisQueryProvider.java index 7c2e7ec3e0..3f01cf9385 100644 --- a/backend/src/main/java/io/dataease/provider/engine/doris/DorisQueryProvider.java +++ b/backend/src/main/java/io/dataease/provider/engine/doris/DorisQueryProvider.java @@ -5,8 +5,8 @@ import io.dataease.plugins.common.base.domain.DatasetTableField; import io.dataease.plugins.common.base.domain.DatasetTableFieldExample; import io.dataease.plugins.common.base.domain.Datasource; import io.dataease.plugins.common.base.mapper.DatasetTableFieldMapper; -import io.dataease.plugins.common.constants.DorisConstants; -import io.dataease.plugins.common.constants.SQLConstants; +import io.dataease.plugins.common.constants.datasource.DorisConstants; +import io.dataease.plugins.common.constants.datasource.SQLConstants; import io.dataease.plugins.common.dto.chart.ChartCustomFilterItemDTO; import io.dataease.plugins.common.dto.chart.ChartFieldCustomFilterDTO; import io.dataease.plugins.common.dto.chart.ChartViewFieldDTO; @@ -31,7 +31,7 @@ import java.util.regex.Matcher; import java.util.regex.Pattern; import java.util.stream.Collectors; -import static io.dataease.plugins.common.constants.SQLConstants.TABLE_ALIAS_PREFIX; +import static io.dataease.plugins.common.constants.datasource.SQLConstants.TABLE_ALIAS_PREFIX; /** * @Author gin diff --git a/backend/src/main/java/io/dataease/provider/engine/mysql/MysqlQueryProvider.java b/backend/src/main/java/io/dataease/provider/engine/mysql/MysqlQueryProvider.java index cc32f18c29..face0dccde 100644 --- a/backend/src/main/java/io/dataease/provider/engine/mysql/MysqlQueryProvider.java +++ b/backend/src/main/java/io/dataease/provider/engine/mysql/MysqlQueryProvider.java @@ -5,8 +5,8 @@ import io.dataease.plugins.common.base.domain.DatasetTableField; import io.dataease.plugins.common.base.domain.DatasetTableFieldExample; import io.dataease.plugins.common.base.domain.Datasource; import io.dataease.plugins.common.base.mapper.DatasetTableFieldMapper; +import io.dataease.plugins.common.constants.datasource.SQLConstants; import io.dataease.plugins.common.constants.engine.MysqlConstants; -import io.dataease.plugins.common.constants.SQLConstants; import io.dataease.plugins.common.dto.chart.ChartCustomFilterItemDTO; import io.dataease.plugins.common.dto.chart.ChartFieldCustomFilterDTO; import io.dataease.plugins.common.dto.chart.ChartViewFieldDTO; @@ -31,7 +31,7 @@ import java.util.regex.Matcher; import java.util.regex.Pattern; import java.util.stream.Collectors; -import static io.dataease.plugins.common.constants.SQLConstants.TABLE_ALIAS_PREFIX; +import static io.dataease.plugins.common.constants.datasource.SQLConstants.TABLE_ALIAS_PREFIX; /** * @Author gin diff --git a/backend/src/main/java/io/dataease/provider/query/ck/CKQueryProvider.java b/backend/src/main/java/io/dataease/provider/query/ck/CKQueryProvider.java index 903a93fb51..6e4ab2a20d 100644 --- a/backend/src/main/java/io/dataease/provider/query/ck/CKQueryProvider.java +++ b/backend/src/main/java/io/dataease/provider/query/ck/CKQueryProvider.java @@ -5,10 +5,10 @@ import io.dataease.plugins.common.base.domain.DatasetTableField; import io.dataease.plugins.common.base.domain.DatasetTableFieldExample; import io.dataease.plugins.common.base.domain.Datasource; import io.dataease.plugins.common.base.mapper.DatasetTableFieldMapper; -import io.dataease.plugins.common.constants.CKConstants; -import io.dataease.plugins.common.constants.Db2Constants; +import io.dataease.plugins.common.constants.datasource.CKConstants; +import io.dataease.plugins.common.constants.datasource.Db2Constants; import io.dataease.plugins.common.constants.DeTypeConstants; -import io.dataease.plugins.common.constants.SQLConstants; +import io.dataease.plugins.common.constants.datasource.SQLConstants; import io.dataease.plugins.common.dto.chart.ChartCustomFilterItemDTO; import io.dataease.plugins.common.dto.chart.ChartFieldCustomFilterDTO; import io.dataease.plugins.common.dto.chart.ChartViewFieldDTO; @@ -33,7 +33,7 @@ import java.util.regex.Matcher; import java.util.regex.Pattern; import java.util.stream.Collectors; -import static io.dataease.plugins.common.constants.SQLConstants.TABLE_ALIAS_PREFIX; +import static io.dataease.plugins.common.constants.datasource.SQLConstants.TABLE_ALIAS_PREFIX; /** * @Author gin diff --git a/backend/src/main/java/io/dataease/provider/query/db2/Db2QueryProvider.java b/backend/src/main/java/io/dataease/provider/query/db2/Db2QueryProvider.java index 0a64fdf0a3..3722565c95 100644 --- a/backend/src/main/java/io/dataease/provider/query/db2/Db2QueryProvider.java +++ b/backend/src/main/java/io/dataease/provider/query/db2/Db2QueryProvider.java @@ -7,10 +7,9 @@ import io.dataease.plugins.common.base.domain.DatasetTableFieldExample; import io.dataease.plugins.common.base.domain.Datasource; import io.dataease.plugins.common.base.mapper.DatasetTableFieldMapper; import io.dataease.dto.datasource.Db2Configuration; -import io.dataease.plugins.common.constants.Db2Constants; +import io.dataease.plugins.common.constants.datasource.Db2Constants; import io.dataease.plugins.common.constants.DeTypeConstants; -import io.dataease.plugins.common.constants.EsSqlLConstants; -import io.dataease.plugins.common.constants.SQLConstants; +import io.dataease.plugins.common.constants.datasource.SQLConstants; import io.dataease.plugins.common.dto.chart.ChartCustomFilterItemDTO; import io.dataease.plugins.common.dto.chart.ChartFieldCustomFilterDTO; import io.dataease.plugins.common.dto.chart.ChartViewFieldDTO; @@ -35,7 +34,7 @@ import java.util.regex.Matcher; import java.util.regex.Pattern; import java.util.stream.Collectors; -import static io.dataease.plugins.common.constants.SQLConstants.TABLE_ALIAS_PREFIX; +import static io.dataease.plugins.common.constants.datasource.SQLConstants.TABLE_ALIAS_PREFIX; @Service("db2QueryProvider") public class Db2QueryProvider extends QueryProvider { diff --git a/backend/src/main/java/io/dataease/provider/query/es/EsQueryProvider.java b/backend/src/main/java/io/dataease/provider/query/es/EsQueryProvider.java index f2b562252b..ea41d830c6 100644 --- a/backend/src/main/java/io/dataease/provider/query/es/EsQueryProvider.java +++ b/backend/src/main/java/io/dataease/provider/query/es/EsQueryProvider.java @@ -6,9 +6,9 @@ import io.dataease.plugins.common.base.domain.DatasetTableFieldExample; import io.dataease.plugins.common.base.domain.Datasource; import io.dataease.plugins.common.base.mapper.DatasetTableFieldMapper; import io.dataease.plugins.common.constants.DeTypeConstants; -import io.dataease.plugins.common.constants.EsSqlLConstants; -import io.dataease.plugins.common.constants.HiveConstants; -import io.dataease.plugins.common.constants.SQLConstants; +import io.dataease.plugins.common.constants.datasource.EsSqlLConstants; +import io.dataease.plugins.common.constants.datasource.HiveConstants; +import io.dataease.plugins.common.constants.datasource.SQLConstants; import io.dataease.plugins.common.dto.chart.ChartCustomFilterItemDTO; import io.dataease.plugins.common.dto.chart.ChartFieldCustomFilterDTO; import io.dataease.plugins.common.dto.chart.ChartViewFieldDTO; @@ -33,7 +33,7 @@ import java.util.regex.Matcher; import java.util.regex.Pattern; import java.util.stream.Collectors; -import static io.dataease.plugins.common.constants.SQLConstants.TABLE_ALIAS_PREFIX; +import static io.dataease.plugins.common.constants.datasource.SQLConstants.TABLE_ALIAS_PREFIX; @Service("esQueryProvider") public class EsQueryProvider extends QueryProvider { diff --git a/backend/src/main/java/io/dataease/provider/query/hive/HiveQueryProvider.java b/backend/src/main/java/io/dataease/provider/query/hive/HiveQueryProvider.java index 0dae80e83d..9158376216 100644 --- a/backend/src/main/java/io/dataease/provider/query/hive/HiveQueryProvider.java +++ b/backend/src/main/java/io/dataease/provider/query/hive/HiveQueryProvider.java @@ -6,9 +6,9 @@ import io.dataease.plugins.common.base.domain.DatasetTableFieldExample; import io.dataease.plugins.common.base.domain.Datasource; import io.dataease.plugins.common.base.mapper.DatasetTableFieldMapper; import io.dataease.plugins.common.constants.DeTypeConstants; -import io.dataease.plugins.common.constants.HiveConstants; -import io.dataease.plugins.common.constants.ImpalaConstants; -import io.dataease.plugins.common.constants.SQLConstants; +import io.dataease.plugins.common.constants.datasource.HiveConstants; +import io.dataease.plugins.common.constants.datasource.ImpalaConstants; +import io.dataease.plugins.common.constants.datasource.SQLConstants; import io.dataease.plugins.common.dto.chart.ChartCustomFilterItemDTO; import io.dataease.plugins.common.dto.chart.ChartFieldCustomFilterDTO; import io.dataease.plugins.common.dto.chart.ChartViewFieldDTO; @@ -33,7 +33,7 @@ import java.util.regex.Matcher; import java.util.regex.Pattern; import java.util.stream.Collectors; -import static io.dataease.plugins.common.constants.SQLConstants.TABLE_ALIAS_PREFIX; +import static io.dataease.plugins.common.constants.datasource.SQLConstants.TABLE_ALIAS_PREFIX; /** * @Author gin diff --git a/backend/src/main/java/io/dataease/provider/query/impala/ImpalaQueryProvider.java b/backend/src/main/java/io/dataease/provider/query/impala/ImpalaQueryProvider.java index 24530afa3f..96f7ebd15f 100644 --- a/backend/src/main/java/io/dataease/provider/query/impala/ImpalaQueryProvider.java +++ b/backend/src/main/java/io/dataease/provider/query/impala/ImpalaQueryProvider.java @@ -6,9 +6,9 @@ import io.dataease.plugins.common.base.domain.DatasetTableFieldExample; import io.dataease.plugins.common.base.domain.Datasource; import io.dataease.plugins.common.base.mapper.DatasetTableFieldMapper; import io.dataease.plugins.common.constants.DeTypeConstants; -import io.dataease.plugins.common.constants.ImpalaConstants; -import io.dataease.plugins.common.constants.MongoConstants; -import io.dataease.plugins.common.constants.SQLConstants; +import io.dataease.plugins.common.constants.datasource.ImpalaConstants; +import io.dataease.plugins.common.constants.datasource.MongoConstants; +import io.dataease.plugins.common.constants.datasource.SQLConstants; import io.dataease.plugins.common.dto.chart.ChartCustomFilterItemDTO; import io.dataease.plugins.common.dto.chart.ChartFieldCustomFilterDTO; import io.dataease.plugins.common.dto.chart.ChartViewFieldDTO; @@ -33,7 +33,7 @@ import java.util.regex.Matcher; import java.util.regex.Pattern; import java.util.stream.Collectors; -import static io.dataease.plugins.common.constants.SQLConstants.TABLE_ALIAS_PREFIX; +import static io.dataease.plugins.common.constants.datasource.SQLConstants.TABLE_ALIAS_PREFIX; @Service("impalaQueryProvider") diff --git a/backend/src/main/java/io/dataease/provider/query/mongodb/MongoQueryProvider.java b/backend/src/main/java/io/dataease/provider/query/mongodb/MongoQueryProvider.java index f81eeb5125..ff26263f2c 100644 --- a/backend/src/main/java/io/dataease/provider/query/mongodb/MongoQueryProvider.java +++ b/backend/src/main/java/io/dataease/provider/query/mongodb/MongoQueryProvider.java @@ -6,9 +6,9 @@ import io.dataease.plugins.common.base.domain.DatasetTableFieldExample; import io.dataease.plugins.common.base.domain.Datasource; import io.dataease.plugins.common.base.mapper.DatasetTableFieldMapper; import io.dataease.plugins.common.constants.DeTypeConstants; -import io.dataease.plugins.common.constants.MongoConstants; -import io.dataease.plugins.common.constants.MySQLConstants; -import io.dataease.plugins.common.constants.SQLConstants; +import io.dataease.plugins.common.constants.datasource.MongoConstants; +import io.dataease.plugins.common.constants.datasource.MySQLConstants; +import io.dataease.plugins.common.constants.datasource.SQLConstants; import io.dataease.plugins.common.dto.chart.ChartCustomFilterItemDTO; import io.dataease.plugins.common.dto.chart.ChartFieldCustomFilterDTO; import io.dataease.plugins.common.dto.chart.ChartViewFieldDTO; @@ -33,7 +33,8 @@ import java.util.regex.Matcher; import java.util.regex.Pattern; import java.util.stream.Collectors; -import static io.dataease.plugins.common.constants.SQLConstants.TABLE_ALIAS_PREFIX; +import static io.dataease.plugins.common.constants.datasource.SQLConstants.TABLE_ALIAS_PREFIX; + /** * @Author gin diff --git a/backend/src/main/java/io/dataease/provider/query/mysql/MysqlQueryProvider.java b/backend/src/main/java/io/dataease/provider/query/mysql/MysqlQueryProvider.java index a26dd57464..6103e2bed1 100644 --- a/backend/src/main/java/io/dataease/provider/query/mysql/MysqlQueryProvider.java +++ b/backend/src/main/java/io/dataease/provider/query/mysql/MysqlQueryProvider.java @@ -5,9 +5,9 @@ import io.dataease.plugins.common.base.domain.DatasetTableField; import io.dataease.plugins.common.base.domain.DatasetTableFieldExample; import io.dataease.plugins.common.base.domain.Datasource; import io.dataease.plugins.common.base.mapper.DatasetTableFieldMapper; -import io.dataease.plugins.common.constants.MySQLConstants; +import io.dataease.plugins.common.constants.datasource.MySQLConstants; import io.dataease.plugins.common.constants.engine.MysqlConstants; -import io.dataease.plugins.common.constants.SQLConstants; +import io.dataease.plugins.common.constants.datasource.SQLConstants; import io.dataease.plugins.common.dto.chart.ChartCustomFilterItemDTO; import io.dataease.plugins.common.dto.chart.ChartFieldCustomFilterDTO; import io.dataease.plugins.common.dto.chart.ChartViewFieldDTO; @@ -32,7 +32,8 @@ import java.util.regex.Matcher; import java.util.regex.Pattern; import java.util.stream.Collectors; -import static io.dataease.plugins.common.constants.SQLConstants.TABLE_ALIAS_PREFIX; +import static io.dataease.plugins.common.constants.datasource.SQLConstants.TABLE_ALIAS_PREFIX; + /** * @Author gin diff --git a/backend/src/main/java/io/dataease/provider/query/oracle/OracleQueryProvider.java b/backend/src/main/java/io/dataease/provider/query/oracle/OracleQueryProvider.java index cdbc5ba4a1..c0e537beff 100644 --- a/backend/src/main/java/io/dataease/provider/query/oracle/OracleQueryProvider.java +++ b/backend/src/main/java/io/dataease/provider/query/oracle/OracleQueryProvider.java @@ -7,9 +7,9 @@ import io.dataease.plugins.common.base.domain.DatasetTableFieldExample; import io.dataease.plugins.common.base.domain.Datasource; import io.dataease.plugins.common.base.mapper.DatasetTableFieldMapper; import io.dataease.dto.datasource.OracleConfiguration; -import io.dataease.plugins.common.constants.MySQLConstants; -import io.dataease.plugins.common.constants.OracleConstants; -import io.dataease.plugins.common.constants.SQLConstants; +import io.dataease.plugins.common.constants.datasource.MySQLConstants; +import io.dataease.plugins.common.constants.datasource.OracleConstants; +import io.dataease.plugins.common.constants.datasource.SQLConstants; import io.dataease.plugins.common.dto.chart.ChartCustomFilterItemDTO; import io.dataease.plugins.common.dto.chart.ChartFieldCustomFilterDTO; import io.dataease.plugins.common.dto.chart.ChartViewFieldDTO; @@ -35,7 +35,7 @@ import java.util.regex.Matcher; import java.util.regex.Pattern; import java.util.stream.Collectors; -import static io.dataease.plugins.common.constants.SQLConstants.TABLE_ALIAS_PREFIX; +import static io.dataease.plugins.common.constants.datasource.SQLConstants.TABLE_ALIAS_PREFIX; /** * @Author gin diff --git a/backend/src/main/java/io/dataease/provider/query/pg/PgQueryProvider.java b/backend/src/main/java/io/dataease/provider/query/pg/PgQueryProvider.java index c54c2a761e..0c2aded84f 100644 --- a/backend/src/main/java/io/dataease/provider/query/pg/PgQueryProvider.java +++ b/backend/src/main/java/io/dataease/provider/query/pg/PgQueryProvider.java @@ -7,6 +7,9 @@ import io.dataease.plugins.common.base.domain.DatasetTableFieldExample; import io.dataease.plugins.common.base.domain.Datasource; import io.dataease.plugins.common.base.mapper.DatasetTableFieldMapper; import io.dataease.plugins.common.constants.*; +import io.dataease.plugins.common.constants.datasource.PgConstants; +import io.dataease.plugins.common.constants.datasource.SQLConstants; +import io.dataease.plugins.common.constants.datasource.SqlServerSQLConstants; import io.dataease.plugins.common.dto.chart.ChartCustomFilterItemDTO; import io.dataease.plugins.common.dto.chart.ChartFieldCustomFilterDTO; import io.dataease.plugins.common.dto.chart.ChartViewFieldDTO; @@ -32,7 +35,7 @@ import java.util.regex.Matcher; import java.util.regex.Pattern; import java.util.stream.Collectors; -import static io.dataease.plugins.common.constants.SQLConstants.TABLE_ALIAS_PREFIX; +import static io.dataease.plugins.common.constants.datasource.SQLConstants.TABLE_ALIAS_PREFIX; @Service("pgQueryProvider") diff --git a/backend/src/main/java/io/dataease/provider/query/redshift/RedshiftQueryProvider.java b/backend/src/main/java/io/dataease/provider/query/redshift/RedshiftQueryProvider.java index 49a78170ac..f0ab0c1edf 100644 --- a/backend/src/main/java/io/dataease/provider/query/redshift/RedshiftQueryProvider.java +++ b/backend/src/main/java/io/dataease/provider/query/redshift/RedshiftQueryProvider.java @@ -7,6 +7,10 @@ import io.dataease.plugins.common.base.domain.DatasetTableFieldExample; import io.dataease.plugins.common.base.domain.Datasource; import io.dataease.plugins.common.base.mapper.DatasetTableFieldMapper; import io.dataease.plugins.common.constants.*; +import io.dataease.plugins.common.constants.datasource.PgConstants; +import io.dataease.plugins.common.constants.datasource.RedshiftConstants; +import io.dataease.plugins.common.constants.datasource.SQLConstants; +import io.dataease.plugins.common.constants.datasource.SqlServerSQLConstants; import io.dataease.plugins.common.dto.chart.ChartCustomFilterItemDTO; import io.dataease.plugins.common.dto.chart.ChartFieldCustomFilterDTO; import io.dataease.plugins.common.dto.chart.ChartViewFieldDTO; @@ -32,7 +36,7 @@ import java.util.regex.Matcher; import java.util.regex.Pattern; import java.util.stream.Collectors; -import static io.dataease.plugins.common.constants.SQLConstants.TABLE_ALIAS_PREFIX; +import static io.dataease.plugins.common.constants.datasource.SQLConstants.TABLE_ALIAS_PREFIX; /** diff --git a/backend/src/main/java/io/dataease/provider/query/sqlserver/SqlserverQueryProvider.java b/backend/src/main/java/io/dataease/provider/query/sqlserver/SqlserverQueryProvider.java index 191ce6d589..89008d508f 100644 --- a/backend/src/main/java/io/dataease/provider/query/sqlserver/SqlserverQueryProvider.java +++ b/backend/src/main/java/io/dataease/provider/query/sqlserver/SqlserverQueryProvider.java @@ -7,9 +7,9 @@ import io.dataease.plugins.common.base.domain.DatasetTableFieldExample; import io.dataease.plugins.common.base.domain.Datasource; import io.dataease.plugins.common.base.mapper.DatasetTableFieldMapper; import io.dataease.plugins.common.constants.DeTypeConstants; -import io.dataease.plugins.common.constants.ImpalaConstants; -import io.dataease.plugins.common.constants.SQLConstants; -import io.dataease.plugins.common.constants.SqlServerSQLConstants; +import io.dataease.plugins.common.constants.datasource.ImpalaConstants; +import io.dataease.plugins.common.constants.datasource.SQLConstants; +import io.dataease.plugins.common.constants.datasource.SqlServerSQLConstants; import io.dataease.plugins.common.dto.chart.ChartCustomFilterItemDTO; import io.dataease.plugins.common.dto.chart.ChartFieldCustomFilterDTO; import io.dataease.plugins.common.dto.chart.ChartViewFieldDTO; @@ -35,7 +35,7 @@ import java.util.regex.Matcher; import java.util.regex.Pattern; import java.util.stream.Collectors; -import static io.dataease.plugins.common.constants.SQLConstants.TABLE_ALIAS_PREFIX; +import static io.dataease.plugins.common.constants.datasource.SQLConstants.TABLE_ALIAS_PREFIX; @Service("sqlServerQueryProvider") public class SqlserverQueryProvider extends QueryProvider { 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 16f2bcfb12..22b0627d34 100644 --- a/backend/src/main/java/io/dataease/service/chart/ChartViewService.java +++ b/backend/src/main/java/io/dataease/service/chart/ChartViewService.java @@ -27,6 +27,7 @@ import io.dataease.plugins.common.base.domain.*; import io.dataease.plugins.common.base.mapper.ChartViewCacheMapper; import io.dataease.plugins.common.base.mapper.ChartViewMapper; import io.dataease.plugins.common.base.mapper.PanelViewMapper; +import io.dataease.plugins.common.constants.DatasetType; import io.dataease.plugins.common.dto.chart.ChartFieldCompareDTO; import io.dataease.plugins.common.dto.chart.ChartFieldCustomFilterDTO; import io.dataease.plugins.common.dto.chart.ChartViewFieldDTO; @@ -435,7 +436,7 @@ public class ChartViewService { datasourceRequest.setDatasource(ds); DataTableInfoDTO dataTableInfoDTO = gson.fromJson(table.getInfo(), DataTableInfoDTO.class); QueryProvider qp = ProviderFactory.getQueryProvider(ds.getType()); - if (StringUtils.equalsIgnoreCase(table.getType(), "db")) { + if (StringUtils.equalsIgnoreCase(table.getType(), DatasetType.DB.name())) { datasourceRequest.setTable(dataTableInfoDTO.getTable()); if (StringUtils.equalsIgnoreCase("text", view.getType()) || StringUtils.equalsIgnoreCase("gauge", view.getType()) || StringUtils.equalsIgnoreCase("liquid", view.getType())) { datasourceRequest.setQuery(qp.getSQLSummary(dataTableInfoDTO.getTable(), yAxis, fieldCustomFilter, extFilterList, view, ds)); @@ -448,19 +449,23 @@ public class ChartViewService { } else { datasourceRequest.setQuery(qp.getSQL(dataTableInfoDTO.getTable(), xAxis, yAxis, fieldCustomFilter, extFilterList, ds, view)); } - } else if (StringUtils.equalsIgnoreCase(table.getType(), "sql")) { - if (StringUtils.equalsIgnoreCase("text", view.getType()) || StringUtils.equalsIgnoreCase("gauge", view.getType()) || StringUtils.equalsIgnoreCase("liquid", view.getType())) { - datasourceRequest.setQuery(qp.getSQLSummaryAsTmp(dataTableInfoDTO.getSql(), yAxis, fieldCustomFilter, extFilterList, view)); - } else if (StringUtils.containsIgnoreCase(view.getType(), "stack")) { - datasourceRequest.setQuery(qp.getSQLAsTmpStack(dataTableInfoDTO.getSql(), xAxis, yAxis, fieldCustomFilter, extFilterList, extStack, view)); - } else if (StringUtils.containsIgnoreCase(view.getType(), "scatter")) { - datasourceRequest.setQuery(qp.getSQLAsTmpScatter(dataTableInfoDTO.getSql(), xAxis, yAxis, fieldCustomFilter, extFilterList, extBubble, view)); - } else if (StringUtils.equalsIgnoreCase("table-info", view.getType())) { - datasourceRequest.setQuery(qp.getSQLAsTmpTableInfo(dataTableInfoDTO.getSql(), xAxis, fieldCustomFilter, extFilterList, ds, view)); - } else { - datasourceRequest.setQuery(qp.getSQLAsTmp(dataTableInfoDTO.getSql(), xAxis, yAxis, fieldCustomFilter, extFilterList, view)); + } else if (StringUtils.equalsIgnoreCase(table.getType(), DatasetType.SQL.name())) { + String sql = dataTableInfoDTO.getSql(); + if (CollectionUtils.isNotEmpty(requestList.getFilter())) { + sql = handleVariable(sql, requestList); } - } else if (StringUtils.equalsIgnoreCase(table.getType(), "custom")) { + if (StringUtils.equalsIgnoreCase("text", view.getType()) || StringUtils.equalsIgnoreCase("gauge", view.getType()) || StringUtils.equalsIgnoreCase("liquid", view.getType())) { + datasourceRequest.setQuery(qp.getSQLSummaryAsTmp(sql, yAxis, fieldCustomFilter, extFilterList, view)); + } else if (StringUtils.containsIgnoreCase(view.getType(), "stack")) { + datasourceRequest.setQuery(qp.getSQLAsTmpStack(sql, xAxis, yAxis, fieldCustomFilter, extFilterList, extStack, view)); + } else if (StringUtils.containsIgnoreCase(view.getType(), "scatter")) { + datasourceRequest.setQuery(qp.getSQLAsTmpScatter(sql, xAxis, yAxis, fieldCustomFilter, extFilterList, extBubble, view)); + } else if (StringUtils.equalsIgnoreCase("table-info", view.getType())) { + datasourceRequest.setQuery(qp.getSQLAsTmpTableInfo(sql, xAxis, fieldCustomFilter, extFilterList, ds, view)); + } else { + datasourceRequest.setQuery(qp.getSQLAsTmp(sql, xAxis, yAxis, fieldCustomFilter, extFilterList, view)); + } + } else if (StringUtils.equalsIgnoreCase(table.getType(), DatasetType.CUSTOM.name())) { DataTableInfoDTO dt = gson.fromJson(table.getInfo(), DataTableInfoDTO.class); List list = dataSetTableUnionService.listByTableId(dt.getList().get(0).getTableId()); String sql = dataSetTableService.getCustomSQLDatasource(dt, list, ds); @@ -475,7 +480,7 @@ public class ChartViewService { } else { datasourceRequest.setQuery(qp.getSQLAsTmp(sql, xAxis, yAxis, fieldCustomFilter, extFilterList, view)); } - } else if (StringUtils.equalsIgnoreCase(table.getType(), "union")) { + } else if (StringUtils.equalsIgnoreCase(table.getType(), DatasetType.UNION.name())) { DataTableInfoDTO dt = gson.fromJson(table.getInfo(), DataTableInfoDTO.class); Map sqlMap = dataSetTableService.getUnionSQLDatasource(dt, ds); String sql = (String) sqlMap.get("sql"); @@ -494,9 +499,6 @@ public class ChartViewService { } data = datasourceProvider.getData(datasourceRequest); } else if (table.getMode() == 1) {// 抽取 - // 连接doris,构建doris数据源查询 - // Datasource ds = engineService.getDeEngine(); - // DatasourceProvider datasourceProvider = ProviderFactory.getProvider(ds.getType()); datasourceRequest.setDatasource(ds); String tableName = "ds_" + table.getId().replaceAll("-", "_"); datasourceRequest.setTable(tableName); @@ -807,7 +809,7 @@ public class ChartViewService { datasourceRequest.setDatasource(ds); DataTableInfoDTO dataTableInfoDTO = gson.fromJson(table.getInfo(), DataTableInfoDTO.class); QueryProvider qp = ProviderFactory.getQueryProvider(ds.getType()); - if (StringUtils.equalsIgnoreCase(table.getType(), "db")) { + if (StringUtils.equalsIgnoreCase(table.getType(), DatasetType.DB.name())) { datasourceRequest.setTable(dataTableInfoDTO.getTable()); if (StringUtils.equalsIgnoreCase("text", view.getType()) || StringUtils.equalsIgnoreCase("gauge", view.getType()) || StringUtils.equalsIgnoreCase("liquid", view.getType())) { datasourceRequest.setQuery(qp.getSQLSummary(dataTableInfoDTO.getTable(), yAxis, fieldCustomFilter, extFilterList, view, ds)); @@ -820,19 +822,25 @@ public class ChartViewService { } else { datasourceRequest.setQuery(qp.getSQL(dataTableInfoDTO.getTable(), xAxis, yAxis, fieldCustomFilter, extFilterList, ds, view)); } - } else if (StringUtils.equalsIgnoreCase(table.getType(), "sql")) { - if (StringUtils.equalsIgnoreCase("text", view.getType()) || StringUtils.equalsIgnoreCase("gauge", view.getType()) || StringUtils.equalsIgnoreCase("liquid", view.getType())) { - datasourceRequest.setQuery(qp.getSQLSummaryAsTmp(dataTableInfoDTO.getSql(), yAxis, fieldCustomFilter, extFilterList, view)); - } else if (StringUtils.containsIgnoreCase(view.getType(), "stack")) { - datasourceRequest.setQuery(qp.getSQLAsTmpStack(dataTableInfoDTO.getSql(), xAxis, yAxis, fieldCustomFilter, extFilterList, extStack, view)); - } else if (StringUtils.containsIgnoreCase(view.getType(), "scatter")) { - datasourceRequest.setQuery(qp.getSQLAsTmpScatter(dataTableInfoDTO.getSql(), xAxis, yAxis, fieldCustomFilter, extFilterList, extBubble, view)); - } else if (StringUtils.equalsIgnoreCase("table-info", view.getType())) { - datasourceRequest.setQuery(qp.getSQLAsTmpTableInfo(dataTableInfoDTO.getSql(), xAxis, fieldCustomFilter, extFilterList, ds, view)); - } else { - datasourceRequest.setQuery(qp.getSQLAsTmp(dataTableInfoDTO.getSql(), xAxis, yAxis, fieldCustomFilter, extFilterList, view)); + } else if (StringUtils.equalsIgnoreCase(table.getType(), DatasetType.SQL.name())) { + String sql = dataTableInfoDTO.getSql(); + if (CollectionUtils.isNotEmpty(requestList.getFilter())) { + sql = handleVariable(sql, requestList); } - } else if (StringUtils.equalsIgnoreCase(table.getType(), "custom")) { + + if (StringUtils.equalsIgnoreCase("text", view.getType()) || StringUtils.equalsIgnoreCase("gauge", view.getType()) || StringUtils.equalsIgnoreCase("liquid", view.getType())) { + datasourceRequest.setQuery(qp.getSQLSummaryAsTmp(sql, yAxis, fieldCustomFilter, extFilterList, view)); + } else if (StringUtils.containsIgnoreCase(view.getType(), "stack")) { + datasourceRequest.setQuery(qp.getSQLAsTmpStack(sql, xAxis, yAxis, fieldCustomFilter, extFilterList, extStack, view)); + } else if (StringUtils.containsIgnoreCase(view.getType(), "scatter")) { + datasourceRequest.setQuery(qp.getSQLAsTmpScatter(sql, xAxis, yAxis, fieldCustomFilter, extFilterList, extBubble, view)); + } else if (StringUtils.equalsIgnoreCase("table-info", view.getType())) { + datasourceRequest.setQuery(qp.getSQLAsTmpTableInfo(sql, xAxis, fieldCustomFilter, extFilterList, ds, view)); + } else { + datasourceRequest.setQuery(qp.getSQLAsTmp(sql, xAxis, yAxis, fieldCustomFilter, extFilterList, view)); + } + System.out.println(datasourceRequest.getQuery()); + } else if (StringUtils.equalsIgnoreCase(table.getType(), DatasetType.CUSTOM.name())) { DataTableInfoDTO dt = gson.fromJson(table.getInfo(), DataTableInfoDTO.class); List list = dataSetTableUnionService.listByTableId(dt.getList().get(0).getTableId()); String sql = dataSetTableService.getCustomSQLDatasource(dt, list, ds); @@ -847,7 +855,7 @@ public class ChartViewService { } else { datasourceRequest.setQuery(qp.getSQLAsTmp(sql, xAxis, yAxis, fieldCustomFilter, extFilterList, view)); } - } else if (StringUtils.equalsIgnoreCase(table.getType(), "union")) { + } else if (StringUtils.equalsIgnoreCase(table.getType(), DatasetType.UNION.name())) { DataTableInfoDTO dt = gson.fromJson(table.getInfo(), DataTableInfoDTO.class); Map sqlMap = dataSetTableService.getUnionSQLDatasource(dt, ds); String sql = (String) sqlMap.get("sql"); @@ -1490,4 +1498,22 @@ public class ChartViewService { chartViewMapper.updateByPrimaryKeySelective(chartView); } + private String handleVariable(String sql, ChartExtRequest requestList){ + for (ChartExtFilterRequest chartExtFilterRequest : requestList.getFilter()) { + chartExtFilterRequest.getParameters(); + if(CollectionUtils.isEmpty(chartExtFilterRequest.getValue())){ + continue; + } + if(chartExtFilterRequest.getValue().size() > 1){ + for (String parameter : chartExtFilterRequest.getParameters()) { + sql = sql.replace("${" + parameter + "}", String.join(",", chartExtFilterRequest.getValue())); + } + }else { + for (String parameter : chartExtFilterRequest.getParameters()) { + sql = sql.replace("${" + parameter + "}", chartExtFilterRequest.getValue().get(0)); + } + } + } + return sql; + } } diff --git a/backend/src/main/java/io/dataease/service/chart/ViewPluginBaseServiceImpl.java b/backend/src/main/java/io/dataease/service/chart/ViewPluginBaseServiceImpl.java index 7b331b7ca6..72ec3edf32 100644 --- a/backend/src/main/java/io/dataease/service/chart/ViewPluginBaseServiceImpl.java +++ b/backend/src/main/java/io/dataease/service/chart/ViewPluginBaseServiceImpl.java @@ -3,12 +3,14 @@ package io.dataease.service.chart; import cn.hutool.core.util.ReflectUtil; import com.google.gson.Gson; import io.dataease.commons.model.PluginViewSetImpl; +import io.dataease.commons.utils.TableUtils; import io.dataease.dto.dataset.DataSetTableUnionDTO; import io.dataease.dto.dataset.DataTableInfoDTO; import io.dataease.plugins.common.base.domain.ChartViewWithBLOBs; import io.dataease.plugins.common.base.domain.DatasetTableField; import io.dataease.plugins.common.base.domain.Datasource; -import io.dataease.plugins.common.constants.SQLConstants; +import io.dataease.plugins.common.constants.DatasetType; +import io.dataease.plugins.common.constants.datasource.SQLConstants; import io.dataease.plugins.common.dto.chart.ChartFieldCustomFilterDTO; import io.dataease.plugins.common.dto.chart.ChartViewFieldDTO; import io.dataease.plugins.common.dto.sqlObj.SQLObj; @@ -30,7 +32,7 @@ import java.lang.reflect.Method; import java.util.*; import java.util.stream.Collectors; -import static io.dataease.plugins.common.constants.SQLConstants.TABLE_ALIAS_PREFIX; +import static io.dataease.plugins.common.constants.datasource.SQLConstants.TABLE_ALIAS_PREFIX; @Service public class ViewPluginBaseServiceImpl implements ViewPluginBaseService { @@ -97,24 +99,22 @@ public class ViewPluginBaseServiceImpl implements ViewPluginBaseService { String tableName = null; DataTableInfoDTO dataTableInfoDTO = new Gson().fromJson(pluginViewSet.getInfo(), DataTableInfoDTO.class); if (ObjectUtils.isNotEmpty(pluginViewSet.getMode()) && 1 == pluginViewSet.getMode()) { - - tableName = "ds_" + pluginViewSet.getTabelId().replaceAll("-", "_"); - + tableName = TableUtils.tableName(pluginViewSet.getTabelId()); }else { - switch (pluginViewSet.getType()) { - case "db": + switch (DatasetType.valueOf(pluginViewSet.getType())) { + case DB: tableName = dataTableInfoDTO.getTable(); break; - case "sql": - tableName = dataTableInfoDTO.getSql(); + case SQL: + tableName = dataSetTableService.handleVariableDefaultValue(dataTableInfoDTO.getSql(), pluginViewSet.getSqlVariableDetails()); break; - case "custom": + case CUSTOM: List list = dataSetTableUnionService.listByTableId(dataTableInfoDTO.getList().get(0).getTableId()); Datasource ds = new Datasource(); ds.setType(pluginViewSet.getDsType()); tableName = dataSetTableService.getCustomSQLDatasource(dataTableInfoDTO, list, ds); break; - case "union": + case UNION: Datasource datasource = new Datasource(); datasource.setType(pluginViewSet.getDsType()); Map sqlMap = dataSetTableService.getUnionSQLDatasource(dataTableInfoDTO, datasource); @@ -129,19 +129,12 @@ public class ViewPluginBaseServiceImpl implements ViewPluginBaseService { String tabelName = (tableName.startsWith("(") && tableName.endsWith(")")) ? tableName : String.format(keyword, tableName); String tabelAlias = String.format(TABLE_ALIAS_PREFIX, 0); PluginViewSQL tableObj = PluginViewSQL.builder().tableName(tabelName).tableAlias(tabelAlias).build(); - - QueryProvider queryProvider = ProviderFactory.getQueryProvider(pluginViewSet.getDsType()); - SQLObj sqlObj = SQLObj.builder().tableName(tabelName).tableAlias(tabelAlias).build(); PluginViewSetImpl child = (PluginViewSetImpl)pluginViewSet; queryProvider.setSchema(sqlObj, child.getDs()); - // String methodName = "setSchema"; - // execProviderMethod(queryProvider, methodName, sqlObj, child.getDs()); tableObj.setTableName(sqlObj.getTableName()); tableObj.setTableAlias(sqlObj.getTableAlias()); - - return tableObj; } 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 a36fa85640..f12e35e3f3 100644 --- a/backend/src/main/java/io/dataease/service/dataset/DataSetTableService.java +++ b/backend/src/main/java/io/dataease/service/dataset/DataSetTableService.java @@ -4,6 +4,7 @@ import com.google.gson.Gson; import com.google.gson.JsonElement; import com.google.gson.JsonObject; import com.google.gson.JsonParser; +import com.google.gson.reflect.TypeToken; import io.dataease.auth.annotation.DeCleaner; import io.dataease.auth.api.dto.CurrentUserDto; import io.dataease.dto.SysLogDTO; @@ -26,6 +27,7 @@ import io.dataease.i18n.Translator; import io.dataease.listener.util.CacheUtils; import io.dataease.plugins.common.base.domain.*; import io.dataease.plugins.common.base.mapper.*; +import io.dataease.plugins.common.constants.DatasetType; import io.dataease.plugins.common.constants.DatasourceTypes; import io.dataease.plugins.common.dto.chart.ChartFieldCustomFilterDTO; import io.dataease.plugins.common.dto.datasource.TableField; @@ -38,6 +40,19 @@ import io.dataease.provider.datasource.JdbcProvider; import io.dataease.provider.DDLProvider; import io.dataease.service.engine.EngineService; import io.dataease.service.sys.SysAuthService; +import net.sf.jsqlparser.expression.BinaryExpression; +import net.sf.jsqlparser.expression.Expression; +import net.sf.jsqlparser.expression.Parenthesis; +import net.sf.jsqlparser.expression.operators.conditional.AndExpression; +import net.sf.jsqlparser.expression.operators.conditional.OrExpression; +import net.sf.jsqlparser.expression.operators.relational.ExpressionList; +import net.sf.jsqlparser.expression.operators.relational.InExpression; +import net.sf.jsqlparser.parser.CCJSqlParserUtil; +import net.sf.jsqlparser.statement.Statement; +import net.sf.jsqlparser.statement.select.PlainSelect; +import net.sf.jsqlparser.statement.select.Select; +import net.sf.jsqlparser.statement.select.SubSelect; +import net.sf.jsqlparser.util.deparser.ExpressionDeParser; import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.lang3.ObjectUtils; import org.apache.commons.lang3.StringUtils; @@ -62,6 +77,7 @@ import javax.annotation.Resource; import java.io.File; import java.io.FileOutputStream; import java.io.InputStream; +import java.io.StringReader; import java.math.BigDecimal; import java.text.MessageFormat; import java.text.NumberFormat; @@ -112,10 +128,15 @@ public class DataSetTableService { private EngineService engineService; @Resource private SysAuthService sysAuthService; + @Resource + private ChartViewMapper chartViewMapper; private static boolean isUpdatingDatasetTableStatus = false; private static final String lastUpdateTime = "${__last_update_time__}"; private static final String currentUpdateTime = "${__current_update_time__}"; + private static final String regex = "\\$\\{(.*?)\\}"; + private static final String SubstitutedParams = "DATAEASE_PATAMS_BI"; + private static final String SubstitutedSql = " 'BI' = 'BI' "; @Value("${upload.file.path}") private String path; @@ -268,7 +289,7 @@ public class DataSetTableService { @DeCleaner(value = DePermissionType.DATASET, key = "sceneId") public DatasetTable save(DataSetTableRequest datasetTable) throws Exception { checkName(datasetTable); - if (StringUtils.equalsIgnoreCase(datasetTable.getType(), "sql")) { + if (StringUtils.equalsIgnoreCase(datasetTable.getType(), DatasetType.SQL.name())) { DataSetTableRequest dataSetTableRequest = new DataSetTableRequest(); BeanUtils.copyBean(dataSetTableRequest, datasetTable); getSQLPreview(dataSetTableRequest); @@ -295,9 +316,9 @@ public class DataSetTableService { if (datasetTable.getIsRename() == null || !datasetTable.getIsRename()) { // 更新数据和字段 if (update == 1) { - if (StringUtils.equalsIgnoreCase(datasetTable.getType(), "sql") - || StringUtils.equalsIgnoreCase(datasetTable.getType(), "custom") - || StringUtils.equalsIgnoreCase(datasetTable.getType(), "union")) { + if (StringUtils.equalsIgnoreCase(datasetTable.getType(), DatasetType.SQL.name()) + || StringUtils.equalsIgnoreCase(datasetTable.getType(), DatasetType.CUSTOM.name()) + || StringUtils.equalsIgnoreCase(datasetTable.getType(), DatasetType.UNION.name())) { saveTableField(datasetTable); } DeLogUtils.save(SysLogConstants.OPERATE_TYPE.MODIFY, SysLogConstants.SOURCE_TYPE.DATASET, datasetTable.getId(), datasetTable.getSceneId(), null, null); @@ -339,8 +360,8 @@ public class DataSetTableService { DatasourceRequest datasourceRequest = new DatasourceRequest(); datasourceRequest.setDatasource(dorisDatasource); DDLProvider ddlProvider = ProviderFactory.getDDLProvider(dorisDatasource.getType()); - if (StringUtils.equalsIgnoreCase("custom", table.getType()) - || StringUtils.equalsIgnoreCase("union", table.getType())) { + if (StringUtils.equalsIgnoreCase(DatasetType.CUSTOM.name(), table.getType()) + || StringUtils.equalsIgnoreCase(DatasetType.UNION.name(), table.getType())) { datasourceRequest.setQuery(ddlProvider.dropView(dorisTableName)); jdbcProvider.exec(datasourceRequest); datasourceRequest.setQuery(ddlProvider.dropView(TableUtils.tmpName(dorisTableName))); @@ -362,7 +383,7 @@ public class DataSetTableService { public List list(List datasetIds) { DatasetTableExample example = new DatasetTableExample(); example.createCriteria().andIdIn(datasetIds); - return datasetTableMapper.selectByExampleWithBLOBs(example); + return datasetTableMapper.selectByExample(example); } public List listAndGroup(DataSetTableRequest dataSetTableRequest) { @@ -542,7 +563,7 @@ public class DataSetTableService { if (page == Integer.parseInt(dataSetTableRequest.getRow()) / pageSize + 1) { realSize = Integer.parseInt(dataSetTableRequest.getRow()) % pageSize; } - if (StringUtils.equalsIgnoreCase(datasetTable.getType(), "db") || StringUtils.equalsIgnoreCase(datasetTable.getType(), "api")) { + if (StringUtils.equalsIgnoreCase(datasetTable.getType(), DatasetType.DB.name()) || StringUtils.equalsIgnoreCase(datasetTable.getType(), DatasetType.API.name())) { if (datasetTable.getMode() == 0) { Datasource ds = datasourceMapper.selectByPrimaryKey(dataSetTableRequest.getDataSourceId()); if (ObjectUtils.isEmpty(ds)) { @@ -617,7 +638,7 @@ public class DataSetTableService { } } - } else if (StringUtils.equalsIgnoreCase(datasetTable.getType(), "sql")) { + } else if (StringUtils.equalsIgnoreCase(datasetTable.getType(), DatasetType.SQL.name())) { if (datasetTable.getMode() == 0) { Datasource ds = datasourceMapper.selectByPrimaryKey(dataSetTableRequest.getDataSourceId()); if (ObjectUtils.isEmpty(ds)) { @@ -630,7 +651,7 @@ public class DataSetTableService { DatasourceRequest datasourceRequest = new DatasourceRequest(); datasourceRequest.setDatasource(ds); - String sql = dataTableInfoDTO.getSql(); + String sql = handleVariableDefaultValue(new Gson().fromJson(datasetTable.getInfo(), DataTableInfoDTO.class).getSql(), datasetTable.getSqlVariableDetails()); QueryProvider qp = ProviderFactory.getQueryProvider(ds.getType()); datasourceRequest.setQuery( qp.createQuerySQLWithPage(sql, fields, page, pageSize, realSize, false, customFilter)); @@ -882,6 +903,86 @@ public class DataSetTableService { return map; } + public List paramsWithIds(List viewIds) { + if (CollectionUtils.isEmpty(viewIds)) { + return new ArrayList<>(); + } + ChartViewExample chartViewExample = new ChartViewExample(); + chartViewExample.createCriteria().andIdIn(viewIds); + List datasetIds = chartViewMapper.selectByExample(chartViewExample).stream().map(ChartView::getTableId).collect(Collectors.toList()); + if (CollectionUtils.isEmpty(datasetIds)) { + return new ArrayList<>(); + } + DatasetTableExample datasetTableExample = new DatasetTableExample(); + datasetTableExample.createCriteria().andIdIn(datasetIds); + List datasetTables = datasetTableMapper.selectByExample(datasetTableExample); + if (CollectionUtils.isEmpty(datasetTables)) { + return new ArrayList<>(); + } + List sqlVariableDetails = new ArrayList<>(); + datasetTables.forEach(datasetTable -> { + if (StringUtils.isNotEmpty(datasetTable.getSqlVariableDetails())) { + sqlVariableDetails.addAll(new Gson().fromJson(datasetTable.getSqlVariableDetails(), new TypeToken>() { + }.getType())); + } + + }); + return sqlVariableDetails; + } + + + public String handleVariableDefaultValue(String sql, String sqlVariableDetails) { + if (StringUtils.isEmpty(sql)) { + DataEaseException.throwException(Translator.get("i18n_sql_not_empty")); + } + Pattern pattern = Pattern.compile(regex); + Matcher matcher = pattern.matcher(sql); + while (matcher.find()) { + boolean customValue = false; +// if (CollectionUtils.isNotEmpty(customSqlVariableDetails)) { +// for (SqlVariableDetails customSqlVariableDetail : customSqlVariableDetails) { +// if (matcher.group().substring(2, matcher.group().length() - 1).equalsIgnoreCase(customSqlVariableDetail.getVariableName())) { +// sql = sql.replace(matcher.group(), customSqlVariableDetail.getDefaultValue()); +// customValue = true; +// break; +// } +// } +// } + if (!customValue) { + SqlVariableDetails defaultsSqlVariableDetail = null; + List defaultsSqlVariableDetails = new Gson().fromJson(sqlVariableDetails, new TypeToken>() { + }.getType()); + for (SqlVariableDetails sqlVariableDetail : defaultsSqlVariableDetails) { + if (matcher.group().substring(2, matcher.group().length() - 1).equalsIgnoreCase(sqlVariableDetail.getVariableName())) { + defaultsSqlVariableDetail = sqlVariableDetail; + break; + } + } + if (defaultsSqlVariableDetail == null || StringUtils.isEmpty(defaultsSqlVariableDetail.getDefaultValue())) { + throw new RuntimeException(matcher.group().substring(2, matcher.group().length() - 1) + "没有默认值!"); + } + sql = sql.replace(matcher.group(), defaultsSqlVariableDetail.getDefaultValue()); + } + } + return sql; + } + + private String removeVariables(String sql) throws Exception { + Pattern pattern = Pattern.compile(regex); + Matcher matcher = pattern.matcher(sql); + while (matcher.find()) { + sql = sql.replace(matcher.group(), SubstitutedParams); + } + + CCJSqlParserUtil.parse(sql, parser -> parser.withSquareBracketQuotation(true)); + Statement statement = CCJSqlParserUtil.parse(sql); + Select select = (Select) statement; + Expression expr = ((PlainSelect) select.getSelectBody()).getWhere(); + StringBuilder stringBuilder = new StringBuilder(); + expr.accept(getExpressionDeParser(stringBuilder)); + return stringBuilder.toString(); + } + public Map getSQLPreview(DataSetTableRequest dataSetTableRequest) throws Exception { Datasource ds = datasourceMapper.selectByPrimaryKey(dataSetTableRequest.getDataSourceId()); if (ds == null) { @@ -890,8 +991,7 @@ public class DataSetTableService { Provider datasourceProvider = ProviderFactory.getProvider(ds.getType()); DatasourceRequest datasourceRequest = new DatasourceRequest(); datasourceRequest.setDatasource(ds); - String sql = new Gson().fromJson(dataSetTableRequest.getInfo(), DataTableInfoDTO.class).getSql(); - + String sql = handleVariableDefaultValue(new Gson().fromJson(dataSetTableRequest.getInfo(), DataTableInfoDTO.class).getSql(), dataSetTableRequest.getSqlVariableDetails()); if (StringUtils.isEmpty(sql)) { DataEaseException.throwException(Translator.get("i18n_sql_not_empty")); } @@ -1533,7 +1633,7 @@ public class DataSetTableService { public void saveTableField(DatasetTable datasetTable) throws Exception { Datasource ds = datasourceMapper.selectByPrimaryKey(datasetTable.getDataSourceId()); - if (ObjectUtils.isEmpty(ds) && !datasetTable.getType().equalsIgnoreCase("union")) { + if (ObjectUtils.isEmpty(ds) && !datasetTable.getType().equalsIgnoreCase(DatasetType.UNION.name())) { throw new RuntimeException(Translator.get("i18n_datasource_delete")); } DataSetTableRequest dataSetTableRequest = new DataSetTableRequest(); @@ -1541,20 +1641,20 @@ public class DataSetTableService { List fields = new ArrayList<>(); long syncTime = System.currentTimeMillis(); - if (StringUtils.equalsIgnoreCase(datasetTable.getType(), "db") || StringUtils.equalsIgnoreCase(datasetTable.getType(), "api")) { + if (StringUtils.equalsIgnoreCase(datasetTable.getType(), DatasetType.DB.name()) || StringUtils.equalsIgnoreCase(datasetTable.getType(), DatasetType.API.name())) { fields = getFields(datasetTable); - } else if (StringUtils.equalsIgnoreCase(datasetTable.getType(), "sql")) { + } else if (StringUtils.equalsIgnoreCase(datasetTable.getType(), DatasetType.SQL.name())) { Provider datasourceProvider = ProviderFactory.getProvider(ds.getType()); DatasourceRequest datasourceRequest = new DatasourceRequest(); datasourceRequest.setDatasource(ds); QueryProvider qp = ProviderFactory.getQueryProvider(ds.getType()); - String sqlAsTable = qp.createSQLPreview( - new Gson().fromJson(dataSetTableRequest.getInfo(), DataTableInfoDTO.class).getSql(), null); + String sql = handleVariableDefaultValue(new Gson().fromJson(datasetTable.getInfo(), DataTableInfoDTO.class).getSql(), datasetTable.getSqlVariableDetails()); + String sqlAsTable = qp.createSQLPreview(sql, null); datasourceRequest.setQuery(sqlAsTable); fields = datasourceProvider.fetchResultField(datasourceRequest); - } else if (StringUtils.equalsIgnoreCase(datasetTable.getType(), "excel")) { + } else if (StringUtils.equalsIgnoreCase(datasetTable.getType(), DatasetType.EXCEL.name())) { fields = dataSetTableRequest.getFields(); - } else if (StringUtils.equalsIgnoreCase(datasetTable.getType(), "custom")) { + } else if (StringUtils.equalsIgnoreCase(datasetTable.getType(), DatasetType.CUSTOM.name())) { if (datasetTable.getMode() == 1) { // save field DataTableInfoDTO dataTableInfoDTO = new Gson().fromJson(dataSetTableRequest.getInfo(), @@ -2382,4 +2482,110 @@ public class DataSetTableService { public int updateByExampleSelective(DatasetTable record, DatasetTableExample example) { return datasetTableMapper.updateByExampleSelective(record, example); } + + private ExpressionDeParser getExpressionDeParser(StringBuilder stringBuilder) { + ExpressionDeParser expressionDeParser = new ExpressionDeParser(null, stringBuilder) { + @Override + public void visit(Parenthesis parenthesis) { + getBuffer().append("("); + parenthesis.getExpression().accept(this); + getBuffer().append(")"); + } + + @Override + public void visit(OrExpression orExpression) { + visitBinaryExpr(orExpression, "OR"); + } + + @Override + public void visit(AndExpression andExpression) { + visitBinaryExpr(andExpression, "AND"); + } + + + @Override + public void visit(ExpressionList expressionList) { + for (Expression expression : expressionList.getExpressions()) { + expression.accept(this); + } + } + + @Override + public void visit(InExpression inExpression) { + inExpression.getLeftExpression().accept(this); + if (inExpression.isNot()) { + getBuffer().append(" " + "NOT IN" + " "); + } else { + getBuffer().append(" " + "IN" + " "); + } + + getBuffer().append("("); + if (inExpression.getRightItemsList() != null) { + inExpression.getRightItemsList().accept(this); + } + if (inExpression.getRightExpression() != null) { + inExpression.getRightExpression().accept(this); + } + + getBuffer().append(")"); + } + + + @Override + public void visit(SubSelect subSelect) { + StringBuilder stringBuilder = new StringBuilder(); + Expression in = ((PlainSelect) subSelect.getSelectBody()).getWhere(); + if (in instanceof BinaryExpression && hasVarible(in.toString())) { + stringBuilder.append(SubstitutedSql); + } else { + in.accept(getExpressionDeParser(stringBuilder)); + } + + try { + Expression where = CCJSqlParserUtil.parseCondExpression(stringBuilder.toString()); + ((PlainSelect) subSelect.getSelectBody()).setWhere(where); + getBuffer().append(subSelect.getSelectBody()); + } catch (Exception e) { + e.printStackTrace(); + } + } + + private boolean hasVarible(String sql) { + return sql.contains(SubstitutedParams); + } + + private void visitBinaryExpr(BinaryExpression expr, String operator) { + boolean hasBinaryExpression = false; + try { + BinaryExpression leftBinaryExpression = (BinaryExpression) expr.getLeftExpression(); + hasBinaryExpression = leftBinaryExpression.getLeftExpression() instanceof BinaryExpression; + } catch (Exception e) { + } + + if (expr.getLeftExpression() instanceof BinaryExpression && !hasBinaryExpression && hasVarible(expr.getLeftExpression().toString())) { + getBuffer().append(SubstitutedSql); + } else { + expr.getLeftExpression().accept(this); + } + + getBuffer().append(" " + operator + " "); + + hasBinaryExpression = false; + try { + BinaryExpression rightBinaryExpression = (BinaryExpression) expr.getRightExpression(); + hasBinaryExpression = rightBinaryExpression.getRightExpression() instanceof BinaryExpression; + } catch (Exception e) { + } + + if (expr.getRightExpression() instanceof BinaryExpression && !hasBinaryExpression && hasVarible(expr.getRightExpression().toString())) { + getBuffer().append(SubstitutedSql); + } else if (expr.getRightExpression() instanceof InExpression && !hasBinaryExpression && hasVarible(expr.getRightExpression().toString())) { + getBuffer().append(SubstitutedSql); + } else { + expr.getRightExpression().accept(this); + } + } + }; + return expressionDeParser; + } } 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 79bc9c6476..dfcd9c61db 100644 --- a/backend/src/main/java/io/dataease/service/dataset/ExtractDataService.java +++ b/backend/src/main/java/io/dataease/service/dataset/ExtractDataService.java @@ -8,6 +8,7 @@ import io.dataease.commons.model.AuthURD; import io.dataease.commons.utils.*; import io.dataease.controller.request.datasource.ApiDefinition; import io.dataease.plugins.common.base.domain.*; +import io.dataease.plugins.common.constants.DatasetType; import io.dataease.plugins.common.constants.DatasourceTypes; import io.dataease.plugins.common.constants.DeTypeConstants; import io.dataease.plugins.common.dto.datasource.TableField; @@ -1012,13 +1013,13 @@ public class ExtractDataService { } private String getSelectSQL(String extractType, DatasetTable datasetTable, Datasource datasource, List datasetTableFields, String selectSQL) { - if (extractType.equalsIgnoreCase("all_scope") && datasetTable.getType().equalsIgnoreCase("db")) { + if (extractType.equalsIgnoreCase("all_scope") && datasetTable.getType().equalsIgnoreCase(DatasetType.DB.name())) { String tableName = new Gson().fromJson(datasetTable.getInfo(), DataTableInfoDTO.class).getTable(); QueryProvider qp = ProviderFactory.getQueryProvider(datasource.getType()); selectSQL = qp.createRawQuerySQL(tableName, datasetTableFields, datasource); } - if (extractType.equalsIgnoreCase("all_scope") && datasetTable.getType().equalsIgnoreCase("sql")) { + if (extractType.equalsIgnoreCase("all_scope") && datasetTable.getType().equalsIgnoreCase(DatasetType.SQL.name())) { selectSQL = new Gson().fromJson(datasetTable.getInfo(), DataTableInfoDTO.class).getSql(); QueryProvider qp = ProviderFactory.getQueryProvider(datasource.getType()); selectSQL = qp.createRawQuerySQLAsTmp(selectSQL, datasetTableFields); @@ -1032,7 +1033,7 @@ public class ExtractDataService { private StepMeta inputStep(TransMeta transMeta, String selectSQL) { TableInputMeta tableInput = new TableInputMeta(); - DatabaseMeta database = transMeta.findDatabase("db"); + DatabaseMeta database = transMeta.findDatabase(DatasetType.DB.name()); tableInput.setDatabaseMeta(database); tableInput.setSQL(selectSQL); StepMeta fromStep = new StepMeta("TableInput", "Data Input", tableInput); diff --git a/backend/src/main/java/io/dataease/service/dataset/impl/direct/DirectFieldService.java b/backend/src/main/java/io/dataease/service/dataset/impl/direct/DirectFieldService.java index f2157cd321..b3feb61c4b 100644 --- a/backend/src/main/java/io/dataease/service/dataset/impl/direct/DirectFieldService.java +++ b/backend/src/main/java/io/dataease/service/dataset/impl/direct/DirectFieldService.java @@ -11,6 +11,7 @@ import io.dataease.plugins.common.base.domain.DatasetTableField; import io.dataease.plugins.common.base.domain.Datasource; import io.dataease.commons.constants.ColumnPermissionConstants; import io.dataease.i18n.Translator; +import io.dataease.plugins.common.constants.DatasetType; import io.dataease.plugins.common.dto.chart.ChartFieldCustomFilterDTO; import io.dataease.plugins.common.dto.datasource.DeSortField; import io.dataease.plugins.common.request.datasource.DatasourceRequest; @@ -133,17 +134,21 @@ public class DirectFieldService implements DataSetFieldService { datasourceRequest.setDatasource(ds); DataTableInfoDTO dataTableInfoDTO = new Gson().fromJson(datasetTable.getInfo(), DataTableInfoDTO.class); QueryProvider qp = ProviderFactory.getQueryProvider(ds.getType()); - if (StringUtils.equalsIgnoreCase(datasetTable.getType(), "db")) { + if (StringUtils.equalsIgnoreCase(datasetTable.getType(), DatasetType.DB.toString())) { datasourceRequest.setTable(dataTableInfoDTO.getTable()); datasourceRequest.setQuery(qp.createQuerySQL(dataTableInfoDTO.getTable(), permissionFields, true, ds, customFilter, deSortFields)); - } else if (StringUtils.equalsIgnoreCase(datasetTable.getType(), "sql")) { - datasourceRequest.setQuery(qp.createQuerySQLAsTmp(dataTableInfoDTO.getSql(), permissionFields, true, customFilter, deSortFields)); - } else if (StringUtils.equalsIgnoreCase(datasetTable.getType(), "custom")) { + } else if (StringUtils.equalsIgnoreCase(datasetTable.getType(), DatasetType.SQL.toString())) { + String sql = dataTableInfoDTO.getSql(); + if (rowAndColumnMgm) { + sql = ""; + } + datasourceRequest.setQuery(qp.createQuerySQLAsTmp(sql, permissionFields, true, customFilter, deSortFields)); + } else if (StringUtils.equalsIgnoreCase(datasetTable.getType(), DatasetType.CUSTOM.toString())) { DataTableInfoDTO dt = new Gson().fromJson(datasetTable.getInfo(), DataTableInfoDTO.class); List listUnion = dataSetTableUnionService.listByTableId(dt.getList().get(0).getTableId()); String sql = dataSetTableService.getCustomSQLDatasource(dt, listUnion, ds); datasourceRequest.setQuery(qp.createQuerySQLAsTmp(sql, permissionFields, true, customFilter, deSortFields)); - } else if (StringUtils.equalsIgnoreCase(datasetTable.getType(), "union")) { + } else if (StringUtils.equalsIgnoreCase(datasetTable.getType(), DatasetType.UNION.toString())) { DataTableInfoDTO dt = new Gson().fromJson(datasetTable.getInfo(), DataTableInfoDTO.class); String sql = (String) dataSetTableService.getUnionSQLDatasource(dt, ds).get("sql"); datasourceRequest.setQuery(qp.createQuerySQLAsTmp(sql, permissionFields, true, customFilter, deSortFields)); @@ -159,7 +164,7 @@ public class DirectFieldService implements DataSetFieldService { QueryProvider qp = ProviderFactory.getQueryProvider(ds.getType()); datasourceRequest.setQuery(qp.createQuerySQL(tableName, permissionFields, true, null, customFilter)); } - + System.out.println(datasourceRequest.getQuery()); List rows = datasourceProvider.getData(datasourceRequest); if (!needMapping) { List results = rows.stream().map(row -> row[0]).distinct().collect(Collectors.toList()); diff --git a/backend/src/main/java/io/dataease/service/datasource/DatasourceService.java b/backend/src/main/java/io/dataease/service/datasource/DatasourceService.java index 7fc5e98756..cba528e0b0 100644 --- a/backend/src/main/java/io/dataease/service/datasource/DatasourceService.java +++ b/backend/src/main/java/io/dataease/service/datasource/DatasourceService.java @@ -30,6 +30,7 @@ import io.dataease.i18n.Translator; import io.dataease.plugins.common.base.domain.*; import io.dataease.plugins.common.base.mapper.DatasetTableMapper; import io.dataease.plugins.common.base.mapper.DatasourceMapper; +import io.dataease.plugins.common.constants.DatasetType; import io.dataease.plugins.common.constants.DatasourceCalculationMode; import io.dataease.plugins.common.constants.DatasourceTypes; import io.dataease.plugins.common.dto.datasource.DataSourceType; @@ -325,7 +326,7 @@ public class DatasourceService { Provider datasourceProvider = ProviderFactory.getProvider(ds.getType()); DatasourceRequest datasourceRequest = new DatasourceRequest(); datasourceRequest.setDatasource(ds); - if (!ds.getType().equalsIgnoreCase("api")) { + if (!ds.getType().equalsIgnoreCase(DatasetType.API.name())) { datasourceProvider.checkStatus(datasourceRequest); } @@ -333,8 +334,8 @@ public class DatasourceService { // 获取当前数据源下的db、api类型数据集 DatasetTableExample datasetTableExample = new DatasetTableExample(); - datasetTableExample.createCriteria().andTypeIn(Arrays.asList("db", "api")).andDataSourceIdEqualTo(ds.getId()); - List datasetTables = datasetTableMapper.selectByExampleWithBLOBs(datasetTableExample); + datasetTableExample.createCriteria().andTypeIn(Arrays.asList(DatasetType.DB.name(), DatasetType.API.name())).andDataSourceIdEqualTo(ds.getId()); + List datasetTables = datasetTableMapper.selectByExample(datasetTableExample); List list = new ArrayList<>(); for (TableDesc tableDesc : tables) { DBTableDTO dbTableDTO = new DBTableDTO(); diff --git a/backend/src/main/java/io/dataease/service/datasource/DriverService.java b/backend/src/main/java/io/dataease/service/datasource/DriverService.java index df44a4fef3..3d33550253 100644 --- a/backend/src/main/java/io/dataease/service/datasource/DriverService.java +++ b/backend/src/main/java/io/dataease/service/datasource/DriverService.java @@ -105,6 +105,9 @@ public class DriverService { public void deleteDriverFile(String driverFileId) throws Exception{ DeDriverDetails deDriverDetails = deDriverDetailsMapper.selectByPrimaryKey(driverFileId); DeDriver deDriver = deDriverMapper.selectByPrimaryKey(deDriverDetails.getDeDriverId()); + if(deDriver == null){ + throw new Exception("未找到驱动"); + } DeFileUtils.deleteFile(DRIVER_PATH + deDriverDetails.getDeDriverId() + "/" + deDriverDetails.getFileName()); SysLogDTO sysLogDTO = DeLogUtils.buildLog(SysLogConstants.OPERATE_TYPE.DELETE, SysLogConstants.SOURCE_TYPE.DRIVER_FILE, deDriverDetails.getId(), deDriverDetails.getDeDriverId(), null, null); DeLogUtils.save(sysLogDTO); @@ -114,6 +117,10 @@ public class DriverService { } public DeDriverDetails saveJar(MultipartFile file, String driverId) throws Exception { + DeDriver deDriver = deDriverMapper.selectByPrimaryKey(driverId); + if(deDriver == null){ + throw new Exception("未找到驱动"); + } String filename = file.getOriginalFilename(); String dirPath = DRIVER_PATH + driverId + "/"; String filePath = dirPath + filename; @@ -138,7 +145,6 @@ public class DriverService { deDriverDetailsMapper.insert(deDriverDetails); SysLogDTO sysLogDTO = DeLogUtils.buildLog(SysLogConstants.OPERATE_TYPE.UPLOADFILE, SysLogConstants.SOURCE_TYPE.DRIVER_FILE, deDriverDetails.getId(), driverId, null, null); DeLogUtils.save(sysLogDTO); - DeDriver deDriver = deDriverMapper.selectByPrimaryKey(driverId); DefaultJdbcProvider defaultJdbcProvider = (DefaultJdbcProvider)ProviderFactory.getProvider(deDriver.getType()); defaultJdbcProvider.reloadCustomJdbcClassLoader(deDriver); return deDriverDetails; diff --git a/backend/src/main/resources/db/migration/V36__1.12.sql b/backend/src/main/resources/db/migration/V36__1.12.sql index 908b821a69..c503924442 100644 --- a/backend/src/main/resources/db/migration/V36__1.12.sql +++ b/backend/src/main/resources/db/migration/V36__1.12.sql @@ -20,16 +20,6 @@ CREATE TABLE `chart_view_field` PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE utf8mb4_general_ci; -DROP TABLE IF EXISTS `sql_variable`; -CREATE TABLE `sql_variable` -( - `id` varchar(50) NOT NULL COMMENT 'ID', - `table_id` varchar(50) NOT NULL COMMENT '数据集ID', - `variable_name` varchar(255) NOT NULL COMMENT '名称', - `alias` varchar(255) NOT NULL COMMENT '别名', - `type` varchar(50) NOT NULL COMMENT '类型', - `details` longtext DEFAULT NULL COMMENT '明细', - `default_value` longtext DEFAULT NULL COMMENT '默认值', - `required` tinyint(1) NOT NULL DEFAULT '0' COMMENT '是否必填', - PRIMARY KEY (`id`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE utf8mb4_general_ci; \ No newline at end of file + +ALTER TABLE `dataset_table` + ADD COLUMN `sql_variable_details` LONGTEXT NULL AFTER `last_update_time`; diff --git a/frontend/src/api/panel/view.js b/frontend/src/api/panel/view.js index 1c3f9c12c6..e1c74e633c 100644 --- a/frontend/src/api/panel/view.js +++ b/frontend/src/api/panel/view.js @@ -17,6 +17,15 @@ export function viewsWithIds(data) { }) } +export function paramsWithIds(data) { + return request({ + url: '/dataset/table/paramsWithIds', + method: 'post', + loading: true, + data + }) +} + export function findOne(id) { return request({ url: '/api/panelView/findOne/' + id, diff --git a/frontend/src/components/widget/DeWidget/DeSelect.vue b/frontend/src/components/widget/DeWidget/DeSelect.vue index 6904f89bb4..04668dc91f 100644 --- a/frontend/src/components/widget/DeWidget/DeSelect.vue +++ b/frontend/src/components/widget/DeWidget/DeSelect.vue @@ -215,6 +215,7 @@ export default { }, setCondition() { + console.log(this.element) const param = { component: this.element, value: this.formatFilterValue(), diff --git a/frontend/src/components/widget/bean/Condition.js b/frontend/src/components/widget/bean/Condition.js index ad3c1dc985..bf5ca5f799 100644 --- a/frontend/src/components/widget/bean/Condition.js +++ b/frontend/src/components/widget/bean/Condition.js @@ -5,12 +5,13 @@ * viewIds 过滤视图范围 */ export class Condition { - constructor(componentId, fieldId, operator, value, viewIds, isTree) { + constructor(componentId, fieldId, operator, value, viewIds, parameters, isTree) { this.componentId = componentId this.fieldId = fieldId this.operator = operator || 'eq' this.value = value this.viewIds = viewIds + this.parameters = parameters this.isTree = isTree || false } } diff --git a/frontend/src/components/widget/serviceImpl/TextInputServiceImpl.js b/frontend/src/components/widget/serviceImpl/TextInputServiceImpl.js index 6d5ab5116d..87090ebd17 100644 --- a/frontend/src/components/widget/serviceImpl/TextInputServiceImpl.js +++ b/frontend/src/components/widget/serviceImpl/TextInputServiceImpl.js @@ -11,6 +11,7 @@ const dialogPanel = { attrs: { placeholder: 'deinputsearch.placeholder', viewIds: [], + parameters: [], fieldId: '', dragItems: [] diff --git a/frontend/src/components/widget/serviceImpl/TextSelectGridServiceImpl.js b/frontend/src/components/widget/serviceImpl/TextSelectGridServiceImpl.js index 19c32f870a..9c7644b1d5 100644 --- a/frontend/src/components/widget/serviceImpl/TextSelectGridServiceImpl.js +++ b/frontend/src/components/widget/serviceImpl/TextSelectGridServiceImpl.js @@ -13,6 +13,7 @@ const dialogPanel = { multiple: false, placeholder: 'detextgridselect.placeholder', viewIds: [], + parameters: [], datas: [], key: 'id', label: 'text', diff --git a/frontend/src/components/widget/serviceImpl/TextSelectServiceImpl.js b/frontend/src/components/widget/serviceImpl/TextSelectServiceImpl.js index 65f6c53ffb..056f56a5c9 100644 --- a/frontend/src/components/widget/serviceImpl/TextSelectServiceImpl.js +++ b/frontend/src/components/widget/serviceImpl/TextSelectServiceImpl.js @@ -12,6 +12,7 @@ const dialogPanel = { multiple: false, placeholder: 'detextselect.placeholder', viewIds: [], + parameters: [], datas: [], key: 'id', label: 'text', diff --git a/frontend/src/components/widget/serviceImpl/TextSelectTreeServiceImpl.js b/frontend/src/components/widget/serviceImpl/TextSelectTreeServiceImpl.js index 7dbe3d9f72..83903a2e61 100644 --- a/frontend/src/components/widget/serviceImpl/TextSelectTreeServiceImpl.js +++ b/frontend/src/components/widget/serviceImpl/TextSelectTreeServiceImpl.js @@ -12,6 +12,7 @@ const dialogPanel = { multiple: false, placeholder: 'detextselectTree.placeholder', viewIds: [], + parameters: [], datas: [], key: 'id', label: 'text', diff --git a/frontend/src/lang/zh.js b/frontend/src/lang/zh.js index 64c76e1e8c..dc6e8ce2a7 100644 --- a/frontend/src/lang/zh.js +++ b/frontend/src/lang/zh.js @@ -1577,6 +1577,7 @@ export default { data_list: '数据列表', component_list: '组件列表', custom_scope: '自定义控制范围', + binding_parameters: '绑定参数', multiple_choice: '多选', single_choice: '单选', field: '字段', diff --git a/frontend/src/store/index.js b/frontend/src/store/index.js index 535c057026..f048a30fa3 100644 --- a/frontend/src/store/index.js +++ b/frontend/src/store/index.js @@ -237,7 +237,11 @@ const data = { }) }, addViewFilter(state, data) { + console.log('data ') + console.log(data) const condition = formatCondition(data) + console.log('condition ') + console.log(condition) const vValid = valueValid(condition) // 1.根据componentId过滤 const filterComponentId = condition.componentId @@ -247,6 +251,8 @@ const data = { for (let index = 0; index < state.componentData.length; index++) { const element = state.componentData[index] + console.log('element: ') + console.log(element) if (element.type && element.type === 'de-tabs') { for (let idx = 0; idx < element.options.tabList.length; idx++) { const ele = element.options.tabList[idx].content @@ -271,6 +277,7 @@ const data = { if (!element.type || element.type !== 'view') continue const currentFilters = element.filters || [] const vidMatch = viewIdMatch(condition.viewIds, element.propValue.viewId) + console.log(vidMatch) let j = currentFilters.length while (j--) { diff --git a/frontend/src/utils/conditionUtil.js b/frontend/src/utils/conditionUtil.js index 27ba99e879..93b5a0ff01 100644 --- a/frontend/src/utils/conditionUtil.js +++ b/frontend/src/utils/conditionUtil.js @@ -30,6 +30,7 @@ export const formatCondition = obj => { let fieldId = component.options.attrs.fieldId const viewIds = component.options.attrs.viewIds + const parameters = component.options.attrs.parameters if (isTree && !component.options.attrs.multiple && value && value.length) { // 单选树 const val = value[0] @@ -40,7 +41,7 @@ export const formatCondition = obj => { } } } - const condition = new Condition(component.id, fieldId, operator, value, viewIds, isTree) + const condition = new Condition(component.id, fieldId, operator, value, viewIds, parameters, isTree) return condition } diff --git a/frontend/src/views/dataset/add/AddExcel.vue b/frontend/src/views/dataset/add/AddExcel.vue index 0b013ae397..1680ecf276 100644 --- a/frontend/src/views/dataset/add/AddExcel.vue +++ b/frontend/src/views/dataset/add/AddExcel.vue @@ -134,9 +134,6 @@ {{ field.remarks }} - - - diff --git a/frontend/src/views/dataset/add/AddSQL.vue b/frontend/src/views/dataset/add/AddSQL.vue index 80c161e7a6..a2223937f5 100644 --- a/frontend/src/views/dataset/add/AddSQL.vue +++ b/frontend/src/views/dataset/add/AddSQL.vue @@ -16,37 +16,43 @@ - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + - - - - - - - - {{ $t('sql_variable.variable_mgm') }} + + + + + + + + + + + {{ $t('sql_variable.variable_mgm') }} + + @@ -96,17 +102,39 @@ - - - - - - - - - - - + + + + + + + + + + + + @@ -179,7 +207,13 @@ export default { showVariableMgm: false, dialogTitle: '', variables: [], - variablesTmp: [] + variablesTmp: [], + fieldOptions: [ + { label: this.$t('dataset.text'), value: 'TEXT' }, + { label: this.$t('dataset.time'), value: 'DATETIME' }, + { label: this.$t('dataset.value'), value: 'LONG' }, + { label: this.$t('dataset.value') + '(' + this.$t('dataset.float') + ')', value: 'DOUBLE' } + ], } }, computed: { @@ -224,7 +258,7 @@ export default { if (this.options[i].id === this.dataSource) { this.selectedDatasource = this.options[i] this.mode = '0' - if (this.engineMode === 'simple' || (!this.kettleRunning || this.selectedDatasource.calculationMode === 'DIRECT' )) { + if (this.engineMode === 'simple' || (!this.kettleRunning || this.selectedDatasource.calculationMode === 'DIRECT')) { this.disabledSync = true } else { this.disabledSync = false @@ -253,6 +287,7 @@ export default { this.dataSource = table.dataSourceId this.mode = table.mode + '' this.sql = JSON.parse(table.info.replace(/\n/g, '\\n').replace(/\r/g, '\\r')).sql + this.variables= JSON.parse(table.sqlVariableDetails) this.getSQLPreview() }) @@ -271,7 +306,7 @@ export default { post('/dataset/table/sqlPreview', { dataSourceId: this.dataSource, type: 'sql', - // info: '{"sql":"' + this.sql + '"}', + sqlVariableDetails: JSON.stringify(this.variables), info: JSON.stringify({sql: this.sql.trim()}) }).then(response => { this.fields = response.data.fields @@ -314,7 +349,7 @@ export default { type: 'sql', syncType: this.syncType, mode: parseInt(this.mode), - // info: '{"sql":"' + this.sql + '"}', + sqlVariableDetails: JSON.stringify(this.variables), info: JSON.stringify({sql: this.sql.trim()}) } post('/dataset/table/update', table).then(response => { @@ -357,15 +392,39 @@ export default { }, variableMgm() { - var reg = new RegExp("${(.*?)}", "gim"); + this.variablesTmp = [] + var reg = new RegExp("\\${(.*?)}", "gim"); var match = this.sql.match(reg); - console.log(match) + const names = [] + if (match !== null) { + for (let index = 0; index < match.length; index++) { + var name = match[index].substring(2, match[index].length - 1) + if(names.indexOf(name) < 0){ + names.push(name) + var obj = undefined + for (let i = 0; i < this.variables.length; i ++) { + if(this.variables[i].variableName === name){ + obj = this.variables[i] + } + } + if(obj === undefined){ + obj = {variableName: name, alias: '', type: 'TEXT', required: false, defaultValue: '', details: ''} + } + this.variablesTmp.push(obj) + } + } + } + this.variables = JSON.parse(JSON.stringify(this.variablesTmp)).concat() this.dialogTitle = this.$t('sql_variable.variable_mgm') this.showVariableMgm = true }, closeVariableMgm() { this.showVariableMgm = false }, + saveVariable(){ + this.variables = JSON.parse(JSON.stringify(this.variablesTmp)).concat() + this.showVariableMgm = false + } } } diff --git a/frontend/src/views/panel/filter/filterDialog.vue b/frontend/src/views/panel/filter/filterDialog.vue index 8dd498f2b8..d2d2bb76c5 100644 --- a/frontend/src/views/panel/filter/filterDialog.vue +++ b/frontend/src/views/panel/filter/filterDialog.vue @@ -210,6 +210,7 @@ import { fieldListWithPermission } from '@/api/dataset/dataset' import { + paramsWithIds, viewsWithIds } from '@/api/panel/view' import { @@ -472,6 +473,15 @@ export default { this.viewInfos = datas this.childViews.viewInfos = datas }) + viewIds && viewIds.length > 0 && paramsWithIds(viewIds).then(res => { + const datas = res.data + /* datas.forEach(item => { + if (tabViewIds.includes(item.id)) { + item.name = 'tabs(' + item.name + ')' + } + }) */ + this.childViews.datasetParams = datas + }) }, handleNodeClick(data) { if (data.type !== 'group') { diff --git a/frontend/src/views/panel/filter/filterMain/FilterControl.vue b/frontend/src/views/panel/filter/filterMain/FilterControl.vue index 3649a871ff..0faf983735 100644 --- a/frontend/src/views/panel/filter/filterMain/FilterControl.vue +++ b/frontend/src/views/panel/filter/filterMain/FilterControl.vue @@ -60,6 +60,38 @@ /> + + + {{ $t('panel.binding_parameters') }} + + +
+ + +
+ + {{ item.variableName }} + + {{ item.variableName }} + +
+ +
+
+
+ + +
+
@@ -94,13 +126,16 @@ export default { return { attrs: null, titlePopovervisible: false, - popovervisible: false + popovervisible: false, + parametersVisible: false } }, created() { this.attrs = this.controlAttrs + console.log(this.childViews) + console.log(this.attrs) }, methods: { multipleChange(value) { @@ -115,6 +150,12 @@ export default { } this.fillAttrs2Filter() }, + enableParametersChange(value) { + if (!value) { + this.attrs.parameters = [] + } + this.fillAttrs2Filter() + }, showTitleChange(value) { if (!value) { this.attrs.title = '' From 3293f3a8703af04506b97adcfe7c8c10e1a05783 Mon Sep 17 00:00:00 2001 From: taojinlong Date: Thu, 16 Jun 2022 22:41:09 +0800 Subject: [PATCH 4/4] =?UTF-8?q?feat:=20=E5=8F=82=E6=95=B0=E7=AE=A1?= =?UTF-8?q?=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../service/chart/ChartViewService.java | 36 ++++---- .../service/dataset/DataSetTableService.java | 84 +++++++++++-------- .../impl/direct/DirectFieldService.java | 2 +- .../panel/filter/filterMain/FilterControl.vue | 2 +- .../src/views/system/datasource/ApiBody.vue | 1 - .../views/system/datasource/ApiKeyValue.vue | 1 - .../views/system/datasource/ApiVariable.vue | 1 - 7 files changed, 67 insertions(+), 60 deletions(-) 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 22b0627d34..c7c54149b3 100644 --- a/backend/src/main/java/io/dataease/service/chart/ChartViewService.java +++ b/backend/src/main/java/io/dataease/service/chart/ChartViewService.java @@ -451,9 +451,7 @@ public class ChartViewService { } } else if (StringUtils.equalsIgnoreCase(table.getType(), DatasetType.SQL.name())) { String sql = dataTableInfoDTO.getSql(); - if (CollectionUtils.isNotEmpty(requestList.getFilter())) { - sql = handleVariable(sql, requestList); - } + sql = handleVariable(sql, requestList); if (StringUtils.equalsIgnoreCase("text", view.getType()) || StringUtils.equalsIgnoreCase("gauge", view.getType()) || StringUtils.equalsIgnoreCase("liquid", view.getType())) { datasourceRequest.setQuery(qp.getSQLSummaryAsTmp(sql, yAxis, fieldCustomFilter, extFilterList, view)); } else if (StringUtils.containsIgnoreCase(view.getType(), "stack")) { @@ -824,10 +822,7 @@ public class ChartViewService { } } else if (StringUtils.equalsIgnoreCase(table.getType(), DatasetType.SQL.name())) { String sql = dataTableInfoDTO.getSql(); - if (CollectionUtils.isNotEmpty(requestList.getFilter())) { - sql = handleVariable(sql, requestList); - } - + sql = handleVariable(sql, requestList); if (StringUtils.equalsIgnoreCase("text", view.getType()) || StringUtils.equalsIgnoreCase("gauge", view.getType()) || StringUtils.equalsIgnoreCase("liquid", view.getType())) { datasourceRequest.setQuery(qp.getSQLSummaryAsTmp(sql, yAxis, fieldCustomFilter, extFilterList, view)); } else if (StringUtils.containsIgnoreCase(view.getType(), "stack")) { @@ -839,7 +834,6 @@ public class ChartViewService { } else { datasourceRequest.setQuery(qp.getSQLAsTmp(sql, xAxis, yAxis, fieldCustomFilter, extFilterList, view)); } - System.out.println(datasourceRequest.getQuery()); } else if (StringUtils.equalsIgnoreCase(table.getType(), DatasetType.CUSTOM.name())) { DataTableInfoDTO dt = gson.fromJson(table.getInfo(), DataTableInfoDTO.class); List list = dataSetTableUnionService.listByTableId(dt.getList().get(0).getTableId()); @@ -1498,22 +1492,24 @@ public class ChartViewService { chartViewMapper.updateByPrimaryKeySelective(chartView); } - private String handleVariable(String sql, ChartExtRequest requestList){ - for (ChartExtFilterRequest chartExtFilterRequest : requestList.getFilter()) { - chartExtFilterRequest.getParameters(); - if(CollectionUtils.isEmpty(chartExtFilterRequest.getValue())){ - continue; - } - if(chartExtFilterRequest.getValue().size() > 1){ - for (String parameter : chartExtFilterRequest.getParameters()) { - sql = sql.replace("${" + parameter + "}", String.join(",", chartExtFilterRequest.getValue())); + private String handleVariable(String sql, ChartExtRequest requestList)throws Exception{ + if(requestList !=null &&CollectionUtils.isNotEmpty(requestList.getFilter()) ){ + for (ChartExtFilterRequest chartExtFilterRequest : requestList.getFilter()) { + if(CollectionUtils.isEmpty(chartExtFilterRequest.getValue())){ + continue; } - }else { - for (String parameter : chartExtFilterRequest.getParameters()) { - sql = sql.replace("${" + parameter + "}", chartExtFilterRequest.getValue().get(0)); + if(chartExtFilterRequest.getValue().size() > 1){ + for (String parameter : chartExtFilterRequest.getParameters()) { + sql = sql.replace("${" + parameter + "}", String.join(",", chartExtFilterRequest.getValue())); + } + }else { + for (String parameter : chartExtFilterRequest.getParameters()) { + sql = sql.replace("${" + parameter + "}", chartExtFilterRequest.getValue().get(0)); + } } } } + sql = dataSetTableService.removeVariables(sql); return sql; } } 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 f12e35e3f3..b641f0cd8a 100644 --- a/backend/src/main/java/io/dataease/service/dataset/DataSetTableService.java +++ b/backend/src/main/java/io/dataease/service/dataset/DataSetTableService.java @@ -7,6 +7,7 @@ import com.google.gson.JsonParser; import com.google.gson.reflect.TypeToken; import io.dataease.auth.annotation.DeCleaner; import io.dataease.auth.api.dto.CurrentUserDto; +import io.dataease.controller.request.chart.ChartExtRequest; import io.dataease.dto.SysLogDTO; import io.dataease.ext.ExtDataSetGroupMapper; import io.dataease.ext.ExtDataSetTableMapper; @@ -31,6 +32,7 @@ import io.dataease.plugins.common.constants.DatasetType; import io.dataease.plugins.common.constants.DatasourceTypes; import io.dataease.plugins.common.dto.chart.ChartFieldCustomFilterDTO; import io.dataease.plugins.common.dto.datasource.TableField; +import io.dataease.plugins.common.request.chart.ChartExtFilterRequest; import io.dataease.plugins.common.request.datasource.DatasourceRequest; import io.dataease.plugins.datasource.provider.Provider; import io.dataease.plugins.datasource.query.QueryProvider; @@ -47,6 +49,7 @@ import net.sf.jsqlparser.expression.operators.conditional.AndExpression; import net.sf.jsqlparser.expression.operators.conditional.OrExpression; import net.sf.jsqlparser.expression.operators.relational.ExpressionList; import net.sf.jsqlparser.expression.operators.relational.InExpression; +import net.sf.jsqlparser.expression.operators.relational.LikeExpression; import net.sf.jsqlparser.parser.CCJSqlParserUtil; import net.sf.jsqlparser.statement.Statement; import net.sf.jsqlparser.statement.select.PlainSelect; @@ -922,65 +925,61 @@ public class DataSetTableService { List sqlVariableDetails = new ArrayList<>(); datasetTables.forEach(datasetTable -> { if (StringUtils.isNotEmpty(datasetTable.getSqlVariableDetails())) { - sqlVariableDetails.addAll(new Gson().fromJson(datasetTable.getSqlVariableDetails(), new TypeToken>() { - }.getType())); + sqlVariableDetails.addAll(new Gson().fromJson(datasetTable.getSqlVariableDetails(), new TypeToken>() {}.getType())); } }); return sqlVariableDetails; } - - public String handleVariableDefaultValue(String sql, String sqlVariableDetails) { + public String handleVariableDefaultValue(String sql, String sqlVariableDetails){ if (StringUtils.isEmpty(sql)) { DataEaseException.throwException(Translator.get("i18n_sql_not_empty")); } Pattern pattern = Pattern.compile(regex); Matcher matcher = pattern.matcher(sql); while (matcher.find()) { - boolean customValue = false; -// if (CollectionUtils.isNotEmpty(customSqlVariableDetails)) { -// for (SqlVariableDetails customSqlVariableDetail : customSqlVariableDetails) { -// if (matcher.group().substring(2, matcher.group().length() - 1).equalsIgnoreCase(customSqlVariableDetail.getVariableName())) { -// sql = sql.replace(matcher.group(), customSqlVariableDetail.getDefaultValue()); -// customValue = true; -// break; -// } -// } -// } - if (!customValue) { - SqlVariableDetails defaultsSqlVariableDetail = null; - List defaultsSqlVariableDetails = new Gson().fromJson(sqlVariableDetails, new TypeToken>() { - }.getType()); - for (SqlVariableDetails sqlVariableDetail : defaultsSqlVariableDetails) { - if (matcher.group().substring(2, matcher.group().length() - 1).equalsIgnoreCase(sqlVariableDetail.getVariableName())) { - defaultsSqlVariableDetail = sqlVariableDetail; - break; - } - } - if (defaultsSqlVariableDetail == null || StringUtils.isEmpty(defaultsSqlVariableDetail.getDefaultValue())) { - throw new RuntimeException(matcher.group().substring(2, matcher.group().length() - 1) + "没有默认值!"); + SqlVariableDetails defaultsSqlVariableDetail = null; + List defaultsSqlVariableDetails = new Gson().fromJson(sqlVariableDetails, new TypeToken>() {}.getType()); + for (SqlVariableDetails sqlVariableDetail : defaultsSqlVariableDetails) { + if (matcher.group().substring(2, matcher.group().length() - 1).equalsIgnoreCase(sqlVariableDetail.getVariableName())) { + defaultsSqlVariableDetail = sqlVariableDetail; + break; } + } + if (defaultsSqlVariableDetail != null && StringUtils.isNotEmpty(defaultsSqlVariableDetail.getDefaultValue())) { sql = sql.replace(matcher.group(), defaultsSqlVariableDetail.getDefaultValue()); } } + try { + sql = removeVariables(sql); + }catch (Exception e){ + e.printStackTrace(); + } return sql; } - private String removeVariables(String sql) throws Exception { + public String removeVariables(String sql) throws Exception { Pattern pattern = Pattern.compile(regex); Matcher matcher = pattern.matcher(sql); while (matcher.find()) { sql = sql.replace(matcher.group(), SubstitutedParams); } - CCJSqlParserUtil.parse(sql, parser -> parser.withSquareBracketQuotation(true)); Statement statement = CCJSqlParserUtil.parse(sql); Select select = (Select) statement; - Expression expr = ((PlainSelect) select.getSelectBody()).getWhere(); + PlainSelect plainSelect = ((PlainSelect) select.getSelectBody()); + Expression expr = plainSelect.getWhere(); StringBuilder stringBuilder = new StringBuilder(); - expr.accept(getExpressionDeParser(stringBuilder)); - return stringBuilder.toString(); + BinaryExpression binaryExpression = (BinaryExpression)expr; + + if(!(binaryExpression.getLeftExpression() instanceof BinaryExpression) && !(binaryExpression.getRightExpression() instanceof BinaryExpression) && hasVarible(binaryExpression.toString())){ + stringBuilder.append(SubstitutedSql); + }else { + expr.accept(getExpressionDeParser(stringBuilder)); + } + plainSelect.setWhere(CCJSqlParserUtil.parseCondExpression(stringBuilder.toString())); + return plainSelect.toString(); } public Map getSQLPreview(DataSetTableRequest dataSetTableRequest) throws Exception { @@ -2510,6 +2509,21 @@ public class DataSetTableService { } } + @Override + public void visit(LikeExpression likeExpression) { + if (hasVarible(likeExpression.toString())) { + getBuffer().append(SubstitutedSql); + return; + } + + visitBinaryExpression(likeExpression, (likeExpression.isNot() ? " NOT" : "") + (likeExpression.isCaseInsensitive() ? " ILIKE " : " LIKE ")); + Expression escape = likeExpression.getEscape(); + if (escape != null) { + getBuffer().append(" ESCAPE "); + likeExpression.getEscape().accept(this); + } + } + @Override public void visit(InExpression inExpression) { inExpression.getLeftExpression().accept(this); @@ -2536,7 +2550,7 @@ public class DataSetTableService { StringBuilder stringBuilder = new StringBuilder(); Expression in = ((PlainSelect) subSelect.getSelectBody()).getWhere(); if (in instanceof BinaryExpression && hasVarible(in.toString())) { - stringBuilder.append(SubstitutedSql); + stringBuilder.append(SubstitutedParams); } else { in.accept(getExpressionDeParser(stringBuilder)); } @@ -2550,9 +2564,6 @@ public class DataSetTableService { } } - private boolean hasVarible(String sql) { - return sql.contains(SubstitutedParams); - } private void visitBinaryExpr(BinaryExpression expr, String operator) { boolean hasBinaryExpression = false; @@ -2588,4 +2599,7 @@ public class DataSetTableService { }; return expressionDeParser; } + static private boolean hasVarible(String sql) { + return sql.contains(SubstitutedParams); + } } diff --git a/backend/src/main/java/io/dataease/service/dataset/impl/direct/DirectFieldService.java b/backend/src/main/java/io/dataease/service/dataset/impl/direct/DirectFieldService.java index b3feb61c4b..f47cc35fff 100644 --- a/backend/src/main/java/io/dataease/service/dataset/impl/direct/DirectFieldService.java +++ b/backend/src/main/java/io/dataease/service/dataset/impl/direct/DirectFieldService.java @@ -140,7 +140,7 @@ public class DirectFieldService implements DataSetFieldService { } else if (StringUtils.equalsIgnoreCase(datasetTable.getType(), DatasetType.SQL.toString())) { String sql = dataTableInfoDTO.getSql(); if (rowAndColumnMgm) { - sql = ""; + sql = dataSetTableService.removeVariables(sql); } datasourceRequest.setQuery(qp.createQuerySQLAsTmp(sql, permissionFields, true, customFilter, deSortFields)); } else if (StringUtils.equalsIgnoreCase(datasetTable.getType(), DatasetType.CUSTOM.toString())) { diff --git a/frontend/src/views/panel/filter/filterMain/FilterControl.vue b/frontend/src/views/panel/filter/filterMain/FilterControl.vue index 0faf983735..1cdd27034d 100644 --- a/frontend/src/views/panel/filter/filterMain/FilterControl.vue +++ b/frontend/src/views/panel/filter/filterMain/FilterControl.vue @@ -60,7 +60,7 @@ /> - + {{ $t('panel.binding_parameters') }} diff --git a/frontend/src/views/system/datasource/ApiBody.vue b/frontend/src/views/system/datasource/ApiBody.vue index 424f2ead17..8cfce4db2f 100644 --- a/frontend/src/views/system/datasource/ApiBody.vue +++ b/frontend/src/views/system/datasource/ApiBody.vue @@ -207,7 +207,6 @@ export default { case "WWW_FORM": this.setContentType("application/x-www-form-urlencoded"); break; - // todo from data case "BINARY": this.setContentType("application/octet-stream"); break; diff --git a/frontend/src/views/system/datasource/ApiKeyValue.vue b/frontend/src/views/system/datasource/ApiKeyValue.vue index 9758f5e073..a3251b2258 100644 --- a/frontend/src/views/system/datasource/ApiKeyValue.vue +++ b/frontend/src/views/system/datasource/ApiKeyValue.vue @@ -157,7 +157,6 @@ this.items.push(new KeyValue({enable: true})); } this.$emit('change', this.items); - // TODO 检查key重复 }, isDisable: function (index) { return this.items.length - 1 === index; diff --git a/frontend/src/views/system/datasource/ApiVariable.vue b/frontend/src/views/system/datasource/ApiVariable.vue index 78fbb98736..1016add2c2 100644 --- a/frontend/src/views/system/datasource/ApiVariable.vue +++ b/frontend/src/views/system/datasource/ApiVariable.vue @@ -164,7 +164,6 @@ export default { })); } this.$emit('change', this.parameters); - // TODO 检查key重复 }, isDisable: function (index) { return this.parameters.length - 1 == index;