diff --git a/backend/pom.xml b/backend/pom.xml index 360ed3f072..4e31117b34 100644 --- a/backend/pom.xml +++ b/backend/pom.xml @@ -329,7 +329,11 @@ 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 7b68637c97..d10bff43ad 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,7 @@ 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.DatasetTable; import io.dataease.plugins.common.base.domain.DatasetTableField; import io.dataease.plugins.common.base.domain.DatasetTableIncrementalConfig; @@ -208,4 +209,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 838a941f99..92b708bb21 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 @@ -6,8 +6,8 @@ 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.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; @@ -32,7 +32,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 d9ceba830f..0203fc1287 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 @@ -6,8 +6,8 @@ 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.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; @@ -32,7 +32,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 3fd563b41e..7334ada1dd 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,9 +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.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; @@ -32,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 191e769537..72731de4c0 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,9 +7,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.Db2Constants; +import io.dataease.dto.datasource.Db2Configuration; +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; @@ -34,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("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 2176a0adb5..fb1f0b6861 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,8 +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.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; @@ -32,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 1ac76b661d..ae777a63c2 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,8 +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.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; @@ -32,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 b5d44f2b23..a9b62b5da6 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,8 +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.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; @@ -32,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 44cf88f25d..9e5c27b512 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 @@ -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.MySQLConstants; -import io.dataease.plugins.common.constants.SQLConstants; +import io.dataease.plugins.common.constants.datasource.MySQLConstants; import io.dataease.plugins.common.constants.engine.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/oracle/OracleQueryProvider.java b/backend/src/main/java/io/dataease/provider/query/oracle/OracleQueryProvider.java index cd9736d4aa..e5b61e1870 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 @@ -8,8 +8,8 @@ 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.OracleConstants; -import io.dataease.plugins.common.constants.SQLConstants; +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 705c1f210c..3ea31b9c78 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,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.PgConstants; -import io.dataease.plugins.common.constants.SQLConstants; -import io.dataease.plugins.common.constants.SqlServerSQLConstants; +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; @@ -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("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 551620b866..2a01a709f8 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 fbd564d8d6..43c076e669 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,8 +7,8 @@ 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.SQLConstants; -import io.dataease.plugins.common.constants.SqlServerSQLConstants; +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; @@ -34,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("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 7eb54431d5..6ecf0b84a0 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,21 @@ public class ChartViewService { } else { datasourceRequest.setQuery(qp.getSQL(dataTableInfoDTO.getTable(), xAxis, yAxis, fieldCustomFilter, extFilterList, ds, view)); } - } else if (StringUtils.equalsIgnoreCase(table.getType(), "sql")) { + } else if (StringUtils.equalsIgnoreCase(table.getType(), DatasetType.SQL.name())) { + String sql = dataTableInfoDTO.getSql(); + sql = handleVariable(sql, requestList); 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)); + datasourceRequest.setQuery(qp.getSQLSummaryAsTmp(sql, yAxis, fieldCustomFilter, extFilterList, view)); } else if (StringUtils.containsIgnoreCase(view.getType(), "stack")) { - datasourceRequest.setQuery(qp.getSQLAsTmpStack(dataTableInfoDTO.getSql(), xAxis, yAxis, fieldCustomFilter, extFilterList, extStack, view)); + datasourceRequest.setQuery(qp.getSQLAsTmpStack(sql, 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)); + datasourceRequest.setQuery(qp.getSQLAsTmpScatter(sql, 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)); + datasourceRequest.setQuery(qp.getSQLAsTmpTableInfo(sql, xAxis, fieldCustomFilter, extFilterList, ds, view)); } else { - datasourceRequest.setQuery(qp.getSQLAsTmp(dataTableInfoDTO.getSql(), xAxis, yAxis, fieldCustomFilter, extFilterList, view)); + datasourceRequest.setQuery(qp.getSQLAsTmp(sql, xAxis, yAxis, fieldCustomFilter, extFilterList, view)); } - } else if (StringUtils.equalsIgnoreCase(table.getType(), "custom")) { + } 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 +478,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 +497,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 +807,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 +820,21 @@ public class ChartViewService { } else { datasourceRequest.setQuery(qp.getSQL(dataTableInfoDTO.getTable(), xAxis, yAxis, fieldCustomFilter, extFilterList, ds, view)); } - } else if (StringUtils.equalsIgnoreCase(table.getType(), "sql")) { + } else if (StringUtils.equalsIgnoreCase(table.getType(), DatasetType.SQL.name())) { + String sql = dataTableInfoDTO.getSql(); + sql = handleVariable(sql, requestList); 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)); + datasourceRequest.setQuery(qp.getSQLSummaryAsTmp(sql, yAxis, fieldCustomFilter, extFilterList, view)); } else if (StringUtils.containsIgnoreCase(view.getType(), "stack")) { - datasourceRequest.setQuery(qp.getSQLAsTmpStack(dataTableInfoDTO.getSql(), xAxis, yAxis, fieldCustomFilter, extFilterList, extStack, view)); + datasourceRequest.setQuery(qp.getSQLAsTmpStack(sql, 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)); + datasourceRequest.setQuery(qp.getSQLAsTmpScatter(sql, 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)); + datasourceRequest.setQuery(qp.getSQLAsTmpTableInfo(sql, xAxis, fieldCustomFilter, extFilterList, ds, view)); } else { - datasourceRequest.setQuery(qp.getSQLAsTmp(dataTableInfoDTO.getSql(), xAxis, yAxis, fieldCustomFilter, extFilterList, view)); + datasourceRequest.setQuery(qp.getSQLAsTmp(sql, xAxis, yAxis, fieldCustomFilter, extFilterList, view)); } - } else if (StringUtils.equalsIgnoreCase(table.getType(), "custom")) { + } 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 +849,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 +1492,24 @@ public class ChartViewService { chartViewMapper.updateByPrimaryKeySelective(chartView); } + 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; + } + 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/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 ba16cff9e9..fdac8d0c1d 100644 --- a/backend/src/main/java/io/dataease/service/dataset/DataSetTableService.java +++ b/backend/src/main/java/io/dataease/service/dataset/DataSetTableService.java @@ -4,8 +4,10 @@ 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.controller.request.chart.ChartExtRequest; import io.dataease.dto.SysLogDTO; import io.dataease.ext.ExtDataSetGroupMapper; import io.dataease.ext.ExtDataSetTableMapper; @@ -26,9 +28,11 @@ 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; +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; @@ -38,6 +42,20 @@ 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.expression.operators.relational.LikeExpression; +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 +80,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 +131,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 +292,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 +319,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 +363,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 +386,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 +566,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 +641,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 +654,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 +906,82 @@ 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()) { + 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; + } + + 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; + PlainSelect plainSelect = ((PlainSelect) select.getSelectBody()); + Expression expr = plainSelect.getWhere(); + StringBuilder stringBuilder = new StringBuilder(); + 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 { Datasource ds = datasourceMapper.selectByPrimaryKey(dataSetTableRequest.getDataSourceId()); if (ds == null) { @@ -890,8 +990,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 +1632,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 +1640,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(), @@ -2383,4 +2482,125 @@ 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(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); + 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(SubstitutedParams); + } 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 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; + } + static private boolean hasVarible(String sql) { + return sql.contains(SubstitutedParams); + } } 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 11d6e1a4d7..4889f9e7ee 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, false, ds, customFilter, deSortFields)); - } else if (StringUtils.equalsIgnoreCase(datasetTable.getType(), "sql")) { - datasourceRequest.setQuery(qp.createQuerySQLAsTmp(dataTableInfoDTO.getSql(), permissionFields, false, 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 = dataSetTableService.removeVariables(sql); + } + datasourceRequest.setQuery(qp.createQuerySQLAsTmp(sql, permissionFields, false, 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, false, 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, false, customFilter, deSortFields)); @@ -159,7 +164,7 @@ public class DirectFieldService implements DataSetFieldService { QueryProvider qp = ProviderFactory.getQueryProvider(ds.getType()); datasourceRequest.setQuery(qp.createQuerySQL(tableName, permissionFields, false, 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 eef7f8df4d..69be3ad455 100644 --- a/backend/src/main/java/io/dataease/service/datasource/DriverService.java +++ b/backend/src/main/java/io/dataease/service/datasource/DriverService.java @@ -128,13 +128,6 @@ public class DriverService { saveFile(file, dirPath, filePath); List jdbcList = new ArrayList<>(); String version = ""; -// ExtendedJdbcClassLoader extendedJdbcClassLoader = new ExtendedJdbcClassLoader(new URL[]{new File(filePath).toURI().toURL()}, null); -// for (String className : getClassNameFrom(filePath)) { -// if (isChildClass(className, java.sql.Driver.class, extendedJdbcClassLoader)) { -// jdbcList.add(className); -// version = classVersion(extendedJdbcClassLoader, className); -// } -// } DeDriverDetails deDriverDetails = new DeDriverDetails(); deDriverDetails.setId(UUID.randomUUID().toString()); diff --git a/backend/src/main/resources/db/migration/V37__1.12.sql b/backend/src/main/resources/db/migration/V37__1.12.sql index 5ded5a0267..2cbce2ed72 100644 --- a/backend/src/main/resources/db/migration/V37__1.12.sql +++ b/backend/src/main/resources/db/migration/V37__1.12.sql @@ -19,3 +19,6 @@ 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; + + +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 a96eeb4da2..43389d11ad 100644 --- a/frontend/src/lang/zh.js +++ b/frontend/src/lang/zh.js @@ -1591,6 +1591,7 @@ export default { data_list: '数据列表', component_list: '组件列表', custom_scope: '自定义控制范围', + binding_parameters: '绑定参数', multiple_choice: '多选', single_choice: '单选', field: '字段', @@ -2094,5 +2095,8 @@ export default { }, plugin_style: { border: '边框' + }, + sql_variable: { + variable_mgm: '参数设置' } } diff --git a/frontend/src/store/index.js b/frontend/src/store/index.js index 29f0ac10fb..af8c7ca9aa 100644 --- a/frontend/src/store/index.js +++ b/frontend/src/store/index.js @@ -238,7 +238,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 @@ -248,6 +252,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 @@ -272,6 +278,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 b52b880061..a2223937f5 100644 --- a/frontend/src/views/dataset/add/AddSQL.vue +++ b/frontend/src/views/dataset/add/AddSQL.vue @@ -16,36 +16,43 @@ - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + - - - - - - - + + + + + + + + + + + {{ $t('sql_variable.variable_mgm') }} + + @@ -94,6 +101,42 @@ + + + + + + + + + + + + + + + {{ item.label }} + + + + + + + + + + + + + @@ -161,6 +204,16 @@ export default { selectedDatasource: {}, engineMode: 'local', disabledSync: true, + showVariableMgm: false, + dialogTitle: '', + variables: [], + 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: { @@ -205,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 @@ -234,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() }) @@ -252,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 @@ -295,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 => { @@ -335,6 +389,41 @@ export default { this.fields = [] this.mode = '0' this.syncType = 'sync_now' + }, + + variableMgm() { + this.variablesTmp = [] + var reg = new RegExp("\\${(.*?)}", "gim"); + var match = this.sql.match(reg); + 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..1cdd27034d 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 = '' 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;