mirror of
https://github.com/tencentmusic/supersonic.git
synced 2025-12-11 03:58:14 +00:00
(improvement)(headless)Decrease the number of database queries to the s2_tag table.
This commit is contained in:
@@ -1,6 +1,7 @@
|
||||
package com.tencent.supersonic.headless.server.persistence.dataobject;
|
||||
|
||||
import com.baomidou.mybatisplus.annotation.IdType;
|
||||
import com.baomidou.mybatisplus.annotation.TableField;
|
||||
import com.baomidou.mybatisplus.annotation.TableId;
|
||||
import com.baomidou.mybatisplus.annotation.TableName;
|
||||
import lombok.Data;
|
||||
@@ -50,6 +51,7 @@ public class DimensionDO {
|
||||
|
||||
private String dataType;
|
||||
|
||||
@TableField(exist = false)
|
||||
private int isTag;
|
||||
|
||||
private String ext;
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
package com.tencent.supersonic.headless.server.persistence.dataobject;
|
||||
|
||||
import com.baomidou.mybatisplus.annotation.IdType;
|
||||
import com.baomidou.mybatisplus.annotation.TableField;
|
||||
import com.baomidou.mybatisplus.annotation.TableId;
|
||||
import com.baomidou.mybatisplus.annotation.TableName;
|
||||
import lombok.Data;
|
||||
@@ -105,4 +106,6 @@ public class MetricDO {
|
||||
|
||||
private Integer isPublish;
|
||||
|
||||
@TableField(exist = false)
|
||||
private int isTag;
|
||||
}
|
||||
|
||||
@@ -19,7 +19,6 @@ import com.tencent.supersonic.common.pojo.exception.InvalidArgumentException;
|
||||
import com.tencent.supersonic.headless.api.pojo.DimValueMap;
|
||||
import com.tencent.supersonic.headless.api.pojo.ModelDetail;
|
||||
import com.tencent.supersonic.headless.api.pojo.enums.ModelDefineType;
|
||||
import com.tencent.supersonic.headless.api.pojo.enums.TagDefineType;
|
||||
import com.tencent.supersonic.headless.api.pojo.request.DimensionReq;
|
||||
import com.tencent.supersonic.headless.api.pojo.request.MetaBatchReq;
|
||||
import com.tencent.supersonic.headless.api.pojo.request.PageDimensionReq;
|
||||
@@ -28,16 +27,13 @@ import com.tencent.supersonic.headless.api.pojo.response.DatabaseResp;
|
||||
import com.tencent.supersonic.headless.api.pojo.response.DimensionResp;
|
||||
import com.tencent.supersonic.headless.api.pojo.response.ModelResp;
|
||||
import com.tencent.supersonic.headless.api.pojo.response.SemanticQueryResp;
|
||||
import com.tencent.supersonic.headless.api.pojo.response.TagItem;
|
||||
import com.tencent.supersonic.headless.server.persistence.dataobject.DimensionDO;
|
||||
import com.tencent.supersonic.headless.server.persistence.dataobject.TagDO;
|
||||
import com.tencent.supersonic.headless.server.persistence.mapper.DimensionDOMapper;
|
||||
import com.tencent.supersonic.headless.server.persistence.repository.DimensionRepository;
|
||||
import com.tencent.supersonic.headless.server.pojo.DimensionFilter;
|
||||
import com.tencent.supersonic.headless.server.pojo.DimensionsFilter;
|
||||
import com.tencent.supersonic.headless.api.pojo.MetaFilter;
|
||||
import com.tencent.supersonic.headless.server.pojo.ModelFilter;
|
||||
import com.tencent.supersonic.headless.server.pojo.TagFilter;
|
||||
import com.tencent.supersonic.headless.server.service.DatabaseService;
|
||||
import com.tencent.supersonic.headless.server.service.DimensionService;
|
||||
import com.tencent.supersonic.headless.server.service.ModelRelaService;
|
||||
@@ -60,7 +56,6 @@ import java.util.Date;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Objects;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
@Service
|
||||
@@ -264,21 +259,6 @@ public class DimensionServiceImpl extends ServiceImpl<DimensionDOMapper, Dimensi
|
||||
List<DimensionDO> dimensionDOS = dimensionRepository.getDimension(dimensionFilter);
|
||||
List<DimensionResp> dimensionResps = convertList(dimensionDOS);
|
||||
|
||||
List<Long> dimensionIds = dimensionResps.stream().map(dimensionResp -> dimensionResp.getId())
|
||||
.collect(Collectors.toList());
|
||||
List<TagItem> tagItems = tagMetaService.getTagItems(dimensionIds, TagDefineType.DIMENSION);
|
||||
Map<Long, TagItem> itemIdToTagItem = tagItems.stream()
|
||||
.collect(Collectors.toMap(tag -> tag.getItemId(), tag -> tag, (newTag, oldTag) -> newTag));
|
||||
|
||||
if (Objects.nonNull(itemIdToTagItem)) {
|
||||
dimensionResps.stream().forEach(dimensionResp -> {
|
||||
Long metricRespId = dimensionResp.getId();
|
||||
if (itemIdToTagItem.containsKey(metricRespId)) {
|
||||
dimensionResp.setIsTag(itemIdToTagItem.get(metricRespId).getIsTag());
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
if (!CollectionUtils.isEmpty(metaFilter.getFieldsDepend())) {
|
||||
return filterByField(dimensionResps, metaFilter.getFieldsDepend());
|
||||
}
|
||||
@@ -332,33 +312,9 @@ public class DimensionServiceImpl extends ServiceImpl<DimensionDOMapper, Dimensi
|
||||
.convert2DimensionResp(dimensionDO, modelMap))
|
||||
.collect(Collectors.toList());
|
||||
}
|
||||
fillTagInfo(dimensionResps);
|
||||
return dimensionResps;
|
||||
}
|
||||
|
||||
private void fillTagInfo(List<DimensionResp> dimensionResps) {
|
||||
if (CollectionUtils.isEmpty(dimensionResps)) {
|
||||
return;
|
||||
}
|
||||
TagFilter tagFilter = new TagFilter();
|
||||
tagFilter.setTagDefineType(TagDefineType.DIMENSION);
|
||||
List<Long> dimensionIds = dimensionResps.stream().map(dimension -> dimension.getId())
|
||||
.collect(Collectors.toList());
|
||||
tagFilter.setItemIds(dimensionIds);
|
||||
Map<Long, TagDO> keyAndTagMap = tagMetaService.getTagDOList(tagFilter).stream()
|
||||
.collect(Collectors.toMap(tag -> tag.getItemId(), tag -> tag,
|
||||
(newTag, oldTag) -> newTag));
|
||||
if (Objects.nonNull(keyAndTagMap)) {
|
||||
dimensionResps.stream().forEach(dim -> {
|
||||
if (keyAndTagMap.containsKey(dim.getId())) {
|
||||
dim.setIsTag(1);
|
||||
} else {
|
||||
dim.setIsTag(0);
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<String> mockAlias(DimensionReq dimensionReq, String mockType, User user) {
|
||||
String mockAlias = aliasGenerateHelper.generateAlias(mockType, dimensionReq.getName(),
|
||||
|
||||
@@ -29,7 +29,6 @@ import com.tencent.supersonic.headless.api.pojo.SchemaElementType;
|
||||
import com.tencent.supersonic.headless.api.pojo.SchemaItem;
|
||||
import com.tencent.supersonic.headless.api.pojo.enums.MapModeEnum;
|
||||
import com.tencent.supersonic.headless.api.pojo.enums.MetricDefineType;
|
||||
import com.tencent.supersonic.headless.api.pojo.enums.TagDefineType;
|
||||
import com.tencent.supersonic.headless.api.pojo.request.MetaBatchReq;
|
||||
import com.tencent.supersonic.headless.api.pojo.request.MetricBaseReq;
|
||||
import com.tencent.supersonic.headless.api.pojo.request.MetricReq;
|
||||
@@ -43,12 +42,10 @@ import com.tencent.supersonic.headless.api.pojo.response.DimensionResp;
|
||||
import com.tencent.supersonic.headless.api.pojo.response.MapInfoResp;
|
||||
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.TagItem;
|
||||
import com.tencent.supersonic.headless.server.facade.service.ChatLayerService;
|
||||
import com.tencent.supersonic.headless.server.persistence.dataobject.CollectDO;
|
||||
import com.tencent.supersonic.headless.server.persistence.dataobject.MetricDO;
|
||||
import com.tencent.supersonic.headless.server.persistence.dataobject.MetricQueryDefaultConfigDO;
|
||||
import com.tencent.supersonic.headless.server.persistence.dataobject.TagDO;
|
||||
import com.tencent.supersonic.headless.server.persistence.mapper.MetricDOMapper;
|
||||
import com.tencent.supersonic.headless.server.persistence.repository.MetricRepository;
|
||||
import com.tencent.supersonic.headless.server.pojo.DimensionsFilter;
|
||||
@@ -57,7 +54,6 @@ import com.tencent.supersonic.headless.server.pojo.MetricFilter;
|
||||
import com.tencent.supersonic.headless.server.pojo.MetricsFilter;
|
||||
import com.tencent.supersonic.headless.server.pojo.ModelCluster;
|
||||
import com.tencent.supersonic.headless.server.pojo.ModelFilter;
|
||||
import com.tencent.supersonic.headless.server.pojo.TagFilter;
|
||||
import com.tencent.supersonic.headless.server.service.DimensionService;
|
||||
import com.tencent.supersonic.headless.server.service.MetricService;
|
||||
import com.tencent.supersonic.headless.server.service.ModelService;
|
||||
@@ -347,7 +343,6 @@ public class MetricServiceImpl extends ServiceImpl<MetricDOMapper, MetricDO>
|
||||
BeanUtils.copyProperties(metricDOPageInfo, pageInfo);
|
||||
List<MetricResp> metricResps = convertList(metricDOPageInfo.getList(), collectIds);
|
||||
fillAdminRes(metricResps, user);
|
||||
fillTagInfo(metricResps);
|
||||
pageInfo.setList(metricResps);
|
||||
return pageInfo;
|
||||
}
|
||||
@@ -370,20 +365,7 @@ public class MetricServiceImpl extends ServiceImpl<MetricDOMapper, MetricDO>
|
||||
MetricFilter metricFilter = new MetricFilter();
|
||||
BeanUtils.copyProperties(metaFilter, metricFilter);
|
||||
List<MetricResp> metricResps = convertList(queryMetric(metricFilter));
|
||||
List<Long> metricIds = metricResps.stream().map(metricResp -> metricResp.getId()).collect(Collectors.toList());
|
||||
|
||||
List<TagItem> tagItems = tagMetaService.getTagItems(metricIds, TagDefineType.METRIC);
|
||||
Map<Long, TagItem> itemIdToTagItem = tagItems.stream()
|
||||
.collect(Collectors.toMap(tag -> tag.getItemId(), tag -> tag, (newTag, oldTag) -> newTag));
|
||||
|
||||
if (Objects.nonNull(itemIdToTagItem)) {
|
||||
metricResps.stream().forEach(metricResp -> {
|
||||
Long metricRespId = metricResp.getId();
|
||||
if (itemIdToTagItem.containsKey(metricRespId)) {
|
||||
metricResp.setIsTag(itemIdToTagItem.get(metricRespId).getIsTag());
|
||||
}
|
||||
});
|
||||
}
|
||||
if (!CollectionUtils.isEmpty(metaFilter.getFieldsDepend())) {
|
||||
return filterByField(metricResps, metaFilter.getFieldsDepend());
|
||||
}
|
||||
@@ -420,30 +402,6 @@ public class MetricServiceImpl extends ServiceImpl<MetricDOMapper, MetricDO>
|
||||
return idsToFilter;
|
||||
}
|
||||
|
||||
private void fillTagInfo(List<MetricResp> metricRespList) {
|
||||
if (CollectionUtils.isEmpty(metricRespList)) {
|
||||
return;
|
||||
}
|
||||
|
||||
TagFilter tagFilter = new TagFilter();
|
||||
tagFilter.setTagDefineType(TagDefineType.METRIC);
|
||||
List<Long> metricIds = metricRespList.stream().map(metric -> metric.getId())
|
||||
.collect(Collectors.toList());
|
||||
tagFilter.setItemIds(metricIds);
|
||||
Map<Long, TagDO> keyAndTagMap = tagMetaService.getTagDOList(tagFilter).stream()
|
||||
.collect(Collectors.toMap(tag -> tag.getItemId(), tag -> tag,
|
||||
(newTag, oldTag) -> newTag));
|
||||
if (Objects.nonNull(keyAndTagMap)) {
|
||||
metricRespList.stream().forEach(metric -> {
|
||||
if (keyAndTagMap.containsKey(metric.getId())) {
|
||||
metric.setIsTag(1);
|
||||
} else {
|
||||
metric.setIsTag(0);
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
private List<MetricResp> filterByField(List<MetricResp> metricResps, List<String> fields) {
|
||||
Set<MetricResp> metricRespFiltered = Sets.newHashSet();
|
||||
for (MetricResp metricResp : metricResps) {
|
||||
|
||||
@@ -89,6 +89,7 @@ public class DimensionConverter {
|
||||
}
|
||||
dimensionResp.setType(getType(dimensionDO.getType()));
|
||||
dimensionResp.setTypeEnum(TypeEnums.DIMENSION);
|
||||
dimensionResp.setIsTag(dimensionDO.getIsTag());
|
||||
return dimensionResp;
|
||||
}
|
||||
|
||||
|
||||
@@ -107,6 +107,7 @@ public class MetricConverter {
|
||||
if (metricDO.getDefineType() != null) {
|
||||
metricResp.setMetricDefineType(MetricDefineType.valueOf(metricDO.getDefineType()));
|
||||
}
|
||||
metricResp.setIsTag(metricDO.getIsTag());
|
||||
return metricResp;
|
||||
}
|
||||
|
||||
|
||||
@@ -117,7 +117,7 @@
|
||||
</update>
|
||||
|
||||
<select id="query" resultMap="ResultMapWithBLOBs">
|
||||
select *
|
||||
select t.*, (case when t1.id is not null then 1 else 0 end) as isTag
|
||||
from s2_dimension t
|
||||
left join (
|
||||
select *
|
||||
|
||||
@@ -128,7 +128,7 @@
|
||||
</update>
|
||||
|
||||
<select id="query" resultMap="ResultMapWithBLOBs">
|
||||
select t.*
|
||||
select t.*, (case when t1.id is not null then 1 else 0 end) as isTag
|
||||
from s2_metric t
|
||||
left join (
|
||||
select *
|
||||
|
||||
Reference in New Issue
Block a user