diff --git a/chat/server/src/main/java/com/tencent/supersonic/chat/server/executor/SqlExecutor.java b/chat/server/src/main/java/com/tencent/supersonic/chat/server/executor/SqlExecutor.java index 7ad0c68dd..6a68033c5 100644 --- a/chat/server/src/main/java/com/tencent/supersonic/chat/server/executor/SqlExecutor.java +++ b/chat/server/src/main/java/com/tencent/supersonic/chat/server/executor/SqlExecutor.java @@ -5,25 +5,32 @@ import com.tencent.supersonic.chat.server.persistence.dataobject.ChatMemoryDO; import com.tencent.supersonic.chat.server.pojo.ChatExecuteContext; import com.tencent.supersonic.chat.server.service.MemoryService; import com.tencent.supersonic.chat.server.util.ResultFormatter; +import com.tencent.supersonic.common.pojo.QueryColumn; import com.tencent.supersonic.common.util.ContextUtils; import com.tencent.supersonic.headless.api.pojo.SemanticParseInfo; -import com.tencent.supersonic.headless.api.pojo.request.ExecuteQueryReq; +import com.tencent.supersonic.headless.api.pojo.request.QuerySqlReq; import com.tencent.supersonic.headless.api.pojo.response.QueryResult; import com.tencent.supersonic.headless.api.pojo.response.QueryState; +import com.tencent.supersonic.headless.api.pojo.response.SemanticQueryResp; +import com.tencent.supersonic.headless.chat.ChatContext; import com.tencent.supersonic.headless.chat.query.llm.s2sql.LLMSqlQuery; -import com.tencent.supersonic.headless.server.facade.service.ChatQueryService; +import com.tencent.supersonic.headless.server.facade.service.SemanticLayerService; +import com.tencent.supersonic.headless.server.web.service.ChatContextService; import lombok.SneakyThrows; import org.apache.commons.lang3.StringUtils; + +import java.util.ArrayList; import java.util.Date; +import java.util.List; +import java.util.Map; public class SqlExecutor implements ChatExecutor { @SneakyThrows @Override public QueryResult execute(ChatExecuteContext chatExecuteContext) { - ExecuteQueryReq executeQueryReq = buildExecuteReq(chatExecuteContext); - ChatQueryService chatQueryService = ContextUtils.getBean(ChatQueryService.class); - QueryResult queryResult = chatQueryService.performExecution(executeQueryReq); + QueryResult queryResult = doExecute(chatExecuteContext); + if (queryResult != null) { String textResult = ResultFormatter.transform2TextNew(queryResult.getQueryColumns(), queryResult.getQueryResults()); @@ -48,16 +55,43 @@ public class SqlExecutor implements ChatExecutor { return queryResult; } - private ExecuteQueryReq buildExecuteReq(ChatExecuteContext chatExecuteContext) { - SemanticParseInfo parseInfo = chatExecuteContext.getParseInfo(); - return ExecuteQueryReq.builder() - .queryId(chatExecuteContext.getQueryId()) - .chatId(chatExecuteContext.getChatId()) - .queryText(chatExecuteContext.getQueryText()) - .parseInfo(parseInfo) - .saveAnswer(chatExecuteContext.isSaveAnswer()) - .user(chatExecuteContext.getUser()) + @SneakyThrows + private QueryResult doExecute(ChatExecuteContext chatExecuteContext) { + SemanticLayerService semanticLayer = ContextUtils.getBean(SemanticLayerService.class); + ChatContextService chatContextService = ContextUtils.getBean(ChatContextService.class); + + ChatContext chatCtx = chatContextService.getOrCreateContext(chatExecuteContext.getChatId()); + + QuerySqlReq sqlReq = QuerySqlReq.builder() + .sql(chatExecuteContext.getParseInfo().getSqlInfo().getCorrectS2SQL()) .build(); + sqlReq.setSqlInfo(chatExecuteContext.getParseInfo().getSqlInfo()); + sqlReq.setDataSetId(chatExecuteContext.getParseInfo().getDataSetId()); + + long startTime = System.currentTimeMillis(); + SemanticQueryResp queryResp = semanticLayer.queryByReq(sqlReq, chatExecuteContext.getUser()); + QueryResult queryResult = new QueryResult(); + + if (queryResp != null) { + queryResult.setQueryAuthorization(queryResp.getQueryAuthorization()); + List> resultList = queryResp == null ? new ArrayList<>() + : queryResp.getResultList(); + List columns = queryResp == null ? new ArrayList<>() : queryResp.getColumns(); + queryResult.setQueryTimeCost(System.currentTimeMillis() - startTime); + queryResult.setQuerySql(queryResp.getSql()); + queryResult.setQueryResults(resultList); + queryResult.setQueryColumns(columns); + queryResult.setQueryMode(chatExecuteContext.getParseInfo().getQueryMode()); + queryResult.setQueryState(QueryState.SUCCESS); + + chatCtx.setParseInfo(chatExecuteContext.getParseInfo()); + chatContextService.updateContext(chatCtx); + } else { + queryResult.setQueryState(QueryState.INVALID); + queryResult.setQueryMode(chatExecuteContext.getParseInfo().getQueryMode()); + } + + return queryResult; } public String buildSchemaStr(SemanticParseInfo parseInfo) { diff --git a/chat/server/src/main/java/com/tencent/supersonic/chat/server/parser/NL2SQLParser.java b/chat/server/src/main/java/com/tencent/supersonic/chat/server/parser/NL2SQLParser.java index 2af26cdab..5a5ed244a 100644 --- a/chat/server/src/main/java/com/tencent/supersonic/chat/server/parser/NL2SQLParser.java +++ b/chat/server/src/main/java/com/tencent/supersonic/chat/server/parser/NL2SQLParser.java @@ -15,7 +15,7 @@ import com.tencent.supersonic.headless.api.pojo.SchemaElementMatch; import com.tencent.supersonic.headless.api.pojo.SchemaElementType; import com.tencent.supersonic.headless.api.pojo.SemanticParseInfo; import com.tencent.supersonic.headless.api.pojo.request.QueryFilter; -import com.tencent.supersonic.headless.api.pojo.request.QueryReq; +import com.tencent.supersonic.headless.api.pojo.request.QueryTextReq; import com.tencent.supersonic.headless.api.pojo.response.MapResp; import com.tencent.supersonic.headless.api.pojo.response.ParseResp; import com.tencent.supersonic.headless.server.facade.service.ChatQueryService; @@ -69,11 +69,11 @@ public class NL2SQLParser implements ChatParser { } processMultiTurn(chatParseContext); - QueryReq queryReq = QueryReqConverter.buildText2SqlQueryReq(chatParseContext); - addDynamicExemplars(chatParseContext.getAgent().getId(), queryReq); + QueryTextReq queryTextReq = QueryReqConverter.buildText2SqlQueryReq(chatParseContext); + addDynamicExemplars(chatParseContext.getAgent().getId(), queryTextReq); ChatQueryService chatQueryService = ContextUtils.getBean(ChatQueryService.class); - ParseResp text2SqlParseResp = chatQueryService.performParsing(queryReq); + ParseResp text2SqlParseResp = chatQueryService.performParsing(queryTextReq); if (!ParseResp.ParseState.FAILED.equals(text2SqlParseResp.getState())) { parseResp.getSelectedParses().addAll(text2SqlParseResp.getSelectedParses()); } @@ -149,8 +149,8 @@ public class NL2SQLParser implements ChatParser { // derive mapping result of current question and parsing result of last question. ChatQueryService chatQueryService = ContextUtils.getBean(ChatQueryService.class); - QueryReq queryReq = QueryReqConverter.buildText2SqlQueryReq(chatParseContext); - MapResp currentMapResult = chatQueryService.performMapping(queryReq); + QueryTextReq queryTextReq = QueryReqConverter.buildText2SqlQueryReq(chatParseContext); + MapResp currentMapResult = chatQueryService.performMapping(queryTextReq); List historyParseResults = getHistoryParseResult(chatParseContext.getChatId(), 1); if (historyParseResults.size() == 0) { @@ -168,7 +168,7 @@ public class NL2SQLParser implements ChatParser { .curtSchema(curtMapStr) .histSchema(histMapStr) .histSQL(histSQL) - .llmConfig(queryReq.getLlmConfig()) + .llmConfig(queryTextReq.getLlmConfig()) .build()); chatParseContext.setQueryText(rewrittenQuery); log.info("Last Query: {} Current Query: {}, Rewritten Query: {}", @@ -225,13 +225,13 @@ public class NL2SQLParser implements ChatParser { return contextualList; } - private void addDynamicExemplars(Integer agentId, QueryReq queryReq) { + private void addDynamicExemplars(Integer agentId, QueryTextReq queryTextReq) { ExemplarServiceImpl exemplarManager = ContextUtils.getBean(ExemplarServiceImpl.class); EmbeddingConfig embeddingConfig = ContextUtils.getBean(EmbeddingConfig.class); String memoryCollectionName = embeddingConfig.getMemoryCollectionName(agentId); List exemplars = exemplarManager.recallExemplars(memoryCollectionName, - queryReq.getQueryText(), 5); - queryReq.getDynamicExemplars().addAll(exemplars); + queryTextReq.getQueryText(), 5); + queryTextReq.getDynamicExemplars().addAll(exemplars); } @Builder diff --git a/chat/server/src/main/java/com/tencent/supersonic/chat/server/rest/ChatQueryController.java b/chat/server/src/main/java/com/tencent/supersonic/chat/server/rest/ChatQueryController.java index 1e04eb04c..a900b7d99 100644 --- a/chat/server/src/main/java/com/tencent/supersonic/chat/server/rest/ChatQueryController.java +++ b/chat/server/src/main/java/com/tencent/supersonic/chat/server/rest/ChatQueryController.java @@ -10,7 +10,7 @@ import com.tencent.supersonic.chat.server.service.ChatService; import com.tencent.supersonic.common.pojo.exception.InvalidArgumentException; import com.tencent.supersonic.headless.api.pojo.SemanticParseInfo; import com.tencent.supersonic.headless.api.pojo.request.DimensionValueReq; -import com.tencent.supersonic.headless.api.pojo.request.QueryReq; +import com.tencent.supersonic.headless.api.pojo.request.QueryTextReq; import com.tencent.supersonic.headless.api.pojo.response.ParseResp; import org.apache.commons.collections.CollectionUtils; import org.springframework.beans.BeanUtils; @@ -76,7 +76,7 @@ public class ChatQueryController { } @PostMapping("queryContext") - public Object queryContext(@RequestBody QueryReq queryCtx, + public Object queryContext(@RequestBody QueryTextReq queryCtx, HttpServletRequest request, HttpServletResponse response) { queryCtx.setUser(UserHolder.findUser(request, response)); return chatService.queryContext(queryCtx.getChatId()); diff --git a/chat/server/src/main/java/com/tencent/supersonic/chat/server/service/impl/ChatServiceImpl.java b/chat/server/src/main/java/com/tencent/supersonic/chat/server/service/impl/ChatServiceImpl.java index 1034dcaec..2c739dd0a 100644 --- a/chat/server/src/main/java/com/tencent/supersonic/chat/server/service/impl/ChatServiceImpl.java +++ b/chat/server/src/main/java/com/tencent/supersonic/chat/server/service/impl/ChatServiceImpl.java @@ -21,7 +21,7 @@ import com.tencent.supersonic.common.util.BeanMapper; import com.tencent.supersonic.headless.api.pojo.SemanticParseInfo; import com.tencent.supersonic.headless.api.pojo.request.DimensionValueReq; import com.tencent.supersonic.headless.api.pojo.request.QueryDataReq; -import com.tencent.supersonic.headless.api.pojo.request.QueryReq; +import com.tencent.supersonic.headless.api.pojo.request.QueryTextReq; import com.tencent.supersonic.headless.api.pojo.response.MapResp; import com.tencent.supersonic.headless.api.pojo.response.ParseResp; import com.tencent.supersonic.headless.api.pojo.response.QueryResult; @@ -60,8 +60,8 @@ public class ChatServiceImpl implements ChatService { if (!agent.enableSearch()) { return Lists.newArrayList(); } - QueryReq queryReq = QueryReqConverter.buildText2SqlQueryReq(chatParseContext); - return retrieveService.retrieve(queryReq); + QueryTextReq queryTextReq = QueryReqConverter.buildText2SqlQueryReq(chatParseContext); + return retrieveService.retrieve(queryTextReq); } @Override @@ -137,8 +137,8 @@ public class ChatServiceImpl implements ChatService { } private void supplyMapInfo(ChatParseContext chatParseContext) { - QueryReq queryReq = QueryReqConverter.buildText2SqlQueryReq(chatParseContext); - MapResp mapResp = chatQueryService.performMapping(queryReq); + QueryTextReq queryTextReq = QueryReqConverter.buildText2SqlQueryReq(chatParseContext); + MapResp mapResp = chatQueryService.performMapping(queryTextReq); chatParseContext.setMapInfo(mapResp.getMapInfo()); } diff --git a/chat/server/src/main/java/com/tencent/supersonic/chat/server/util/QueryReqConverter.java b/chat/server/src/main/java/com/tencent/supersonic/chat/server/util/QueryReqConverter.java index 6cd91f4d9..6a1203306 100644 --- a/chat/server/src/main/java/com/tencent/supersonic/chat/server/util/QueryReqConverter.java +++ b/chat/server/src/main/java/com/tencent/supersonic/chat/server/util/QueryReqConverter.java @@ -4,35 +4,35 @@ import com.tencent.supersonic.chat.server.agent.Agent; import com.tencent.supersonic.chat.server.pojo.ChatParseContext; import com.tencent.supersonic.common.pojo.enums.Text2SQLType; import com.tencent.supersonic.common.util.BeanMapper; -import com.tencent.supersonic.headless.api.pojo.request.QueryReq; +import com.tencent.supersonic.headless.api.pojo.request.QueryTextReq; import org.apache.commons.collections.MapUtils; import java.util.Objects; public class QueryReqConverter { - public static QueryReq buildText2SqlQueryReq(ChatParseContext chatParseContext) { - QueryReq queryReq = new QueryReq(); - BeanMapper.mapper(chatParseContext, queryReq); + public static QueryTextReq buildText2SqlQueryReq(ChatParseContext chatParseContext) { + QueryTextReq queryTextReq = new QueryTextReq(); + BeanMapper.mapper(chatParseContext, queryTextReq); Agent agent = chatParseContext.getAgent(); if (agent == null) { - return queryReq; + return queryTextReq; } if (agent.containsLLMParserTool() && agent.containsRuleTool()) { - queryReq.setText2SQLType(Text2SQLType.RULE_AND_LLM); + queryTextReq.setText2SQLType(Text2SQLType.RULE_AND_LLM); } else if (agent.containsLLMParserTool()) { - queryReq.setText2SQLType(Text2SQLType.ONLY_LLM); + queryTextReq.setText2SQLType(Text2SQLType.ONLY_LLM); } else if (agent.containsRuleTool()) { - queryReq.setText2SQLType(Text2SQLType.ONLY_RULE); + queryTextReq.setText2SQLType(Text2SQLType.ONLY_RULE); } - queryReq.setDataSetIds(agent.getDataSetIds()); - if (Objects.nonNull(queryReq.getMapInfo()) - && MapUtils.isNotEmpty(queryReq.getMapInfo().getDataSetElementMatches())) { - queryReq.setMapInfo(queryReq.getMapInfo()); + queryTextReq.setDataSetIds(agent.getDataSetIds()); + if (Objects.nonNull(queryTextReq.getMapInfo()) + && MapUtils.isNotEmpty(queryTextReq.getMapInfo().getDataSetElementMatches())) { + queryTextReq.setMapInfo(queryTextReq.getMapInfo()); } - queryReq.setLlmConfig(agent.getLlmConfig()); - queryReq.setPromptConfig(agent.getPromptConfig()); - return queryReq; + queryTextReq.setLlmConfig(agent.getLlmConfig()); + queryTextReq.setPromptConfig(agent.getPromptConfig()); + return queryTextReq; } } diff --git a/common/src/main/java/com/tencent/supersonic/common/config/ChatModelConfig.java b/common/src/main/java/com/tencent/supersonic/common/config/ChatModelConfig.java index 0d9d00356..4acd09a09 100644 --- a/common/src/main/java/com/tencent/supersonic/common/config/ChatModelConfig.java +++ b/common/src/main/java/com/tencent/supersonic/common/config/ChatModelConfig.java @@ -2,12 +2,14 @@ package com.tencent.supersonic.common.config; import com.tencent.supersonic.common.util.AESEncryptionUtil; import lombok.AllArgsConstructor; +import lombok.Builder; import lombok.Data; import lombok.NoArgsConstructor; import java.io.Serializable; @Data +@Builder @AllArgsConstructor @NoArgsConstructor public class ChatModelConfig implements Serializable { diff --git a/headless/api/src/main/java/com/tencent/supersonic/headless/api/pojo/enums/WorkflowState.java b/headless/api/src/main/java/com/tencent/supersonic/headless/api/pojo/enums/WorkflowState.java index a49067e42..3c7fd0a87 100644 --- a/headless/api/src/main/java/com/tencent/supersonic/headless/api/pojo/enums/WorkflowState.java +++ b/headless/api/src/main/java/com/tencent/supersonic/headless/api/pojo/enums/WorkflowState.java @@ -4,6 +4,7 @@ public enum WorkflowState { MAPPING, PARSING, CORRECTING, + TRANSLATING, PROCESSING, FINISHED } \ No newline at end of file diff --git a/headless/api/src/main/java/com/tencent/supersonic/headless/api/pojo/request/QuerySqlReq.java b/headless/api/src/main/java/com/tencent/supersonic/headless/api/pojo/request/QuerySqlReq.java index b20a5530d..506c3cb68 100644 --- a/headless/api/src/main/java/com/tencent/supersonic/headless/api/pojo/request/QuerySqlReq.java +++ b/headless/api/src/main/java/com/tencent/supersonic/headless/api/pojo/request/QuerySqlReq.java @@ -1,6 +1,9 @@ package com.tencent.supersonic.headless.api.pojo.request; +import lombok.AllArgsConstructor; +import lombok.Builder; import lombok.Data; +import lombok.NoArgsConstructor; import lombok.ToString; import org.apache.commons.collections.CollectionUtils; @@ -8,8 +11,13 @@ import java.util.Objects; @Data @ToString +@Builder +@AllArgsConstructor +@NoArgsConstructor public class QuerySqlReq extends SemanticQueryReq { + private String sql; + private Integer limit = 1000; @Override diff --git a/headless/api/src/main/java/com/tencent/supersonic/headless/api/pojo/request/QueryStructReq.java b/headless/api/src/main/java/com/tencent/supersonic/headless/api/pojo/request/QueryStructReq.java index f64bd3abf..077613a67 100644 --- a/headless/api/src/main/java/com/tencent/supersonic/headless/api/pojo/request/QueryStructReq.java +++ b/headless/api/src/main/java/com/tencent/supersonic/headless/api/pojo/request/QueryStructReq.java @@ -155,7 +155,7 @@ public class QueryStructReq extends SemanticQueryReq { String sql = null; try { sql = buildSql(this, isBizName); - } catch (Exception e) { + } catch (JSQLParserException e) { log.error("buildSql error", e); } @@ -164,7 +164,7 @@ public class QueryStructReq extends SemanticQueryReq { result.setDataSetId(this.getDataSetId()); result.setModelIds(this.getModelIdSet()); result.setParams(new ArrayList<>()); - result.setSqlInfo(this.getSqlInfo()); + result.getSqlInfo().setCorrectS2SQL(sql); return result; } diff --git a/headless/api/src/main/java/com/tencent/supersonic/headless/api/pojo/request/QueryReq.java b/headless/api/src/main/java/com/tencent/supersonic/headless/api/pojo/request/QueryTextReq.java similarity index 97% rename from headless/api/src/main/java/com/tencent/supersonic/headless/api/pojo/request/QueryReq.java rename to headless/api/src/main/java/com/tencent/supersonic/headless/api/pojo/request/QueryTextReq.java index 4af8ae504..ba6c32073 100644 --- a/headless/api/src/main/java/com/tencent/supersonic/headless/api/pojo/request/QueryReq.java +++ b/headless/api/src/main/java/com/tencent/supersonic/headless/api/pojo/request/QueryTextReq.java @@ -16,7 +16,7 @@ import java.util.List; import java.util.Set; @Data -public class QueryReq { +public class QueryTextReq { private String queryText; private Integer chatId; private Set dataSetIds = Sets.newHashSet(); diff --git a/headless/api/src/main/java/com/tencent/supersonic/headless/api/pojo/request/ExplainSqlReq.java b/headless/api/src/main/java/com/tencent/supersonic/headless/api/pojo/request/TranslateSqlReq.java similarity index 92% rename from headless/api/src/main/java/com/tencent/supersonic/headless/api/pojo/request/ExplainSqlReq.java rename to headless/api/src/main/java/com/tencent/supersonic/headless/api/pojo/request/TranslateSqlReq.java index 42a59f277..1e41a9435 100644 --- a/headless/api/src/main/java/com/tencent/supersonic/headless/api/pojo/request/ExplainSqlReq.java +++ b/headless/api/src/main/java/com/tencent/supersonic/headless/api/pojo/request/TranslateSqlReq.java @@ -12,7 +12,7 @@ import lombok.ToString; @Builder @AllArgsConstructor @NoArgsConstructor -public class ExplainSqlReq { +public class TranslateSqlReq { private QueryMethod queryTypeEnum; diff --git a/headless/api/src/main/java/com/tencent/supersonic/headless/api/pojo/response/ExplainResp.java b/headless/api/src/main/java/com/tencent/supersonic/headless/api/pojo/response/TranslateResp.java similarity index 86% rename from headless/api/src/main/java/com/tencent/supersonic/headless/api/pojo/response/ExplainResp.java rename to headless/api/src/main/java/com/tencent/supersonic/headless/api/pojo/response/TranslateResp.java index 92d888423..fc658c728 100644 --- a/headless/api/src/main/java/com/tencent/supersonic/headless/api/pojo/response/ExplainResp.java +++ b/headless/api/src/main/java/com/tencent/supersonic/headless/api/pojo/response/TranslateResp.java @@ -13,7 +13,7 @@ import java.io.Serializable; @Builder @AllArgsConstructor @NoArgsConstructor -public class ExplainResp implements Serializable { +public class TranslateResp implements Serializable { private String sql; diff --git a/headless/chat/src/main/java/com/tencent/supersonic/headless/chat/parser/llm/ParseResult.java b/headless/chat/src/main/java/com/tencent/supersonic/headless/chat/parser/llm/ParseResult.java index 840622005..ddb1ea5a7 100644 --- a/headless/chat/src/main/java/com/tencent/supersonic/headless/chat/parser/llm/ParseResult.java +++ b/headless/chat/src/main/java/com/tencent/supersonic/headless/chat/parser/llm/ParseResult.java @@ -1,6 +1,6 @@ package com.tencent.supersonic.headless.chat.parser.llm; -import com.tencent.supersonic.headless.api.pojo.request.QueryReq; +import com.tencent.supersonic.headless.api.pojo.request.QueryTextReq; import com.tencent.supersonic.headless.chat.query.llm.s2sql.LLMReq; import com.tencent.supersonic.headless.chat.query.llm.s2sql.LLMResp; import lombok.AllArgsConstructor; @@ -22,7 +22,7 @@ public class ParseResult { private LLMResp llmResp; - private QueryReq request; + private QueryTextReq request; private List linkingValues; } diff --git a/headless/server/src/main/java/com/tencent/supersonic/headless/server/facade/rest/ChatQueryApiController.java b/headless/server/src/main/java/com/tencent/supersonic/headless/server/facade/rest/ChatQueryApiController.java index 9afdedbac..ad44169e8 100644 --- a/headless/server/src/main/java/com/tencent/supersonic/headless/server/facade/rest/ChatQueryApiController.java +++ b/headless/server/src/main/java/com/tencent/supersonic/headless/server/facade/rest/ChatQueryApiController.java @@ -1,8 +1,7 @@ package com.tencent.supersonic.headless.server.facade.rest; import com.tencent.supersonic.auth.api.authentication.utils.UserHolder; -import com.tencent.supersonic.headless.api.pojo.request.ExecuteQueryReq; -import com.tencent.supersonic.headless.api.pojo.request.QueryReq; +import com.tencent.supersonic.headless.api.pojo.request.QueryTextReq; import com.tencent.supersonic.headless.api.pojo.response.MapResp; import com.tencent.supersonic.headless.server.facade.service.ChatQueryService; import com.tencent.supersonic.headless.server.facade.service.RetrieveService; @@ -27,35 +26,27 @@ public class ChatQueryApiController { private RetrieveService retrieveService; @PostMapping("/chat/search") - public Object search(@RequestBody QueryReq queryReq, + public Object search(@RequestBody QueryTextReq queryTextReq, HttpServletRequest request, HttpServletResponse response) throws Exception { - queryReq.setUser(UserHolder.findUser(request, response)); - return retrieveService.retrieve(queryReq); + queryTextReq.setUser(UserHolder.findUser(request, response)); + return retrieveService.retrieve(queryTextReq); } @PostMapping("/chat/map") - public MapResp map(@RequestBody QueryReq queryReq, + public MapResp map(@RequestBody QueryTextReq queryTextReq, HttpServletRequest request, HttpServletResponse response) { - queryReq.setUser(UserHolder.findUser(request, response)); - return chatQueryService.performMapping(queryReq); + queryTextReq.setUser(UserHolder.findUser(request, response)); + return chatQueryService.performMapping(queryTextReq); } @PostMapping("/chat/parse") - public Object parse(@RequestBody QueryReq queryReq, + public Object parse(@RequestBody QueryTextReq queryTextReq, HttpServletRequest request, HttpServletResponse response) throws Exception { - queryReq.setUser(UserHolder.findUser(request, response)); - return chatQueryService.performParsing(queryReq); - } - - @PostMapping("/chat/execute") - public Object execute(@RequestBody ExecuteQueryReq executeQueryReq, - HttpServletRequest request, - HttpServletResponse response) throws Exception { - executeQueryReq.setUser(UserHolder.findUser(request, response)); - return chatQueryService.performExecution(executeQueryReq); + queryTextReq.setUser(UserHolder.findUser(request, response)); + return chatQueryService.performParsing(queryTextReq); } } diff --git a/headless/server/src/main/java/com/tencent/supersonic/headless/server/facade/service/ChatQueryService.java b/headless/server/src/main/java/com/tencent/supersonic/headless/server/facade/service/ChatQueryService.java index 3deab7bf4..236c2506b 100644 --- a/headless/server/src/main/java/com/tencent/supersonic/headless/server/facade/service/ChatQueryService.java +++ b/headless/server/src/main/java/com/tencent/supersonic/headless/server/facade/service/ChatQueryService.java @@ -7,7 +7,7 @@ import com.tencent.supersonic.headless.api.pojo.request.DimensionValueReq; import com.tencent.supersonic.headless.api.pojo.request.ExecuteQueryReq; import com.tencent.supersonic.headless.api.pojo.request.QueryDataReq; import com.tencent.supersonic.headless.api.pojo.request.QueryMapReq; -import com.tencent.supersonic.headless.api.pojo.request.QueryReq; +import com.tencent.supersonic.headless.api.pojo.request.QueryTextReq; import com.tencent.supersonic.headless.api.pojo.request.QuerySqlReq; import com.tencent.supersonic.headless.api.pojo.response.MapInfoResp; import com.tencent.supersonic.headless.api.pojo.response.MapResp; @@ -19,12 +19,13 @@ import com.tencent.supersonic.headless.api.pojo.response.QueryResult; */ public interface ChatQueryService { - MapResp performMapping(QueryReq queryReq); + MapResp performMapping(QueryTextReq queryTextReq); MapInfoResp map(QueryMapReq queryMapReq); - ParseResp performParsing(QueryReq queryReq); + ParseResp performParsing(QueryTextReq queryTextReq); + @Deprecated QueryResult performExecution(ExecuteQueryReq queryReq) throws Exception; SemanticParseInfo queryContext(Integer chatId); diff --git a/headless/server/src/main/java/com/tencent/supersonic/headless/server/facade/service/RetrieveService.java b/headless/server/src/main/java/com/tencent/supersonic/headless/server/facade/service/RetrieveService.java index f5a19edd3..0da9dc203 100644 --- a/headless/server/src/main/java/com/tencent/supersonic/headless/server/facade/service/RetrieveService.java +++ b/headless/server/src/main/java/com/tencent/supersonic/headless/server/facade/service/RetrieveService.java @@ -1,12 +1,12 @@ package com.tencent.supersonic.headless.server.facade.service; -import com.tencent.supersonic.headless.api.pojo.request.QueryReq; +import com.tencent.supersonic.headless.api.pojo.request.QueryTextReq; import com.tencent.supersonic.headless.api.pojo.response.SearchResult; import java.util.List; public interface RetrieveService { - List retrieve(QueryReq queryCtx); + List retrieve(QueryTextReq queryCtx); } \ No newline at end of file diff --git a/headless/server/src/main/java/com/tencent/supersonic/headless/server/facade/service/SemanticLayerService.java b/headless/server/src/main/java/com/tencent/supersonic/headless/server/facade/service/SemanticLayerService.java index 277638b8c..22adb9217 100644 --- a/headless/server/src/main/java/com/tencent/supersonic/headless/server/facade/service/SemanticLayerService.java +++ b/headless/server/src/main/java/com/tencent/supersonic/headless/server/facade/service/SemanticLayerService.java @@ -4,10 +4,10 @@ import com.tencent.supersonic.auth.api.authentication.pojo.User; import com.tencent.supersonic.headless.api.pojo.DataSetSchema; import com.tencent.supersonic.headless.api.pojo.EntityInfo; import com.tencent.supersonic.headless.api.pojo.SemanticParseInfo; -import com.tencent.supersonic.headless.api.pojo.request.ExplainSqlReq; +import com.tencent.supersonic.headless.api.pojo.request.TranslateSqlReq; import com.tencent.supersonic.headless.api.pojo.request.QueryDimValueReq; 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.TranslateResp; import com.tencent.supersonic.headless.api.pojo.response.ItemResp; import com.tencent.supersonic.headless.api.pojo.response.SemanticQueryResp; @@ -24,7 +24,7 @@ public interface SemanticLayerService { SemanticQueryResp queryDimValue(QueryDimValueReq queryDimValueReq, User user); - ExplainResp explain(ExplainSqlReq explainSqlReq, User user) throws Exception; + TranslateResp translate(TranslateSqlReq translateSqlReq, User user) throws Exception; EntityInfo getEntityInfo(SemanticParseInfo parseInfo, DataSetSchema dataSetSchema, User user); diff --git a/headless/server/src/main/java/com/tencent/supersonic/headless/server/facade/service/impl/ChatQueryServiceImpl.java b/headless/server/src/main/java/com/tencent/supersonic/headless/server/facade/service/impl/ChatQueryServiceImpl.java index 860b363dc..ab5c1fad0 100644 --- a/headless/server/src/main/java/com/tencent/supersonic/headless/server/facade/service/impl/ChatQueryServiceImpl.java +++ b/headless/server/src/main/java/com/tencent/supersonic/headless/server/facade/service/impl/ChatQueryServiceImpl.java @@ -29,19 +29,19 @@ import com.tencent.supersonic.headless.api.pojo.enums.CostType; import com.tencent.supersonic.headless.api.pojo.enums.QueryMethod; import com.tencent.supersonic.headless.api.pojo.request.DimensionValueReq; import com.tencent.supersonic.headless.api.pojo.request.ExecuteQueryReq; -import com.tencent.supersonic.headless.api.pojo.request.ExplainSqlReq; +import com.tencent.supersonic.headless.api.pojo.request.QueryTextReq; +import com.tencent.supersonic.headless.api.pojo.request.TranslateSqlReq; import com.tencent.supersonic.headless.api.pojo.request.QueryDataReq; import com.tencent.supersonic.headless.api.pojo.request.QueryDimValueReq; import com.tencent.supersonic.headless.api.pojo.request.QueryFilter; import com.tencent.supersonic.headless.api.pojo.request.QueryFilters; import com.tencent.supersonic.headless.api.pojo.request.QueryMapReq; -import com.tencent.supersonic.headless.api.pojo.request.QueryReq; import com.tencent.supersonic.headless.api.pojo.request.QuerySqlReq; import com.tencent.supersonic.headless.api.pojo.request.SemanticQueryReq; import com.tencent.supersonic.headless.api.pojo.response.DataSetMapInfo; import com.tencent.supersonic.headless.api.pojo.response.DataSetResp; import com.tencent.supersonic.headless.api.pojo.response.DimensionResp; -import com.tencent.supersonic.headless.api.pojo.response.ExplainResp; +import com.tencent.supersonic.headless.api.pojo.response.TranslateResp; import com.tencent.supersonic.headless.api.pojo.response.MapInfoResp; import com.tencent.supersonic.headless.api.pojo.response.MapResp; import com.tencent.supersonic.headless.api.pojo.response.ParseResp; @@ -63,13 +63,13 @@ import com.tencent.supersonic.headless.chat.query.SemanticQuery; import com.tencent.supersonic.headless.chat.query.llm.s2sql.LLMSqlQuery; import com.tencent.supersonic.headless.server.facade.service.ChatQueryService; import com.tencent.supersonic.headless.server.facade.service.SemanticLayerService; +import com.tencent.supersonic.headless.server.utils.WorkflowEngine; import com.tencent.supersonic.headless.server.persistence.dataobject.StatisticsDO; import com.tencent.supersonic.headless.server.pojo.MetaFilter; import com.tencent.supersonic.headless.server.utils.ComponentFactory; import com.tencent.supersonic.headless.server.web.service.ChatContextService; import com.tencent.supersonic.headless.server.web.service.DataSetService; import com.tencent.supersonic.headless.server.web.service.SchemaService; -import com.tencent.supersonic.headless.server.web.service.WorkflowService; import lombok.extern.slf4j.Slf4j; import net.sf.jsqlparser.expression.Expression; import net.sf.jsqlparser.expression.LongValue; @@ -115,45 +115,45 @@ public class ChatQueryServiceImpl implements ChatQueryService { @Autowired private DataSetService dataSetService; @Autowired - private WorkflowService workflowService; + private WorkflowEngine workflowEngine; @Override - public MapResp performMapping(QueryReq queryReq) { + public MapResp performMapping(QueryTextReq queryTextReq) { MapResp mapResp = new MapResp(); - QueryContext queryCtx = buildQueryContext(queryReq); + QueryContext queryCtx = buildQueryContext(queryTextReq); ComponentFactory.getSchemaMappers().forEach(mapper -> { mapper.map(queryCtx); }); SchemaMapInfo mapInfo = queryCtx.getMapInfo(); mapResp.setMapInfo(mapInfo); - mapResp.setQueryText(queryReq.getQueryText()); + mapResp.setQueryText(queryTextReq.getQueryText()); return mapResp; } @Override public MapInfoResp map(QueryMapReq queryMapReq) { - QueryReq queryReq = new QueryReq(); - BeanUtils.copyProperties(queryMapReq, queryReq); + QueryTextReq queryTextReq = new QueryTextReq(); + BeanUtils.copyProperties(queryMapReq, queryTextReq); List dataSets = dataSetService.getDataSets(queryMapReq.getDataSetNames(), queryMapReq.getUser()); Set dataSetIds = dataSets.stream().map(SchemaItem::getId).collect(Collectors.toSet()); - queryReq.setDataSetIds(dataSetIds); - MapResp mapResp = performMapping(queryReq); + queryTextReq.setDataSetIds(dataSetIds); + MapResp mapResp = performMapping(queryTextReq); dataSetIds.retainAll(mapResp.getMapInfo().getDataSetElementMatches().keySet()); return convert(mapResp, queryMapReq.getTopN(), dataSetIds); } @Override - public ParseResp performParsing(QueryReq queryReq) { - ParseResp parseResult = new ParseResp(queryReq.getChatId(), queryReq.getQueryText()); + public ParseResp performParsing(QueryTextReq queryTextReq) { + ParseResp parseResult = new ParseResp(queryTextReq.getChatId(), queryTextReq.getQueryText()); // build queryContext and chatContext - QueryContext queryCtx = buildQueryContext(queryReq); + QueryContext queryCtx = buildQueryContext(queryTextReq); // in order to support multi-turn conversation, chat context is needed - ChatContext chatCtx = chatContextService.getOrCreateContext(queryReq.getChatId()); + ChatContext chatCtx = chatContextService.getOrCreateContext(queryTextReq.getChatId()); - workflowService.startWorkflow(queryCtx, chatCtx, parseResult); + workflowEngine.startWorkflow(queryCtx, chatCtx, parseResult); List parseInfos = queryCtx.getCandidateQueries().stream() .map(SemanticQuery::getParseInfo).collect(Collectors.toList()); @@ -161,25 +161,26 @@ public class ChatQueryServiceImpl implements ChatQueryService { return parseResult; } - public QueryContext buildQueryContext(QueryReq queryReq) { + public QueryContext buildQueryContext(QueryTextReq queryTextReq) { SemanticSchema semanticSchema = schemaService.getSemanticSchema(); Map> modelIdToDataSetIds = dataSetService.getModelIdToDataSetIds(); QueryContext queryCtx = QueryContext.builder() - .queryFilters(queryReq.getQueryFilters()) + .queryFilters(queryTextReq.getQueryFilters()) .semanticSchema(semanticSchema) .candidateQueries(new ArrayList<>()) .mapInfo(new SchemaMapInfo()) .modelIdToDataSetIds(modelIdToDataSetIds) - .text2SQLType(queryReq.getText2SQLType()) - .mapModeEnum(queryReq.getMapModeEnum()) - .dataSetIds(queryReq.getDataSetIds()) + .text2SQLType(queryTextReq.getText2SQLType()) + .mapModeEnum(queryTextReq.getMapModeEnum()) + .dataSetIds(queryTextReq.getDataSetIds()) .build(); - BeanUtils.copyProperties(queryReq, queryCtx); + BeanUtils.copyProperties(queryTextReq, queryCtx); return queryCtx; } @Override + @Deprecated public QueryResult performExecution(ExecuteQueryReq queryReq) throws Exception { List timeCostDOList = new ArrayList<>(); SemanticParseInfo parseInfo = queryReq.getParseInfo(); @@ -263,9 +264,9 @@ public class ChatQueryServiceImpl implements ChatQueryService { parseInfo.getSqlInfo().setCorrectS2SQL(correctorSql); semanticQuery.setParseInfo(parseInfo); SemanticQueryReq semanticQueryReq = semanticQuery.buildSemanticQueryReq(); - ExplainSqlReq explainSqlReq = ExplainSqlReq.builder().queryReq(semanticQueryReq) + TranslateSqlReq translateSqlReq = TranslateSqlReq.builder().queryReq(semanticQueryReq) .queryTypeEnum(QueryMethod.SQL).build(); - ExplainResp explain = semanticLayerService.explain(explainSqlReq, user); + TranslateResp explain = semanticLayerService.translate(translateSqlReq, user); if (StringUtils.isNotBlank(explain.getSql())) { parseInfo.getSqlInfo().setQuerySQL(explain.getSql()); parseInfo.getSqlInfo().setSourceId(explain.getSourceId()); @@ -277,9 +278,9 @@ public class ChatQueryServiceImpl implements ChatQueryService { validFilter(semanticQuery.getParseInfo().getMetricFilters()); //init s2sql semanticQuery.initS2Sql(semanticSchema, user); - QueryReq queryReq = new QueryReq(); - queryReq.setQueryFilters(new QueryFilters()); - queryReq.setUser(user); + QueryTextReq queryTextReq = new QueryTextReq(); + queryTextReq.setQueryFilters(new QueryFilters()); + queryTextReq.setUser(user); } SemanticQueryReq semanticQueryReq = semanticQuery.buildSemanticQueryReq(); QueryResult queryResult = doExecution(semanticQueryReq, semanticQuery.getParseInfo(), user); diff --git a/headless/server/src/main/java/com/tencent/supersonic/headless/server/facade/service/impl/RetrieveServiceImpl.java b/headless/server/src/main/java/com/tencent/supersonic/headless/server/facade/service/impl/RetrieveServiceImpl.java index d4098882b..6ef664859 100644 --- a/headless/server/src/main/java/com/tencent/supersonic/headless/server/facade/service/impl/RetrieveServiceImpl.java +++ b/headless/server/src/main/java/com/tencent/supersonic/headless/server/facade/service/impl/RetrieveServiceImpl.java @@ -8,7 +8,7 @@ import com.tencent.supersonic.headless.api.pojo.SchemaElementType; import com.tencent.supersonic.headless.api.pojo.SemanticSchema; import com.tencent.supersonic.headless.api.pojo.request.QueryFilter; import com.tencent.supersonic.headless.api.pojo.request.QueryFilters; -import com.tencent.supersonic.headless.api.pojo.request.QueryReq; +import com.tencent.supersonic.headless.api.pojo.request.QueryTextReq; import com.tencent.supersonic.headless.api.pojo.response.S2Term; import com.tencent.supersonic.headless.api.pojo.response.SearchResult; import com.tencent.supersonic.headless.chat.QueryContext; @@ -64,9 +64,9 @@ public class RetrieveServiceImpl implements RetrieveService { @Autowired private SearchMatchStrategy searchMatchStrategy; @Override - public List retrieve(QueryReq queryReq) { + public List retrieve(QueryTextReq queryTextReq) { - String queryText = queryReq.getQueryText(); + String queryText = queryTextReq.getQueryText(); // 1.get meta info SemanticSchema semanticSchemaDb = schemaService.getSemanticSchema(); List metricsDb = semanticSchemaDb.getMetrics(); @@ -76,10 +76,10 @@ public class RetrieveServiceImpl implements RetrieveService { // 2.detect by segment List originals = knowledgeBaseService.getTerms(queryText, modelIdToDataSetIds); log.debug("hanlp parse result: {}", originals); - Set dataSetIds = queryReq.getDataSetIds(); + Set dataSetIds = queryTextReq.getDataSetIds(); QueryContext queryContext = new QueryContext(); - BeanUtils.copyProperties(queryReq, queryContext); + BeanUtils.copyProperties(queryTextReq, queryContext); queryContext.setModelIdToDataSetIds(dataSetService.getModelIdToDataSetIds()); Map> regTextMap = @@ -100,12 +100,12 @@ public class RetrieveServiceImpl implements RetrieveService { return Lists.newArrayList(); } Map.Entry> searchTextEntry = mostSimilarSearchResult.get(); - log.debug("searchTextEntry:{},queryReq:{}", searchTextEntry, queryReq); + log.debug("searchTextEntry:{},queryTextReq:{}", searchTextEntry, queryTextReq); Set searchResults = new LinkedHashSet(); DataSetInfoStat dataSetInfoStat = NatureHelper.getDataSetStat(originals); - List possibleDataSets = getPossibleDataSets(queryReq, originals, dataSetInfoStat, dataSetIds); + List possibleDataSets = getPossibleDataSets(queryTextReq, originals, dataSetInfoStat, dataSetIds); // 5.1 priority dimension metric boolean existMetricAndDimension = searchMetricAndDimension(new HashSet<>(possibleDataSets), dataSetIdToName, @@ -120,14 +120,14 @@ public class RetrieveServiceImpl implements RetrieveService { Set searchResultSet = searchDimensionValue(metricsDb, dataSetIdToName, dataSetInfoStat.getMetricDataSetCount(), existMetricAndDimension, - matchText, natureToNameMap, natureToNameEntry, queryReq.getQueryFilters()); + matchText, natureToNameMap, natureToNameEntry, queryTextReq.getQueryFilters()); searchResults.addAll(searchResultSet); } return searchResults.stream().limit(RESULT_SIZE).collect(Collectors.toList()); } - private List getPossibleDataSets(QueryReq queryCtx, List originals, + private List getPossibleDataSets(QueryTextReq queryCtx, List originals, DataSetInfoStat dataSetInfoStat, Set dataSetIds) { if (CollectionUtils.isNotEmpty(dataSetIds)) { return new ArrayList<>(dataSetIds); diff --git a/headless/server/src/main/java/com/tencent/supersonic/headless/server/facade/service/impl/S2SemanticLayerService.java b/headless/server/src/main/java/com/tencent/supersonic/headless/server/facade/service/impl/S2SemanticLayerService.java index 66d974d73..f906c31b6 100644 --- a/headless/server/src/main/java/com/tencent/supersonic/headless/server/facade/service/impl/S2SemanticLayerService.java +++ b/headless/server/src/main/java/com/tencent/supersonic/headless/server/facade/service/impl/S2SemanticLayerService.java @@ -19,7 +19,7 @@ import com.tencent.supersonic.headless.api.pojo.SchemaElementType; import com.tencent.supersonic.headless.api.pojo.SemanticParseInfo; import com.tencent.supersonic.headless.api.pojo.TagTypeDefaultConfig; import com.tencent.supersonic.headless.api.pojo.TimeDefaultConfig; -import com.tencent.supersonic.headless.api.pojo.request.ExplainSqlReq; +import com.tencent.supersonic.headless.api.pojo.request.TranslateSqlReq; import com.tencent.supersonic.headless.api.pojo.request.QueryDimValueReq; import com.tencent.supersonic.headless.api.pojo.request.QueryFilter; import com.tencent.supersonic.headless.api.pojo.request.QueryMultiStructReq; @@ -28,7 +28,7 @@ import com.tencent.supersonic.headless.api.pojo.request.QueryStructReq; import com.tencent.supersonic.headless.api.pojo.request.SchemaFilterReq; import com.tencent.supersonic.headless.api.pojo.request.SemanticQueryReq; import com.tencent.supersonic.headless.api.pojo.response.DimensionResp; -import com.tencent.supersonic.headless.api.pojo.response.ExplainResp; +import com.tencent.supersonic.headless.api.pojo.response.TranslateResp; import com.tencent.supersonic.headless.api.pojo.response.ItemResp; import com.tencent.supersonic.headless.api.pojo.response.ModelResp; import com.tencent.supersonic.headless.api.pojo.response.SemanticQueryResp; @@ -125,7 +125,7 @@ public class S2SemanticLayerService implements SemanticLayerService { StatUtils.get().setUseResultCache(false); //3 query QueryStatement queryStatement = buildQueryStatement(queryReq, user); - SemanticQueryResp result = query(queryStatement); + SemanticQueryResp result = doQuery(queryStatement); //4 reset cache and set stateInfo Boolean setCacheSuccess = queryCache.put(cacheKey, result); if (setCacheSuccess) { @@ -228,8 +228,8 @@ public class S2SemanticLayerService implements SemanticLayerService { } @Override - public ExplainResp explain(ExplainSqlReq explainSqlReq, User user) throws Exception { - T queryReq = explainSqlReq.getQueryReq(); + public TranslateResp translate(TranslateSqlReq translateSqlReq, User user) throws Exception { + T queryReq = translateSqlReq.getQueryReq(); QueryStatement queryStatement = buildQueryStatement((SemanticQueryReq) queryReq, user); semanticTranslator.translate(queryStatement); @@ -239,7 +239,7 @@ public class S2SemanticLayerService implements SemanticLayerService { sql = queryStatement.getSql(); sorceId = queryStatement.getSourceId(); } - return ExplainResp.builder().sql(sql).sourceId(sorceId).build(); + return TranslateResp.builder().sql(sql).sourceId(sorceId).build(); } public List getDomainDataSetTree() { @@ -268,7 +268,7 @@ public class S2SemanticLayerService implements SemanticLayerService { return querySqlReq; } - private SemanticQueryResp query(QueryStatement queryStatement) { + private SemanticQueryResp doQuery(QueryStatement queryStatement) { SemanticQueryResp semanticQueryResp = null; try { //1 translate diff --git a/headless/server/src/main/java/com/tencent/supersonic/headless/server/processor/SqlInfoProcessor.java b/headless/server/src/main/java/com/tencent/supersonic/headless/server/processor/SqlInfoProcessor.java index 75fd19e4f..b2b26bc06 100644 --- a/headless/server/src/main/java/com/tencent/supersonic/headless/server/processor/SqlInfoProcessor.java +++ b/headless/server/src/main/java/com/tencent/supersonic/headless/server/processor/SqlInfoProcessor.java @@ -4,9 +4,9 @@ import com.tencent.supersonic.common.util.ContextUtils; import com.tencent.supersonic.headless.api.pojo.SemanticParseInfo; import com.tencent.supersonic.headless.api.pojo.SqlInfo; import com.tencent.supersonic.headless.api.pojo.enums.QueryMethod; -import com.tencent.supersonic.headless.api.pojo.request.ExplainSqlReq; +import com.tencent.supersonic.headless.api.pojo.request.TranslateSqlReq; 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.TranslateResp; import com.tencent.supersonic.headless.api.pojo.response.ParseResp; import com.tencent.supersonic.headless.chat.ChatContext; import com.tencent.supersonic.headless.chat.QueryContext; @@ -24,8 +24,8 @@ import java.util.Objects; import java.util.stream.Collectors; /** - * SqlInfoProcessor adds S2SQL to the parsing results so that - * technical users could verify SQL by themselves. + * SqlInfoProcessor adds intermediate S2SQL and final SQL to the parsing results + * so that technical users could verify SQL by themselves. **/ @Slf4j public class SqlInfoProcessor implements ResultProcessor { @@ -66,9 +66,9 @@ public class SqlInfoProcessor implements ResultProcessor { semanticQuery.setParseInfo(parseInfo); SemanticQueryReq semanticQueryReq = semanticQuery.buildSemanticQueryReq(); SemanticLayerService queryService = ContextUtils.getBean(SemanticLayerService.class); - ExplainSqlReq explainSqlReq = ExplainSqlReq.builder().queryReq(semanticQueryReq) + TranslateSqlReq translateSqlReq = TranslateSqlReq.builder().queryReq(semanticQueryReq) .queryTypeEnum(QueryMethod.SQL).build(); - ExplainResp explain = queryService.explain(explainSqlReq, queryContext.getUser()); + TranslateResp explain = queryService.translate(translateSqlReq, queryContext.getUser()); String querySql = explain.getSql(); if (StringUtils.isBlank(querySql)) { return; diff --git a/headless/server/src/main/java/com/tencent/supersonic/headless/server/web/service/impl/WorkflowServiceImpl.java b/headless/server/src/main/java/com/tencent/supersonic/headless/server/utils/WorkflowEngine.java similarity index 93% rename from headless/server/src/main/java/com/tencent/supersonic/headless/server/web/service/impl/WorkflowServiceImpl.java rename to headless/server/src/main/java/com/tencent/supersonic/headless/server/utils/WorkflowEngine.java index fda24661c..21baeced4 100644 --- a/headless/server/src/main/java/com/tencent/supersonic/headless/server/web/service/impl/WorkflowServiceImpl.java +++ b/headless/server/src/main/java/com/tencent/supersonic/headless/server/utils/WorkflowEngine.java @@ -1,4 +1,4 @@ -package com.tencent.supersonic.headless.server.web.service.impl; +package com.tencent.supersonic.headless.server.utils; import com.tencent.supersonic.common.util.JsonUtil; import com.tencent.supersonic.headless.api.pojo.enums.WorkflowState; @@ -11,8 +11,6 @@ import com.tencent.supersonic.headless.chat.parser.SemanticParser; import com.tencent.supersonic.headless.chat.query.SemanticQuery; import com.tencent.supersonic.headless.chat.query.rule.RuleSemanticQuery; import com.tencent.supersonic.headless.server.processor.ResultProcessor; -import com.tencent.supersonic.headless.server.web.service.WorkflowService; -import com.tencent.supersonic.headless.server.utils.ComponentFactory; import lombok.extern.slf4j.Slf4j; import org.apache.commons.collections.CollectionUtils; import org.apache.commons.collections.MapUtils; @@ -23,7 +21,7 @@ import java.util.Objects; @Service @Slf4j -public class WorkflowServiceImpl implements WorkflowService { +public class WorkflowEngine { private List schemaMappers = ComponentFactory.getSchemaMappers(); private List semanticParsers = ComponentFactory.getSemanticParsers(); private List semanticCorrectors = ComponentFactory.getSemanticCorrectors(); diff --git a/headless/server/src/main/java/com/tencent/supersonic/headless/server/web/service/WorkflowService.java b/headless/server/src/main/java/com/tencent/supersonic/headless/server/web/service/WorkflowService.java deleted file mode 100644 index 950cf4667..000000000 --- a/headless/server/src/main/java/com/tencent/supersonic/headless/server/web/service/WorkflowService.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.tencent.supersonic.headless.server.web.service; - -import com.tencent.supersonic.headless.api.pojo.response.ParseResp; -import com.tencent.supersonic.headless.chat.ChatContext; -import com.tencent.supersonic.headless.chat.QueryContext; - -public interface WorkflowService { - void startWorkflow(QueryContext queryCtx, ChatContext chatCtx, ParseResp parseResult); -} \ No newline at end of file diff --git a/headless/server/src/test/java/com/tencent/supersonic/headless/server/utils/QueryReqBuilderTest.java b/headless/server/src/test/java/com/tencent/supersonic/headless/server/utils/QueryTextReqBuilderTest.java similarity index 98% rename from headless/server/src/test/java/com/tencent/supersonic/headless/server/utils/QueryReqBuilderTest.java rename to headless/server/src/test/java/com/tencent/supersonic/headless/server/utils/QueryTextReqBuilderTest.java index 0b1d2cd91..32a14df2b 100644 --- a/headless/server/src/test/java/com/tencent/supersonic/headless/server/utils/QueryReqBuilderTest.java +++ b/headless/server/src/test/java/com/tencent/supersonic/headless/server/utils/QueryTextReqBuilderTest.java @@ -22,9 +22,9 @@ import java.util.Arrays; import java.util.List; /** - * QueryReqBuilderTest + * QueryTextReqBuilderTest */ -class QueryReqBuilderTest { +class QueryTextReqBuilderTest { @Test void buildS2SQLReq() { diff --git a/launchers/standalone/src/test/java/com/tencent/supersonic/chat/MetricTest.java b/launchers/standalone/src/test/java/com/tencent/supersonic/chat/MetricTest.java index 011bb3bba..a6d714620 100644 --- a/launchers/standalone/src/test/java/com/tencent/supersonic/chat/MetricTest.java +++ b/launchers/standalone/src/test/java/com/tencent/supersonic/chat/MetricTest.java @@ -5,21 +5,19 @@ import com.tencent.supersonic.common.pojo.enums.FilterOperatorEnum; import com.tencent.supersonic.common.pojo.enums.QueryType; 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.ParseResp; import com.tencent.supersonic.headless.api.pojo.response.QueryResult; import com.tencent.supersonic.headless.chat.query.rule.metric.MetricFilterQuery; import com.tencent.supersonic.headless.chat.query.rule.metric.MetricGroupByQuery; import com.tencent.supersonic.headless.chat.query.rule.metric.MetricModelQuery; import com.tencent.supersonic.headless.chat.query.rule.metric.MetricTopNQuery; import com.tencent.supersonic.util.DataUtils; -import org.junit.Assert; +import org.junit.jupiter.api.Order; import org.junit.jupiter.api.Test; import java.text.DateFormat; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.List; -import java.util.stream.Collectors; import static com.tencent.supersonic.common.pojo.enums.AggregateTypeEnum.NONE; import static com.tencent.supersonic.common.pojo.enums.AggregateTypeEnum.SUM; @@ -27,6 +25,8 @@ import static com.tencent.supersonic.common.pojo.enums.AggregateTypeEnum.SUM; public class MetricTest extends BaseTest { + private int chatId = 10; + @Test public void testMetricFilter() throws Exception { QueryResult actualResult = submitNewChat("alice的访问次数", DataUtils.metricAgentId); @@ -51,16 +51,6 @@ public class MetricTest extends BaseTest { assertQueryResult(expectedResult, actualResult); } - @Test - public void testMetricFilterWithAgent() { - //agent only support METRIC_ENTITY, METRIC_FILTER - ParseResp parseResp = submitParseWithAgent("alice的访问次数", DataUtils.getMetricAgent().getId()); - Assert.assertNotNull(parseResp.getSelectedParses()); - List queryModes = parseResp.getSelectedParses().stream() - .map(SemanticParseInfo::getQueryMode).collect(Collectors.toList()); - Assert.assertTrue(queryModes.contains("METRIC_FILTER")); - } - @Test public void testMetricDomain() throws Exception { QueryResult actualResult = submitNewChat("超音数的访问次数", DataUtils.metricAgentId); @@ -80,18 +70,9 @@ public class MetricTest extends BaseTest { assertQueryResult(expectedResult, actualResult); } - @Test - public void testMetricModelWithAgent() { - //agent only support METRIC_ENTITY, METRIC_FILTER - ParseResp parseResp = submitParseWithAgent("超音数的访问次数", DataUtils.getMetricAgent().getId()); - List queryModes = parseResp.getSelectedParses().stream() - .map(SemanticParseInfo::getQueryMode).collect(Collectors.toList()); - Assert.assertTrue(queryModes.contains("METRIC_MODEL")); - } - @Test public void testMetricGroupBy() throws Exception { - QueryResult actualResult = submitNewChat("超音数各部门的访问次数", DataUtils.metricAgentId); + QueryResult actualResult = submitNewChat("近7天超音数各部门的访问次数", DataUtils.metricAgentId); QueryResult expectedResult = new QueryResult(); SemanticParseInfo expectedParseInfo = new SemanticParseInfo(); @@ -137,6 +118,7 @@ public class MetricTest extends BaseTest { } @Test + @Order(3) public void testMetricTopN() throws Exception { QueryResult actualResult = submitNewChat("近3天访问次数最多的用户", DataUtils.metricAgentId); @@ -160,7 +142,7 @@ public class MetricTest extends BaseTest { @Test public void testMetricGroupBySum() throws Exception { - QueryResult actualResult = submitNewChat("超音数各部门的访问次数总和", DataUtils.metricAgentId); + QueryResult actualResult = submitNewChat("近7天超音数各部门的访问次数总和", DataUtils.metricAgentId); QueryResult expectedResult = new QueryResult(); SemanticParseInfo expectedParseInfo = new SemanticParseInfo(); expectedResult.setChatContext(expectedParseInfo); diff --git a/launchers/standalone/src/test/java/com/tencent/supersonic/headless/ExplainTest.java b/launchers/standalone/src/test/java/com/tencent/supersonic/headless/TranslateTest.java similarity index 73% rename from launchers/standalone/src/test/java/com/tencent/supersonic/headless/ExplainTest.java rename to launchers/standalone/src/test/java/com/tencent/supersonic/headless/TranslateTest.java index 1df37ea72..cdc55d4f8 100644 --- a/launchers/standalone/src/test/java/com/tencent/supersonic/headless/ExplainTest.java +++ b/launchers/standalone/src/test/java/com/tencent/supersonic/headless/TranslateTest.java @@ -3,10 +3,10 @@ package com.tencent.supersonic.headless; import com.tencent.supersonic.auth.api.authentication.pojo.User; import com.tencent.supersonic.headless.api.pojo.enums.QueryMethod; -import com.tencent.supersonic.headless.api.pojo.request.ExplainSqlReq; +import com.tencent.supersonic.headless.api.pojo.request.TranslateSqlReq; import com.tencent.supersonic.headless.api.pojo.request.QuerySqlReq; import com.tencent.supersonic.headless.api.pojo.request.QueryStructReq; -import com.tencent.supersonic.headless.api.pojo.response.ExplainResp; +import com.tencent.supersonic.headless.api.pojo.response.TranslateResp; import com.tencent.supersonic.headless.chat.utils.QueryReqBuilder; import com.tencent.supersonic.util.DataUtils; import org.junit.jupiter.api.Test; @@ -16,16 +16,16 @@ import java.util.Arrays; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertTrue; -public class ExplainTest extends BaseTest { +public class TranslateTest extends BaseTest { @Test public void testSqlExplain() throws Exception { String sql = "SELECT 部门, SUM(访问次数) AS 访问次数 FROM 超音数PVUV统计 GROUP BY 部门 "; - ExplainSqlReq explainSqlReq = ExplainSqlReq.builder() + TranslateSqlReq translateSqlReq = TranslateSqlReq.builder() .queryTypeEnum(QueryMethod.SQL) .queryReq(QueryReqBuilder.buildS2SQLReq(sql, DataUtils.getMetricAgentView())) .build(); - ExplainResp explain = semanticLayerService.explain(explainSqlReq, User.getFakeUser()); + TranslateResp explain = semanticLayerService.translate(translateSqlReq, User.getFakeUser()); assertNotNull(explain); assertNotNull(explain.getSql()); assertTrue(explain.getSql().contains("department")); @@ -35,11 +35,11 @@ public class ExplainTest extends BaseTest { @Test public void testStructExplain() throws Exception { QueryStructReq queryStructReq = buildQueryStructReq(Arrays.asList("department")); - ExplainSqlReq explainSqlReq = ExplainSqlReq.builder() + TranslateSqlReq translateSqlReq = TranslateSqlReq.builder() .queryTypeEnum(QueryMethod.STRUCT) .queryReq(queryStructReq) .build(); - ExplainResp explain = semanticLayerService.explain(explainSqlReq, User.getFakeUser()); + TranslateResp explain = semanticLayerService.translate(translateSqlReq, User.getFakeUser()); assertNotNull(explain); assertNotNull(explain.getSql()); assertTrue(explain.getSql().contains("department"));