mirror of
https://github.com/tencentmusic/supersonic.git
synced 2026-04-27 19:04:25 +08:00
Compare commits
4 Commits
be59b051fc
...
e0f7ec0f40
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
e0f7ec0f40 | ||
|
|
7b46ef64fd | ||
|
|
6af345044a | ||
|
|
4821f31e15 |
@@ -17,6 +17,7 @@ public class QueryColumn {
|
||||
private String dataFormatType;
|
||||
private DataFormat dataFormat;
|
||||
private String comment;
|
||||
private Long modelId;
|
||||
|
||||
public QueryColumn(String nameEn, String type) {
|
||||
this.type = type;
|
||||
|
||||
@@ -34,6 +34,8 @@ public class MetaFilter {
|
||||
|
||||
private List<String> names;
|
||||
|
||||
private List<String> bizNames;
|
||||
|
||||
private List<String> fieldsDepend;
|
||||
|
||||
private Integer isTag;
|
||||
|
||||
@@ -13,6 +13,8 @@ public class ItemUseReq {
|
||||
|
||||
private String startTime;
|
||||
private Long modelId;
|
||||
private Long dataSetId;
|
||||
private List<Long> dataSetIds;
|
||||
private List<Long> modelIds;
|
||||
private Boolean cacheEnable = true;
|
||||
private String metric;
|
||||
|
||||
@@ -54,6 +54,12 @@ public class ModelRepositoryImpl implements ModelRepository {
|
||||
if (!CollectionUtils.isEmpty(modelFilter.getModelIds())) {
|
||||
wrapper.lambda().in(ModelDO::getId, modelFilter.getModelIds());
|
||||
}
|
||||
if (!CollectionUtils.isEmpty(modelFilter.getNames())) {
|
||||
wrapper.lambda().in(ModelDO::getName, modelFilter.getNames());
|
||||
}
|
||||
if (!CollectionUtils.isEmpty(modelFilter.getBizNames())) {
|
||||
wrapper.lambda().in(ModelDO::getBizName, modelFilter.getBizNames());
|
||||
}
|
||||
if (modelFilter.getIncludesDetail() != null && !modelFilter.getIncludesDetail()) {
|
||||
wrapper.select(ModelDO.class, modelDO -> !modelDO.getColumn().equals("model_detail"));
|
||||
}
|
||||
|
||||
@@ -12,6 +12,7 @@ import com.tencent.supersonic.headless.server.persistence.mapper.StatMapper;
|
||||
import com.tencent.supersonic.headless.server.persistence.repository.StatRepository;
|
||||
import lombok.SneakyThrows;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.apache.commons.collections.CollectionUtils;
|
||||
import org.apache.commons.lang3.StringUtils;
|
||||
import org.springframework.beans.BeanUtils;
|
||||
import org.springframework.stereotype.Repository;
|
||||
@@ -82,7 +83,12 @@ public class StatRepositoryImpl implements StatRepository {
|
||||
if (Objects.nonNull(itemUseReq.getMetric())) {
|
||||
queryWrapper.lambda().like(QueryStatDO::getMetrics, itemUseReq.getMetric());
|
||||
}
|
||||
|
||||
if (Objects.nonNull(itemUseReq.getDataSetId())) {
|
||||
queryWrapper.lambda().eq(QueryStatDO::getDataSetId, itemUseReq.getDataSetId());
|
||||
}
|
||||
if (CollectionUtils.isNotEmpty(itemUseReq.getDataSetIds())) {
|
||||
queryWrapper.lambda().in(QueryStatDO::getDataSetId, itemUseReq.getDataSetIds());
|
||||
}
|
||||
return statMapper.selectList(queryWrapper);
|
||||
}
|
||||
|
||||
|
||||
@@ -14,6 +14,7 @@ import com.tencent.supersonic.common.util.JsonUtil;
|
||||
import com.tencent.supersonic.headless.api.pojo.DataSetSchema;
|
||||
import com.tencent.supersonic.headless.api.pojo.ItemDateFilter;
|
||||
import com.tencent.supersonic.headless.api.pojo.MetaFilter;
|
||||
import com.tencent.supersonic.headless.api.pojo.SchemaItem;
|
||||
import com.tencent.supersonic.headless.api.pojo.SemanticSchema;
|
||||
import com.tencent.supersonic.headless.api.pojo.enums.SchemaType;
|
||||
import com.tencent.supersonic.headless.api.pojo.request.DataSetFilterReq;
|
||||
@@ -280,7 +281,9 @@ public class SchemaServiceImpl implements SchemaService {
|
||||
}
|
||||
|
||||
private void fillCnt(List<DataSetSchemaResp> dataSetSchemaResps, List<ItemUseResp> statInfos) {
|
||||
|
||||
if (CollectionUtils.isEmpty(statInfos)) {
|
||||
return;
|
||||
}
|
||||
Map<String, ItemUseResp> typeIdAndStatPair = statInfos.stream()
|
||||
.collect(Collectors.toMap(
|
||||
itemUseInfo -> itemUseInfo.getType() + AT_SYMBOL + AT_SYMBOL
|
||||
@@ -296,40 +299,41 @@ public class SchemaServiceImpl implements SchemaService {
|
||||
private void fillMetricCnt(DataSetSchemaResp dataSetSchemaResp,
|
||||
Map<String, ItemUseResp> typeIdAndStatPair) {
|
||||
List<MetricSchemaResp> metrics = dataSetSchemaResp.getMetrics();
|
||||
if (CollectionUtils.isEmpty(dataSetSchemaResp.getMetrics())) {
|
||||
if (CollectionUtils.isEmpty(metrics)) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (!CollectionUtils.isEmpty(metrics)) {
|
||||
metrics.stream().forEach(metric -> {
|
||||
String key = TypeEnums.METRIC.name().toLowerCase() + AT_SYMBOL + AT_SYMBOL
|
||||
+ metric.getBizName();
|
||||
if (typeIdAndStatPair.containsKey(key)) {
|
||||
metric.setUseCnt(typeIdAndStatPair.get(key).getUseCnt());
|
||||
}
|
||||
});
|
||||
}
|
||||
metrics.forEach(metric -> {
|
||||
metric.setUseCnt(getItemCnt(metric, typeIdAndStatPair));
|
||||
});
|
||||
dataSetSchemaResp.setMetrics(metrics);
|
||||
}
|
||||
|
||||
private void fillDimCnt(DataSetSchemaResp dataSetSchemaResp,
|
||||
Map<String, ItemUseResp> typeIdAndStatPair) {
|
||||
List<DimSchemaResp> dimensions = dataSetSchemaResp.getDimensions();
|
||||
if (CollectionUtils.isEmpty(dataSetSchemaResp.getDimensions())) {
|
||||
if (CollectionUtils.isEmpty(dimensions)) {
|
||||
return;
|
||||
}
|
||||
if (!CollectionUtils.isEmpty(dimensions)) {
|
||||
dimensions.stream().forEach(dim -> {
|
||||
String key = TypeEnums.DIMENSION.name().toLowerCase() + AT_SYMBOL + AT_SYMBOL
|
||||
+ dim.getBizName();
|
||||
if (typeIdAndStatPair.containsKey(key)) {
|
||||
dim.setUseCnt(typeIdAndStatPair.get(key).getUseCnt());
|
||||
}
|
||||
});
|
||||
}
|
||||
dimensions.forEach(dim -> {
|
||||
dim.setUseCnt(getItemCnt(dim, typeIdAndStatPair));
|
||||
});
|
||||
dataSetSchemaResp.setDimensions(dimensions);
|
||||
}
|
||||
|
||||
private Long getItemCnt(SchemaItem schemaItem, Map<String, ItemUseResp> typeIdAndStatPair) {
|
||||
String bizNameKey = schemaItem.getTypeEnum().name().toLowerCase() + AT_SYMBOL + AT_SYMBOL
|
||||
+ schemaItem.getBizName();
|
||||
String nameKey = schemaItem.getTypeEnum().name().toLowerCase() + AT_SYMBOL + AT_SYMBOL
|
||||
+ schemaItem.getName();
|
||||
if (typeIdAndStatPair.containsKey(bizNameKey)) {
|
||||
return typeIdAndStatPair.get(bizNameKey).getUseCnt();
|
||||
}
|
||||
if (typeIdAndStatPair.containsKey(nameKey)) {
|
||||
return typeIdAndStatPair.get(nameKey).getUseCnt();
|
||||
}
|
||||
return 0L;
|
||||
}
|
||||
|
||||
@Override
|
||||
public DimensionResp getDimension(String bizName, Long modelId) {
|
||||
return dimensionService.getDimension(bizName, modelId);
|
||||
@@ -469,7 +473,7 @@ public class SchemaServiceImpl implements SchemaService {
|
||||
List<Long> dataSetIds = dataSetSchemaResps.stream().map(DataSetSchemaResp::getId)
|
||||
.collect(Collectors.toList());
|
||||
ItemUseReq itemUseReq = new ItemUseReq();
|
||||
itemUseReq.setModelIds(dataSetIds);
|
||||
itemUseReq.setDataSetIds(dataSetIds);
|
||||
|
||||
List<ItemUseResp> statInfos = getStatInfo(itemUseReq);
|
||||
log.debug("statInfos:{}", statInfos);
|
||||
|
||||
@@ -4,10 +4,7 @@ import com.tencent.supersonic.common.pojo.Constants;
|
||||
import com.tencent.supersonic.common.pojo.QueryColumn;
|
||||
import com.tencent.supersonic.headless.api.pojo.enums.SemanticType;
|
||||
import com.tencent.supersonic.headless.api.pojo.request.QueryMultiStructReq;
|
||||
import com.tencent.supersonic.headless.api.pojo.response.MetricResp;
|
||||
import com.tencent.supersonic.headless.api.pojo.response.MetricSchemaResp;
|
||||
import com.tencent.supersonic.headless.api.pojo.response.SemanticQueryResp;
|
||||
import com.tencent.supersonic.headless.api.pojo.response.SemanticSchemaResp;
|
||||
import com.tencent.supersonic.headless.api.pojo.response.*;
|
||||
import com.tencent.supersonic.headless.core.pojo.QueryStatement;
|
||||
import com.tencent.supersonic.headless.core.utils.SqlGenerateUtils;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
@@ -39,11 +36,13 @@ public class QueryUtils {
|
||||
public void populateQueryColumns(SemanticQueryResp semanticQueryResp,
|
||||
SemanticSchemaResp semanticSchemaResp) {
|
||||
Map<String, MetricResp> metricRespMap = createMetricRespMap(semanticSchemaResp);
|
||||
Map<String, DimensionResp> dimensionRespMap = createDimRespMap(semanticSchemaResp);
|
||||
Map<String, String> namePair = new HashMap<>();
|
||||
Map<String, String> nameTypePair = new HashMap<>();
|
||||
populateNamePairs(semanticSchemaResp, namePair, nameTypePair);
|
||||
List<QueryColumn> columns = semanticQueryResp.getColumns();
|
||||
columns.forEach(column -> processColumn(column, namePair, nameTypePair, metricRespMap));
|
||||
columns.forEach(column -> processColumn(column, namePair, nameTypePair, metricRespMap,
|
||||
dimensionRespMap));
|
||||
}
|
||||
|
||||
private Map<String, MetricResp> createMetricRespMap(SemanticSchemaResp semanticSchemaResp) {
|
||||
@@ -52,6 +51,12 @@ public class QueryUtils {
|
||||
.collect(Collectors.toMap(MetricResp::getBizName, a -> a, (k1, k2) -> k1));
|
||||
}
|
||||
|
||||
private Map<String, DimensionResp> createDimRespMap(SemanticSchemaResp semanticSchemaResp) {
|
||||
List<DimSchemaResp> dimensions = semanticSchemaResp.getDimensions();
|
||||
return dimensions.stream()
|
||||
.collect(Collectors.toMap(DimensionResp::getBizName, a -> a, (k1, k2) -> k1));
|
||||
}
|
||||
|
||||
private void populateNamePairs(SemanticSchemaResp semanticSchemaResp,
|
||||
Map<String, String> namePair, Map<String, String> nameTypePair) {
|
||||
semanticSchemaResp.getMetrics().forEach(metricDesc -> {
|
||||
@@ -65,8 +70,9 @@ public class QueryUtils {
|
||||
}
|
||||
|
||||
private void processColumn(QueryColumn column, Map<String, String> namePair,
|
||||
Map<String, String> nameTypePair, Map<String, MetricResp> metricRespMap) {
|
||||
String nameEn = getName(column.getNameEn().toLowerCase());
|
||||
Map<String, String> nameTypePair, Map<String, MetricResp> metricRespMap,
|
||||
Map<String, DimensionResp> dimensionRespMap) {
|
||||
String nameEn = getName(column.getNameEn());
|
||||
if (nameEn.contains(JOIN_UNDERLINE)) {
|
||||
nameEn = nameEn.split(JOIN_UNDERLINE)[1];
|
||||
}
|
||||
@@ -98,6 +104,10 @@ public class QueryUtils {
|
||||
if (metricRespMap.containsKey(nameEn)) {
|
||||
column.setDataFormatType(metricRespMap.get(nameEn).getDataFormatType());
|
||||
column.setDataFormat(metricRespMap.get(nameEn).getDataFormat());
|
||||
column.setModelId(metricRespMap.get(nameEn).getModelId());
|
||||
}
|
||||
if (dimensionRespMap.containsKey(nameEn)) {
|
||||
column.setModelId(dimensionRespMap.get(nameEn).getModelId());
|
||||
}
|
||||
// set name by NameEn
|
||||
if (StringUtils.isBlank(column.getName()) && StringUtils.isNotBlank(column.getNameEn())) {
|
||||
|
||||
@@ -137,8 +137,8 @@ public class StatUtils {
|
||||
QueryStat queryStatInfo = new QueryStat();
|
||||
List<String> aggFields = SqlSelectHelper.getAggregateFields(querySqlReq.getSql());
|
||||
List<String> allFields = SqlSelectHelper.getAllSelectFields(querySqlReq.getSql());
|
||||
List<String> dimensions =
|
||||
allFields.stream().filter(aggFields::contains).collect(Collectors.toList());
|
||||
List<String> dimensions = allFields.stream().filter(field -> !aggFields.contains(field))
|
||||
.collect(Collectors.toList());
|
||||
|
||||
String userName = getUserName(facadeUser);
|
||||
try {
|
||||
|
||||
Reference in New Issue
Block a user