mirror of
https://github.com/tencentmusic/supersonic.git
synced 2025-12-10 11:07:06 +00:00
[improvement](Headless) add tag metirc define type model (#800)
This commit is contained in:
@@ -3,6 +3,7 @@ package com.tencent.supersonic.headless.server.manager;
|
|||||||
import com.tencent.supersonic.common.pojo.ModelRela;
|
import com.tencent.supersonic.common.pojo.ModelRela;
|
||||||
import com.tencent.supersonic.common.pojo.enums.FilterOperatorEnum;
|
import com.tencent.supersonic.common.pojo.enums.FilterOperatorEnum;
|
||||||
import com.tencent.supersonic.headless.api.pojo.Field;
|
import com.tencent.supersonic.headless.api.pojo.Field;
|
||||||
|
import com.tencent.supersonic.headless.api.pojo.enums.TagDefineType;
|
||||||
import com.tencent.supersonic.headless.api.pojo.response.DatabaseResp;
|
import com.tencent.supersonic.headless.api.pojo.response.DatabaseResp;
|
||||||
import com.tencent.supersonic.headless.api.pojo.response.SemanticSchemaResp;
|
import com.tencent.supersonic.headless.api.pojo.response.SemanticSchemaResp;
|
||||||
import com.tencent.supersonic.headless.api.pojo.response.TagResp;
|
import com.tencent.supersonic.headless.api.pojo.response.TagResp;
|
||||||
@@ -103,11 +104,36 @@ public class SemanticSchemaManager {
|
|||||||
}
|
}
|
||||||
if (Objects.nonNull(semanticModel.getDatasourceMap()) && !semanticModel.getDatasourceMap().isEmpty()) {
|
if (Objects.nonNull(semanticModel.getDatasourceMap()) && !semanticModel.getDatasourceMap().isEmpty()) {
|
||||||
for (Map.Entry<String, DataSource> entry : semanticModel.getDatasourceMap().entrySet()) {
|
for (Map.Entry<String, DataSource> entry : semanticModel.getDatasourceMap().entrySet()) {
|
||||||
List<Dimension> dimensions = new ArrayList<>();
|
List<Dimension> modelDimensions = new ArrayList<>();
|
||||||
List<String> tagNames = new ArrayList<>();
|
if (!semanticModel.getDimensionMap().containsKey(entry.getKey())) {
|
||||||
|
semanticModel.getDimensionMap().put(entry.getKey(), modelDimensions);
|
||||||
|
} else {
|
||||||
|
modelDimensions = semanticModel.getDimensionMap().get(entry.getKey());
|
||||||
|
}
|
||||||
if (tagMap.containsKey(entry.getValue().getId())) {
|
if (tagMap.containsKey(entry.getValue().getId())) {
|
||||||
for (TagResp tagResp : tagMap.get(entry.getValue().getId())) {
|
for (TagResp tagResp : tagMap.get(entry.getValue().getId())) {
|
||||||
tagNames.add(tagResp.getBizName());
|
addTagModel(tagResp, modelDimensions, semanticModel.getMetrics());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return semanticModel;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void addTagModel(TagResp tagResp, List<Dimension> modelDimensions, List<Metric> modelMetrics)
|
||||||
|
throws Exception {
|
||||||
|
switch (tagResp.getTagDefineType()) {
|
||||||
|
case FIELD:
|
||||||
|
case DIMENSION:
|
||||||
|
if (TagDefineType.DIMENSION.equals(tagResp.getTagDefineType())) {
|
||||||
|
Optional<Dimension> modelDimension = modelDimensions.stream()
|
||||||
|
.filter(d -> d.getBizName().equals(tagResp.getExpr())).findFirst();
|
||||||
|
if (modelDimension.isPresent()) {
|
||||||
|
modelDimension.get().setName(tagResp.getBizName());
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
Dimension dimension = Dimension.builder().build();
|
Dimension dimension = Dimension.builder().build();
|
||||||
dimension.setType("");
|
dimension.setType("");
|
||||||
dimension.setExpr(tagResp.getExpr());
|
dimension.setExpr(tagResp.getExpr());
|
||||||
@@ -117,23 +143,23 @@ public class SemanticSchemaManager {
|
|||||||
if (Objects.isNull(dimension.getDataType())) {
|
if (Objects.isNull(dimension.getDataType())) {
|
||||||
dimension.setDataType(DataType.UNKNOWN);
|
dimension.setDataType(DataType.UNKNOWN);
|
||||||
}
|
}
|
||||||
|
|
||||||
DimensionTimeTypeParams dimensionTimeTypeParams = new DimensionTimeTypeParams();
|
DimensionTimeTypeParams dimensionTimeTypeParams = new DimensionTimeTypeParams();
|
||||||
dimension.setDimensionTimeTypeParams(dimensionTimeTypeParams);
|
dimension.setDimensionTimeTypeParams(dimensionTimeTypeParams);
|
||||||
dimensions.add(dimension);
|
modelDimensions.add(dimension);
|
||||||
|
return;
|
||||||
|
case METRIC:
|
||||||
|
Optional<Metric> modelMetric = modelMetrics.stream()
|
||||||
|
.filter(m -> m.getName().equalsIgnoreCase(tagResp.getExpr())).findFirst();
|
||||||
|
if (modelMetric.isPresent()) {
|
||||||
|
modelMetric.get().setName(tagResp.getBizName());
|
||||||
|
} else {
|
||||||
|
throw new Exception(String.format("tag [{}] cant find the metric [{}]", tagResp.getBizName(),
|
||||||
|
tagResp.getExpr()));
|
||||||
}
|
}
|
||||||
|
return;
|
||||||
|
default:
|
||||||
}
|
}
|
||||||
if (semanticModel.getDimensionMap().containsKey(entry.getKey())) {
|
|
||||||
semanticModel.getDimensionMap().get(entry.getKey()).stream()
|
|
||||||
.filter(d -> !tagNames.contains(d.getBizName())).forEach(d -> {
|
|
||||||
dimensions.add(d);
|
|
||||||
});
|
|
||||||
}
|
|
||||||
semanticModel.getDimensionMap().put(entry.getKey(), dimensions);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
// metric ignored
|
|
||||||
semanticModel.setMetrics(new ArrayList<>());
|
|
||||||
return semanticModel;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public static List<Metric> getMetrics(final List<MetricYamlTpl> t) {
|
public static List<Metric> getMetrics(final List<MetricYamlTpl> t) {
|
||||||
|
|||||||
Reference in New Issue
Block a user