mirror of
https://github.com/tencentmusic/supersonic.git
synced 2025-12-16 06:56:57 +00:00
[improvement][headless] When validating permissions from SQL, handle Identifier types compatibility (#1844)
This commit is contained in:
@@ -12,6 +12,7 @@ import com.tencent.supersonic.common.pojo.enums.DatePeriodEnum;
|
|||||||
import com.tencent.supersonic.common.pojo.enums.TypeEnums;
|
import com.tencent.supersonic.common.pojo.enums.TypeEnums;
|
||||||
import com.tencent.supersonic.common.util.DateModeUtils;
|
import com.tencent.supersonic.common.util.DateModeUtils;
|
||||||
import com.tencent.supersonic.common.util.SqlFilterUtils;
|
import com.tencent.supersonic.common.util.SqlFilterUtils;
|
||||||
|
import com.tencent.supersonic.headless.api.pojo.Identify;
|
||||||
import com.tencent.supersonic.headless.api.pojo.ItemDateFilter;
|
import com.tencent.supersonic.headless.api.pojo.ItemDateFilter;
|
||||||
import com.tencent.supersonic.headless.api.pojo.MetaFilter;
|
import com.tencent.supersonic.headless.api.pojo.MetaFilter;
|
||||||
import com.tencent.supersonic.headless.api.pojo.SchemaItem;
|
import com.tencent.supersonic.headless.api.pojo.SchemaItem;
|
||||||
@@ -19,6 +20,7 @@ import com.tencent.supersonic.headless.api.pojo.request.QuerySqlReq;
|
|||||||
import com.tencent.supersonic.headless.api.pojo.request.QueryStructReq;
|
import com.tencent.supersonic.headless.api.pojo.request.QueryStructReq;
|
||||||
import com.tencent.supersonic.headless.api.pojo.response.DimensionResp;
|
import com.tencent.supersonic.headless.api.pojo.response.DimensionResp;
|
||||||
import com.tencent.supersonic.headless.api.pojo.response.MetricResp;
|
import com.tencent.supersonic.headless.api.pojo.response.MetricResp;
|
||||||
|
import com.tencent.supersonic.headless.api.pojo.response.ModelResp;
|
||||||
import com.tencent.supersonic.headless.api.pojo.response.SemanticSchemaResp;
|
import com.tencent.supersonic.headless.api.pojo.response.SemanticSchemaResp;
|
||||||
import com.tencent.supersonic.headless.server.service.SchemaService;
|
import com.tencent.supersonic.headless.server.service.SchemaService;
|
||||||
import lombok.extern.slf4j.Slf4j;
|
import lombok.extern.slf4j.Slf4j;
|
||||||
@@ -143,6 +145,37 @@ public class QueryStructUtils {
|
|||||||
return Lists.newArrayList();
|
return Lists.newArrayList();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private Set<Long> getModelIdsByIdentifiesFromSql(QuerySqlReq querySqlReq,
|
||||||
|
SemanticSchemaResp semanticSchemaResp) {
|
||||||
|
Set<String> resNameSet = getResName(querySqlReq);
|
||||||
|
Set<Long> modelIds = new HashSet<>();
|
||||||
|
|
||||||
|
if (semanticSchemaResp == null) {
|
||||||
|
return modelIds;
|
||||||
|
}
|
||||||
|
if (CollectionUtils.isEmpty(semanticSchemaResp.getModelResps())) {
|
||||||
|
return modelIds;
|
||||||
|
}
|
||||||
|
for (ModelResp modelResp : semanticSchemaResp.getModelResps()) {
|
||||||
|
if (modelHasMatchingIdentifier(modelResp, resNameSet)) {
|
||||||
|
modelIds.add(modelResp.getId());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return modelIds;
|
||||||
|
}
|
||||||
|
|
||||||
|
private boolean modelHasMatchingIdentifier(ModelResp modelResp, Set<String> resNameSet) {
|
||||||
|
if (modelResp.getModelDetail() == null) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
List<Identify> identifiers = modelResp.getModelDetail().getIdentifiers();
|
||||||
|
if (CollectionUtils.isEmpty(identifiers)) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
return identifiers.stream().anyMatch(identifier -> resNameSet.contains(identifier.getName())
|
||||||
|
|| resNameSet.contains(identifier.getBizName()));
|
||||||
|
}
|
||||||
|
|
||||||
private List<DimensionResp> getDimensionsFromSql(QuerySqlReq querySqlReq,
|
private List<DimensionResp> getDimensionsFromSql(QuerySqlReq querySqlReq,
|
||||||
SemanticSchemaResp semanticSchemaResp) {
|
SemanticSchemaResp semanticSchemaResp) {
|
||||||
Set<String> resNameSet = getResName(querySqlReq);
|
Set<String> resNameSet = getResName(querySqlReq);
|
||||||
@@ -162,6 +195,7 @@ public class QueryStructUtils {
|
|||||||
modelIds.addAll(
|
modelIds.addAll(
|
||||||
dimensions.stream().map(DimensionResp::getModelId).collect(Collectors.toList()));
|
dimensions.stream().map(DimensionResp::getModelId).collect(Collectors.toList()));
|
||||||
modelIds.addAll(metrics.stream().map(MetricResp::getModelId).collect(Collectors.toList()));
|
modelIds.addAll(metrics.stream().map(MetricResp::getModelId).collect(Collectors.toList()));
|
||||||
|
modelIds.addAll(getModelIdsByIdentifiesFromSql(querySqlReq, semanticSchemaResp));
|
||||||
return modelIds;
|
return modelIds;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user