diff --git a/chat/api/src/main/java/com/tencent/supersonic/chat/api/pojo/response/QueryResp.java b/chat/api/src/main/java/com/tencent/supersonic/chat/api/pojo/response/QueryResp.java index 1c50eeb05..535841552 100644 --- a/chat/api/src/main/java/com/tencent/supersonic/chat/api/pojo/response/QueryResp.java +++ b/chat/api/src/main/java/com/tencent/supersonic/chat/api/pojo/response/QueryResp.java @@ -1,6 +1,8 @@ package com.tencent.supersonic.chat.api.pojo.response; import java.util.Date; +import java.util.List; +import com.tencent.supersonic.chat.api.pojo.SemanticParseInfo; import lombok.Data; @Data @@ -13,4 +15,5 @@ public class QueryResp { private String feedback; private String queryText; private QueryResult queryResult; + private List parseInfos; } \ No newline at end of file diff --git a/chat/core/src/main/java/com/tencent/supersonic/chat/persistence/mapper/ChatParseMapper.java b/chat/core/src/main/java/com/tencent/supersonic/chat/persistence/mapper/ChatParseMapper.java index 94be19489..2cdf13a55 100644 --- a/chat/core/src/main/java/com/tencent/supersonic/chat/persistence/mapper/ChatParseMapper.java +++ b/chat/core/src/main/java/com/tencent/supersonic/chat/persistence/mapper/ChatParseMapper.java @@ -12,6 +12,10 @@ public interface ChatParseMapper { boolean batchSaveParseInfo(@Param("list") List list); + boolean updateParseInfo(ChatParseDO chatParseDO); + ChatParseDO getParseInfo(Long questionId, String userName, int parseId); + List getParseInfoList(List questionIds); + } diff --git a/chat/core/src/main/java/com/tencent/supersonic/chat/persistence/repository/ChatQueryRepository.java b/chat/core/src/main/java/com/tencent/supersonic/chat/persistence/repository/ChatQueryRepository.java index c5b0dab24..bc7fbb8f1 100644 --- a/chat/core/src/main/java/com/tencent/supersonic/chat/persistence/repository/ChatQueryRepository.java +++ b/chat/core/src/main/java/com/tencent/supersonic/chat/persistence/repository/ChatQueryRepository.java @@ -21,18 +21,22 @@ public interface ChatQueryRepository { void createChatQuery(QueryResult queryResult, ChatContext chatCtx); + void updateChatParseInfo(List chatParseDOS); + ChatQueryDO getLastChatQuery(long chatId); int updateChatQuery(ChatQueryDO chatQueryDO); Long createChatParse(ParseResp parseResult, ChatContext chatCtx, QueryReq queryReq); - Boolean batchSaveParseInfo(ChatContext chatCtx, QueryReq queryReq, + List batchSaveParseInfo(ChatContext chatCtx, QueryReq queryReq, ParseResp parseResult, List candidateParses, List selectedParses); public ChatParseDO getParseInfo(Long questionId, String userName, int parseId); + List getParseInfoList(List questionIds); + Boolean deleteChatQuery(Long questionId); } diff --git a/chat/core/src/main/java/com/tencent/supersonic/chat/persistence/repository/impl/ChatQueryRepositoryImpl.java b/chat/core/src/main/java/com/tencent/supersonic/chat/persistence/repository/impl/ChatQueryRepositoryImpl.java index ee2cad994..d77261df8 100644 --- a/chat/core/src/main/java/com/tencent/supersonic/chat/persistence/repository/impl/ChatQueryRepositoryImpl.java +++ b/chat/core/src/main/java/com/tencent/supersonic/chat/persistence/repository/impl/ChatQueryRepositoryImpl.java @@ -130,7 +130,8 @@ public class ChatQueryRepositoryImpl implements ChatQueryRepository { return queryId; } - public Boolean batchSaveParseInfo(ChatContext chatCtx, QueryReq queryReq, + @Override + public List batchSaveParseInfo(ChatContext chatCtx, QueryReq queryReq, ParseResp parseResult, List candidateParses, List selectedParses) { @@ -139,8 +140,15 @@ public class ChatQueryRepositoryImpl implements ChatQueryRepository { log.info("candidateParses size:{},selectedParses size:{}", candidateParses.size(), selectedParses.size()); getChatParseDO(chatCtx, queryReq, queryId, 0, 1, candidateParses, chatParseDOList); getChatParseDO(chatCtx, queryReq, queryId, candidateParses.size(), 0, selectedParses, chatParseDOList); - Boolean save = chatParseMapper.batchSaveParseInfo(chatParseDOList); - return save; + chatParseMapper.batchSaveParseInfo(chatParseDOList); + return chatParseDOList; + } + + @Override + public void updateChatParseInfo(List chatParseDOS) { + for (ChatParseDO chatParseDO : chatParseDOS) { + chatParseMapper.updateParseInfo(chatParseDO); + } } public void getChatParseDO(ChatContext chatCtx, QueryReq queryReq, Long queryId, int base, int isCandidate, @@ -180,10 +188,16 @@ public class ChatQueryRepositoryImpl implements ChatQueryRepository { return chatQueryDOMapper.updateByPrimaryKeyWithBLOBs(chatQueryDO); } + @Override public ChatParseDO getParseInfo(Long questionId, String userName, int parseId) { return chatParseMapper.getParseInfo(questionId, userName, parseId); } + @Override + public List getParseInfoList(List questionIds) { + return chatParseMapper.getParseInfoList(questionIds); + } + @Override public Boolean deleteChatQuery(Long questionId) { return chatQueryDOMapper.deleteByPrimaryKey(questionId); diff --git a/chat/core/src/main/java/com/tencent/supersonic/chat/responder/parse/EntityInfoParseResponder.java b/chat/core/src/main/java/com/tencent/supersonic/chat/responder/parse/EntityInfoParseResponder.java index 9602e008a..5fab1eaa0 100644 --- a/chat/core/src/main/java/com/tencent/supersonic/chat/responder/parse/EntityInfoParseResponder.java +++ b/chat/core/src/main/java/com/tencent/supersonic/chat/responder/parse/EntityInfoParseResponder.java @@ -5,6 +5,7 @@ import com.tencent.supersonic.chat.api.pojo.SemanticParseInfo; import com.tencent.supersonic.chat.api.pojo.request.QueryReq; import com.tencent.supersonic.chat.api.pojo.response.EntityInfo; import com.tencent.supersonic.chat.api.pojo.response.ParseResp; +import com.tencent.supersonic.chat.persistence.dataobject.ChatParseDO; import com.tencent.supersonic.chat.query.QueryManager; import com.tencent.supersonic.chat.query.llm.s2ql.S2QLQuery; import com.tencent.supersonic.chat.service.SemanticService; @@ -16,7 +17,8 @@ import org.springframework.util.CollectionUtils; public class EntityInfoParseResponder implements ParseResponder { @Override - public void fillResponse(ParseResp parseResp, QueryContext queryContext) { + public void fillResponse(ParseResp parseResp, QueryContext queryContext, + List chatParseDOS) { List selectedParses = parseResp.getSelectedParses(); if (CollectionUtils.isEmpty(selectedParses)) { return; diff --git a/chat/core/src/main/java/com/tencent/supersonic/chat/responder/parse/ExplainSqlParseResponder.java b/chat/core/src/main/java/com/tencent/supersonic/chat/responder/parse/ExplainSqlParseResponder.java index ab63a6cb7..e8d4e2476 100644 --- a/chat/core/src/main/java/com/tencent/supersonic/chat/responder/parse/ExplainSqlParseResponder.java +++ b/chat/core/src/main/java/com/tencent/supersonic/chat/responder/parse/ExplainSqlParseResponder.java @@ -5,19 +5,44 @@ import com.tencent.supersonic.chat.api.pojo.QueryContext; import com.tencent.supersonic.chat.api.pojo.SemanticParseInfo; import com.tencent.supersonic.chat.api.pojo.request.QueryReq; import com.tencent.supersonic.chat.api.pojo.response.ParseResp; +import com.tencent.supersonic.chat.persistence.dataobject.ChatParseDO; import com.tencent.supersonic.chat.query.QueryManager; +import com.tencent.supersonic.common.util.JsonUtil; import com.tencent.supersonic.semantic.api.model.response.ExplainResp; import org.springframework.util.CollectionUtils; import java.util.List; +import java.util.Map; import java.util.Objects; +import java.util.function.Function; +import java.util.stream.Collectors; public class ExplainSqlParseResponder implements ParseResponder { @Override - public void fillResponse(ParseResp parseResp, QueryContext queryContext) { + public void fillResponse(ParseResp parseResp, QueryContext queryContext, + List chatParseDOS) { QueryReq queryReq = queryContext.getRequest(); addExplainSql(queryReq, parseResp.getSelectedParses()); addExplainSql(queryReq, parseResp.getCandidateParses()); + if (!CollectionUtils.isEmpty(chatParseDOS)) { + Map chatParseDOMap = chatParseDOS.stream() + .collect(Collectors.toMap(ChatParseDO::getParseId, + Function.identity(), (oldValue, newValue) -> newValue)); + updateParseInfo(chatParseDOMap, parseResp.getSelectedParses()); + updateParseInfo(chatParseDOMap, parseResp.getCandidateParses()); + } + } + + private void updateParseInfo(Map chatParseDOMap, List parseInfos) { + if (CollectionUtils.isEmpty(parseInfos)) { + return; + } + for (SemanticParseInfo parseInfo : parseInfos) { + ChatParseDO chatParseDO = chatParseDOMap.get(parseInfo.getId()); + if (chatParseDO != null) { + chatParseDO.setParseInfo(JsonUtil.toString(parseInfo)); + } + } } private void addExplainSql(QueryReq queryReq, List semanticParseInfos) { diff --git a/chat/core/src/main/java/com/tencent/supersonic/chat/responder/parse/ParseResponder.java b/chat/core/src/main/java/com/tencent/supersonic/chat/responder/parse/ParseResponder.java index 6112b9331..2953c236c 100644 --- a/chat/core/src/main/java/com/tencent/supersonic/chat/responder/parse/ParseResponder.java +++ b/chat/core/src/main/java/com/tencent/supersonic/chat/responder/parse/ParseResponder.java @@ -2,9 +2,11 @@ package com.tencent.supersonic.chat.responder.parse; import com.tencent.supersonic.chat.api.pojo.QueryContext; import com.tencent.supersonic.chat.api.pojo.response.ParseResp; +import com.tencent.supersonic.chat.persistence.dataobject.ChatParseDO; +import java.util.List; public interface ParseResponder { - void fillResponse(ParseResp parseResp, QueryContext queryContext); + void fillResponse(ParseResp parseResp, QueryContext queryContext, List chatParseDOS); } \ No newline at end of file diff --git a/chat/core/src/main/java/com/tencent/supersonic/chat/service/ChatService.java b/chat/core/src/main/java/com/tencent/supersonic/chat/service/ChatService.java index d310ea260..e852033b3 100644 --- a/chat/core/src/main/java/com/tencent/supersonic/chat/service/ChatService.java +++ b/chat/core/src/main/java/com/tencent/supersonic/chat/service/ChatService.java @@ -49,11 +49,13 @@ public interface ChatService { void addQuery(QueryResult queryResult, ChatContext chatCtx); - void batchAddParse(ChatContext chatCtx, QueryReq queryReq, + List batchAddParse(ChatContext chatCtx, QueryReq queryReq, ParseResp parseResult, List candidateParses, List selectedParses); + void updateChatParse(List chatParseDOS); + ChatQueryDO getLastQuery(long chatId); int updateQuery(ChatQueryDO chatQueryDO); diff --git a/chat/core/src/main/java/com/tencent/supersonic/chat/service/impl/ChatServiceImpl.java b/chat/core/src/main/java/com/tencent/supersonic/chat/service/impl/ChatServiceImpl.java index 3a2f274a5..fb5425b3c 100644 --- a/chat/core/src/main/java/com/tencent/supersonic/chat/service/impl/ChatServiceImpl.java +++ b/chat/core/src/main/java/com/tencent/supersonic/chat/service/impl/ChatServiceImpl.java @@ -20,6 +20,7 @@ import com.tencent.supersonic.chat.persistence.repository.ChatQueryRepository; import com.tencent.supersonic.chat.persistence.repository.ChatRepository; import java.text.SimpleDateFormat; +import java.util.Comparator; import java.util.List; import java.util.Map; import java.util.Objects; @@ -133,7 +134,30 @@ public class ChatServiceImpl implements ChatService { @Override public PageInfo queryInfo(PageQueryInfoReq pageQueryInfoReq, long chatId) { - return chatQueryRepository.getChatQuery(pageQueryInfoReq, chatId); + PageInfo queryRespPageInfo = chatQueryRepository.getChatQuery(pageQueryInfoReq, chatId); + if (CollectionUtils.isEmpty(queryRespPageInfo.getList())) { + return queryRespPageInfo; + } + List queryIds = queryRespPageInfo.getList().stream() + .map(QueryResp::getQuestionId).collect(Collectors.toList()); + List chatParseDOs = chatQueryRepository.getParseInfoList(queryIds); + if (CollectionUtils.isEmpty(chatParseDOs)) { + return queryRespPageInfo; + } + Map> chatParseMap = chatParseDOs.stream() + .collect(Collectors.groupingBy(ChatParseDO::getQuestionId)); + for (QueryResp queryResp : queryRespPageInfo.getList()) { + List chatParseDOList = chatParseMap.get(queryResp.getQuestionId()); + if (CollectionUtils.isEmpty(chatParseMap)) { + continue; + } + List parseInfos = chatParseDOList.stream().map(chatParseDO -> + JsonUtil.toObject(chatParseDO.getParseInfo(), SemanticParseInfo.class)) + .sorted(Comparator.comparingDouble(SemanticParseInfo::getScore).reversed()) + .collect(Collectors.toList()); + queryResp.setParseInfos(parseInfos); + } + return queryRespPageInfo; } @Override @@ -173,12 +197,16 @@ public class ChatServiceImpl implements ChatService { } @Override - public void batchAddParse(ChatContext chatCtx, QueryReq queryReq, + public List batchAddParse(ChatContext chatCtx, QueryReq queryReq, ParseResp parseResult, List candidateParses, List selectedParses) { - chatQueryRepository.batchSaveParseInfo(chatCtx, queryReq, parseResult, candidateParses, selectedParses); + return chatQueryRepository.batchSaveParseInfo(chatCtx, queryReq, parseResult, candidateParses, selectedParses); + } + @Override + public void updateChatParse(List chatParseDOS) { + chatQueryRepository.updateChatParseInfo(chatParseDOS); } @Override diff --git a/chat/core/src/main/java/com/tencent/supersonic/chat/service/impl/QueryServiceImpl.java b/chat/core/src/main/java/com/tencent/supersonic/chat/service/impl/QueryServiceImpl.java index 11878653e..ce5e9b211 100644 --- a/chat/core/src/main/java/com/tencent/supersonic/chat/service/impl/QueryServiceImpl.java +++ b/chat/core/src/main/java/com/tencent/supersonic/chat/service/impl/QueryServiceImpl.java @@ -63,6 +63,7 @@ import java.util.stream.Collectors; import lombok.extern.slf4j.Slf4j; import org.apache.calcite.sql.parser.SqlParseException; import org.apache.commons.collections.CollectionUtils; +import org.apache.commons.compress.utils.Lists; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; @@ -113,6 +114,7 @@ public class QueryServiceImpl implements QueryService { log.info("{} result:{}", parser.getClass().getSimpleName(), JsonUtil.toString(queryCtx)); }); ParseResp parseResult; + List chatParseDOS = Lists.newArrayList(); if (queryCtx.getCandidateQueries().size() > 0) { log.debug("pick before [{}]", queryCtx.getCandidateQueries().stream().collect( Collectors.toList())); @@ -130,7 +132,7 @@ public class QueryServiceImpl implements QueryService { .selectedParses(selectedParses) .candidateParses(candidateParses) .build(); - chatService.batchAddParse(chatCtx, queryReq, parseResult, candidateParses, selectedParses); + chatParseDOS = chatService.batchAddParse(chatCtx, queryReq, parseResult, candidateParses, selectedParses); saveInfo(timeCostDOList, queryReq.getQueryText(), parseResult.getQueryId(), queryReq.getUser().getName(), queryReq.getChatId().longValue()); } else { @@ -141,8 +143,9 @@ public class QueryServiceImpl implements QueryService { .build(); } for (ParseResponder parseResponder : parseResponders) { - parseResponder.fillResponse(parseResult, queryCtx); + parseResponder.fillResponse(parseResult, queryCtx, chatParseDOS); } + chatService.updateChatParse(chatParseDOS); return parseResult; } diff --git a/chat/core/src/main/resources/mapper/ChatParseMapper.xml b/chat/core/src/main/resources/mapper/ChatParseMapper.xml index 1d6b7f344..0faf32d9a 100644 --- a/chat/core/src/main/resources/mapper/ChatParseMapper.xml +++ b/chat/core/src/main/resources/mapper/ChatParseMapper.xml @@ -25,6 +25,12 @@ + + update s2_chat_parse + set parse_info = #{parseInfo} + where parse_id = #{parseId} + + + + diff --git a/pom.xml b/pom.xml index c3d1921db..38f89909f 100644 --- a/pom.xml +++ b/pom.xml @@ -70,7 +70,8 @@ 22.3.0 - 3.1.1 + 2.2.6 + 3.17 diff --git a/semantic/query/pom.xml b/semantic/query/pom.xml index 481dd4f01..e451828d4 100644 --- a/semantic/query/pom.xml +++ b/semantic/query/pom.xml @@ -97,6 +97,21 @@ easyexcel ${easyexcel.version} + + org.apache.poi + poi + ${poi.version} + + + org.apache.poi + poi-ooxml + ${poi.version} + + + org.apache.poi + poi-ooxml-schemas + ${poi.version} +