From d10801ef38cc8f762a88e0620dc50273b82fae80 Mon Sep 17 00:00:00 2001 From: lexluo09 <39718951+lexluo09@users.noreply.github.com> Date: Tue, 20 Feb 2024 20:36:57 +0800 Subject: [PATCH] [improvement](Headless) Optimize the issue of integrating the Headless knowledge dictionary. (#731) --- .../core/mapper/HanlpDictMatchStrategy.java | 15 +++++---- .../chat/core/mapper/SearchMatchStrategy.java | 9 ++++-- .../server/service/impl/QueryServiceImpl.java | 16 ++++++---- .../api/pojo/request/QueryMetricReq.java | 21 ++++++++++++ .../headless/server/pojo/MetaFilter.java | 26 +++++++++++++++ .../server/rest/MetricApiController.java | 32 +++++++++++++++++++ .../headless/server/service/QueryService.java | 3 ++ .../headless/server/service/ViewService.java | 3 +- .../service/impl/KnowledgeServiceImpl.java | 27 ++++------------ .../impl/MetaEmbeddingServiceImpl.java | 22 ++----------- .../server/service/impl/QueryServiceImpl.java | 8 ++++- .../server/service/impl/ViewServiceImpl.java | 13 ++++++-- 12 files changed, 136 insertions(+), 59 deletions(-) create mode 100644 headless/api/src/main/java/com/tencent/supersonic/headless/api/pojo/request/QueryMetricReq.java create mode 100644 headless/server/src/main/java/com/tencent/supersonic/headless/server/rest/MetricApiController.java diff --git a/chat/core/src/main/java/com/tencent/supersonic/chat/core/mapper/HanlpDictMatchStrategy.java b/chat/core/src/main/java/com/tencent/supersonic/chat/core/mapper/HanlpDictMatchStrategy.java index 41f425824..62a5e8615 100644 --- a/chat/core/src/main/java/com/tencent/supersonic/chat/core/mapper/HanlpDictMatchStrategy.java +++ b/chat/core/src/main/java/com/tencent/supersonic/chat/core/mapper/HanlpDictMatchStrategy.java @@ -1,11 +1,11 @@ package com.tencent.supersonic.chat.core.mapper; import com.tencent.supersonic.chat.core.config.OptimizationConfig; -import com.tencent.supersonic.headless.api.pojo.response.S2Term; -import com.tencent.supersonic.headless.core.knowledge.HanlpMapResult; -import com.tencent.supersonic.headless.core.knowledge.SearchService; import com.tencent.supersonic.chat.core.pojo.QueryContext; import com.tencent.supersonic.common.pojo.Constants; +import com.tencent.supersonic.headless.api.pojo.response.S2Term; +import com.tencent.supersonic.headless.core.knowledge.HanlpMapResult; +import com.tencent.supersonic.headless.server.service.KnowledgeService; import java.util.HashMap; import java.util.LinkedHashSet; import java.util.List; @@ -34,6 +34,9 @@ public class HanlpDictMatchStrategy extends BaseMatchStrategy { @Autowired private OptimizationConfig optimizationConfig; + @Autowired + private KnowledgeService knowledgeService; + @Override public Map> match(QueryContext queryContext, List terms, Set detectViewIds) { @@ -61,10 +64,10 @@ public class HanlpDictMatchStrategy extends BaseMatchStrategy { String detectSegment, int offset) { // step1. pre search Integer oneDetectionMaxSize = optimizationConfig.getOneDetectionMaxSize(); - LinkedHashSet hanlpMapResults = SearchService.prefixSearch(detectSegment, oneDetectionMaxSize, - detectViewIds).stream().collect(Collectors.toCollection(LinkedHashSet::new)); + LinkedHashSet hanlpMapResults = knowledgeService.prefixSearch(detectSegment, + oneDetectionMaxSize, detectViewIds).stream().collect(Collectors.toCollection(LinkedHashSet::new)); // step2. suffix search - LinkedHashSet suffixHanlpMapResults = SearchService.suffixSearch(detectSegment, + LinkedHashSet suffixHanlpMapResults = knowledgeService.suffixSearch(detectSegment, oneDetectionMaxSize, detectViewIds).stream().collect(Collectors.toCollection(LinkedHashSet::new)); hanlpMapResults.addAll(suffixHanlpMapResults); diff --git a/chat/core/src/main/java/com/tencent/supersonic/chat/core/mapper/SearchMatchStrategy.java b/chat/core/src/main/java/com/tencent/supersonic/chat/core/mapper/SearchMatchStrategy.java index 717c0ee42..b7dfd1e39 100644 --- a/chat/core/src/main/java/com/tencent/supersonic/chat/core/mapper/SearchMatchStrategy.java +++ b/chat/core/src/main/java/com/tencent/supersonic/chat/core/mapper/SearchMatchStrategy.java @@ -6,6 +6,7 @@ import com.tencent.supersonic.headless.core.knowledge.HanlpMapResult; import com.tencent.supersonic.headless.core.knowledge.SearchService; import com.tencent.supersonic.chat.core.pojo.QueryContext; import com.tencent.supersonic.common.pojo.enums.DictWordType; +import com.tencent.supersonic.headless.server.service.KnowledgeService; import java.util.List; import java.util.Map; import java.util.Objects; @@ -14,6 +15,7 @@ import java.util.concurrent.ConcurrentHashMap; import java.util.stream.Collectors; import org.apache.commons.collections.CollectionUtils; import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; /** @@ -25,6 +27,9 @@ public class SearchMatchStrategy extends BaseMatchStrategy { private static final int SEARCH_SIZE = 3; + @Autowired + private KnowledgeService knowledgeService; + @Override public Map> match(QueryContext queryContext, List originals, Set detectViewIds) { @@ -51,9 +56,9 @@ public class SearchMatchStrategy extends BaseMatchStrategy { String detectSegment = text.substring(detectIndex); if (StringUtils.isNotEmpty(detectSegment)) { - List hanlpMapResults = SearchService.prefixSearch(detectSegment, + List hanlpMapResults = knowledgeService.prefixSearch(detectSegment, SearchService.SEARCH_SIZE, detectViewIds); - List suffixHanlpMapResults = SearchService.suffixSearch( + List suffixHanlpMapResults = knowledgeService.suffixSearch( detectSegment, SEARCH_SIZE, detectViewIds); hanlpMapResults.addAll(suffixHanlpMapResults); // remove entity name where search diff --git a/chat/server/src/main/java/com/tencent/supersonic/chat/server/service/impl/QueryServiceImpl.java b/chat/server/src/main/java/com/tencent/supersonic/chat/server/service/impl/QueryServiceImpl.java index bef576c6a..469b983a0 100644 --- a/chat/server/src/main/java/com/tencent/supersonic/chat/server/service/impl/QueryServiceImpl.java +++ b/chat/server/src/main/java/com/tencent/supersonic/chat/server/service/impl/QueryServiceImpl.java @@ -66,6 +66,7 @@ import com.tencent.supersonic.common.util.jsqlparser.SqlReplaceHelper; import com.tencent.supersonic.common.util.jsqlparser.SqlSelectHelper; import com.tencent.supersonic.headless.api.pojo.request.QueryStructReq; import com.tencent.supersonic.headless.api.pojo.response.SemanticQueryResp; +import com.tencent.supersonic.headless.server.service.KnowledgeService; import lombok.extern.slf4j.Slf4j; import net.sf.jsqlparser.expression.Expression; import net.sf.jsqlparser.expression.LongValue; @@ -122,6 +123,9 @@ public class QueryServiceImpl implements QueryService { @Autowired private PluginService pluginService; + @Autowired + private KnowledgeService knowledgeService; + @Value("${time.threshold: 100}") private Integer timeThreshold; @@ -637,10 +641,10 @@ public class QueryServiceImpl implements QueryService { SemanticService semanticService = ContextUtils.getBean(SemanticService.class); SemanticSchema semanticSchema = semanticService.getSemanticSchema(); SchemaElement schemaElement = semanticSchema.getDimension(dimensionValueReq.getElementID()); - Set detectModelIds = new HashSet<>(); - detectModelIds.add(schemaElement.getView()); + Set detectViewIds = new HashSet<>(); + detectViewIds.add(schemaElement.getView()); dimensionValueReq.setModelId(schemaElement.getView()); - List dimensionValues = getDimensionValues(dimensionValueReq, detectModelIds); + List dimensionValues = getDimensionValues(dimensionValueReq, detectViewIds); // if the search results is null,search dimensionValue from database if (CollectionUtils.isEmpty(dimensionValues)) { semanticQueryResp = queryDatabase(dimensionValueReq, user); @@ -664,14 +668,14 @@ public class QueryServiceImpl implements QueryService { return semanticQueryResp; } - private List getDimensionValues(DimensionValueReq dimensionValueReq, Set detectModelIds) { + private List getDimensionValues(DimensionValueReq dimensionValueReq, Set viewIds) { //if value is null ,then search from NATURE_TO_VALUES if (StringUtils.isBlank(dimensionValueReq.getValue())) { return SearchService.getDimensionValue(dimensionValueReq); } //search from prefixSearch - List hanlpMapResultList = SearchService.prefixSearch(dimensionValueReq.getValue(), - 2000, detectModelIds); + List hanlpMapResultList = knowledgeService.prefixSearch(dimensionValueReq.getValue(), + 2000, viewIds); HanlpHelper.transLetterOriginal(hanlpMapResultList); return hanlpMapResultList.stream() .filter(o -> { diff --git a/headless/api/src/main/java/com/tencent/supersonic/headless/api/pojo/request/QueryMetricReq.java b/headless/api/src/main/java/com/tencent/supersonic/headless/api/pojo/request/QueryMetricReq.java new file mode 100644 index 000000000..4ba3b6dbc --- /dev/null +++ b/headless/api/src/main/java/com/tencent/supersonic/headless/api/pojo/request/QueryMetricReq.java @@ -0,0 +1,21 @@ +package com.tencent.supersonic.headless.api.pojo.request; + +import java.util.List; +import lombok.Data; +import lombok.ToString; + +@Data +@ToString +public class QueryMetricReq { + + private Long domainId; + + private List metricIds; + + private List metricNames; + + private List dimensionIds; + + private List dimensionNames; + +} \ No newline at end of file diff --git a/headless/server/src/main/java/com/tencent/supersonic/headless/server/pojo/MetaFilter.java b/headless/server/src/main/java/com/tencent/supersonic/headless/server/pojo/MetaFilter.java index 91de83646..ca05fc42e 100644 --- a/headless/server/src/main/java/com/tencent/supersonic/headless/server/pojo/MetaFilter.java +++ b/headless/server/src/main/java/com/tencent/supersonic/headless/server/pojo/MetaFilter.java @@ -1,5 +1,6 @@ package com.tencent.supersonic.headless.server.pojo; +import com.google.common.base.Objects; import lombok.Data; import lombok.NoArgsConstructor; import java.util.List; @@ -36,4 +37,29 @@ public class MetaFilter { public MetaFilter(List modelIds) { this.modelIds = modelIds; } + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + MetaFilter that = (MetaFilter) o; + return Objects.equal(id, that.id) && Objects.equal(name, that.name) + && Objects.equal(bizName, that.bizName) && Objects.equal( + createdBy, that.createdBy) && Objects.equal(modelIds, that.modelIds) + && Objects.equal(domainId, that.domainId) && Objects.equal( + viewId, that.viewId) && Objects.equal(sensitiveLevel, that.sensitiveLevel) + && Objects.equal(status, that.status) && Objects.equal(key, + that.key) && Objects.equal(ids, that.ids) && Objects.equal( + fieldsDepend, that.fieldsDepend); + } + + @Override + public int hashCode() { + return Objects.hashCode(id, name, bizName, createdBy, modelIds, domainId, viewId, sensitiveLevel, status, key, + ids, fieldsDepend); + } } diff --git a/headless/server/src/main/java/com/tencent/supersonic/headless/server/rest/MetricApiController.java b/headless/server/src/main/java/com/tencent/supersonic/headless/server/rest/MetricApiController.java new file mode 100644 index 000000000..764379663 --- /dev/null +++ b/headless/server/src/main/java/com/tencent/supersonic/headless/server/rest/MetricApiController.java @@ -0,0 +1,32 @@ +package com.tencent.supersonic.headless.server.rest; + +import com.tencent.supersonic.auth.api.authentication.pojo.User; +import com.tencent.supersonic.auth.api.authentication.utils.UserHolder; +import com.tencent.supersonic.headless.api.pojo.request.QueryMetricReq; +import com.tencent.supersonic.headless.server.service.QueryService; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +@RestController +@RequestMapping("/api/semantic/query") +@Slf4j +public class MetricApiController { + + @Autowired + private QueryService queryService; + + @PostMapping("/metric") + public Object queryBySql(@RequestBody QueryMetricReq queryMetricReq, + HttpServletRequest request, + HttpServletResponse response) throws Exception { + User user = UserHolder.findUser(request, response); + return queryService.queryByMetric(queryMetricReq, user); + } + +} diff --git a/headless/server/src/main/java/com/tencent/supersonic/headless/server/service/QueryService.java b/headless/server/src/main/java/com/tencent/supersonic/headless/server/service/QueryService.java index 664841991..7d5c0608b 100644 --- a/headless/server/src/main/java/com/tencent/supersonic/headless/server/service/QueryService.java +++ b/headless/server/src/main/java/com/tencent/supersonic/headless/server/service/QueryService.java @@ -5,6 +5,7 @@ import com.tencent.supersonic.headless.api.pojo.request.ExplainSqlReq; import com.tencent.supersonic.headless.api.pojo.request.ItemUseReq; import com.tencent.supersonic.headless.api.pojo.request.QueryDimValueReq; import com.tencent.supersonic.headless.api.pojo.request.QueryItemReq; +import com.tencent.supersonic.headless.api.pojo.request.QueryMetricReq; import com.tencent.supersonic.headless.api.pojo.request.SemanticQueryReq; import com.tencent.supersonic.headless.api.pojo.response.ExplainResp; import com.tencent.supersonic.headless.api.pojo.response.ItemQueryResultResp; @@ -27,4 +28,6 @@ public interface QueryService { @ApiHeaderCheck ItemQueryResultResp queryMetricDataById(QueryItemReq queryApiReq, HttpServletRequest request) throws Exception; + SemanticQueryResp queryByMetric(QueryMetricReq queryMetricReq, User user) throws Exception; + } diff --git a/headless/server/src/main/java/com/tencent/supersonic/headless/server/service/ViewService.java b/headless/server/src/main/java/com/tencent/supersonic/headless/server/service/ViewService.java index 6b86a65fd..7a3180280 100644 --- a/headless/server/src/main/java/com/tencent/supersonic/headless/server/service/ViewService.java +++ b/headless/server/src/main/java/com/tencent/supersonic/headless/server/service/ViewService.java @@ -6,6 +6,7 @@ import com.tencent.supersonic.headless.api.pojo.response.ViewResp; import com.tencent.supersonic.headless.server.pojo.MetaFilter; import java.util.List; +import java.util.Map; public interface ViewService { @@ -19,7 +20,7 @@ public interface ViewService { void delete(Long id, User user); - List getViewListByCache(MetaFilter metaFilter); + Map> getModelIdToViewIds(List viewIds); List getViews(User user); diff --git a/headless/server/src/main/java/com/tencent/supersonic/headless/server/service/impl/KnowledgeServiceImpl.java b/headless/server/src/main/java/com/tencent/supersonic/headless/server/service/impl/KnowledgeServiceImpl.java index 58ff737b1..5c517feb9 100644 --- a/headless/server/src/main/java/com/tencent/supersonic/headless/server/service/impl/KnowledgeServiceImpl.java +++ b/headless/server/src/main/java/com/tencent/supersonic/headless/server/service/impl/KnowledgeServiceImpl.java @@ -2,23 +2,19 @@ package com.tencent.supersonic.headless.server.service.impl; import com.tencent.supersonic.common.pojo.enums.DictWordType; import com.tencent.supersonic.headless.api.pojo.response.S2Term; -import com.tencent.supersonic.headless.api.pojo.response.ViewResp; import com.tencent.supersonic.headless.core.knowledge.DictWord; import com.tencent.supersonic.headless.core.knowledge.HanlpMapResult; import com.tencent.supersonic.headless.core.knowledge.SearchService; import com.tencent.supersonic.headless.core.knowledge.helper.HanlpHelper; -import com.tencent.supersonic.headless.server.pojo.MetaFilter; import com.tencent.supersonic.headless.server.service.KnowledgeService; import com.tencent.supersonic.headless.server.service.ViewService; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; -import org.springframework.util.CollectionUtils; - import java.util.ArrayList; -import java.util.HashSet; import java.util.List; +import java.util.Map; import java.util.Set; import java.util.stream.Collectors; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; @Service @Slf4j @@ -77,7 +73,8 @@ public class KnowledgeServiceImpl implements KnowledgeService { @Override public List prefixSearch(String key, int limit, Set viewIds) { - return prefixSearch(key, limit, viewIds2ModelIdList(viewIds)); + Map> modelIdToViewIds = viewService.getModelIdToViewIds(new ArrayList<>(viewIds)); + return prefixSearchByModel(key, limit, modelIdToViewIds.keySet()); } public List prefixSearchByModel(String key, int limit, Set models) { @@ -86,22 +83,12 @@ public class KnowledgeServiceImpl implements KnowledgeService { @Override public List suffixSearch(String key, int limit, Set viewIds) { - return suffixSearch(key, limit, viewIds2ModelIdList(viewIds)); + Map> modelIdToViewIds = viewService.getModelIdToViewIds(new ArrayList<>(viewIds)); + return suffixSearchByModel(key, limit, modelIdToViewIds.keySet()); } public List suffixSearchByModel(String key, int limit, Set models) { return SearchService.suffixSearch(key, limit, models); } - private Set viewIds2ModelIdList(Set viewIds) { - Set modelIds = new HashSet<>(); - MetaFilter filter = new MetaFilter(); - filter.setIds(new ArrayList<>(viewIds)); - List viewList = viewService.getViewList(filter); - if (CollectionUtils.isEmpty(viewList)) { - return modelIds; - } - viewList.stream().forEach(view -> modelIds.addAll(view.getAllModels())); - return modelIds; - } } \ No newline at end of file diff --git a/headless/server/src/main/java/com/tencent/supersonic/headless/server/service/impl/MetaEmbeddingServiceImpl.java b/headless/server/src/main/java/com/tencent/supersonic/headless/server/service/impl/MetaEmbeddingServiceImpl.java index ba0052d67..b3db16bad 100644 --- a/headless/server/src/main/java/com/tencent/supersonic/headless/server/service/impl/MetaEmbeddingServiceImpl.java +++ b/headless/server/src/main/java/com/tencent/supersonic/headless/server/service/impl/MetaEmbeddingServiceImpl.java @@ -2,14 +2,11 @@ package com.tencent.supersonic.headless.server.service.impl; import com.tencent.supersonic.common.config.EmbeddingConfig; import com.tencent.supersonic.common.pojo.Constants; -import com.tencent.supersonic.common.pojo.enums.StatusEnum; import com.tencent.supersonic.common.util.ComponentFactory; import com.tencent.supersonic.common.util.embedding.Retrieval; import com.tencent.supersonic.common.util.embedding.RetrieveQuery; import com.tencent.supersonic.common.util.embedding.RetrieveQueryResult; import com.tencent.supersonic.common.util.embedding.S2EmbeddingStore; -import com.tencent.supersonic.headless.api.pojo.response.ViewResp; -import com.tencent.supersonic.headless.server.pojo.MetaFilter; import com.tencent.supersonic.headless.server.service.MetaEmbeddingService; import com.tencent.supersonic.headless.server.service.ViewService; import java.util.ArrayList; @@ -22,7 +19,6 @@ import java.util.Set; import java.util.stream.Collectors; import lombok.extern.slf4j.Slf4j; import org.apache.commons.collections.CollectionUtils; -import org.apache.commons.lang3.tuple.Pair; import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @@ -41,16 +37,8 @@ public class MetaEmbeddingServiceImpl implements MetaEmbeddingService { @Override public List retrieveQuery(List viewIds, RetrieveQuery retrieveQuery, int num) { // viewIds->modelIds - MetaFilter metaFilter = new MetaFilter(); - metaFilter.setStatus(StatusEnum.ONLINE.getCode()); - metaFilter.setIds(viewIds); - List viewListByCache = viewService.getViewListByCache(metaFilter); - Set allModels = getModels(viewListByCache); - - Map> modelIdToViewIds = viewListByCache.stream() - .flatMap(viewResp -> viewResp.getAllModels().stream() - .map(modelId -> Pair.of(modelId, viewResp.getId()))) - .collect(Collectors.groupingBy(Pair::getLeft, Collectors.mapping(Pair::getRight, Collectors.toList()))); + Map> modelIdToViewIds = viewService.getModelIdToViewIds(viewIds); + Set allModels = modelIdToViewIds.keySet(); if (CollectionUtils.isNotEmpty(allModels) && allModels.size() == 1) { Map filterCondition = new HashMap<>(); @@ -105,10 +93,4 @@ public class MetaEmbeddingServiceImpl implements MetaEmbeddingService { .filter(retrieveQueryResult -> CollectionUtils.isNotEmpty(retrieveQueryResult.getRetrieval())) .collect(Collectors.toList()); } - - private Set getModels(List viewListByCache) { - return viewListByCache.stream() - .flatMap(viewResp -> viewResp.getAllModels().stream()) - .collect(Collectors.toSet()); - } } \ No newline at end of file diff --git a/headless/server/src/main/java/com/tencent/supersonic/headless/server/service/impl/QueryServiceImpl.java b/headless/server/src/main/java/com/tencent/supersonic/headless/server/service/impl/QueryServiceImpl.java index 72bd81d7a..cd0385b62 100644 --- a/headless/server/src/main/java/com/tencent/supersonic/headless/server/service/impl/QueryServiceImpl.java +++ b/headless/server/src/main/java/com/tencent/supersonic/headless/server/service/impl/QueryServiceImpl.java @@ -18,6 +18,7 @@ import com.tencent.supersonic.headless.api.pojo.request.ExplainSqlReq; import com.tencent.supersonic.headless.api.pojo.request.ItemUseReq; import com.tencent.supersonic.headless.api.pojo.request.QueryDimValueReq; import com.tencent.supersonic.headless.api.pojo.request.QueryItemReq; +import com.tencent.supersonic.headless.api.pojo.request.QueryMetricReq; import com.tencent.supersonic.headless.api.pojo.request.QueryMultiStructReq; import com.tencent.supersonic.headless.api.pojo.request.QuerySqlReq; import com.tencent.supersonic.headless.api.pojo.request.QueryStructReq; @@ -65,6 +66,7 @@ import org.springframework.stereotype.Service; @Service @Slf4j public class QueryServiceImpl implements QueryService { + private StatUtils statUtils; private final QueryUtils queryUtils; private final QueryReqConverter queryReqConverter; @@ -167,7 +169,6 @@ public class QueryServiceImpl implements QueryService { QueryStatement queryStatement = new QueryStatement(); QueryParam queryParam = new QueryParam(); queryReqConverter.convert(queryStructReq, queryParam); - //queryStatement.setQueryStructReq(queryStructReq); queryStatement.setQueryParam(queryParam); queryStatement.setIsS2SQL(false); queryStatement.setEnableOptimize(queryUtils.enableOptimize()); @@ -239,6 +240,11 @@ public class QueryServiceImpl implements QueryService { return ItemQueryResultResp.builder().results(results).build(); } + @Override + public SemanticQueryResp queryByMetric(QueryMetricReq queryMetricReq, User user) throws Exception { + return null; + } + private SingleItemQueryResult dataQuery(Integer appId, Item item, DateConf dateConf, Long limit) throws Exception { MetricResp metricResp = catalog.getMetric(item.getId()); item.setCreatedBy(metricResp.getCreatedBy()); diff --git a/headless/server/src/main/java/com/tencent/supersonic/headless/server/service/impl/ViewServiceImpl.java b/headless/server/src/main/java/com/tencent/supersonic/headless/server/service/impl/ViewServiceImpl.java index 5b1e6705e..9b60a20a9 100644 --- a/headless/server/src/main/java/com/tencent/supersonic/headless/server/service/impl/ViewServiceImpl.java +++ b/headless/server/src/main/java/com/tencent/supersonic/headless/server/service/impl/ViewServiceImpl.java @@ -26,10 +26,12 @@ import java.util.Comparator; import java.util.Date; import java.util.HashSet; import java.util.List; +import java.util.Map; import java.util.Set; import java.util.concurrent.TimeUnit; import java.util.stream.Collectors; import org.apache.commons.lang3.StringUtils; +import org.apache.commons.lang3.tuple.Pair; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.util.CollectionUtils; @@ -159,13 +161,18 @@ public class ViewServiceImpl } @Override - public List getViewListByCache(MetaFilter metaFilter) { + public Map> getModelIdToViewIds(List viewIds) { + MetaFilter metaFilter = new MetaFilter(); + metaFilter.setStatus(StatusEnum.ONLINE.getCode()); + metaFilter.setIds(viewIds); List viewList = viewSchemaCache.getIfPresent(metaFilter); if (CollectionUtils.isEmpty(viewList)) { viewList = getViewList(metaFilter); viewSchemaCache.put(metaFilter, viewList); } - return viewList; + return viewList.stream() + .flatMap( + viewResp -> viewResp.getAllModels().stream().map(modelId -> Pair.of(modelId, viewResp.getId()))) + .collect(Collectors.groupingBy(Pair::getLeft, Collectors.mapping(Pair::getRight, Collectors.toList()))); } - }