(improvement)(Headless)Querying dimension values and dataSet interface with tag support. (#832)

This commit is contained in:
lexluo09
2024-03-19 22:05:14 +08:00
committed by GitHub
parent bd95552854
commit 5929c2aa90
20 changed files with 106 additions and 101 deletions

View File

@@ -1,11 +1,9 @@
package com.tencent.supersonic.headless.api.pojo; package com.tencent.supersonic.headless.api.pojo;
import com.tencent.supersonic.common.pojo.enums.QueryType;
import lombok.Data;
import java.util.HashSet; import java.util.HashSet;
import java.util.Optional; import java.util.Optional;
import java.util.Set; import java.util.Set;
import lombok.Data;
@Data @Data
public class DataSetSchema { public class DataSetSchema {
@@ -16,7 +14,6 @@ public class DataSetSchema {
private Set<SchemaElement> dimensionValues = new HashSet<>(); private Set<SchemaElement> dimensionValues = new HashSet<>();
private SchemaElement entity = new SchemaElement(); private SchemaElement entity = new SchemaElement();
private QueryConfig queryConfig; private QueryConfig queryConfig;
private QueryType queryType;
public SchemaElement getElement(SchemaElementType elementType, long elementID) { public SchemaElement getElement(SchemaElementType elementType, long elementID) {
Optional<SchemaElement> element = Optional.empty(); Optional<SchemaElement> element = Optional.empty();

View File

@@ -1,6 +1,5 @@
package com.tencent.supersonic.headless.api.pojo.request; package com.tencent.supersonic.headless.api.pojo.request;
import com.tencent.supersonic.common.pojo.enums.QueryType;
import com.tencent.supersonic.headless.api.pojo.DataSetDetail; import com.tencent.supersonic.headless.api.pojo.DataSetDetail;
import com.tencent.supersonic.headless.api.pojo.QueryConfig; import com.tencent.supersonic.headless.api.pojo.QueryConfig;
import com.tencent.supersonic.headless.api.pojo.SchemaItem; import com.tencent.supersonic.headless.api.pojo.SchemaItem;
@@ -22,8 +21,6 @@ public class DataSetReq extends SchemaItem {
private List<String> adminOrgs; private List<String> adminOrgs;
private QueryType queryType;
public String getAdmin() { public String getAdmin() {
if (admins == null) { if (admins == null) {
return null; return null;

View File

@@ -1,7 +1,6 @@
package com.tencent.supersonic.headless.api.pojo.response; package com.tencent.supersonic.headless.api.pojo.response;
import com.google.common.collect.Lists; import com.google.common.collect.Lists;
import com.tencent.supersonic.common.pojo.enums.QueryType;
import com.tencent.supersonic.headless.api.pojo.DataSetDetail; import com.tencent.supersonic.headless.api.pojo.DataSetDetail;
import com.tencent.supersonic.headless.api.pojo.DataSetModelConfig; import com.tencent.supersonic.headless.api.pojo.DataSetModelConfig;
import com.tencent.supersonic.headless.api.pojo.QueryConfig; import com.tencent.supersonic.headless.api.pojo.QueryConfig;
@@ -30,14 +29,16 @@ public class DataSetResp extends SchemaItem {
private QueryConfig queryConfig; private QueryConfig queryConfig;
private QueryType queryType; private List<TagItem> allMetrics = new ArrayList<>();
public List<Long> getAllMetrics() { private List<TagItem> allDimensions = new ArrayList<>();
public List<Long> metricIds() {
return getDataSetModelConfigs().stream().map(DataSetModelConfig::getMetrics) return getDataSetModelConfigs().stream().map(DataSetModelConfig::getMetrics)
.flatMap(Collection::stream).collect(Collectors.toList()); .flatMap(Collection::stream).collect(Collectors.toList());
} }
public List<Long> getAllDimensions() { public List<Long> dimensionIds() {
return getDataSetModelConfigs().stream().map(DataSetModelConfig::getDimensions) return getDataSetModelConfigs().stream().map(DataSetModelConfig::getDimensions)
.flatMap(Collection::stream).collect(Collectors.toList()); .flatMap(Collection::stream).collect(Collectors.toList());
} }

View File

@@ -15,8 +15,6 @@ public class DataSetSchemaResp extends DataSetResp {
private List<MetricSchemaResp> metrics = Lists.newArrayList(); private List<MetricSchemaResp> metrics = Lists.newArrayList();
private List<DimSchemaResp> dimensions = Lists.newArrayList(); private List<DimSchemaResp> dimensions = Lists.newArrayList();
private List<TagResp> tags = Lists.newArrayList();
private List<ModelResp> modelResps = Lists.newArrayList(); private List<ModelResp> modelResps = Lists.newArrayList();
public DimSchemaResp getPrimaryKey() { public DimSchemaResp getPrimaryKey() {

View File

@@ -0,0 +1,12 @@
package com.tencent.supersonic.headless.api.pojo.response;
import lombok.Data;
@Data
public class TagItem {
private Long itemId;
private int isTag;
}

View File

@@ -2,25 +2,22 @@ package com.tencent.supersonic.headless.core.pojo;
import com.fasterxml.jackson.annotation.JsonIgnore; import com.fasterxml.jackson.annotation.JsonIgnore;
import com.tencent.supersonic.auth.api.authentication.pojo.User; import com.tencent.supersonic.auth.api.authentication.pojo.User;
import com.tencent.supersonic.common.pojo.enums.QueryType;
import com.tencent.supersonic.common.util.ContextUtils; import com.tencent.supersonic.common.util.ContextUtils;
import com.tencent.supersonic.headless.api.pojo.DataSetSchema;
import com.tencent.supersonic.headless.api.pojo.SchemaMapInfo; import com.tencent.supersonic.headless.api.pojo.SchemaMapInfo;
import com.tencent.supersonic.headless.api.pojo.SemanticSchema; import com.tencent.supersonic.headless.api.pojo.SemanticSchema;
import com.tencent.supersonic.headless.api.pojo.request.QueryFilters; import com.tencent.supersonic.headless.api.pojo.request.QueryFilters;
import com.tencent.supersonic.headless.core.config.OptimizationConfig;
import com.tencent.supersonic.headless.core.chat.query.SemanticQuery; import com.tencent.supersonic.headless.core.chat.query.SemanticQuery;
import lombok.AllArgsConstructor; import com.tencent.supersonic.headless.core.config.OptimizationConfig;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Comparator; import java.util.Comparator;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.Set; import java.util.Set;
import java.util.stream.Collectors; import java.util.stream.Collectors;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data @Data
@Builder @Builder
@@ -51,10 +48,4 @@ public class QueryContext {
.collect(Collectors.toList()); .collect(Collectors.toList());
return candidateQueries; return candidateQueries;
} }
public QueryType getQueryType(Long dataSetId) {
SemanticSchema semanticSchema = this.semanticSchema;
DataSetSchema dataSetSchema = semanticSchema.getDataSetSchemaMap().get(dataSetId);
return dataSetSchema.getQueryType();
}
} }

View File

@@ -40,7 +40,4 @@ public class DataSetDO {
private String admin; private String admin;
private String adminOrg; private String adminOrg;
private String queryType;
} }

View File

@@ -29,14 +29,14 @@ public class DataSetController {
@PostMapping @PostMapping
public DataSetResp save(@RequestBody DataSetReq dataSetReq, public DataSetResp save(@RequestBody DataSetReq dataSetReq,
HttpServletRequest request, HttpServletResponse response) { HttpServletRequest request, HttpServletResponse response) {
User user = UserHolder.findUser(request, response); User user = UserHolder.findUser(request, response);
return dataSetService.save(dataSetReq, user); return dataSetService.save(dataSetReq, user);
} }
@PutMapping @PutMapping
public DataSetResp update(@RequestBody DataSetReq dataSetReq, public DataSetResp update(@RequestBody DataSetReq dataSetReq,
HttpServletRequest request, HttpServletResponse response) { HttpServletRequest request, HttpServletResponse response) {
User user = UserHolder.findUser(request, response); User user = UserHolder.findUser(request, response);
return dataSetService.update(dataSetReq, user); return dataSetService.update(dataSetReq, user);
} }
@@ -47,15 +47,17 @@ public class DataSetController {
} }
@GetMapping("/getDataSetList") @GetMapping("/getDataSetList")
public List<DataSetResp> getDataSetList(@RequestParam("domainId") Long domainId) { public List<DataSetResp> getDataSetList(@RequestParam("domainId") Long domainId,
HttpServletRequest request, HttpServletResponse response) {
MetaFilter metaFilter = new MetaFilter(); MetaFilter metaFilter = new MetaFilter();
metaFilter.setDomainId(domainId); metaFilter.setDomainId(domainId);
return dataSetService.getDataSetList(metaFilter); User user = UserHolder.findUser(request, response);
return dataSetService.getDataSetList(metaFilter, user);
} }
@DeleteMapping("/{id}") @DeleteMapping("/{id}")
public Boolean delete(@PathVariable("id") Long id, public Boolean delete(@PathVariable("id") Long id,
HttpServletRequest request, HttpServletResponse response) { HttpServletRequest request, HttpServletResponse response) {
User user = UserHolder.findUser(request, response); User user = UserHolder.findUser(request, response);
dataSetService.delete(id, user); dataSetService.delete(id, user);
return true; return true;

View File

@@ -18,11 +18,11 @@ public interface DataSetService {
DataSetResp getDataSet(Long id); DataSetResp getDataSet(Long id);
List<DataSetResp> getDataSetList(MetaFilter metaFilter); List<DataSetResp> getDataSetList(MetaFilter metaFilter, User user);
void delete(Long id, User user); void delete(Long id, User user);
Map<Long, List<Long>> getModelIdToDataSetIds(List<Long> dataSetIds); Map<Long, List<Long>> getModelIdToDataSetIds(List<Long> dataSetIds, User user);
Map<Long, List<Long>> getModelIdToDataSetIds(); Map<Long, List<Long>> getModelIdToDataSetIds();

View File

@@ -14,6 +14,7 @@ import com.tencent.supersonic.common.pojo.exception.InvalidArgumentException;
import com.tencent.supersonic.common.util.BeanMapper; import com.tencent.supersonic.common.util.BeanMapper;
import com.tencent.supersonic.headless.api.pojo.DataSetDetail; import com.tencent.supersonic.headless.api.pojo.DataSetDetail;
import com.tencent.supersonic.headless.api.pojo.QueryConfig; import com.tencent.supersonic.headless.api.pojo.QueryConfig;
import com.tencent.supersonic.headless.api.pojo.enums.TagDefineType;
import com.tencent.supersonic.headless.api.pojo.request.DataSetReq; import com.tencent.supersonic.headless.api.pojo.request.DataSetReq;
import com.tencent.supersonic.headless.api.pojo.request.QueryDataSetReq; import com.tencent.supersonic.headless.api.pojo.request.QueryDataSetReq;
import com.tencent.supersonic.headless.api.pojo.request.QuerySqlReq; import com.tencent.supersonic.headless.api.pojo.request.QuerySqlReq;
@@ -23,13 +24,17 @@ import com.tencent.supersonic.headless.api.pojo.response.DataSetResp;
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.DomainResp; import com.tencent.supersonic.headless.api.pojo.response.DomainResp;
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.TagItem;
import com.tencent.supersonic.headless.server.persistence.dataobject.DataSetDO; import com.tencent.supersonic.headless.server.persistence.dataobject.DataSetDO;
import com.tencent.supersonic.headless.server.persistence.dataobject.TagDO;
import com.tencent.supersonic.headless.server.persistence.mapper.DataSetDOMapper; import com.tencent.supersonic.headless.server.persistence.mapper.DataSetDOMapper;
import com.tencent.supersonic.headless.server.pojo.MetaFilter; import com.tencent.supersonic.headless.server.pojo.MetaFilter;
import com.tencent.supersonic.headless.server.pojo.TagFilter;
import com.tencent.supersonic.headless.server.service.DataSetService; import com.tencent.supersonic.headless.server.service.DataSetService;
import com.tencent.supersonic.headless.server.service.DimensionService; import com.tencent.supersonic.headless.server.service.DimensionService;
import com.tencent.supersonic.headless.server.service.DomainService; import com.tencent.supersonic.headless.server.service.DomainService;
import com.tencent.supersonic.headless.server.service.MetricService; import com.tencent.supersonic.headless.server.service.MetricService;
import com.tencent.supersonic.headless.server.service.TagMetaService;
import java.util.Arrays; import java.util.Arrays;
import java.util.Comparator; import java.util.Comparator;
import java.util.Date; import java.util.Date;
@@ -66,12 +71,16 @@ public class DataSetServiceImpl
@Autowired @Autowired
private MetricService metricService; private MetricService metricService;
@Lazy
@Autowired
private TagMetaService tagMetaService;
@Override @Override
public DataSetResp save(DataSetReq dataSetReq, User user) { public DataSetResp save(DataSetReq dataSetReq, User user) {
dataSetReq.createdBy(user.getName()); dataSetReq.createdBy(user.getName());
DataSetDO dataSetDO = convert(dataSetReq); DataSetDO dataSetDO = convert(dataSetReq);
dataSetDO.setStatus(StatusEnum.ONLINE.getCode()); dataSetDO.setStatus(StatusEnum.ONLINE.getCode());
DataSetResp dataSetResp = convert(dataSetDO); DataSetResp dataSetResp = convert(dataSetDO, user);
conflictCheck(dataSetResp); conflictCheck(dataSetResp);
save(dataSetDO); save(dataSetDO);
return dataSetResp; return dataSetResp;
@@ -81,7 +90,7 @@ public class DataSetServiceImpl
public DataSetResp update(DataSetReq dataSetReq, User user) { public DataSetResp update(DataSetReq dataSetReq, User user) {
dataSetReq.updatedBy(user.getName()); dataSetReq.updatedBy(user.getName());
DataSetDO dataSetDO = convert(dataSetReq); DataSetDO dataSetDO = convert(dataSetReq);
DataSetResp dataSetResp = convert(dataSetDO); DataSetResp dataSetResp = convert(dataSetDO, user);
conflictCheck(dataSetResp); conflictCheck(dataSetResp);
updateById(dataSetDO); updateById(dataSetDO);
return dataSetResp; return dataSetResp;
@@ -90,11 +99,11 @@ public class DataSetServiceImpl
@Override @Override
public DataSetResp getDataSet(Long id) { public DataSetResp getDataSet(Long id) {
DataSetDO dataSetDO = getById(id); DataSetDO dataSetDO = getById(id);
return convert(dataSetDO); return convert(dataSetDO, User.getFakeUser());
} }
@Override @Override
public List<DataSetResp> getDataSetList(MetaFilter metaFilter) { public List<DataSetResp> getDataSetList(MetaFilter metaFilter, User user) {
QueryWrapper<DataSetDO> wrapper = new QueryWrapper<>(); QueryWrapper<DataSetDO> wrapper = new QueryWrapper<>();
if (metaFilter.getDomainId() != null) { if (metaFilter.getDomainId() != null) {
wrapper.lambda().eq(DataSetDO::getDomainId, metaFilter.getDomainId()); wrapper.lambda().eq(DataSetDO::getDomainId, metaFilter.getDomainId());
@@ -106,7 +115,7 @@ public class DataSetServiceImpl
wrapper.lambda().eq(DataSetDO::getStatus, metaFilter.getStatus()); wrapper.lambda().eq(DataSetDO::getStatus, metaFilter.getStatus());
} }
wrapper.lambda().ne(DataSetDO::getStatus, StatusEnum.DELETED.getCode()); wrapper.lambda().ne(DataSetDO::getStatus, StatusEnum.DELETED.getCode());
return list(wrapper).stream().map(this::convert).collect(Collectors.toList()); return list(wrapper).stream().map(entry -> convert(entry, user)).collect(Collectors.toList());
} }
@Override @Override
@@ -120,13 +129,13 @@ public class DataSetServiceImpl
@Override @Override
public List<DataSetResp> getDataSets(User user) { public List<DataSetResp> getDataSets(User user) {
List<DataSetResp> dataSetResps = getDataSetList(new MetaFilter()); List<DataSetResp> dataSetResps = getDataSetList(new MetaFilter(), user);
return getDataSetFilterByAuth(dataSetResps, user); return getDataSetFilterByAuth(dataSetResps, user);
} }
@Override @Override
public List<DataSetResp> getDataSetsInheritAuth(User user, Long domainId) { public List<DataSetResp> getDataSetsInheritAuth(User user, Long domainId) {
List<DataSetResp> dataSetResps = getDataSetList(new MetaFilter()); List<DataSetResp> dataSetResps = getDataSetList(new MetaFilter(), user);
List<DataSetResp> inheritAuthFormDomain = getDataSetFilterByDomainAuth(dataSetResps, user); List<DataSetResp> inheritAuthFormDomain = getDataSetFilterByDomainAuth(dataSetResps, user);
Set<DataSetResp> dataSetRespSet = new HashSet<>(inheritAuthFormDomain); Set<DataSetResp> dataSetRespSet = new HashSet<>(inheritAuthFormDomain);
List<DataSetResp> dataSetFilterByAuth = getDataSetFilterByAuth(dataSetResps, user); List<DataSetResp> dataSetFilterByAuth = getDataSetFilterByAuth(dataSetResps, user);
@@ -155,7 +164,22 @@ public class DataSetServiceImpl
domainIds.contains(dataSetResp.getDomainId())).collect(Collectors.toList()); domainIds.contains(dataSetResp.getDomainId())).collect(Collectors.toList());
} }
private DataSetResp convert(DataSetDO dataSetDO) { private List<TagItem> getTagItems(User user, List<Long> dimensionIds, TagDefineType tagDefineType) {
TagFilter tagFilter = new TagFilter();
tagFilter.setTagDefineType(tagDefineType);
tagFilter.setItemIds(dimensionIds);
Set<Long> dimensionItemSet = tagMetaService.getTagDOList(tagFilter, user).stream().map(TagDO::getItemId)
.collect(Collectors.toSet());
return dimensionIds.stream().map(entry -> {
TagItem tagItem = new TagItem();
tagItem.setIsTag(Boolean.compare(dimensionItemSet.contains(entry), false));
tagItem.setItemId(entry);
return tagItem;
}
).collect(Collectors.toList());
}
private DataSetResp convert(DataSetDO dataSetDO, User user) {
DataSetResp dataSetResp = new DataSetResp(); DataSetResp dataSetResp = new DataSetResp();
BeanMapper.mapper(dataSetDO, dataSetResp); BeanMapper.mapper(dataSetDO, dataSetResp);
dataSetResp.setDataSetDetail(JSONObject.parseObject(dataSetDO.getDataSetDetail(), DataSetDetail.class)); dataSetResp.setDataSetDetail(JSONObject.parseObject(dataSetDO.getDataSetDetail(), DataSetDetail.class));
@@ -167,6 +191,11 @@ public class DataSetServiceImpl
dataSetResp.setAdminOrgs(StringUtils.isBlank(dataSetDO.getAdminOrg()) dataSetResp.setAdminOrgs(StringUtils.isBlank(dataSetDO.getAdminOrg())
? Lists.newArrayList() : Arrays.asList(dataSetDO.getAdminOrg().split(","))); ? Lists.newArrayList() : Arrays.asList(dataSetDO.getAdminOrg().split(",")));
dataSetResp.setTypeEnum(TypeEnums.DATASET); dataSetResp.setTypeEnum(TypeEnums.DATASET);
List<TagItem> dimensionItems = getTagItems(user, dataSetResp.dimensionIds(), TagDefineType.DIMENSION);
dataSetResp.setAllDimensions(dimensionItems);
List<TagItem> metricItems = getTagItems(user, dataSetResp.metricIds(), TagDefineType.METRIC);
dataSetResp.setAllMetrics(metricItems);
return dataSetResp; return dataSetResp;
} }
@@ -197,13 +226,13 @@ public class DataSetServiceImpl
} }
@Override @Override
public Map<Long, List<Long>> getModelIdToDataSetIds(List<Long> dataSetIds) { public Map<Long, List<Long>> getModelIdToDataSetIds(List<Long> dataSetIds, User user) {
MetaFilter metaFilter = new MetaFilter(); MetaFilter metaFilter = new MetaFilter();
metaFilter.setStatus(StatusEnum.ONLINE.getCode()); metaFilter.setStatus(StatusEnum.ONLINE.getCode());
metaFilter.setIds(dataSetIds); metaFilter.setIds(dataSetIds);
List<DataSetResp> dataSetList = dataSetSchemaCache.getIfPresent(metaFilter); List<DataSetResp> dataSetList = dataSetSchemaCache.getIfPresent(metaFilter);
if (CollectionUtils.isEmpty(dataSetList)) { if (CollectionUtils.isEmpty(dataSetList)) {
dataSetList = getDataSetList(metaFilter); dataSetList = getDataSetList(metaFilter, user);
dataSetSchemaCache.put(metaFilter, dataSetList); dataSetSchemaCache.put(metaFilter, dataSetList);
} }
return dataSetList.stream() return dataSetList.stream()
@@ -216,12 +245,12 @@ public class DataSetServiceImpl
@Override @Override
public Map<Long, List<Long>> getModelIdToDataSetIds() { public Map<Long, List<Long>> getModelIdToDataSetIds() {
return getModelIdToDataSetIds(Lists.newArrayList()); return getModelIdToDataSetIds(Lists.newArrayList(), User.getFakeUser());
} }
private void conflictCheck(DataSetResp dataSetResp) { private void conflictCheck(DataSetResp dataSetResp) {
List<Long> allDimensionIds = dataSetResp.getAllDimensions(); List<Long> allDimensionIds = dataSetResp.dimensionIds();
List<Long> allMetricIds = dataSetResp.getAllMetrics(); List<Long> allMetricIds = dataSetResp.metricIds();
MetaFilter metaFilter = new MetaFilter(); MetaFilter metaFilter = new MetaFilter();
if (!CollectionUtils.isEmpty(allDimensionIds)) { if (!CollectionUtils.isEmpty(allDimensionIds)) {
metaFilter.setIds(allDimensionIds); metaFilter.setIds(allDimensionIds);

View File

@@ -161,7 +161,7 @@ public class SchemaServiceImpl implements SchemaService {
MetaFilter metaFilter = new MetaFilter(); MetaFilter metaFilter = new MetaFilter();
metaFilter.setStatus(StatusEnum.ONLINE.getCode()); metaFilter.setStatus(StatusEnum.ONLINE.getCode());
metaFilter.setIds(filter.getDataSetIds()); metaFilter.setIds(filter.getDataSetIds());
List<DataSetResp> dataSetResps = dataSetService.getDataSetList(metaFilter); List<DataSetResp> dataSetResps = dataSetService.getDataSetList(metaFilter, User.getFakeUser());
Map<Long, DataSetResp> dataSetRespMap = getDataSetMap(dataSetResps); Map<Long, DataSetResp> dataSetRespMap = getDataSetMap(dataSetResps);
List<Long> modelIds = dataSetRespMap.values().stream().map(DataSetResp::getAllModels) List<Long> modelIds = dataSetRespMap.values().stream().map(DataSetResp::getAllModels)
@@ -337,7 +337,6 @@ public class SchemaServiceImpl implements SchemaService {
semanticSchemaResp.setModelRelas(modelRelas); semanticSchemaResp.setModelRelas(modelRelas);
semanticSchemaResp.setModelIds(modelIds); semanticSchemaResp.setModelIds(modelIds);
semanticSchemaResp.setSchemaType(SchemaType.VIEW); semanticSchemaResp.setSchemaType(SchemaType.VIEW);
semanticSchemaResp.setQueryType(dataSetSchemaResp.getQueryType());
} else if (!CollectionUtils.isEmpty(schemaFilterReq.getModelIds())) { } else if (!CollectionUtils.isEmpty(schemaFilterReq.getModelIds())) {
List<ModelSchemaResp> modelSchemaResps = fetchModelSchemaResps(schemaFilterReq.getModelIds()); List<ModelSchemaResp> modelSchemaResps = fetchModelSchemaResps(schemaFilterReq.getModelIds());
semanticSchemaResp.setMetrics(modelSchemaResps.stream().map(ModelSchemaResp::getMetrics) semanticSchemaResp.setMetrics(modelSchemaResps.stream().map(ModelSchemaResp::getMetrics)
@@ -402,7 +401,7 @@ public class SchemaServiceImpl implements SchemaService {
} }
parentItem.getChildren().add(itemResp); parentItem.getChildren().add(itemResp);
} }
List<DataSetResp> dataSetResps = dataSetService.getDataSetList(new MetaFilter()); List<DataSetResp> dataSetResps = dataSetService.getDataSetList(new MetaFilter(), User.getFakeUser());
for (DataSetResp dataSetResp : dataSetResps) { for (DataSetResp dataSetResp : dataSetResps) {
ItemResp itemResp = itemRespMap.get(dataSetResp.getDomainId()); ItemResp itemResp = itemRespMap.get(dataSetResp.getDomainId());
if (itemResp != null) { if (itemResp != null) {

View File

@@ -1,6 +1,7 @@
package com.tencent.supersonic.headless.server.service.impl; package com.tencent.supersonic.headless.server.service.impl;
import com.google.common.collect.Lists; import com.google.common.collect.Lists;
import com.tencent.supersonic.auth.api.authentication.pojo.User;
import com.tencent.supersonic.common.pojo.enums.DictWordType; import com.tencent.supersonic.common.pojo.enums.DictWordType;
import com.tencent.supersonic.headless.api.pojo.SchemaElement; import com.tencent.supersonic.headless.api.pojo.SchemaElement;
import com.tencent.supersonic.headless.api.pojo.SchemaElementType; import com.tencent.supersonic.headless.api.pojo.SchemaElementType;
@@ -70,7 +71,7 @@ public class SearchServiceImpl implements SearchService {
List<SchemaElement> metricsDb = semanticSchemaDb.getMetrics(); List<SchemaElement> metricsDb = semanticSchemaDb.getMetrics();
final Map<Long, String> dataSetIdToName = semanticSchemaDb.getDataSetIdToName(); final Map<Long, String> dataSetIdToName = semanticSchemaDb.getDataSetIdToName();
Map<Long, List<Long>> modelIdToDataSetIds = Map<Long, List<Long>> modelIdToDataSetIds =
dataSetService.getModelIdToDataSetIds(new ArrayList<>(dataSetIdToName.keySet())); dataSetService.getModelIdToDataSetIds(new ArrayList<>(dataSetIdToName.keySet()), User.getFakeUser());
// 2.detect by segment // 2.detect by segment
List<S2Term> originals = knowledgeService.getTerms(queryText, modelIdToDataSetIds); List<S2Term> originals = knowledgeService.getTerms(queryText, modelIdToDataSetIds);
log.info("hanlp parse result: {}", originals); log.info("hanlp parse result: {}", originals);

View File

@@ -13,7 +13,7 @@ import com.tencent.supersonic.headless.api.pojo.ValueDistribution;
import com.tencent.supersonic.headless.api.pojo.enums.TagDefineType; import com.tencent.supersonic.headless.api.pojo.enums.TagDefineType;
import com.tencent.supersonic.headless.api.pojo.request.ItemValueReq; import com.tencent.supersonic.headless.api.pojo.request.ItemValueReq;
import com.tencent.supersonic.headless.api.pojo.request.QuerySqlReq; import com.tencent.supersonic.headless.api.pojo.request.QuerySqlReq;
import com.tencent.supersonic.headless.api.pojo.request.QueryTagReq; import com.tencent.supersonic.headless.api.pojo.request.QueryStructReq;
import com.tencent.supersonic.headless.api.pojo.response.ItemValueResp; import com.tencent.supersonic.headless.api.pojo.response.ItemValueResp;
import com.tencent.supersonic.headless.api.pojo.response.ModelResp; 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.SemanticQueryResp;
@@ -50,7 +50,7 @@ public class TagQueryServiceImpl implements TagQueryService {
private final ModelService modelService; private final ModelService modelService;
public TagQueryServiceImpl(TagMetaService tagMetaService, QueryService queryService, public TagQueryServiceImpl(TagMetaService tagMetaService, QueryService queryService,
ModelService modelService) { ModelService modelService) {
this.tagMetaService = tagMetaService; this.tagMetaService = tagMetaService;
this.queryService = queryService; this.queryService = queryService;
this.modelService = modelService; this.modelService = modelService;
@@ -60,7 +60,7 @@ public class TagQueryServiceImpl implements TagQueryService {
public ItemValueResp queryTagValue(ItemValueReq itemValueReq, User user) throws Exception { public ItemValueResp queryTagValue(ItemValueReq itemValueReq, User user) throws Exception {
ItemValueResp itemValueResp = new ItemValueResp(); ItemValueResp itemValueResp = new ItemValueResp();
itemValueResp.setItemId(itemValueReq.getItemId()); itemValueResp.setItemId(itemValueReq.getItemId());
itemValueResp.setType(SchemaElementType.DIMENSION); itemValueResp.setType(SchemaElementType.TAG);
TagResp tag = tagMetaService.getTag(itemValueReq.getItemId(), user); TagResp tag = tagMetaService.getTag(itemValueReq.getItemId(), user);
checkTag(tag); checkTag(tag);
itemValueResp.setName(tag.getName()); itemValueResp.setName(tag.getName());
@@ -69,8 +69,8 @@ public class TagQueryServiceImpl implements TagQueryService {
// tag total count // tag total count
Long totalCount = queryTagTotalCount(tag, itemValueReq, user); Long totalCount = queryTagTotalCount(tag, itemValueReq, user);
// tag value // tag value
QueryTagReq queryTagReq = generateTagReq(tag, itemValueReq); QueryStructReq queryStructReq = generateReq(tag, itemValueReq);
SemanticQueryResp semanticQueryResp = queryService.queryByReq(queryTagReq, user); SemanticQueryResp semanticQueryResp = queryService.queryByReq(queryStructReq, user);
fillTagValueInfo(itemValueResp, semanticQueryResp, totalCount); fillTagValueInfo(itemValueResp, semanticQueryResp, totalCount);
return itemValueResp; return itemValueResp;
} }
@@ -102,28 +102,7 @@ public class TagQueryServiceImpl implements TagQueryService {
private String queryTagDate(Dim dim) { private String queryTagDate(Dim dim) {
DateTimeFormatter formatter = DateTimeFormatter.ofPattern(dim.getDateFormat()); DateTimeFormatter formatter = DateTimeFormatter.ofPattern(dim.getDateFormat());
String endDate = LocalDate.now().plusDays(-dayBefore).format(formatter); return LocalDate.now().plusDays(-dayBefore).format(formatter);
return endDate;
}
private String queryTagDateFromDbByStruct(Dim dim, TagResp tag, User user) throws Exception {
QueryTagReq queryTagReq = new QueryTagReq();
queryTagReq.addModelId(tag.getModelId());
queryTagReq.setLimit(1L);
List<Aggregator> aggregators = new ArrayList<>();
aggregators.add(new Aggregator(dim.getBizName(), AggOperatorEnum.MAX, maxDateAlias));
queryTagReq.setAggregators(aggregators);
queryTagReq.setDateInfo(null);
log.info("queryTagDateFromDb, queryTagReq:{}", queryTagReq.toCustomizedString());
SemanticQueryResp semanticQueryResp = queryService.queryByReq(queryTagReq, user);
if (!CollectionUtils.isEmpty(semanticQueryResp.getResultList())) {
Object date = semanticQueryResp.getResultList().get(0).get(maxDateAlias);
if (Objects.nonNull(date)) {
return date.toString();
}
}
throw new RuntimeException("queryTagTotalCount error");
} }
private String queryTagDateFromDbBySql(Dim dim, TagResp tag, User user) throws Exception { private String queryTagDateFromDbBySql(Dim dim, TagResp tag, User user) throws Exception {
@@ -156,16 +135,16 @@ public class TagQueryServiceImpl implements TagQueryService {
private Long queryTagTotalCount(TagResp tag, ItemValueReq itemValueReq, User user) throws Exception { private Long queryTagTotalCount(TagResp tag, ItemValueReq itemValueReq, User user) throws Exception {
QueryTagReq queryTagReq = new QueryTagReq(); QueryStructReq queryStructReq = new QueryStructReq();
queryTagReq.addModelId(tag.getModelId()); queryStructReq.addModelId(tag.getModelId());
queryTagReq.setLimit(1L); queryStructReq.setLimit(1L);
List<Aggregator> aggregators = new ArrayList<>(); List<Aggregator> aggregators = new ArrayList<>();
aggregators.add(new Aggregator(tag.getBizName(), AggOperatorEnum.COUNT, tagValueAlias)); aggregators.add(new Aggregator(tag.getBizName(), AggOperatorEnum.COUNT, tagValueAlias));
queryTagReq.setAggregators(aggregators); queryStructReq.setAggregators(aggregators);
DateConf dateConf = generateDateConf(itemValueReq); DateConf dateConf = generateDateConf(itemValueReq);
queryTagReq.setDateInfo(dateConf); queryStructReq.setDateInfo(dateConf);
SemanticQueryResp semanticQueryResp = queryService.queryByReq(queryTagReq, user); SemanticQueryResp semanticQueryResp = queryService.queryByReq(queryStructReq, user);
if (!CollectionUtils.isEmpty(semanticQueryResp.getResultList())) { if (!CollectionUtils.isEmpty(semanticQueryResp.getResultList())) {
Object total = semanticQueryResp.getResultList().get(0).get(tagValueAlias); Object total = semanticQueryResp.getResultList().get(0).get(tagValueAlias);
if (Objects.nonNull(total)) { if (Objects.nonNull(total)) {
@@ -194,24 +173,24 @@ public class TagQueryServiceImpl implements TagQueryService {
itemValueResp.setValueDistributionList(valueDistributionList); itemValueResp.setValueDistributionList(valueDistributionList);
} }
private QueryTagReq generateTagReq(TagResp tag, ItemValueReq itemValueReq) { private QueryStructReq generateReq(TagResp tag, ItemValueReq itemValueReq) {
QueryTagReq queryTagReq = new QueryTagReq(); QueryStructReq queryStructReq = new QueryStructReq();
queryTagReq.addModelId(tag.getModelId()); queryStructReq.addModelId(tag.getModelId());
queryTagReq.setGroups(new ArrayList<>(Arrays.asList(tag.getBizName()))); queryStructReq.setGroups(new ArrayList<>(Arrays.asList(tag.getBizName())));
queryTagReq.setLimit(itemValueReq.getLimit()); queryStructReq.setLimit(itemValueReq.getLimit());
List<Aggregator> aggregators = new ArrayList<>(); List<Aggregator> aggregators = new ArrayList<>();
aggregators.add(new Aggregator(tag.getBizName(), AggOperatorEnum.COUNT, tagValueAlias)); aggregators.add(new Aggregator(tag.getBizName(), AggOperatorEnum.COUNT, tagValueAlias));
queryTagReq.setAggregators(aggregators); queryStructReq.setAggregators(aggregators);
List<Order> orders = new ArrayList<>(); List<Order> orders = new ArrayList<>();
orders.add(new Order(String.format("count(%s)", tag.getBizName()), DESC_UPPER)); orders.add(new Order(String.format("count(%s)", tag.getBizName()), DESC_UPPER));
queryTagReq.setOrders(orders); queryStructReq.setOrders(orders);
DateConf dateConf = generateDateConf(itemValueReq); DateConf dateConf = generateDateConf(itemValueReq);
queryTagReq.setDateInfo(dateConf); queryStructReq.setDateInfo(dateConf);
return queryTagReq; return queryStructReq;
} }
private DateConf generateDateConf(ItemValueReq itemValueReq) { private DateConf generateDateConf(ItemValueReq itemValueReq) {

View File

@@ -28,7 +28,6 @@ public class DataSetSchemaBuilder {
public static DataSetSchema build(DataSetSchemaResp resp) { public static DataSetSchema build(DataSetSchemaResp resp) {
DataSetSchema dataSetSchema = new DataSetSchema(); DataSetSchema dataSetSchema = new DataSetSchema();
dataSetSchema.setQueryConfig(resp.getQueryConfig()); dataSetSchema.setQueryConfig(resp.getQueryConfig());
dataSetSchema.setQueryType(resp.getQueryType());
SchemaElement dataSet = SchemaElement.builder() SchemaElement dataSet = SchemaElement.builder()
.dataSet(resp.getId()) .dataSet(resp.getId())
.id(resp.getId()) .id(resp.getId())

View File

@@ -86,7 +86,7 @@ public class DimensionConverter {
public static List<DimensionResp> filterByDataSet(List<DimensionResp> dimensionResps, DataSetResp dataSetResp) { public static List<DimensionResp> filterByDataSet(List<DimensionResp> dimensionResps, DataSetResp dataSetResp) {
return dimensionResps.stream().filter(dimensionResp -> return dimensionResps.stream().filter(dimensionResp ->
dataSetResp.getAllDimensions().contains(dimensionResp.getId()) dataSetResp.dimensionIds().contains(dimensionResp.getId())
|| dataSetResp.getAllIncludeAllModels().contains(dimensionResp.getModelId())) || dataSetResp.getAllIncludeAllModels().contains(dimensionResp.getModelId()))
.collect(Collectors.toList()); .collect(Collectors.toList());
} }

View File

@@ -101,7 +101,7 @@ public class MetricConverter {
public static List<MetricResp> filterByDataSet(List<MetricResp> metricResps, DataSetResp dataSetResp) { public static List<MetricResp> filterByDataSet(List<MetricResp> metricResps, DataSetResp dataSetResp) {
return metricResps.stream().filter(metricResp -> return metricResps.stream().filter(metricResp ->
dataSetResp.getAllMetrics().contains(metricResp.getId()) dataSetResp.metricIds().contains(metricResp.getId())
|| dataSetResp.getAllIncludeAllModels().contains(metricResp.getModelId())) || dataSetResp.getAllIncludeAllModels().contains(metricResp.getModelId()))
.collect(Collectors.toList()); .collect(Collectors.toList());
} }

View File

@@ -52,13 +52,13 @@
<select id="queryTagRespList" resultMap="TagResp"> <select id="queryTagRespList" resultMap="TagResp">
select * from ( select * from (
select s2_tag.id as id, s2_dimension.model_id as model_id, "DIMENSION" as tag_define_type, s2_dimension.id as item_id, select s2_tag.id as id, s2_dimension.model_id as model_id, 'DIMENSION' as tag_define_type, s2_dimension.id as item_id,
s2_dimension.name as name, s2_dimension.biz_name as biz_name, s2_dimension.description as description, s2_tag.updated_at as updated_at s2_dimension.name as name, s2_dimension.biz_name as biz_name, s2_dimension.description as description, s2_tag.updated_at as updated_at
from s2_tag join s2_dimension from s2_tag join s2_dimension
on s2_tag.item_id = s2_dimension.id on s2_tag.item_id = s2_dimension.id
where s2_dimension.status=1 where s2_dimension.status=1
union union
select s2_tag.id as id, s2_metric.model_id as model_id, "METRIC" as tag_define_type, s2_metric.id as item_id, select s2_tag.id as id, s2_metric.model_id as model_id, 'METRIC' as tag_define_type, s2_metric.id as item_id,
s2_metric.name as name, s2_metric.biz_name as biz_name, s2_metric.description as description, s2_tag.updated_at as updated_at s2_metric.name as name, s2_metric.biz_name as biz_name, s2_metric.description as description, s2_tag.updated_at as updated_at
from s2_tag join s2_metric from s2_tag join s2_metric
on s2_tag.item_id = s2_metric.id on s2_tag.item_id = s2_metric.id

View File

@@ -258,6 +258,7 @@ CREATE TABLE IF NOT EXISTS s2_tag(
`id` INT NOT NULL AUTO_INCREMENT, `id` INT NOT NULL AUTO_INCREMENT,
`item_id` INT NOT NULL , `item_id` INT NOT NULL ,
`type` varchar(255) NOT NULL , `type` varchar(255) NOT NULL ,
`tag_define_type` varchar(20) NOT NULL , --DIMENSION,METRIC
`created_at` TIMESTAMP NOT NULL , `created_at` TIMESTAMP NOT NULL ,
`created_by` varchar(100) NOT NULL , `created_by` varchar(100) NOT NULL ,
`updated_at` TIMESTAMP DEFAULT NULL , `updated_at` TIMESTAMP DEFAULT NULL ,

View File

@@ -579,6 +579,7 @@ CREATE TABLE IF NOT EXISTS `s2_data_set` (
CREATE TABLE IF NOT EXISTS `s2_tag` ( CREATE TABLE IF NOT EXISTS `s2_tag` (
`id` INT NOT NULL AUTO_INCREMENT, `id` INT NOT NULL AUTO_INCREMENT,
`item_id` INT NOT NULL , `item_id` INT NOT NULL ,
`tag_define_type` varchar(20) NOT NULL , --DIMENSION,METRIC
`type` varchar(50) NOT NULL , -- ATOMIC, DERIVED `type` varchar(50) NOT NULL , -- ATOMIC, DERIVED
`created_at` TIMESTAMP NOT NULL , `created_at` TIMESTAMP NOT NULL ,
`created_by` varchar(100) NOT NULL , `created_by` varchar(100) NOT NULL ,

View File

@@ -581,6 +581,7 @@ CREATE TABLE IF NOT EXISTS `s2_tag` (
`id` INT NOT NULL AUTO_INCREMENT, `id` INT NOT NULL AUTO_INCREMENT,
`item_id` INT NOT NULL , `item_id` INT NOT NULL ,
`type` varchar(50) NOT NULL , -- ATOMIC, DERIVED `type` varchar(50) NOT NULL , -- ATOMIC, DERIVED
`tag_define_type` varchar(20) NOT NULL , --DIMENSION,METRIC
`created_at` TIMESTAMP NOT NULL , `created_at` TIMESTAMP NOT NULL ,
`created_by` varchar(100) NOT NULL , `created_by` varchar(100) NOT NULL ,
`updated_at` TIMESTAMP DEFAULT NULL , `updated_at` TIMESTAMP DEFAULT NULL ,