|
@@ -31,8 +31,6 @@ import org.springblade.cube.utils.CubeUtils;
|
|
import org.springblade.datasource.context.DialectContext;
|
|
import org.springblade.datasource.context.DialectContext;
|
|
import org.springblade.datasource.enums.DateFormatEnum;
|
|
import org.springblade.datasource.enums.DateFormatEnum;
|
|
import org.springblade.datasource.enums.DsTypeEnum;
|
|
import org.springblade.datasource.enums.DsTypeEnum;
|
|
-import org.springblade.datasource.enums.FunctionMethodEnum;
|
|
|
|
-import org.springblade.datasource.enums.NumberFormatEnum;
|
|
|
|
import org.springblade.datasource.enums.ViewColumnTypeEnum;
|
|
import org.springblade.datasource.enums.ViewColumnTypeEnum;
|
|
import org.springblade.report.entity.ReportDatasource;
|
|
import org.springblade.report.entity.ReportDatasource;
|
|
import org.springblade.report.service.IReportDatasourceService;
|
|
import org.springblade.report.service.IReportDatasourceService;
|
|
@@ -61,8 +59,6 @@ import org.springframework.beans.factory.annotation.Autowired;
|
|
import org.springframework.stereotype.Service;
|
|
import org.springframework.stereotype.Service;
|
|
|
|
|
|
import com.alibaba.fastjson2.JSON;
|
|
import com.alibaba.fastjson2.JSON;
|
|
-import com.baomidou.mybatisplus.core.toolkit.StringUtils;
|
|
|
|
-import com.baomidou.mybatisplus.core.toolkit.Wrappers;
|
|
|
|
|
|
|
|
import cn.hutool.core.collection.CollectionUtil;
|
|
import cn.hutool.core.collection.CollectionUtil;
|
|
import cn.hutool.core.collection.ListUtil;
|
|
import cn.hutool.core.collection.ListUtil;
|
|
@@ -437,7 +433,7 @@ public class QuerySqlService {
|
|
}
|
|
}
|
|
}
|
|
}
|
|
//解析当前登录用户的行/列权限
|
|
//解析当前登录用户的行/列权限
|
|
- CubePermParseDto cubePermParseDto = cubeDataPermissionService.parseCubePermission(cubeData.getId(), bladeUser, extraParams);
|
|
|
|
|
|
+ CubePermParseDto cubePermParseDto = cubeDataPermissionService.parseAllPermission(cubeData.getId(), bladeUser, dsTypeEnum, extraParams);
|
|
if (StrUtil.isNotBlank(cubePermParseDto.getFilterSql())) {
|
|
if (StrUtil.isNotBlank(cubePermParseDto.getFilterSql())) {
|
|
whereSqlList.add(cubePermParseDto.getFilterSql());
|
|
whereSqlList.add(cubePermParseDto.getFilterSql());
|
|
}
|
|
}
|
|
@@ -466,23 +462,15 @@ public class QuerySqlService {
|
|
|
|
|
|
/**
|
|
/**
|
|
* <p>解析过滤器</p>
|
|
* <p>解析过滤器</p>
|
|
- */
|
|
|
|
- public Tuple2<String, String> parseFilters(List<ComponentFilter> filterList, ComponentFilterRelation componentFilterRelation, DsTypeEnum dsTypeEnum, Map<String, List<Object>> extraParams) {
|
|
|
|
- return parseFilters(filterList, componentFilterRelation, dsTypeEnum, extraParams, true);
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- /**
|
|
|
|
- * <p>解析过滤器</p>
|
|
|
|
* @author wookvn
|
|
* @author wookvn
|
|
* @datetime 2024-10-23 16:17:11
|
|
* @datetime 2024-10-23 16:17:11
|
|
* @param filterList: 过滤器列表
|
|
* @param filterList: 过滤器列表
|
|
* @param componentFilterRelation: 过滤器关系对象
|
|
* @param componentFilterRelation: 过滤器关系对象
|
|
* @param dsTypeEnum: 数据源类型
|
|
* @param dsTypeEnum: 数据源类型
|
|
* @param extraParams: 全局参数值Map
|
|
* @param extraParams: 全局参数值Map
|
|
- * @param isReplaceGlobalParams: 是否替换全局参数:当只需要拿到whereSql片段存储到数据库时,不需要解析全局变量;在执行过程中解析【场景:权限组过滤器使用】
|
|
|
|
* @return org.springblade.visual.utils.Tuple2<java.lang.String,java.lang.String>
|
|
* @return org.springblade.visual.utils.Tuple2<java.lang.String,java.lang.String>
|
|
**/
|
|
**/
|
|
- public Tuple2<String, String> parseFilters(List<ComponentFilter> filterList, ComponentFilterRelation componentFilterRelation, DsTypeEnum dsTypeEnum, Map<String, List<Object>> extraParams, boolean isReplaceGlobalParams) {
|
|
|
|
|
|
+ public Tuple2<String, String> parseFilters(List<ComponentFilter> filterList, ComponentFilterRelation componentFilterRelation, DsTypeEnum dsTypeEnum, Map<String, List<Object>> extraParams) {
|
|
String whereSql = "", havingSql = "";
|
|
String whereSql = "", havingSql = "";
|
|
if (CollectionUtil.isNotEmpty(filterList)) {
|
|
if (CollectionUtil.isNotEmpty(filterList)) {
|
|
//当外部调用该解析器时,判断extraParams是否为null
|
|
//当外部调用该解析器时,判断extraParams是否为null
|
|
@@ -490,25 +478,25 @@ public class QuerySqlService {
|
|
//过滤关系
|
|
//过滤关系
|
|
if (componentFilterRelation != null) {
|
|
if (componentFilterRelation != null) {
|
|
//filterRelation包含where和having的过滤关系,依次处理
|
|
//filterRelation包含where和having的过滤关系,依次处理
|
|
- Tuple2<String, String> whereSqlTuple = _buildFilters(componentFilterRelation.getWhere(), filterList, dsTypeEnum, extraParams, isReplaceGlobalParams);
|
|
|
|
|
|
+ Tuple2<String, String> whereSqlTuple = _buildFilters(componentFilterRelation.getWhere(), filterList, dsTypeEnum, extraParams);
|
|
if (whereSqlTuple != null) {
|
|
if (whereSqlTuple != null) {
|
|
whereSql = whereSqlTuple.getT1();
|
|
whereSql = whereSqlTuple.getT1();
|
|
}
|
|
}
|
|
//having处理
|
|
//having处理
|
|
- Tuple2<String, String> havingSqlTuple = _buildFilters(componentFilterRelation.getHaving(), filterList, dsTypeEnum, extraParams, isReplaceGlobalParams);
|
|
|
|
|
|
+ Tuple2<String, String> havingSqlTuple = _buildFilters(componentFilterRelation.getHaving(), filterList, dsTypeEnum, extraParams);
|
|
if (havingSqlTuple != null) {
|
|
if (havingSqlTuple != null) {
|
|
havingSql = havingSqlTuple.getT2();
|
|
havingSql = havingSqlTuple.getT2();
|
|
}
|
|
}
|
|
//构造非uniqId的条件集合【主要是全局筛选器,因此只需要处理where】
|
|
//构造非uniqId的条件集合【主要是全局筛选器,因此只需要处理where】
|
|
List<ComponentFilter> dataList = filterList.stream().filter(f -> StrUtil.isEmpty(f.getUniqId())).collect(Collectors.toList());
|
|
List<ComponentFilter> dataList = filterList.stream().filter(f -> StrUtil.isEmpty(f.getUniqId())).collect(Collectors.toList());
|
|
if (!dataList.isEmpty()) {
|
|
if (!dataList.isEmpty()) {
|
|
- Tuple2<String, String> globalWhereSqlTuple = _buildConditions(dataList, FilterConnectTypeEnum.AND, dsTypeEnum, extraParams, isReplaceGlobalParams);
|
|
|
|
|
|
+ Tuple2<String, String> globalWhereSqlTuple = _buildConditions(dataList, FilterConnectTypeEnum.AND, dsTypeEnum, extraParams);
|
|
if (globalWhereSqlTuple != null && !"".equals(globalWhereSqlTuple.getT1())) {
|
|
if (globalWhereSqlTuple != null && !"".equals(globalWhereSqlTuple.getT1())) {
|
|
whereSql += (StrUtil.isNotBlank(whereSql) ? " AND " : "") + globalWhereSqlTuple.getT1();
|
|
whereSql += (StrUtil.isNotBlank(whereSql) ? " AND " : "") + globalWhereSqlTuple.getT1();
|
|
}
|
|
}
|
|
}
|
|
}
|
|
} else { //没有过滤关系
|
|
} else { //没有过滤关系
|
|
- Tuple2<String, String> whereHavingSqlTuple = _buildConditions(filterList, FilterConnectTypeEnum.AND, dsTypeEnum, extraParams, isReplaceGlobalParams);
|
|
|
|
|
|
+ Tuple2<String, String> whereHavingSqlTuple = _buildConditions(filterList, FilterConnectTypeEnum.AND, dsTypeEnum, extraParams);
|
|
if (whereHavingSqlTuple != null) {
|
|
if (whereHavingSqlTuple != null) {
|
|
whereSql = whereHavingSqlTuple.getT1();
|
|
whereSql = whereHavingSqlTuple.getT1();
|
|
havingSql = whereHavingSqlTuple.getT2();
|
|
havingSql = whereHavingSqlTuple.getT2();
|
|
@@ -552,7 +540,7 @@ public class QuerySqlService {
|
|
*
|
|
*
|
|
* @param compFilterDto
|
|
* @param compFilterDto
|
|
*/
|
|
*/
|
|
- private Tuple2<String, String> _buildFilters(ComponentFilterDto compFilterDto, List<ComponentFilter> filterList, DsTypeEnum dsTypeEnum, Map<String, List<Object>> extraParams, boolean isReplaceGlobalParams) {
|
|
|
|
|
|
+ private Tuple2<String, String> _buildFilters(ComponentFilterDto compFilterDto, List<ComponentFilter> filterList, DsTypeEnum dsTypeEnum, Map<String, List<Object>> extraParams) {
|
|
if (compFilterDto == null || compFilterDto.getRelation() == null
|
|
if (compFilterDto == null || compFilterDto.getRelation() == null
|
|
|| (CollectionUtil.isEmpty(compFilterDto.getConditions()) && CollectionUtil.isEmpty(compFilterDto.getFilters()))) {
|
|
|| (CollectionUtil.isEmpty(compFilterDto.getConditions()) && CollectionUtil.isEmpty(compFilterDto.getFilters()))) {
|
|
return null;
|
|
return null;
|
|
@@ -563,7 +551,7 @@ public class QuerySqlService {
|
|
if (compFilterDto.getConditions() != null && !compFilterDto.getConditions().isEmpty()) {
|
|
if (compFilterDto.getConditions() != null && !compFilterDto.getConditions().isEmpty()) {
|
|
List<String> uniqIdList = compFilterDto.getConditions().stream().filter(f -> StrUtil.isNotBlank(f.getUniqId())).map(ComponentFilterItem::getUniqId).collect(Collectors.toList());
|
|
List<String> uniqIdList = compFilterDto.getConditions().stream().filter(f -> StrUtil.isNotBlank(f.getUniqId())).map(ComponentFilterItem::getUniqId).collect(Collectors.toList());
|
|
List<ComponentFilter> filterDataList = filterList.stream().filter(f -> uniqIdList.contains(f.getUniqId())).collect(Collectors.toList());
|
|
List<ComponentFilter> filterDataList = filterList.stream().filter(f -> uniqIdList.contains(f.getUniqId())).collect(Collectors.toList());
|
|
- Tuple2<String, String> tuple = _buildConditions(filterDataList, compFilterDto.getRelation(), dsTypeEnum, extraParams, isReplaceGlobalParams);
|
|
|
|
|
|
+ Tuple2<String, String> tuple = _buildConditions(filterDataList, compFilterDto.getRelation(), dsTypeEnum, extraParams);
|
|
if (StrUtil.isNotBlank(tuple.getT1())) {
|
|
if (StrUtil.isNotBlank(tuple.getT1())) {
|
|
whereSqlList.add(tuple.getT1());
|
|
whereSqlList.add(tuple.getT1());
|
|
}
|
|
}
|
|
@@ -578,7 +566,7 @@ public class QuerySqlService {
|
|
List<ComponentFilter> conds = filterList.stream().filter(f -> uniqIdList.contains(f.getUniqId())).collect(Collectors.toList());
|
|
List<ComponentFilter> conds = filterList.stream().filter(f -> uniqIdList.contains(f.getUniqId())).collect(Collectors.toList());
|
|
FilterConnectTypeEnum relation = filterPlus.getRelation();
|
|
FilterConnectTypeEnum relation = filterPlus.getRelation();
|
|
if (conds != null && relation != null && !conds.isEmpty()) {
|
|
if (conds != null && relation != null && !conds.isEmpty()) {
|
|
- Tuple2<String, String> tuple = _buildConditions(conds, relation, dsTypeEnum, extraParams, isReplaceGlobalParams);
|
|
|
|
|
|
+ Tuple2<String, String> tuple = _buildConditions(conds, relation, dsTypeEnum, extraParams);
|
|
if (StrUtil.isNotBlank(tuple.getT1())) {
|
|
if (StrUtil.isNotBlank(tuple.getT1())) {
|
|
whereSqlList.add(tuple.getT1());
|
|
whereSqlList.add(tuple.getT1());
|
|
}
|
|
}
|
|
@@ -599,7 +587,7 @@ public class QuerySqlService {
|
|
* @param dsTypeEnum
|
|
* @param dsTypeEnum
|
|
* @return
|
|
* @return
|
|
*/
|
|
*/
|
|
- private Tuple2<String, String> _buildConditions(List<ComponentFilter> compFilterList, FilterConnectTypeEnum relation, DsTypeEnum dsTypeEnum, Map<String, List<Object>> extraParams, boolean isReplaceGlobalParams) {
|
|
|
|
|
|
+ private Tuple2<String, String> _buildConditions(List<ComponentFilter> compFilterList, FilterConnectTypeEnum relation, DsTypeEnum dsTypeEnum, Map<String, List<Object>> extraParams) {
|
|
List<String> whereSqlList = new ArrayList<String>();
|
|
List<String> whereSqlList = new ArrayList<String>();
|
|
List<String> havingSqlList = new ArrayList<String>();
|
|
List<String> havingSqlList = new ArrayList<String>();
|
|
for (ComponentFilter columnFilter : compFilterList) {
|
|
for (ComponentFilter columnFilter : compFilterList) {
|
|
@@ -636,8 +624,12 @@ public class QuerySqlService {
|
|
for (ComponentFilterCondition condition : conditions) {
|
|
for (ComponentFilterCondition condition : conditions) {
|
|
//替换变量参数
|
|
//替换变量参数
|
|
if (StrUtil.isNotBlank(condition.getParamKey())) {
|
|
if (StrUtil.isNotBlank(condition.getParamKey())) {
|
|
- //当不需要替换全局变量值时:把"${key}"设置为value,数据查询过程中替换
|
|
|
|
- condition.setValues(isReplaceGlobalParams ? extraParams.get(condition.getParamKey()) : ListUtil.toList("${"+condition.getParamKey()+"}"));
|
|
|
|
|
|
+ List<Object> values = extraParams.get(condition.getParamKey());
|
|
|
|
+ if(values == null) {
|
|
|
|
+ log.warn("解析构造where条件时,不能从全局变量中获取到对应的值,该条件已去掉|paramKey:{}", condition.getParamKey());
|
|
|
|
+ continue;
|
|
|
|
+ }
|
|
|
|
+ condition.setValues(values);
|
|
}
|
|
}
|
|
String conditionSql = condition.getFunction().handle(columnName, column.getViewDataType(), condition.getValues(), dsTypeEnum);
|
|
String conditionSql = condition.getFunction().handle(columnName, column.getViewDataType(), condition.getValues(), dsTypeEnum);
|
|
if (!StrUtil.isEmpty(conditionSql)) {
|
|
if (!StrUtil.isEmpty(conditionSql)) {
|