(improvement)(Headless)(Chat) Change View to DataSet (#782)

* (improvement)(Headless)(Chat) Change view to dataSet



---------

Co-authored-by: jolunoluo <jolunoluo@tencent.com>
This commit is contained in:
LXW
2024-03-04 11:48:41 +08:00
committed by GitHub
parent b29e429271
commit a41da3f5fe
184 changed files with 1628 additions and 1532 deletions

View File

@@ -15,7 +15,7 @@ public class PluginDO {
private String type;
private String view;
private String dataSet;
private String pattern;

View File

@@ -4,7 +4,7 @@ import com.google.common.collect.Lists;
import com.tencent.supersonic.headless.api.pojo.RelatedSchemaElement;
import com.tencent.supersonic.headless.api.pojo.SchemaElement;
import com.tencent.supersonic.chat.api.pojo.SemanticParseInfo;
import com.tencent.supersonic.chat.api.pojo.ViewSchema;
import com.tencent.supersonic.chat.api.pojo.DataSetSchema;
import com.tencent.supersonic.chat.api.pojo.request.ExecuteQueryReq;
import com.tencent.supersonic.chat.api.pojo.response.QueryResult;
import com.tencent.supersonic.chat.server.service.SemanticService;
@@ -34,15 +34,15 @@ public class DimensionRecommendProcessor implements ExecuteResultProcessor {
return;
}
SchemaElement element = semanticParseInfo.getMetrics().iterator().next();
List<SchemaElement> dimensionRecommended = getDimensions(element.getId(), element.getView());
List<SchemaElement> dimensionRecommended = getDimensions(element.getId(), element.getDataSet());
queryResult.setRecommendedDimensions(dimensionRecommended);
}
private List<SchemaElement> getDimensions(Long metricId, Long viewId) {
private List<SchemaElement> getDimensions(Long metricId, Long dataSetId) {
SemanticService semanticService = ContextUtils.getBean(SemanticService.class);
ViewSchema viewSchema = semanticService.getViewSchema(viewId);
DataSetSchema dataSetSchema = semanticService.getDataSetSchema(dataSetId);
List<Long> drillDownDimensions = Lists.newArrayList();
Set<SchemaElement> metricElements = viewSchema.getMetrics();
Set<SchemaElement> metricElements = dataSetSchema.getMetrics();
if (!CollectionUtils.isEmpty(metricElements)) {
Optional<SchemaElement> metric = metricElements.stream().filter(schemaElement ->
metricId.equals(schemaElement.getId())
@@ -54,7 +54,7 @@ public class DimensionRecommendProcessor implements ExecuteResultProcessor {
}
}
final List<Long> drillDownDimensionsFinal = drillDownDimensions;
return viewSchema.getDimensions().stream()
return dataSetSchema.getDimensions().stream()
.filter(dim -> filterDimension(drillDownDimensionsFinal, dim))
.sorted(Comparator.comparing(SchemaElement::getUseCnt).reversed())
.limit(recommend_dimension_size)

View File

@@ -1,12 +1,11 @@
package com.tencent.supersonic.chat.server.processor.execute;
import com.alibaba.fastjson.JSONObject;
import com.tencent.supersonic.headless.api.pojo.SchemaElement;
import com.tencent.supersonic.headless.api.pojo.SchemaElementType;
import com.google.common.collect.Lists;
import com.tencent.supersonic.chat.api.pojo.SemanticParseInfo;
import com.tencent.supersonic.chat.api.pojo.request.ExecuteQueryReq;
import com.tencent.supersonic.chat.api.pojo.response.QueryResult;
import com.tencent.supersonic.common.config.EmbeddingConfig;
import com.tencent.supersonic.common.pojo.Constants;
import com.tencent.supersonic.common.pojo.enums.QueryType;
import com.tencent.supersonic.common.util.ComponentFactory;
import com.tencent.supersonic.common.util.ContextUtils;
@@ -14,6 +13,9 @@ 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.SchemaElement;
import com.tencent.supersonic.headless.api.pojo.SchemaElementType;
import com.tencent.supersonic.headless.server.service.MetaEmbeddingService;
import org.springframework.util.CollectionUtils;
import java.util.Collections;
@@ -46,15 +48,14 @@ public class MetricRecommendProcessor implements ExecuteResultProcessor {
}
List<String> metricNames = Collections.singletonList(parseInfo.getMetrics().iterator().next().getName());
Map<String, String> filterCondition = new HashMap<>();
filterCondition.put("modelId", parseInfo.getMetrics().iterator().next().getView().toString());
filterCondition.put("modelId", parseInfo.getMetrics().iterator().next().getDataSet().toString());
filterCondition.put("type", SchemaElementType.METRIC.name());
RetrieveQuery retrieveQuery = RetrieveQuery.builder().queryTextsList(metricNames)
.filterCondition(filterCondition).queryEmbeddings(null).build();
EmbeddingConfig embeddingConfig = ContextUtils.getBean(EmbeddingConfig.class);
List<RetrieveQueryResult> retrieveQueryResults = s2EmbeddingStore.retrieveQuery(
embeddingConfig.getMetaCollectionName(), retrieveQuery, METRIC_RECOMMEND_SIZE + 1);
MetaEmbeddingService metaEmbeddingService = ContextUtils.getBean(MetaEmbeddingService.class);
List<RetrieveQueryResult> retrieveQueryResults =
metaEmbeddingService.retrieveQuery(Lists.newArrayList(parseInfo.getDataSetId()),
retrieveQuery, METRIC_RECOMMEND_SIZE + 1);
if (CollectionUtils.isEmpty(retrieveQueryResults)) {
return;
}
@@ -71,9 +72,10 @@ public class MetricRecommendProcessor implements ExecuteResultProcessor {
if (!metricIds.contains(Retrieval.getLongId(retrieval.getId()))) {
SchemaElement schemaElement = JSONObject.parseObject(JSONObject.toJSONString(retrieval.getMetadata()),
SchemaElement.class);
if (retrieval.getMetadata().containsKey("viewId")) {
String viewId = retrieval.getMetadata().get("viewId").toString();
schemaElement.setView(Long.parseLong(viewId));
if (retrieval.getMetadata().containsKey("dataSetId")) {
String dataSetId = retrieval.getMetadata().get("dataSetId").toString()
.replace(Constants.UNDERLINE, "");
schemaElement.setDataSet(Long.parseLong(dataSetId));
}
schemaElement.setOrder(++metricOrder);
parseInfo.getMetrics().add(schemaElement);

View File

@@ -1,7 +1,7 @@
package com.tencent.supersonic.chat.server.processor.parse;
import com.tencent.supersonic.chat.api.pojo.SemanticParseInfo;
import com.tencent.supersonic.chat.api.pojo.ViewSchema;
import com.tencent.supersonic.chat.api.pojo.DataSetSchema;
import com.tencent.supersonic.chat.api.pojo.response.EntityInfo;
import com.tencent.supersonic.chat.api.pojo.response.ParseResp;
import com.tencent.supersonic.chat.core.pojo.ChatContext;
@@ -37,9 +37,10 @@ public class EntityInfoProcessor implements ParseResultProcessor {
return;
}
//1. set entity info
ViewSchema viewSchema = queryContext.getSemanticSchema().getViewSchemaMap().get(parseInfo.getViewId());
DataSetSchema dataSetSchema =
queryContext.getSemanticSchema().getDataSetSchemaMap().get(parseInfo.getDataSetId());
SemanticService semanticService = ContextUtils.getBean(SemanticService.class);
EntityInfo entityInfo = semanticService.getEntityInfo(parseInfo, viewSchema, queryContext.getUser());
EntityInfo entityInfo = semanticService.getEntityInfo(parseInfo, dataSetSchema, queryContext.getUser());
if (QueryManager.isTagQuery(queryMode)
|| QueryManager.isMetricQuery(queryMode)) {
parseInfo.setEntityInfo(entityInfo);

View File

@@ -74,9 +74,9 @@ public class ParseInfoProcessor implements ParseResultProcessor {
}
//set filter
Long viewId = parseInfo.getViewId();
Long dataSetId = parseInfo.getDataSetId();
try {
Map<String, SchemaElement> fieldNameToElement = getNameToElement(viewId);
Map<String, SchemaElement> fieldNameToElement = getNameToElement(dataSetId);
List<QueryFilter> result = getDimensionFilter(fieldNameToElement, expressions);
parseInfo.getDimensionFilters().addAll(result);
} catch (Exception e) {
@@ -88,31 +88,31 @@ public class ParseInfoProcessor implements ParseResultProcessor {
return;
}
List<String> allFields = getFieldsExceptDate(SqlSelectHelper.getAllFields(sqlInfo.getCorrectS2SQL()));
Set<SchemaElement> metrics = getElements(viewId, allFields, semanticSchema.getMetrics());
Set<SchemaElement> metrics = getElements(dataSetId, allFields, semanticSchema.getMetrics());
parseInfo.setMetrics(metrics);
if (QueryType.METRIC.equals(parseInfo.getQueryType())) {
List<String> groupByFields = SqlSelectHelper.getGroupByFields(sqlInfo.getCorrectS2SQL());
List<String> groupByDimensions = getFieldsExceptDate(groupByFields);
parseInfo.setDimensions(getElements(viewId, groupByDimensions, semanticSchema.getDimensions()));
parseInfo.setDimensions(getElements(dataSetId, groupByDimensions, semanticSchema.getDimensions()));
} else if (QueryType.TAG.equals(parseInfo.getQueryType())) {
List<String> selectFields = SqlSelectHelper.getSelectFields(sqlInfo.getCorrectS2SQL());
List<String> selectDimensions = getFieldsExceptDate(selectFields);
parseInfo.setDimensions(getElements(viewId, selectDimensions, semanticSchema.getDimensions()));
parseInfo.setDimensions(getElements(dataSetId, selectDimensions, semanticSchema.getDimensions()));
}
}
private Set<SchemaElement> getElements(Long viewId, List<String> allFields, List<SchemaElement> elements) {
private Set<SchemaElement> getElements(Long dataSetId, List<String> allFields, List<SchemaElement> elements) {
return elements.stream()
.filter(schemaElement -> {
if (CollectionUtils.isEmpty(schemaElement.getAlias())) {
return viewId.equals(schemaElement.getView()) && allFields.contains(
return dataSetId.equals(schemaElement.getDataSet()) && allFields.contains(
schemaElement.getName());
}
Set<String> allFieldsSet = new HashSet<>(allFields);
Set<String> aliasSet = new HashSet<>(schemaElement.getAlias());
List<String> intersection = allFieldsSet.stream()
.filter(aliasSet::contains).collect(Collectors.toList());
return viewId.equals(schemaElement.getView()) && (allFields.contains(
return dataSetId.equals(schemaElement.getDataSet()) && (allFields.contains(
schemaElement.getName()) || !CollectionUtils.isEmpty(intersection));
}
).collect(Collectors.toSet());
@@ -194,10 +194,10 @@ public class ParseInfoProcessor implements ParseResultProcessor {
return dateExpressions.size() > 1 && Objects.nonNull(dateExpressions.get(1).getFieldValue());
}
protected Map<String, SchemaElement> getNameToElement(Long viewId) {
protected Map<String, SchemaElement> getNameToElement(Long dataSetId) {
SemanticSchema semanticSchema = ContextUtils.getBean(SchemaService.class).getSemanticSchema();
List<SchemaElement> dimensions = semanticSchema.getDimensions(viewId);
List<SchemaElement> metrics = semanticSchema.getMetrics(viewId);
List<SchemaElement> dimensions = semanticSchema.getDimensions(dataSetId);
List<SchemaElement> metrics = semanticSchema.getMetrics(dataSetId);
List<SchemaElement> allElements = Lists.newArrayList();
allElements.addAll(dimensions);

View File

@@ -17,7 +17,7 @@ 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.ItemResp;
import com.tencent.supersonic.headless.api.pojo.response.MetricResp;
import com.tencent.supersonic.headless.api.pojo.response.ViewResp;
import com.tencent.supersonic.headless.api.pojo.response.DataSetResp;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
@@ -84,14 +84,14 @@ public class ChatConfigController {
}
//Compatible with front-end
@GetMapping("/viewList")
public List<ViewResp> getViewList() {
return semanticInterpreter.getViewList(null);
@GetMapping("/dataSetList")
public List<DataSetResp> getDataSetList() {
return semanticInterpreter.getDataSetList(null);
}
@GetMapping("/viewList/{domainId}")
public List<ViewResp> getViewList(@PathVariable("domainId") Long domainId) {
return semanticInterpreter.getViewList(domainId);
@GetMapping("/dataSetList/{domainId}")
public List<DataSetResp> getDataSetList(@PathVariable("domainId") Long domainId) {
return semanticInterpreter.getDataSetList(domainId);
}
@PostMapping("/dimension/page")
@@ -107,9 +107,9 @@ public class ChatConfigController {
return semanticInterpreter.getMetricPage(pageMetricReq, user);
}
@GetMapping("/getDomainViewTree")
public List<ItemResp> getDomainViewTree() {
return semanticInterpreter.getDomainViewTree();
@GetMapping("/getDomainDataSetTree")
public List<ItemResp> getDomainDataSetTree() {
return semanticInterpreter.getDomainDataSetTree();
}
}

View File

@@ -6,11 +6,11 @@ import com.tencent.supersonic.headless.api.pojo.SchemaElement;
import com.tencent.supersonic.headless.api.pojo.SchemaElementType;
import com.tencent.supersonic.chat.api.pojo.SemanticParseInfo;
import com.tencent.supersonic.chat.api.pojo.SemanticSchema;
import com.tencent.supersonic.chat.api.pojo.ViewSchema;
import com.tencent.supersonic.chat.api.pojo.DataSetSchema;
import com.tencent.supersonic.chat.api.pojo.request.QueryFilter;
import com.tencent.supersonic.chat.api.pojo.response.DataInfo;
import com.tencent.supersonic.chat.api.pojo.response.EntityInfo;
import com.tencent.supersonic.chat.api.pojo.response.ViewInfo;
import com.tencent.supersonic.chat.api.pojo.response.DataSetInfo;
import com.tencent.supersonic.chat.core.query.semantic.SemanticInterpreter;
import com.tencent.supersonic.chat.core.utils.ComponentFactory;
import com.tencent.supersonic.chat.core.utils.QueryReqBuilder;
@@ -50,19 +50,19 @@ public class SemanticService {
return schemaService.getSemanticSchema();
}
public ViewSchema getViewSchema(Long id) {
return schemaService.getViewSchema(id);
public DataSetSchema getDataSetSchema(Long id) {
return schemaService.getDataSetSchema(id);
}
public EntityInfo getEntityInfo(SemanticParseInfo parseInfo, ViewSchema viewSchema, User user) {
if (parseInfo != null && parseInfo.getViewId() > 0) {
EntityInfo entityInfo = getEntityBasicInfo(viewSchema);
if (parseInfo.getDimensionFilters().size() <= 0 || entityInfo.getViewInfo() == null) {
public EntityInfo getEntityInfo(SemanticParseInfo parseInfo, DataSetSchema dataSetSchema, User user) {
if (parseInfo != null && parseInfo.getDataSetId() > 0) {
EntityInfo entityInfo = getEntityBasicInfo(dataSetSchema);
if (parseInfo.getDimensionFilters().size() <= 0 || entityInfo.getDataSetInfo() == null) {
entityInfo.setMetrics(null);
entityInfo.setDimensions(null);
return entityInfo;
}
String primaryKey = entityInfo.getViewInfo().getPrimaryKey();
String primaryKey = entityInfo.getDataSetInfo().getPrimaryKey();
if (StringUtils.isNotBlank(primaryKey)) {
String entityId = "";
for (QueryFilter chatFilter : parseInfo.getDimensionFilters()) {
@@ -75,7 +75,7 @@ public class SemanticService {
}
entityInfo.setEntityId(entityId);
try {
fillEntityInfoValue(entityInfo, viewSchema, user);
fillEntityInfoValue(entityInfo, dataSetSchema, user);
return entityInfo;
} catch (Exception e) {
log.error("setMainModel error", e);
@@ -85,29 +85,29 @@ public class SemanticService {
return null;
}
private EntityInfo getEntityBasicInfo(ViewSchema viewSchema) {
private EntityInfo getEntityBasicInfo(DataSetSchema dataSetSchema) {
EntityInfo entityInfo = new EntityInfo();
if (viewSchema == null) {
if (dataSetSchema == null) {
return entityInfo;
}
Long viewId = viewSchema.getView().getView();
ViewInfo viewInfo = new ViewInfo();
viewInfo.setItemId(viewId.intValue());
viewInfo.setName(viewSchema.getView().getName());
viewInfo.setWords(viewSchema.getView().getAlias());
viewInfo.setBizName(viewSchema.getView().getBizName());
if (Objects.nonNull(viewSchema.getEntity())) {
viewInfo.setPrimaryKey(viewSchema.getEntity().getBizName());
Long dataSetId = dataSetSchema.getDataSet().getDataSet();
DataSetInfo dataSetInfo = new DataSetInfo();
dataSetInfo.setItemId(dataSetId.intValue());
dataSetInfo.setName(dataSetSchema.getDataSet().getName());
dataSetInfo.setWords(dataSetSchema.getDataSet().getAlias());
dataSetInfo.setBizName(dataSetSchema.getDataSet().getBizName());
if (Objects.nonNull(dataSetSchema.getEntity())) {
dataSetInfo.setPrimaryKey(dataSetSchema.getEntity().getBizName());
}
entityInfo.setViewInfo(viewInfo);
TagTypeDefaultConfig tagTypeDefaultConfig = viewSchema.getTagTypeDefaultConfig();
entityInfo.setDataSetInfo(dataSetInfo);
TagTypeDefaultConfig tagTypeDefaultConfig = dataSetSchema.getTagTypeDefaultConfig();
if (tagTypeDefaultConfig == null || tagTypeDefaultConfig.getDefaultDisplayInfo() == null) {
return entityInfo;
}
List<DataInfo> dimensions = tagTypeDefaultConfig.getDefaultDisplayInfo().getDimensionIds().stream()
.map(id -> {
SchemaElement element = viewSchema.getElement(SchemaElementType.DIMENSION, id);
SchemaElement element = dataSetSchema.getElement(SchemaElementType.DIMENSION, id);
if (element == null) {
return null;
}
@@ -115,7 +115,7 @@ public class SemanticService {
}).filter(Objects::nonNull).collect(Collectors.toList());
List<DataInfo> metrics = tagTypeDefaultConfig.getDefaultDisplayInfo().getDimensionIds().stream()
.map(id -> {
SchemaElement element = viewSchema.getElement(SchemaElementType.METRIC, id);
SchemaElement element = dataSetSchema.getElement(SchemaElementType.METRIC, id);
if (element == null) {
return null;
}
@@ -126,9 +126,9 @@ public class SemanticService {
return entityInfo;
}
public void fillEntityInfoValue(EntityInfo entityInfo, ViewSchema viewSchema, User user) {
public void fillEntityInfoValue(EntityInfo entityInfo, DataSetSchema dataSetSchema, User user) {
SemanticQueryResp queryResultWithColumns =
getQueryResultWithSchemaResp(entityInfo, viewSchema, user);
getQueryResultWithSchemaResp(entityInfo, dataSetSchema, user);
if (queryResultWithColumns != null) {
if (!CollectionUtils.isEmpty(queryResultWithColumns.getResultList())
&& queryResultWithColumns.getResultList().size() > 0) {
@@ -147,15 +147,16 @@ public class SemanticService {
}
}
public SemanticQueryResp getQueryResultWithSchemaResp(EntityInfo entityInfo, ViewSchema viewSchema, User user) {
public SemanticQueryResp getQueryResultWithSchemaResp(EntityInfo entityInfo,
DataSetSchema dataSetSchema, User user) {
SemanticParseInfo semanticParseInfo = new SemanticParseInfo();
semanticParseInfo.setView(viewSchema.getView());
semanticParseInfo.setDataSet(dataSetSchema.getDataSet());
semanticParseInfo.setQueryType(QueryType.TAG);
semanticParseInfo.setMetrics(getMetrics(entityInfo));
semanticParseInfo.setDimensions(getDimensions(entityInfo));
DateConf dateInfo = new DateConf();
int unit = 1;
TimeDefaultConfig timeDefaultConfig = viewSchema.getTagTypeTimeDefaultConfig();
TimeDefaultConfig timeDefaultConfig = dataSetSchema.getTagTypeTimeDefaultConfig();
if (Objects.nonNull(timeDefaultConfig)) {
unit = timeDefaultConfig.getUnit();
String date = LocalDate.now().plusDays(-unit).toString();
@@ -222,7 +223,7 @@ public class SemanticService {
}
private String getEntityPrimaryName(EntityInfo entityInfo) {
return entityInfo.getViewInfo().getPrimaryKey();
return entityInfo.getDataSetInfo().getPrimaryKey();
}
}

View File

@@ -60,8 +60,8 @@ public class ChatServiceImpl implements ChatService {
return null;
}
SemanticParseInfo originalSemanticParse = chatContext.getParseInfo();
if (Objects.nonNull(originalSemanticParse) && Objects.nonNull(originalSemanticParse.getViewId())) {
return originalSemanticParse.getViewId();
if (Objects.nonNull(originalSemanticParse) && Objects.nonNull(originalSemanticParse.getDataSetId())) {
return originalSemanticParse.getDataSetId();
}
return null;
}

View File

@@ -4,7 +4,7 @@ package com.tencent.supersonic.chat.server.service.impl;
import com.google.common.collect.Lists;
import com.tencent.supersonic.auth.api.authentication.pojo.User;
import com.tencent.supersonic.chat.core.query.semantic.SemanticInterpreter;
import com.tencent.supersonic.chat.api.pojo.ViewSchema;
import com.tencent.supersonic.chat.api.pojo.DataSetSchema;
import com.tencent.supersonic.headless.api.pojo.SchemaElement;
import com.tencent.supersonic.chat.api.pojo.request.ChatAggConfigReq;
import com.tencent.supersonic.chat.api.pojo.request.ChatConfigBaseReq;
@@ -177,7 +177,7 @@ public class ConfigServiceImpl implements ConfigService {
}
private ItemVisibilityInfo fetchVisibilityDescByConfig(ItemVisibility visibility,
ViewSchema modelSchema) {
DataSetSchema modelSchema) {
ItemVisibilityInfo itemVisibilityDesc = new ItemVisibilityInfo();
List<Long> dimIdAllList = chatConfigHelper.generateAllDimIdList(modelSchema);
@@ -219,20 +219,20 @@ public class ConfigServiceImpl implements ConfigService {
}
BeanUtils.copyProperties(chatConfigResp, chatConfigRich);
ViewSchema viewSchema = semanticService.getViewSchema(modelId);
if (viewSchema == null) {
DataSetSchema dataSetSchema = semanticService.getDataSetSchema(modelId);
if (dataSetSchema == null) {
return chatConfigRich;
}
chatConfigRich.setBizName(viewSchema.getView().getBizName());
chatConfigRich.setModelName(viewSchema.getView().getName());
chatConfigRich.setBizName(dataSetSchema.getDataSet().getBizName());
chatConfigRich.setModelName(dataSetSchema.getDataSet().getName());
chatConfigRich.setChatAggRichConfig(fillChatAggRichConfig(viewSchema, chatConfigResp));
chatConfigRich.setChatDetailRichConfig(fillChatDetailRichConfig(viewSchema, chatConfigRich, chatConfigResp));
chatConfigRich.setChatAggRichConfig(fillChatAggRichConfig(dataSetSchema, chatConfigResp));
chatConfigRich.setChatDetailRichConfig(fillChatDetailRichConfig(dataSetSchema, chatConfigRich, chatConfigResp));
return chatConfigRich;
}
private ChatDetailRichConfigResp fillChatDetailRichConfig(ViewSchema modelSchema,
private ChatDetailRichConfigResp fillChatDetailRichConfig(DataSetSchema modelSchema,
ChatConfigRichResp chatConfigRich,
ChatConfigResp chatConfigResp) {
if (Objects.isNull(chatConfigResp) || Objects.isNull(chatConfigResp.getChatDetailConfig())) {
@@ -251,7 +251,7 @@ public class ConfigServiceImpl implements ConfigService {
return detailRichConfig;
}
private EntityRichInfoResp generateRichEntity(Entity entity, ViewSchema modelSchema) {
private EntityRichInfoResp generateRichEntity(Entity entity, DataSetSchema modelSchema) {
EntityRichInfoResp entityRichInfo = new EntityRichInfoResp();
if (Objects.isNull(entity) || Objects.isNull(entity.getEntityId())) {
return entityRichInfo;
@@ -264,7 +264,7 @@ public class ConfigServiceImpl implements ConfigService {
return entityRichInfo;
}
private ChatAggRichConfigResp fillChatAggRichConfig(ViewSchema modelSchema, ChatConfigResp chatConfigResp) {
private ChatAggRichConfigResp fillChatAggRichConfig(DataSetSchema modelSchema, ChatConfigResp chatConfigResp) {
if (Objects.isNull(chatConfigResp) || Objects.isNull(chatConfigResp.getChatAggConfig())) {
return null;
}
@@ -281,7 +281,7 @@ public class ConfigServiceImpl implements ConfigService {
}
private ChatDefaultRichConfigResp fetchDefaultConfig(ChatDefaultConfigReq chatDefaultConfig,
ViewSchema modelSchema,
DataSetSchema modelSchema,
ItemVisibilityInfo itemVisibilityInfo) {
ChatDefaultRichConfigResp defaultRichConfig = new ChatDefaultRichConfigResp();
if (Objects.isNull(chatDefaultConfig)) {
@@ -331,7 +331,7 @@ public class ConfigServiceImpl implements ConfigService {
}
private List<KnowledgeInfoReq> fillKnowledgeBizName(List<KnowledgeInfoReq> knowledgeInfos,
ViewSchema modelSchema) {
DataSetSchema modelSchema) {
if (CollectionUtils.isEmpty(knowledgeInfos)) {
return new ArrayList<>();
}
@@ -351,9 +351,9 @@ public class ConfigServiceImpl implements ConfigService {
@Override
public List<ChatConfigRichResp> getAllChatRichConfig() {
List<ChatConfigRichResp> chatConfigRichInfoList = new ArrayList<>();
List<ViewSchema> modelSchemas = semanticInterpreter.getViewSchema();
List<DataSetSchema> modelSchemas = semanticInterpreter.getDataSetSchema();
modelSchemas.stream().forEach(modelSchema -> {
ChatConfigRichResp chatConfigRichInfo = getConfigRichInfo(modelSchema.getView().getId());
ChatConfigRichResp chatConfigRichInfo = getConfigRichInfo(modelSchema.getDataSet().getId());
if (Objects.nonNull(chatConfigRichInfo)) {
chatConfigRichInfoList.add(chatConfigRichInfo);
}

View File

@@ -93,8 +93,8 @@ public class PluginServiceImpl implements PluginService {
if (StringUtils.isNotBlank(pluginQueryReq.getType())) {
queryWrapper.lambda().eq(PluginDO::getType, pluginQueryReq.getType());
}
if (StringUtils.isNotBlank(pluginQueryReq.getView())) {
queryWrapper.lambda().like(PluginDO::getView, pluginQueryReq.getView());
if (StringUtils.isNotBlank(pluginQueryReq.getDataSet())) {
queryWrapper.lambda().like(PluginDO::getDataSet, pluginQueryReq.getDataSet());
}
if (StringUtils.isNotBlank(pluginQueryReq.getParseMode())) {
queryWrapper.lambda().eq(PluginDO::getParseMode, pluginQueryReq.getParseMode());
@@ -180,8 +180,8 @@ public class PluginServiceImpl implements PluginService {
public Plugin convert(PluginDO pluginDO) {
Plugin plugin = new Plugin();
BeanUtils.copyProperties(pluginDO, plugin);
if (StringUtils.isNotBlank(pluginDO.getView())) {
plugin.setViewList(Arrays.stream(pluginDO.getView().split(","))
if (StringUtils.isNotBlank(pluginDO.getDataSet())) {
plugin.setDataSetList(Arrays.stream(pluginDO.getDataSet().split(","))
.map(Long::parseLong).collect(Collectors.toList()));
}
return plugin;
@@ -194,7 +194,7 @@ public class PluginServiceImpl implements PluginService {
pluginDO.setCreatedBy(user.getName());
pluginDO.setUpdatedAt(new Date());
pluginDO.setUpdatedBy(user.getName());
pluginDO.setView(StringUtils.join(plugin.getViewList(), ","));
pluginDO.setDataSet(StringUtils.join(plugin.getDataSetList(), ","));
return pluginDO;
}
@@ -202,7 +202,7 @@ public class PluginServiceImpl implements PluginService {
BeanUtils.copyProperties(plugin, pluginDO);
pluginDO.setUpdatedAt(new Date());
pluginDO.setUpdatedBy(user.getName());
pluginDO.setView(StringUtils.join(plugin.getViewList(), ","));
pluginDO.setDataSet(StringUtils.join(plugin.getDataSetList(), ","));
return pluginDO;
}

View File

@@ -1,12 +1,11 @@
package com.tencent.supersonic.chat.server.service.impl;
import com.tencent.supersonic.auth.api.authentication.pojo.User;
import com.tencent.supersonic.headless.api.pojo.SchemaElement;
import com.tencent.supersonic.chat.api.pojo.SchemaMapInfo;
import com.tencent.supersonic.chat.api.pojo.SemanticParseInfo;
import com.tencent.supersonic.chat.api.pojo.SemanticSchema;
import com.tencent.supersonic.chat.api.pojo.ViewSchema;
import com.tencent.supersonic.chat.api.pojo.DataSetSchema;
import com.tencent.supersonic.headless.api.pojo.request.DimensionValueReq;
import com.tencent.supersonic.chat.api.pojo.request.ExecuteQueryReq;
import com.tencent.supersonic.chat.api.pojo.request.QueryDataReq;
@@ -296,7 +295,7 @@ public class QueryServiceImpl implements QueryService {
similarQueryManager.saveSimilarQuery(SimilarQueryReq.builder().parseId(queryReq.getParseId())
.queryId(queryReq.getQueryId())
.agentId(chatQueryDO.getAgentId())
.viewId(parseInfo.getViewId())
.dataSetId(parseInfo.getDataSetId())
.queryText(queryReq.getQueryText()).build());
}
@@ -352,9 +351,9 @@ public class QueryServiceImpl implements QueryService {
}
QueryResult queryResult = semanticQuery.execute(user);
queryResult.setChatContext(semanticQuery.getParseInfo());
ViewSchema viewSchema = semanticSchema.getViewSchemaMap().get(parseInfo.getViewId());
DataSetSchema dataSetSchema = semanticSchema.getDataSetSchemaMap().get(parseInfo.getDataSetId());
SemanticService semanticService = ContextUtils.getBean(SemanticService.class);
EntityInfo entityInfo = semanticService.getEntityInfo(parseInfo, viewSchema, user);
EntityInfo entityInfo = semanticService.getEntityInfo(parseInfo, dataSetSchema, user);
queryResult.setEntityInfo(entityInfo);
return queryResult;
}
@@ -422,8 +421,9 @@ public class QueryServiceImpl implements QueryService {
ChatParseDO chatParseDO = chatService.getParseInfo(queryId, parseId);
SemanticParseInfo parseInfo = JsonUtil.toObject(chatParseDO.getParseInfo(), SemanticParseInfo.class);
SemanticService semanticService = ContextUtils.getBean(SemanticService.class);
ViewSchema viewSchema = schemaService.getSemanticSchema().getViewSchemaMap().get(parseInfo.getViewId());
return semanticService.getEntityInfo(parseInfo, viewSchema, user);
DataSetSchema dataSetSchema =
schemaService.getSemanticSchema().getDataSetSchemaMap().get(parseInfo.getDataSetId());
return semanticService.getEntityInfo(parseInfo, dataSetSchema, user);
}
private void updateDateInfo(QueryDataReq queryData, SemanticParseInfo parseInfo,
@@ -641,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<Long> detectViewIds = new HashSet<>();
detectViewIds.add(schemaElement.getView());
dimensionValueReq.setModelId(schemaElement.getView());
List<String> dimensionValues = getDimensionValues(dimensionValueReq, detectViewIds);
Set<Long> detectDataSetIds = new HashSet<>();
detectDataSetIds.add(schemaElement.getDataSet());
dimensionValueReq.setModelId(schemaElement.getDataSet());
List<String> dimensionValues = getDimensionValues(dimensionValueReq, detectDataSetIds);
// if the search results is null,search dimensionValue from database
if (CollectionUtils.isEmpty(dimensionValues)) {
semanticQueryResp = queryDatabase(dimensionValueReq, user);
@@ -668,14 +668,14 @@ public class QueryServiceImpl implements QueryService {
return semanticQueryResp;
}
private List<String> getDimensionValues(DimensionValueReq dimensionValueReq, Set<Long> viewIds) {
private List<String> getDimensionValues(DimensionValueReq dimensionValueReq, Set<Long> dataSetIds) {
//if value is null ,then search from NATURE_TO_VALUES
if (StringUtils.isBlank(dimensionValueReq.getValue())) {
return SearchService.getDimensionValue(dimensionValueReq);
}
//search from prefixSearch
List<HanlpMapResult> hanlpMapResultList = knowledgeService.prefixSearch(dimensionValueReq.getValue(),
2000, viewIds);
2000, dataSetIds);
HanlpHelper.transLetterOriginal(hanlpMapResultList);
return hanlpMapResultList.stream()
.filter(o -> {
@@ -700,7 +700,7 @@ public class QueryServiceImpl implements QueryService {
dateConf.setPeriod("DAY");
queryStructReq.setDateInfo(dateConf);
queryStructReq.setLimit(20L);
queryStructReq.setViewId(dimensionValueReq.getModelId());
queryStructReq.setDataSetId(dimensionValueReq.getModelId());
queryStructReq.setQueryType(QueryType.ID);
List<String> groups = new ArrayList<>();
groups.add(dimensionValueReq.getBizName());

View File

@@ -4,7 +4,7 @@ package com.tencent.supersonic.chat.server.service.impl;
import com.google.common.collect.Lists;
import com.tencent.supersonic.headless.api.pojo.RelatedSchemaElement;
import com.tencent.supersonic.headless.api.pojo.SchemaElement;
import com.tencent.supersonic.chat.api.pojo.ViewSchema;
import com.tencent.supersonic.chat.api.pojo.DataSetSchema;
import com.tencent.supersonic.chat.api.pojo.request.ChatConfigFilter;
import com.tencent.supersonic.chat.api.pojo.request.RecommendReq;
import com.tencent.supersonic.chat.api.pojo.response.ChatConfigResp;
@@ -48,7 +48,7 @@ public class RecommendServiceImpl implements RecommendService {
if (Objects.isNull(modelId)) {
return new RecommendResp();
}
ViewSchema modelSchema = semanticService.getViewSchema(modelId);
DataSetSchema modelSchema = semanticService.getDataSetSchema(modelId);
if (Objects.isNull(modelSchema)) {
return new RecommendResp();
}
@@ -80,7 +80,7 @@ public class RecommendServiceImpl implements RecommendService {
.limit(limit)
.map(dimSchemaDesc -> {
SchemaElement item = new SchemaElement();
item.setView(modelId);
item.setDataSet(modelId);
item.setName(dimSchemaDesc.getName());
item.setBizName(dimSchemaDesc.getBizName());
item.setId(dimSchemaDesc.getId());
@@ -94,7 +94,7 @@ public class RecommendServiceImpl implements RecommendService {
.limit(limit)
.map(metricSchemaDesc -> {
SchemaElement item = new SchemaElement();
item.setView(modelId);
item.setDataSet(modelId);
item.setName(metricSchemaDesc.getName());
item.setBizName(metricSchemaDesc.getBizName());
item.setId(metricSchemaDesc.getId());

View File

@@ -4,7 +4,7 @@ import com.google.common.cache.CacheBuilder;
import com.google.common.cache.CacheLoader;
import com.google.common.cache.LoadingCache;
import com.tencent.supersonic.chat.api.pojo.SemanticSchema;
import com.tencent.supersonic.chat.api.pojo.ViewSchema;
import com.tencent.supersonic.chat.api.pojo.DataSetSchema;
import com.tencent.supersonic.chat.core.query.semantic.SemanticInterpreter;
import com.tencent.supersonic.chat.core.utils.ComponentFactory;
import lombok.extern.slf4j.Slf4j;
@@ -28,13 +28,13 @@ public class SchemaService {
@Override
public SemanticSchema load(String key) {
log.info("load getDomainSchemaInfo cache [{}]", key);
return new SemanticSchema(semanticInterpreter.getViewSchema());
return new SemanticSchema(semanticInterpreter.getDataSetSchema());
}
}
);
public ViewSchema getViewSchema(Long id) {
return semanticInterpreter.getViewSchema(id, true);
public DataSetSchema getDataSetSchema(Long id) {
return semanticInterpreter.getDataSetSchema(id, true);
}
public SemanticSchema getSemanticSchema() {

View File

@@ -14,7 +14,7 @@ import com.tencent.supersonic.chat.core.agent.Agent;
import com.tencent.supersonic.headless.api.pojo.response.S2Term;
import com.tencent.supersonic.headless.core.knowledge.DictWord;
import com.tencent.supersonic.headless.core.knowledge.HanlpMapResult;
import com.tencent.supersonic.headless.core.knowledge.ViewInfoStat;
import com.tencent.supersonic.headless.core.knowledge.DataSetInfoStat;
import com.tencent.supersonic.chat.core.mapper.MapperHelper;
import com.tencent.supersonic.chat.core.mapper.MatchText;
import com.tencent.supersonic.chat.core.mapper.ModelWithSemanticType;
@@ -91,18 +91,19 @@ public class SearchServiceImpl implements SearchService {
// 2.get meta info
SemanticSchema semanticSchemaDb = schemaService.getSemanticSchema();
List<SchemaElement> metricsDb = semanticSchemaDb.getMetrics();
final Map<Long, String> modelToName = semanticSchemaDb.getViewIdToName();
final Map<Long, String> modelToName = semanticSchemaDb.getDataSetIdToName();
// 3.detect by segment
List<S2Term> originals = knowledgeService.getTerms(queryText);
log.info("hanlp parse result: {}", originals);
MapperHelper mapperHelper = ContextUtils.getBean(MapperHelper.class);
Set<Long> detectViewIds = mapperHelper.getViewIds(queryReq.getViewId(), agentService.getAgent(agentId));
Set<Long> detectDataSetIds = mapperHelper.getDataSetIds(queryReq.getDataSetId(),
agentService.getAgent(agentId));
QueryContext queryContext = new QueryContext();
BeanUtils.copyProperties(queryReq, queryContext);
Map<MatchText, List<HanlpMapResult>> regTextMap =
searchMatchStrategy.match(queryContext, originals, detectViewIds);
searchMatchStrategy.match(queryContext, originals, detectDataSetIds);
regTextMap.entrySet().stream().forEach(m -> HanlpHelper.transLetterOriginal(m.getValue()));
// 4.get the most matching data
@@ -121,9 +122,9 @@ public class SearchServiceImpl implements SearchService {
log.info("searchTextEntry:{},queryReq:{}", searchTextEntry, queryReq);
Set<SearchResult> searchResults = new LinkedHashSet();
ViewInfoStat modelStat = NatureHelper.getViewStat(originals);
DataSetInfoStat modelStat = NatureHelper.getDataSetStat(originals);
List<Long> possibleModels = getPossibleModels(queryReq, originals, modelStat, queryReq.getViewId());
List<Long> possibleModels = getPossibleModels(queryReq, originals, modelStat, queryReq.getDataSetId());
// 5.1 priority dimension metric
boolean existMetricAndDimension = searchMetricAndDimension(new HashSet<>(possibleModels), modelToName,
@@ -137,7 +138,7 @@ public class SearchServiceImpl implements SearchService {
for (Map.Entry<String, String> natureToNameEntry : natureToNameMap.entrySet()) {
Set<SearchResult> searchResultSet = searchDimensionValue(metricsDb, modelToName,
modelStat.getMetricViewCount(), existMetricAndDimension,
modelStat.getMetricDataSetCount(), existMetricAndDimension,
matchText, natureToNameMap, natureToNameEntry, queryReq.getQueryFilters());
searchResults.addAll(searchResultSet);
@@ -146,7 +147,7 @@ public class SearchServiceImpl implements SearchService {
}
private List<Long> getPossibleModels(QueryReq queryCtx, List<S2Term> originals,
ViewInfoStat modelStat, Long webModelId) {
DataSetInfoStat modelStat, Long webModelId) {
if (Objects.nonNull(webModelId) && webModelId > 0) {
List<Long> result = new ArrayList<>();
@@ -154,7 +155,7 @@ public class SearchServiceImpl implements SearchService {
return result;
}
List<Long> possibleModels = NatureHelper.selectPossibleViews(originals);
List<Long> possibleModels = NatureHelper.selectPossibleDataSets(originals);
Long contextModel = chatService.getContextModel(queryCtx.getChatId());
@@ -167,9 +168,9 @@ public class SearchServiceImpl implements SearchService {
return possibleModels;
}
private boolean nothingOrOnlyMetric(ViewInfoStat modelStat) {
return modelStat.getMetricViewCount() >= 0 && modelStat.getDimensionViewCount() <= 0
&& modelStat.getDimensionValueViewCount() <= 0 && modelStat.getViewCount() <= 0;
private boolean nothingOrOnlyMetric(DataSetInfoStat modelStat) {
return modelStat.getMetricDataSetCount() >= 0 && modelStat.getDimensionDataSetCount() <= 0
&& modelStat.getDimensionValueDataSetCount() <= 0 && modelStat.getDataSetCount() <= 0;
}
private boolean effectiveModel(Long contextModel) {
@@ -189,7 +190,7 @@ public class SearchServiceImpl implements SearchService {
String nature = natureToNameEntry.getKey();
String wordName = natureToNameEntry.getValue();
Long modelId = NatureHelper.getViewId(nature);
Long modelId = NatureHelper.getDataSetId(nature);
SchemaElementType schemaElementType = NatureHelper.convertToElementType(nature);
if (SchemaElementType.ENTITY.equals(schemaElementType)) {
@@ -266,7 +267,7 @@ public class SearchServiceImpl implements SearchService {
return Lists.newArrayList();
}
return metricsDb.stream()
.filter(mapDO -> Objects.nonNull(mapDO) && model.equals(mapDO.getView()))
.filter(mapDO -> Objects.nonNull(mapDO) && model.equals(mapDO.getDataSet()))
.sorted(Comparator.comparing(SchemaElement::getUseCnt).reversed())
.flatMap(entry -> {
List<String> result = new ArrayList<>();
@@ -290,7 +291,7 @@ public class SearchServiceImpl implements SearchService {
if (CollectionUtils.isEmpty(possibleModels)) {
return true;
}
Long model = NatureHelper.getViewId(nature);
Long model = NatureHelper.getDataSetId(nature);
return possibleModels.contains(model);
})
.map(nature -> {
@@ -313,7 +314,7 @@ public class SearchServiceImpl implements SearchService {
for (HanlpMapResult hanlpMapResult : hanlpMapResults) {
List<ModelWithSemanticType> dimensionMetricClassIds = hanlpMapResult.getNatures().stream()
.map(nature -> new ModelWithSemanticType(NatureHelper.getViewId(nature),
.map(nature -> new ModelWithSemanticType(NatureHelper.getDataSetId(nature),
NatureHelper.convertToElementType(nature)))
.filter(entry -> matchCondition(entry, possibleModels)).collect(Collectors.toList());

View File

@@ -24,7 +24,7 @@ public class WordService {
public List<DictWord> getAllDictWords() {
SemanticInterpreter semanticInterpreter = ComponentFactory.getSemanticLayer();
SemanticSchema semanticSchema = new SemanticSchema(semanticInterpreter.getViewSchema());
SemanticSchema semanticSchema = new SemanticSchema(semanticInterpreter.getDataSetSchema());
List<DictWord> words = new ArrayList<>();

View File

@@ -3,7 +3,7 @@ package com.tencent.supersonic.chat.server.util;
import static com.tencent.supersonic.common.pojo.Constants.ADMIN_LOWER;
import com.tencent.supersonic.auth.api.authentication.pojo.User;
import com.tencent.supersonic.chat.api.pojo.ViewSchema;
import com.tencent.supersonic.chat.api.pojo.DataSetSchema;
import com.tencent.supersonic.headless.api.pojo.SchemaElement;
import com.tencent.supersonic.chat.api.pojo.request.ChatAggConfigReq;
import com.tencent.supersonic.chat.api.pojo.request.ChatConfigBaseReq;
@@ -56,7 +56,7 @@ public class ChatConfigHelper {
return chatConfig;
}
public List<Long> generateAllDimIdList(ViewSchema modelSchema) {
public List<Long> generateAllDimIdList(DataSetSchema modelSchema) {
if (Objects.isNull(modelSchema) || CollectionUtils.isEmpty(modelSchema.getDimensions())) {
return new ArrayList<>();
}
@@ -65,7 +65,7 @@ public class ChatConfigHelper {
return new ArrayList<>(dimIdAndDescPair.keySet());
}
public List<Long> generateAllMetricIdList(ViewSchema modelSchema) {
public List<Long> generateAllMetricIdList(DataSetSchema modelSchema) {
if (Objects.isNull(modelSchema) || CollectionUtils.isEmpty(modelSchema.getMetrics())) {
return new ArrayList<>();
}

View File

@@ -30,8 +30,8 @@ class QueryReqBuilderTest {
void buildS2SQLReq() {
init();
QueryStructReq queryStructReq = new QueryStructReq();
queryStructReq.setViewId(1L);
queryStructReq.setViewName("内容库");
queryStructReq.setDataSetId(1L);
queryStructReq.setDataSetName("内容库");
queryStructReq.setQueryType(QueryType.METRIC);
Aggregator aggregator = new Aggregator();