From 30ee64efec656eba06a5208da46e9618fd90bbe2 Mon Sep 17 00:00:00 2001 From: lexluo09 <39718951+lexluo09@users.noreply.github.com> Date: Thu, 14 Mar 2024 16:58:41 +0800 Subject: [PATCH] (improvement)(Chat) Fixed the issue of ineffective filtering in mapper detectDataSetIds, resolved the autocomplete feature, and changed METRIC_TAG to METRIC_ID. (#819) --- .../execute/MetricRecommendProcessor.java | 7 +-- .../core/chat/knowledge/KnowledgeService.java | 19 ++++---- .../chat/knowledge/MetaEmbeddingService.java | 16 +++---- .../core/chat/knowledge/SearchService.java | 29 ++++++++---- .../chat/knowledge/helper/NatureHelper.java | 22 +++++++-- .../chat/mapper/EmbeddingMatchStrategy.java | 6 ++- .../core/chat/mapper/EntityMapper.java | 4 +- .../chat/mapper/HanlpDictMatchStrategy.java | 6 +-- .../core/chat/mapper/SearchMatchStrategy.java | 6 +-- .../parser/rule/ContextInheritParser.java | 4 +- ...MetricTagQuery.java => MetricIdQuery.java} | 20 ++++---- .../service/impl/ChatQueryServiceImpl.java | 4 +- .../service/impl/SearchServiceImpl.java | 36 +++++++------- .../service/impl/TagQueryServiceImpl.java | 14 +++--- .../headless/server/utils/TagConverter.java | 1 + .../supersonic/ModelDemoDataLoader.java | 15 +++++- .../data/dictionary/custom/TagValue_4_4.txt | 6 +++ .../com/tencent/supersonic/chat/TagTest.java | 31 ------------ .../supersonic/chat/mapper/MapperTest.java | 47 ------------------- .../tencent/supersonic/util/DataUtils.java | 7 ++- .../data/dictionary/custom/TagValue_4_4.txt | 6 +++ webapp/packages/chat-sdk/src/common/type.ts | 2 +- .../src/components/ChatItem/ParseTip.tsx | 4 +- .../src/components/ChatMsg/Message/index.tsx | 2 +- .../chat-sdk/src/components/ChatMsg/index.tsx | 2 +- 25 files changed, 148 insertions(+), 168 deletions(-) rename headless/core/src/main/java/com/tencent/supersonic/headless/core/chat/query/rule/metric/{MetricTagQuery.java => MetricIdQuery.java} (95%) create mode 100644 launchers/standalone/src/main/resources/data/dictionary/custom/TagValue_4_4.txt delete mode 100644 launchers/standalone/src/test/java/com/tencent/supersonic/chat/mapper/MapperTest.java create mode 100644 launchers/standalone/src/test/resources/data/dictionary/custom/TagValue_4_4.txt diff --git a/chat/server/src/main/java/com/tencent/supersonic/chat/server/processor/execute/MetricRecommendProcessor.java b/chat/server/src/main/java/com/tencent/supersonic/chat/server/processor/execute/MetricRecommendProcessor.java index d6c9edffa..cef7df02d 100644 --- a/chat/server/src/main/java/com/tencent/supersonic/chat/server/processor/execute/MetricRecommendProcessor.java +++ b/chat/server/src/main/java/com/tencent/supersonic/chat/server/processor/execute/MetricRecommendProcessor.java @@ -13,15 +13,15 @@ import com.tencent.supersonic.headless.api.pojo.SemanticParseInfo; import com.tencent.supersonic.headless.api.pojo.request.ExecuteQueryReq; import com.tencent.supersonic.headless.api.pojo.response.QueryResult; import com.tencent.supersonic.headless.core.chat.knowledge.MetaEmbeddingService; -import org.springframework.util.CollectionUtils; - import java.util.Collections; import java.util.Comparator; import java.util.HashMap; +import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Set; import java.util.stream.Collectors; +import org.springframework.util.CollectionUtils; /** * MetricRecommendProcessor fills recommended metrics based on embedding similarity. @@ -49,7 +49,8 @@ public class MetricRecommendProcessor implements ExecuteResultProcessor { .filterCondition(filterCondition).queryEmbeddings(null).build(); MetaEmbeddingService metaEmbeddingService = ContextUtils.getBean(MetaEmbeddingService.class); List retrieveQueryResults = - metaEmbeddingService.retrieveQuery(retrieveQuery, METRIC_RECOMMEND_SIZE + 1, new HashMap<>()); + metaEmbeddingService.retrieveQuery(retrieveQuery, METRIC_RECOMMEND_SIZE + 1, new HashMap<>(), + new HashSet<>()); if (CollectionUtils.isEmpty(retrieveQueryResults)) { return; } diff --git a/headless/core/src/main/java/com/tencent/supersonic/headless/core/chat/knowledge/KnowledgeService.java b/headless/core/src/main/java/com/tencent/supersonic/headless/core/chat/knowledge/KnowledgeService.java index f51c11ece..85eab7df4 100644 --- a/headless/core/src/main/java/com/tencent/supersonic/headless/core/chat/knowledge/KnowledgeService.java +++ b/headless/core/src/main/java/com/tencent/supersonic/headless/core/chat/knowledge/KnowledgeService.java @@ -56,21 +56,24 @@ public class KnowledgeService { return HanlpHelper.getTerms(text, modelIdToDataSetIds); } - public List prefixSearch(String key, int limit, Map> modelIdToDataSetIds) { - return prefixSearchByModel(key, limit, modelIdToDataSetIds); + public List prefixSearch(String key, int limit, Map> modelIdToDataSetIds, + Set detectDataSetIds) { + return prefixSearchByModel(key, limit, modelIdToDataSetIds, detectDataSetIds); } public List prefixSearchByModel(String key, int limit, - Map> modelIdToDataSetIds) { - return SearchService.prefixSearch(key, limit, modelIdToDataSetIds); + Map> modelIdToDataSetIds, Set detectDataSetIds) { + return SearchService.prefixSearch(key, limit, modelIdToDataSetIds, detectDataSetIds); } - public List suffixSearch(String key, int limit, Map> modelIdToDataSetIds) { - return suffixSearchByModel(key, limit, modelIdToDataSetIds.keySet()); + public List suffixSearch(String key, int limit, Map> modelIdToDataSetIds, + Set detectDataSetIds) { + return suffixSearchByModel(key, limit, modelIdToDataSetIds, detectDataSetIds); } - public List suffixSearchByModel(String key, int limit, Set models) { - return SearchService.suffixSearch(key, limit, models); + public List suffixSearchByModel(String key, int limit, Map> modelIdToDataSetIds, + Set detectDataSetIds) { + return SearchService.suffixSearch(key, limit, modelIdToDataSetIds, detectDataSetIds); } } \ No newline at end of file diff --git a/headless/core/src/main/java/com/tencent/supersonic/headless/core/chat/knowledge/MetaEmbeddingService.java b/headless/core/src/main/java/com/tencent/supersonic/headless/core/chat/knowledge/MetaEmbeddingService.java index e045fead0..88db4d882 100644 --- a/headless/core/src/main/java/com/tencent/supersonic/headless/core/chat/knowledge/MetaEmbeddingService.java +++ b/headless/core/src/main/java/com/tencent/supersonic/headless/core/chat/knowledge/MetaEmbeddingService.java @@ -7,12 +7,7 @@ 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 lombok.extern.slf4j.Slf4j; -import org.apache.commons.collections.CollectionUtils; -import org.springframework.beans.BeanUtils; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Service; - +import com.tencent.supersonic.headless.core.chat.knowledge.helper.NatureHelper; import java.util.ArrayList; import java.util.HashMap; import java.util.HashSet; @@ -21,6 +16,11 @@ import java.util.Map; import java.util.Objects; import java.util.Set; import java.util.stream.Collectors; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.collections.CollectionUtils; +import org.springframework.beans.BeanUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; @Service @Slf4j @@ -31,9 +31,9 @@ public class MetaEmbeddingService { private EmbeddingConfig embeddingConfig; public List retrieveQuery(RetrieveQuery retrieveQuery, int num, - Map> modelIdToDataSetIds) { + Map> modelIdToDataSetIds, Set detectDataSetIds) { // dataSetIds->modelIds - Set allModels = modelIdToDataSetIds.keySet(); + Set allModels = NatureHelper.getModelIds(modelIdToDataSetIds, detectDataSetIds); if (CollectionUtils.isNotEmpty(allModels) && allModels.size() == 1) { Map filterCondition = new HashMap<>(); diff --git a/headless/core/src/main/java/com/tencent/supersonic/headless/core/chat/knowledge/SearchService.java b/headless/core/src/main/java/com/tencent/supersonic/headless/core/chat/knowledge/SearchService.java index 6cff31060..46adffa7c 100644 --- a/headless/core/src/main/java/com/tencent/supersonic/headless/core/chat/knowledge/SearchService.java +++ b/headless/core/src/main/java/com/tencent/supersonic/headless/core/chat/knowledge/SearchService.java @@ -41,13 +41,15 @@ public class SearchService { * @param key * @return */ - public static List prefixSearch(String key, int limit, Map> modelIdToViewIds) { - return prefixSearch(key, limit, trie, modelIdToViewIds); + public static List prefixSearch(String key, int limit, Map> modelIdToDataSetIds, + Set detectDataSetIds) { + return prefixSearch(key, limit, trie, modelIdToDataSetIds, detectDataSetIds); } public static List prefixSearch(String key, int limit, BinTrie> binTrie, - Map> modelIdToViewIds) { - Set>> result = prefixSearchLimit(key, limit, binTrie, modelIdToViewIds.keySet()); + Map> modelIdToDataSetIds, Set detectDataSetIds) { + Set>> result = prefixSearchLimit(key, limit, binTrie, + modelIdToDataSetIds, detectDataSetIds); List hanlpMapResults = result.stream().map( entry -> { String name = entry.getKey().replace("#", " "); @@ -58,7 +60,7 @@ public class SearchService { .collect(Collectors.toList()); for (HanlpMapResult hanlpMapResult : hanlpMapResults) { List natures = hanlpMapResult.getNatures().stream() - .map(nature -> NatureHelper.changeModel2DataSet(nature, modelIdToViewIds)) + .map(nature -> NatureHelper.changeModel2DataSet(nature, modelIdToDataSetIds)) .flatMap(Collection::stream).collect(Collectors.toList()); hanlpMapResult.setNatures(natures); } @@ -70,14 +72,18 @@ public class SearchService { * @param key * @return */ - public static List suffixSearch(String key, int limit, Set detectModelIds) { + public static List suffixSearch(String key, int limit, Map> modelIdToDataSetIds, + Set detectDataSetIds) { String reverseDetectSegment = StringUtils.reverse(key); - return suffixSearch(reverseDetectSegment, limit, suffixTrie, detectModelIds); + return suffixSearch(reverseDetectSegment, limit, suffixTrie, modelIdToDataSetIds, detectDataSetIds); } public static List suffixSearch(String key, int limit, BinTrie> binTrie, - Set detectModelIds) { - Set>> result = prefixSearchLimit(key, limit, binTrie, detectModelIds); + Map> modelIdToDataSetIds, Set detectDataSetIds) { + + Set>> result = prefixSearchLimit(key, limit, binTrie, modelIdToDataSetIds, + detectDataSetIds); + return result.stream().map( entry -> { String name = entry.getKey().replace("#", " "); @@ -93,7 +99,10 @@ public class SearchService { } private static Set>> prefixSearchLimit(String key, int limit, - BinTrie> binTrie, Set detectModelIds) { + BinTrie> binTrie, Map> modelIdToDataSetIds, Set detectDataSetIds) { + + Set detectModelIds = NatureHelper.getModelIds(modelIdToDataSetIds, detectDataSetIds); + key = key.toLowerCase(); Set>> entrySet = new TreeSet>>(); diff --git a/headless/core/src/main/java/com/tencent/supersonic/headless/core/chat/knowledge/helper/NatureHelper.java b/headless/core/src/main/java/com/tencent/supersonic/headless/core/chat/knowledge/helper/NatureHelper.java index b3b9b92f8..c15282af1 100644 --- a/headless/core/src/main/java/com/tencent/supersonic/headless/core/chat/knowledge/helper/NatureHelper.java +++ b/headless/core/src/main/java/com/tencent/supersonic/headless/core/chat/knowledge/helper/NatureHelper.java @@ -6,17 +6,17 @@ import com.tencent.supersonic.common.pojo.enums.DictWordType; import com.tencent.supersonic.headless.api.pojo.SchemaElementType; import com.tencent.supersonic.headless.api.pojo.response.S2Term; import com.tencent.supersonic.headless.core.chat.knowledge.DataSetInfoStat; -import lombok.extern.slf4j.Slf4j; -import org.apache.commons.lang3.StringUtils; -import org.springframework.util.CollectionUtils; - import java.util.ArrayList; import java.util.Comparator; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Objects; +import java.util.Set; import java.util.stream.Collectors; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +import org.springframework.util.CollectionUtils; /** * nature parse helper @@ -220,4 +220,18 @@ public class NatureHelper { return 0L; } + public static Set getModelIds(Map> modelIdToDataSetIds, Set detectDataSetIds) { + Set detectModelIds = modelIdToDataSetIds.keySet(); + if (!CollectionUtils.isEmpty(detectDataSetIds)) { + detectModelIds = modelIdToDataSetIds.entrySet().stream().filter(entry -> { + List dataSetIds = entry.getValue().stream().filter(detectDataSetIds::contains) + .collect(Collectors.toList()); + if (!CollectionUtils.isEmpty(dataSetIds)) { + return true; + } + return false; + }).map(entry -> entry.getKey()).collect(Collectors.toSet()); + } + return detectModelIds; + } } diff --git a/headless/core/src/main/java/com/tencent/supersonic/headless/core/chat/mapper/EmbeddingMatchStrategy.java b/headless/core/src/main/java/com/tencent/supersonic/headless/core/chat/mapper/EmbeddingMatchStrategy.java index c14c587ca..1bc4acc51 100644 --- a/headless/core/src/main/java/com/tencent/supersonic/headless/core/chat/mapper/EmbeddingMatchStrategy.java +++ b/headless/core/src/main/java/com/tencent/supersonic/headless/core/chat/mapper/EmbeddingMatchStrategy.java @@ -49,7 +49,7 @@ public class EmbeddingMatchStrategy extends BaseMatchStrategy { @Override public void detectByStep(QueryContext queryContext, Set existResults, Set detectDataSetIds, - String detectSegment, int offset) { + String detectSegment, int offset) { } @@ -77,10 +77,12 @@ public class EmbeddingMatchStrategy extends BaseMatchStrategy { int embeddingNumber = optimizationConfig.getEmbeddingMapperNumber(); Double distance = optimizationConfig.getEmbeddingMapperDistanceThreshold(); // step1. build query params + RetrieveQuery retrieveQuery = RetrieveQuery.builder().queryTextsList(queryTextsSub).build(); // step2. retrieveQuery by detectSegment + List retrieveQueryResults = metaEmbeddingService.retrieveQuery( - retrieveQuery, embeddingNumber, modelIdToDataSetIds); + retrieveQuery, embeddingNumber, modelIdToDataSetIds, detectDataSetIds); if (CollectionUtils.isEmpty(retrieveQueryResults)) { return; diff --git a/headless/core/src/main/java/com/tencent/supersonic/headless/core/chat/mapper/EntityMapper.java b/headless/core/src/main/java/com/tencent/supersonic/headless/core/chat/mapper/EntityMapper.java index a9bf8b131..b49f1f7fd 100644 --- a/headless/core/src/main/java/com/tencent/supersonic/headless/core/chat/mapper/EntityMapper.java +++ b/headless/core/src/main/java/com/tencent/supersonic/headless/core/chat/mapper/EntityMapper.java @@ -34,7 +34,9 @@ public class EntityMapper extends BaseMapper { } List valueSchemaElements = schemaElementMatchList.stream() .filter(schemaElementMatch -> - SchemaElementType.VALUE.equals(schemaElementMatch.getElement().getType())) + SchemaElementType.VALUE.equals(schemaElementMatch.getElement().getType()) + || SchemaElementType.TAG_VALUE.equals(schemaElementMatch.getElement().getType() + )) .collect(Collectors.toList()); for (SchemaElementMatch schemaElementMatch : valueSchemaElements) { if (!entity.getId().equals(schemaElementMatch.getElement().getId())) { diff --git a/headless/core/src/main/java/com/tencent/supersonic/headless/core/chat/mapper/HanlpDictMatchStrategy.java b/headless/core/src/main/java/com/tencent/supersonic/headless/core/chat/mapper/HanlpDictMatchStrategy.java index e31e84a39..7aab4964d 100644 --- a/headless/core/src/main/java/com/tencent/supersonic/headless/core/chat/mapper/HanlpDictMatchStrategy.java +++ b/headless/core/src/main/java/com/tencent/supersonic/headless/core/chat/mapper/HanlpDictMatchStrategy.java @@ -39,7 +39,7 @@ public class HanlpDictMatchStrategy extends BaseMatchStrategy { @Override public Map> match(QueryContext queryContext, List terms, - Set detectDataSetIds) { + Set detectDataSetIds) { String text = queryContext.getQueryText(); if (Objects.isNull(terms) || StringUtils.isEmpty(text)) { return null; @@ -65,11 +65,11 @@ public class HanlpDictMatchStrategy extends BaseMatchStrategy { // step1. pre search Integer oneDetectionMaxSize = optimizationConfig.getOneDetectionMaxSize(); LinkedHashSet hanlpMapResults = knowledgeService.prefixSearch(detectSegment, - oneDetectionMaxSize, queryContext.getModelIdToDataSetIds()) + oneDetectionMaxSize, queryContext.getModelIdToDataSetIds(), detectDataSetIds) .stream().collect(Collectors.toCollection(LinkedHashSet::new)); // step2. suffix search LinkedHashSet suffixHanlpMapResults = knowledgeService.suffixSearch(detectSegment, - oneDetectionMaxSize, queryContext.getModelIdToDataSetIds()) + oneDetectionMaxSize, queryContext.getModelIdToDataSetIds(), detectDataSetIds) .stream().collect(Collectors.toCollection(LinkedHashSet::new)); hanlpMapResults.addAll(suffixHanlpMapResults); diff --git a/headless/core/src/main/java/com/tencent/supersonic/headless/core/chat/mapper/SearchMatchStrategy.java b/headless/core/src/main/java/com/tencent/supersonic/headless/core/chat/mapper/SearchMatchStrategy.java index 8ed36a750..f9d144a20 100644 --- a/headless/core/src/main/java/com/tencent/supersonic/headless/core/chat/mapper/SearchMatchStrategy.java +++ b/headless/core/src/main/java/com/tencent/supersonic/headless/core/chat/mapper/SearchMatchStrategy.java @@ -33,7 +33,7 @@ public class SearchMatchStrategy extends BaseMatchStrategy { @Override public Map> match(QueryContext queryContext, List originals, - Set detectDataSetIds) { + Set detectDataSetIds) { String text = queryContext.getQueryText(); Map regOffsetToLength = getRegOffsetToLength(originals); @@ -58,9 +58,9 @@ public class SearchMatchStrategy extends BaseMatchStrategy { if (StringUtils.isNotEmpty(detectSegment)) { List hanlpMapResults = knowledgeService.prefixSearch(detectSegment, - SearchService.SEARCH_SIZE, queryContext.getModelIdToDataSetIds()); + SearchService.SEARCH_SIZE, queryContext.getModelIdToDataSetIds(), detectDataSetIds); List suffixHanlpMapResults = knowledgeService.suffixSearch( - detectSegment, SEARCH_SIZE, queryContext.getModelIdToDataSetIds()); + detectSegment, SEARCH_SIZE, queryContext.getModelIdToDataSetIds(), detectDataSetIds); hanlpMapResults.addAll(suffixHanlpMapResults); // remove entity name where search hanlpMapResults = hanlpMapResults.stream().filter(entry -> { diff --git a/headless/core/src/main/java/com/tencent/supersonic/headless/core/chat/parser/rule/ContextInheritParser.java b/headless/core/src/main/java/com/tencent/supersonic/headless/core/chat/parser/rule/ContextInheritParser.java index bd79b2613..995209e97 100644 --- a/headless/core/src/main/java/com/tencent/supersonic/headless/core/chat/parser/rule/ContextInheritParser.java +++ b/headless/core/src/main/java/com/tencent/supersonic/headless/core/chat/parser/rule/ContextInheritParser.java @@ -10,7 +10,7 @@ import com.tencent.supersonic.headless.core.chat.query.SemanticQuery; import com.tencent.supersonic.headless.core.chat.query.rule.RuleSemanticQuery; import com.tencent.supersonic.headless.core.chat.query.rule.metric.MetricModelQuery; import com.tencent.supersonic.headless.core.chat.query.rule.metric.MetricSemanticQuery; -import com.tencent.supersonic.headless.core.chat.query.rule.metric.MetricTagQuery; +import com.tencent.supersonic.headless.core.chat.query.rule.metric.MetricIdQuery; import lombok.extern.slf4j.Slf4j; import java.util.AbstractMap; @@ -94,7 +94,7 @@ public class ContextInheritParser implements SemanticParser { return matches.stream().anyMatch(m -> { SchemaElementType type = m.getElement().getType(); if (Objects.nonNull(ruleQuery) && ruleQuery instanceof MetricSemanticQuery - && !(ruleQuery instanceof MetricTagQuery)) { + && !(ruleQuery instanceof MetricIdQuery)) { return types.contains(type); } return type.equals(matchType); diff --git a/headless/core/src/main/java/com/tencent/supersonic/headless/core/chat/query/rule/metric/MetricTagQuery.java b/headless/core/src/main/java/com/tencent/supersonic/headless/core/chat/query/rule/metric/MetricIdQuery.java similarity index 95% rename from headless/core/src/main/java/com/tencent/supersonic/headless/core/chat/query/rule/metric/MetricTagQuery.java rename to headless/core/src/main/java/com/tencent/supersonic/headless/core/chat/query/rule/metric/MetricIdQuery.java index 68e4c39fe..a128bb04e 100644 --- a/headless/core/src/main/java/com/tencent/supersonic/headless/core/chat/query/rule/metric/MetricTagQuery.java +++ b/headless/core/src/main/java/com/tencent/supersonic/headless/core/chat/query/rule/metric/MetricIdQuery.java @@ -1,31 +1,31 @@ package com.tencent.supersonic.headless.core.chat.query.rule.metric; +import static com.tencent.supersonic.headless.api.pojo.SchemaElementType.ENTITY; +import static com.tencent.supersonic.headless.api.pojo.SchemaElementType.ID; +import static com.tencent.supersonic.headless.core.chat.query.rule.QueryMatchOption.OptionType.REQUIRED; +import static com.tencent.supersonic.headless.core.chat.query.rule.QueryMatchOption.RequireNumberType.AT_LEAST; + import com.tencent.supersonic.common.pojo.Filter; import com.tencent.supersonic.common.pojo.enums.FilterOperatorEnum; import com.tencent.supersonic.common.pojo.enums.FilterType; import com.tencent.supersonic.headless.api.pojo.request.QueryMultiStructReq; import com.tencent.supersonic.headless.api.pojo.request.QueryStructReq; import com.tencent.supersonic.headless.api.pojo.request.SemanticQueryReq; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Component; - import java.util.ArrayList; import java.util.HashSet; import java.util.List; import java.util.Set; import java.util.stream.Collectors; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; -import static com.tencent.supersonic.headless.api.pojo.SchemaElementType.ENTITY; -import static com.tencent.supersonic.headless.api.pojo.SchemaElementType.ID; -import static com.tencent.supersonic.headless.core.chat.query.rule.QueryMatchOption.OptionType.REQUIRED; -import static com.tencent.supersonic.headless.core.chat.query.rule.QueryMatchOption.RequireNumberType.AT_LEAST; @Slf4j @Component -public class MetricTagQuery extends MetricSemanticQuery { +public class MetricIdQuery extends MetricSemanticQuery { - public static final String QUERY_MODE = "METRIC_TAG"; + public static final String QUERY_MODE = "METRIC_ID"; - public MetricTagQuery() { + public MetricIdQuery() { super(); queryMatcher.addOption(ID, REQUIRED, AT_LEAST, 1) .addOption(ENTITY, REQUIRED, AT_LEAST, 1); diff --git a/headless/server/src/main/java/com/tencent/supersonic/headless/server/service/impl/ChatQueryServiceImpl.java b/headless/server/src/main/java/com/tencent/supersonic/headless/server/service/impl/ChatQueryServiceImpl.java index 5e064603e..62e022649 100644 --- a/headless/server/src/main/java/com/tencent/supersonic/headless/server/service/impl/ChatQueryServiceImpl.java +++ b/headless/server/src/main/java/com/tencent/supersonic/headless/server/service/impl/ChatQueryServiceImpl.java @@ -193,7 +193,7 @@ public class ChatQueryServiceImpl implements ChatQueryService { } private QueryResult doExecution(SemanticQueryReq semanticQueryReq, - SemanticParseInfo parseInfo, User user) throws Exception { + SemanticParseInfo parseInfo, User user) throws Exception { SemanticQueryResp queryResp = queryService.queryByReq(semanticQueryReq, user); QueryResult queryResult = new QueryResult(); if (queryResp != null) { @@ -591,7 +591,7 @@ public class ChatQueryServiceImpl implements ChatQueryService { modelIdToDataSetIds.put(dimensionValueReq.getModelId(), new ArrayList<>(dataSetIds)); //search from prefixSearch List hanlpMapResultList = knowledgeService.prefixSearch(dimensionValueReq.getValue(), - 2000, modelIdToDataSetIds); + 2000, modelIdToDataSetIds, dataSetIds); HanlpHelper.transLetterOriginal(hanlpMapResultList); return hanlpMapResultList.stream() .filter(o -> { diff --git a/headless/server/src/main/java/com/tencent/supersonic/headless/server/service/impl/SearchServiceImpl.java b/headless/server/src/main/java/com/tencent/supersonic/headless/server/service/impl/SearchServiceImpl.java index 2208ff02b..a6161fcfe 100644 --- a/headless/server/src/main/java/com/tencent/supersonic/headless/server/service/impl/SearchServiceImpl.java +++ b/headless/server/src/main/java/com/tencent/supersonic/headless/server/service/impl/SearchServiceImpl.java @@ -78,8 +78,11 @@ public class SearchServiceImpl implements SearchService { QueryContext queryContext = new QueryContext(); BeanUtils.copyProperties(queryReq, queryContext); + queryContext.setModelIdToDataSetIds(dataSetService.getModelIdToDataSetIds()); + Map> regTextMap = searchMatchStrategy.match(queryContext, originals, dataSetIds); + regTextMap.entrySet().stream().forEach(m -> HanlpHelper.transLetterOriginal(m.getValue())); // 3.get the most matching data @@ -100,16 +103,16 @@ public class SearchServiceImpl implements SearchService { Set searchResults = new LinkedHashSet(); DataSetInfoStat dataSetInfoStat = NatureHelper.getDataSetStat(originals); - List possibleModels = getPossibleDataSets(queryReq, originals, dataSetInfoStat, dataSetIds); + List possibleDataSets = getPossibleDataSets(queryReq, originals, dataSetInfoStat, dataSetIds); // 5.1 priority dimension metric - boolean existMetricAndDimension = searchMetricAndDimension(new HashSet<>(possibleModels), dataSetIdToName, + boolean existMetricAndDimension = searchMetricAndDimension(new HashSet<>(possibleDataSets), dataSetIdToName, searchTextEntry, searchResults); // 5.2 process based on dimension values MatchText matchText = searchTextEntry.getKey(); - Map natureToNameMap = getNatureToNameMap(searchTextEntry, new HashSet<>(possibleModels)); - log.debug("possibleModels:{},natureToNameMap:{}", possibleModels, natureToNameMap); + Map natureToNameMap = getNatureToNameMap(searchTextEntry, new HashSet<>(possibleDataSets)); + log.debug("possibleDataSets:{},natureToNameMap:{}", possibleDataSets, natureToNameMap); for (Map.Entry natureToNameEntry : natureToNameMap.entrySet()) { @@ -123,23 +126,23 @@ public class SearchServiceImpl implements SearchService { } private List getPossibleDataSets(QueryReq queryCtx, List originals, - DataSetInfoStat dataSetInfoStat, Set dataSetIds) { + DataSetInfoStat dataSetInfoStat, Set dataSetIds) { if (CollectionUtils.isNotEmpty(dataSetIds)) { return new ArrayList<>(dataSetIds); } - List possibleModels = NatureHelper.selectPossibleDataSets(originals); + List possibleDataSets = NatureHelper.selectPossibleDataSets(originals); Long contextModel = chatContextService.getContextModel(queryCtx.getChatId()); - log.debug("possibleModels:{},dataSetInfoStat:{},contextModel:{}", - possibleModels, dataSetInfoStat, contextModel); + log.debug("possibleDataSets:{},dataSetInfoStat:{},contextModel:{}", + possibleDataSets, dataSetInfoStat, contextModel); // If nothing is recognized or only metric are present, then add the contextModel. if (nothingOrOnlyMetric(dataSetInfoStat)) { return Lists.newArrayList(contextModel); } - return possibleModels; + return possibleDataSets; } private boolean nothingOrOnlyMetric(DataSetInfoStat modelStat) { @@ -175,7 +178,6 @@ public class SearchServiceImpl implements SearchService { .subRecommend(wordName) .build(); - if (metricModelCount <= 0 && !existMetricAndDimension) { if (filterByQueryFilter(wordName, queryFilters)) { return searchResults; @@ -265,7 +267,7 @@ public class SearchServiceImpl implements SearchService { LinkedHashMap::new)); } - private boolean searchMetricAndDimension(Set possibleModels, Map modelToName, + private boolean searchMetricAndDimension(Set possibleDataSets, Map modelToName, Map.Entry> searchTextEntry, Set searchResults) { boolean existMetric = false; log.info("searchMetricAndDimension searchTextEntry:{}", searchTextEntry); @@ -277,7 +279,7 @@ public class SearchServiceImpl implements SearchService { List dimensionMetricClassIds = hanlpMapResult.getNatures().stream() .map(nature -> new ModelWithSemanticType(NatureHelper.getDataSetId(nature), NatureHelper.convertToElementType(nature))) - .filter(entry -> matchCondition(entry, possibleModels)).collect(Collectors.toList()); + .filter(entry -> matchCondition(entry, possibleDataSets)).collect(Collectors.toList()); if (CollectionUtils.isEmpty(dimensionMetricClassIds)) { continue; @@ -296,22 +298,22 @@ public class SearchServiceImpl implements SearchService { //visibility to filter metrics searchResults.add(searchResult); } - log.info("parseResult:{},dimensionMetricClassIds:{},possibleModels:{}", hanlpMapResult, - dimensionMetricClassIds, possibleModels); + log.info("parseResult:{},dimensionMetricClassIds:{},possibleDataSets:{}", hanlpMapResult, + dimensionMetricClassIds, possibleDataSets); } log.info("searchMetricAndDimension searchResults:{}", searchResults); return existMetric; } - private boolean matchCondition(ModelWithSemanticType entry, Set possibleModels) { + private boolean matchCondition(ModelWithSemanticType entry, Set possibleDataSets) { if (!(SchemaElementType.METRIC.equals(entry.getSchemaElementType()) || SchemaElementType.DIMENSION.equals( entry.getSchemaElementType()))) { return false; } - if (CollectionUtils.isEmpty(possibleModels)) { + if (CollectionUtils.isEmpty(possibleDataSets)) { return true; } - return possibleModels.contains(entry.getModel()); + return possibleDataSets.contains(entry.getModel()); } } diff --git a/headless/server/src/main/java/com/tencent/supersonic/headless/server/service/impl/TagQueryServiceImpl.java b/headless/server/src/main/java/com/tencent/supersonic/headless/server/service/impl/TagQueryServiceImpl.java index d9c383232..8e368bae1 100644 --- a/headless/server/src/main/java/com/tencent/supersonic/headless/server/service/impl/TagQueryServiceImpl.java +++ b/headless/server/src/main/java/com/tencent/supersonic/headless/server/service/impl/TagQueryServiceImpl.java @@ -1,5 +1,7 @@ package com.tencent.supersonic.headless.server.service.impl; +import static com.tencent.supersonic.common.pojo.Constants.DESC_UPPER; + import com.tencent.supersonic.auth.api.authentication.pojo.User; import com.tencent.supersonic.common.pojo.Aggregator; import com.tencent.supersonic.common.pojo.DateConf; @@ -20,11 +22,6 @@ import com.tencent.supersonic.headless.server.service.ModelService; import com.tencent.supersonic.headless.server.service.QueryService; import com.tencent.supersonic.headless.server.service.TagMetaService; import com.tencent.supersonic.headless.server.service.TagQueryService; -import lombok.extern.slf4j.Slf4j; -import org.springframework.beans.factory.annotation.Value; -import org.springframework.stereotype.Service; -import org.springframework.util.CollectionUtils; - import java.time.LocalDate; import java.time.format.DateTimeFormatter; import java.util.ArrayList; @@ -34,8 +31,10 @@ import java.util.List; import java.util.Map; import java.util.Objects; import java.util.Set; - -import static com.tencent.supersonic.common.pojo.Constants.DESC_UPPER; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Service; +import org.springframework.util.CollectionUtils; @Service @Slf4j @@ -91,6 +90,7 @@ public class TagQueryServiceImpl implements TagQueryService { if (CollectionUtils.isEmpty(timeDimension)) { return; } + // query date info from db String endDate = queryTagDateFromDbBySql(timeDimension.get(0), tag, user); DateConf dateConf = new DateConf(); diff --git a/headless/server/src/main/java/com/tencent/supersonic/headless/server/utils/TagConverter.java b/headless/server/src/main/java/com/tencent/supersonic/headless/server/utils/TagConverter.java index 720e94f6f..c6c03318c 100644 --- a/headless/server/src/main/java/com/tencent/supersonic/headless/server/utils/TagConverter.java +++ b/headless/server/src/main/java/com/tencent/supersonic/headless/server/utils/TagConverter.java @@ -105,6 +105,7 @@ public class TagConverter { if (!CollectionUtils.isEmpty(queryTagReq.getTagFilters())) { queryStructReq.setDimensionFilters(queryTagReq.getTagFilters()); } + queryStructReq.setQueryType(QueryType.TAG); QuerySqlReq querySqlReq = queryStructReq.convert(); convert(querySqlReq, semanticSchemaResp, queryStatement, queryStructReq); QueryParam queryParam = new QueryParam(); diff --git a/launchers/standalone/src/main/java/com/tencent/supersonic/ModelDemoDataLoader.java b/launchers/standalone/src/main/java/com/tencent/supersonic/ModelDemoDataLoader.java index 45269cf16..1475f5fc3 100644 --- a/launchers/standalone/src/main/java/com/tencent/supersonic/ModelDemoDataLoader.java +++ b/launchers/standalone/src/main/java/com/tencent/supersonic/ModelDemoDataLoader.java @@ -445,6 +445,19 @@ public class ModelDemoDataLoader { tagDefineParam3s.setDependencies(new ArrayList<>(Arrays.asList(5))); tagReq3.setTagDefineParams(tagDefineParam3s); tagMetaService.create(tagReq3, user); + + TagReq tagReq4 = new TagReq(); + tagReq4.setModelId(4L); + tagReq4.setName("歌手名"); + tagReq4.setBizName("singer_name"); + tagReq4.setStatus(StatusEnum.ONLINE.getCode()); + tagReq4.setTypeEnum(TypeEnums.TAG); + tagReq4.setTagDefineType(TagDefineType.DIMENSION); + TagDefineParams tagDefineParam4s = new TagDefineParams(); + tagDefineParam4s.setExpr("singer_name"); + tagDefineParam4s.setDependencies(new ArrayList<>(Arrays.asList(7))); + tagReq4.setTagDefineParams(tagDefineParam4s); + tagMetaService.create(tagReq4, user); } public void addMetric_uv() throws Exception { @@ -529,7 +542,7 @@ public class ModelDemoDataLoader { dataSetReq.setAdmins(Lists.newArrayList("admin", "jack")); List dataSetModelConfigs = Lists.newArrayList( new DataSetModelConfig(4L, Lists.newArrayList(4L, 5L, 6L, 7L), - Lists.newArrayList(5L, 6L, 7L), Lists.newArrayList(1L, 2L, 3L)) + Lists.newArrayList(5L, 6L, 7L), Lists.newArrayList(1L, 2L, 3L, 4L)) ); DataSetDetail dataSetDetail = new DataSetDetail(); dataSetDetail.setDataSetModelConfigs(dataSetModelConfigs); diff --git a/launchers/standalone/src/main/resources/data/dictionary/custom/TagValue_4_4.txt b/launchers/standalone/src/main/resources/data/dictionary/custom/TagValue_4_4.txt new file mode 100644 index 000000000..245ec3a95 --- /dev/null +++ b/launchers/standalone/src/main/resources/data/dictionary/custom/TagValue_4_4.txt @@ -0,0 +1,6 @@ +周杰伦 _4_4_tv 100 +陈奕迅 _4_4_tv 100 +林俊杰 _4_4_tv 100 +张碧晨 _4_4_tv 100 +程响 _4_4_tv 100 +Taylor#Swift _4_4_tv 100 \ No newline at end of file diff --git a/launchers/standalone/src/test/java/com/tencent/supersonic/chat/TagTest.java b/launchers/standalone/src/test/java/com/tencent/supersonic/chat/TagTest.java index 486bfd8fc..6210ea0b1 100644 --- a/launchers/standalone/src/test/java/com/tencent/supersonic/chat/TagTest.java +++ b/launchers/standalone/src/test/java/com/tencent/supersonic/chat/TagTest.java @@ -1,7 +1,6 @@ package com.tencent.supersonic.chat; import com.tencent.supersonic.common.pojo.DateConf; -import com.tencent.supersonic.common.pojo.DateConf.DateMode; import com.tencent.supersonic.common.pojo.enums.AggregateTypeEnum; import com.tencent.supersonic.common.pojo.enums.FilterOperatorEnum; import com.tencent.supersonic.common.pojo.enums.QueryType; @@ -9,40 +8,12 @@ import com.tencent.supersonic.headless.api.pojo.SchemaElement; import com.tencent.supersonic.headless.api.pojo.SemanticParseInfo; import com.tencent.supersonic.headless.api.pojo.request.QueryFilter; import com.tencent.supersonic.headless.api.pojo.response.QueryResult; -import com.tencent.supersonic.headless.core.chat.query.rule.metric.MetricTagQuery; import com.tencent.supersonic.headless.core.chat.query.rule.tag.TagFilterQuery; import com.tencent.supersonic.util.DataUtils; import org.junit.jupiter.api.Test; -import java.util.ArrayList; -import java.util.List; - public class TagTest extends BaseTest { - @Test - public void queryTest_metric_tag_query() throws Exception { - MockConfiguration.mockTagAgent(agentService); - QueryResult actualResult = submitNewChat("艺人周杰伦的播放量", DataUtils.tagAgentId); - - QueryResult expectedResult = new QueryResult(); - SemanticParseInfo expectedParseInfo = new SemanticParseInfo(); - expectedResult.setChatContext(expectedParseInfo); - - expectedResult.setQueryMode(MetricTagQuery.QUERY_MODE); - expectedParseInfo.setAggType(AggregateTypeEnum.NONE); - - QueryFilter dimensionFilter = DataUtils.getFilter("singer_name", FilterOperatorEnum.EQUALS, "周杰伦", "歌手名", 7L); - expectedParseInfo.getDimensionFilters().add(dimensionFilter); - - SchemaElement metric = SchemaElement.builder().name("播放量").build(); - expectedParseInfo.getMetrics().add(metric); - - expectedParseInfo.setDateInfo(DataUtils.getDateConf(DateMode.RECENT, 7, period, startDay, endDay)); - expectedParseInfo.setQueryType(QueryType.METRIC); - - assertQueryResult(expectedResult, actualResult); - } - @Test public void queryTest_tag_list_filter() throws Exception { MockConfiguration.mockTagAgent(agentService); @@ -55,8 +26,6 @@ public class TagTest extends BaseTest { expectedResult.setQueryMode(TagFilterQuery.QUERY_MODE); expectedParseInfo.setAggType(AggregateTypeEnum.NONE); - List list = new ArrayList<>(); - list.add("流行"); QueryFilter dimensionFilter = DataUtils.getFilter("genre", FilterOperatorEnum.EQUALS, "流行", "风格", 2L); expectedParseInfo.getDimensionFilters().add(dimensionFilter); diff --git a/launchers/standalone/src/test/java/com/tencent/supersonic/chat/mapper/MapperTest.java b/launchers/standalone/src/test/java/com/tencent/supersonic/chat/mapper/MapperTest.java deleted file mode 100644 index dd4bf2b3b..000000000 --- a/launchers/standalone/src/test/java/com/tencent/supersonic/chat/mapper/MapperTest.java +++ /dev/null @@ -1,47 +0,0 @@ -package com.tencent.supersonic.chat.mapper; - -import com.tencent.supersonic.chat.BaseTest; -import com.tencent.supersonic.chat.api.pojo.request.ChatParseReq; -import com.tencent.supersonic.common.pojo.DateConf; -import com.tencent.supersonic.common.pojo.enums.FilterOperatorEnum; -import com.tencent.supersonic.common.pojo.enums.QueryType; -import com.tencent.supersonic.headless.api.pojo.SchemaElement; -import com.tencent.supersonic.headless.api.pojo.SemanticParseInfo; -import com.tencent.supersonic.headless.api.pojo.request.QueryFilter; -import com.tencent.supersonic.headless.api.pojo.response.QueryResult; -import com.tencent.supersonic.headless.core.chat.query.rule.metric.MetricTagQuery; -import com.tencent.supersonic.util.DataUtils; -import org.junit.jupiter.api.Test; - -import static com.tencent.supersonic.common.pojo.enums.AggregateTypeEnum.NONE; - -public class MapperTest extends BaseTest { - - @Test - public void hanlp() throws Exception { - - ChatParseReq chatParseReq = DataUtils.getChatParseReq(10, "艺人周杰伦的播放量"); - chatParseReq.setAgentId(DataUtils.tagAgentId); - - QueryResult actualResult = submitNewChat("艺人周杰伦的播放量", DataUtils.tagAgentId); - - QueryResult expectedResult = new QueryResult(); - SemanticParseInfo expectedParseInfo = new SemanticParseInfo(); - expectedResult.setChatContext(expectedParseInfo); - - expectedResult.setQueryMode(MetricTagQuery.QUERY_MODE); - expectedParseInfo.setAggType(NONE); - - QueryFilter dimensionFilter = DataUtils.getFilter("singer_name", FilterOperatorEnum.EQUALS, "周杰伦", "歌手名", 7L); - expectedParseInfo.getDimensionFilters().add(dimensionFilter); - - SchemaElement metric = SchemaElement.builder().name("播放量").build(); - expectedParseInfo.getMetrics().add(metric); - - expectedParseInfo.setDateInfo(DataUtils.getDateConf(DateConf.DateMode.RECENT, 7, period, startDay, endDay)); - expectedParseInfo.setQueryType(QueryType.METRIC); - - assertQueryResult(expectedResult, actualResult); - } - -} diff --git a/launchers/standalone/src/test/java/com/tencent/supersonic/util/DataUtils.java b/launchers/standalone/src/test/java/com/tencent/supersonic/util/DataUtils.java index 8a8756042..dc884bf80 100644 --- a/launchers/standalone/src/test/java/com/tencent/supersonic/util/DataUtils.java +++ b/launchers/standalone/src/test/java/com/tencent/supersonic/util/DataUtils.java @@ -1,5 +1,7 @@ package com.tencent.supersonic.util; +import static java.time.LocalDate.now; + import com.alibaba.fastjson.JSONObject; import com.google.common.collect.Lists; import com.tencent.supersonic.auth.api.authentication.pojo.User; @@ -13,12 +15,9 @@ import com.tencent.supersonic.common.pojo.DateConf; import com.tencent.supersonic.common.pojo.enums.FilterOperatorEnum; import com.tencent.supersonic.headless.api.pojo.SchemaElement; import com.tencent.supersonic.headless.api.pojo.request.QueryFilter; - import java.util.HashSet; import java.util.Set; -import static java.time.LocalDate.now; - public class DataUtils { public static final Integer metricAgentId = 1; @@ -140,7 +139,7 @@ public class DataUtils { RuleParserTool ruleQueryTool = new RuleParserTool(); ruleQueryTool.setType(AgentToolType.NL2SQL_RULE); ruleQueryTool.setDataSetIds(Lists.newArrayList(-1L)); - ruleQueryTool.setQueryModes(Lists.newArrayList("METRIC_TAG", "METRIC_FILTER", "METRIC_MODEL", + ruleQueryTool.setQueryModes(Lists.newArrayList("METRIC_ID", "METRIC_FILTER", "METRIC_MODEL", "TAG_DETAIL", "TAG_LIST_FILTER", "TAG_ID")); return ruleQueryTool; } diff --git a/launchers/standalone/src/test/resources/data/dictionary/custom/TagValue_4_4.txt b/launchers/standalone/src/test/resources/data/dictionary/custom/TagValue_4_4.txt new file mode 100644 index 000000000..245ec3a95 --- /dev/null +++ b/launchers/standalone/src/test/resources/data/dictionary/custom/TagValue_4_4.txt @@ -0,0 +1,6 @@ +周杰伦 _4_4_tv 100 +陈奕迅 _4_4_tv 100 +林俊杰 _4_4_tv 100 +张碧晨 _4_4_tv 100 +程响 _4_4_tv 100 +Taylor#Swift _4_4_tv 100 \ No newline at end of file diff --git a/webapp/packages/chat-sdk/src/common/type.ts b/webapp/packages/chat-sdk/src/common/type.ts index e7101d8f2..a1f20f52b 100644 --- a/webapp/packages/chat-sdk/src/common/type.ts +++ b/webapp/packages/chat-sdk/src/common/type.ts @@ -93,7 +93,7 @@ export type ChatContextType = { elementMatches: any[]; nativeQuery: boolean; queryMode: string; - queryType: 'METRIC' | 'METRIC_TAG' | 'ID' | 'TAG' | 'OTHER'; + queryType: 'METRIC' | 'METRIC_ID' | 'ID' | 'TAG' | 'OTHER'; dimensionFilters: FilterItemType[]; properties: any; sqlInfo: SqlInfoType; diff --git a/webapp/packages/chat-sdk/src/components/ChatItem/ParseTip.tsx b/webapp/packages/chat-sdk/src/components/ChatItem/ParseTip.tsx index b90a27338..3ac381029 100644 --- a/webapp/packages/chat-sdk/src/components/ChatItem/ParseTip.tsx +++ b/webapp/packages/chat-sdk/src/components/ChatItem/ParseTip.tsx @@ -152,11 +152,11 @@ const ParseTip: React.FC = ({
{dataSet?.name}
)} - {(queryType === 'METRIC' || queryType === 'METRIC_TAG' || queryType === 'TAG') && ( + {(queryType === 'METRIC' || queryType === 'METRIC_ID' || queryType === 'TAG') && (
查询模式:
- {queryType === 'METRIC' || queryType === 'METRIC_TAG' ? '指标模式' : '标签模式'} + {queryType === 'METRIC' || queryType === 'METRIC_ID' ? '指标模式' : '标签模式'}
)} diff --git a/webapp/packages/chat-sdk/src/components/ChatMsg/Message/index.tsx b/webapp/packages/chat-sdk/src/components/ChatMsg/Message/index.tsx index f5b4694d8..cc7edaca2 100644 --- a/webapp/packages/chat-sdk/src/components/ChatMsg/Message/index.tsx +++ b/webapp/packages/chat-sdk/src/components/ChatMsg/Message/index.tsx @@ -45,7 +45,7 @@ const Message: React.FC = ({ e.stopPropagation(); }} > - {(queryMode === 'METRIC_TAG' || queryMode === 'TAG_DETAIL') && + {(queryMode === 'METRIC_ID' || queryMode === 'TAG_DETAIL') && entityInfoList.length > 0 && (
diff --git a/webapp/packages/chat-sdk/src/components/ChatMsg/index.tsx b/webapp/packages/chat-sdk/src/components/ChatMsg/index.tsx index 6930167b1..54cb86a6f 100644 --- a/webapp/packages/chat-sdk/src/components/ChatMsg/index.tsx +++ b/webapp/packages/chat-sdk/src/components/ChatMsg/index.tsx @@ -233,7 +233,7 @@ const ChatMsg: React.FC = ({ queryId, data, chartIndex, triggerResize }) ?.name; const isEntityMode = - (queryMode === 'TAG_LIST_FILTER' || queryMode === 'METRIC_TAG') && + (queryMode === 'TAG_LIST_FILTER' || queryMode === 'METRIC_ID') && typeof entityId === 'string' && entityName !== undefined;