(improvement)(headless)Decrease the number of database queries to the s2_tag table.

This commit is contained in:
jerryjzhang
2024-08-08 13:56:59 +08:00
parent 9dbc8657e2
commit 794a448619
8 changed files with 9 additions and 88 deletions

View File

@@ -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;

View File

@@ -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;
}

View File

@@ -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(),

View File

@@ -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) {

View File

@@ -89,6 +89,7 @@ public class DimensionConverter {
}
dimensionResp.setType(getType(dimensionDO.getType()));
dimensionResp.setTypeEnum(TypeEnums.DIMENSION);
dimensionResp.setIsTag(dimensionDO.getIsTag());
return dimensionResp;
}

View File

@@ -107,6 +107,7 @@ public class MetricConverter {
if (metricDO.getDefineType() != null) {
metricResp.setMetricDefineType(MetricDefineType.valueOf(metricDO.getDefineType()));
}
metricResp.setIsTag(metricDO.getIsTag());
return metricResp;
}

View File

@@ -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 *

View File

@@ -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 *