From e537b738e4c05195619765a916cbddcf7e5217e1 Mon Sep 17 00:00:00 2001 From: lexluo09 <39718951+lexluo09@users.noreply.github.com> Date: Fri, 10 Nov 2023 14:31:02 +0800 Subject: [PATCH] (improvement)(chat) Make s2ql switch compatible, executeDirectQuery also needs to perform corrections, and update ParserInfo. (#355) --- .../chat/query/BaseSemanticQuery.java | 30 +++++++++++++------ .../execute/EntityInfoExecuteResponder.java | 3 +- .../parse/EntityInfoParseResponder.java | 3 +- .../chat/service/impl/QueryServiceImpl.java | 15 +++++++++- .../main/resources/optimization.properties | 2 +- .../semantic/query/parser/QueryParser.java | 1 - 6 files changed, 40 insertions(+), 14 deletions(-) diff --git a/chat/core/src/main/java/com/tencent/supersonic/chat/query/BaseSemanticQuery.java b/chat/core/src/main/java/com/tencent/supersonic/chat/query/BaseSemanticQuery.java index a85726db2..da92e43fd 100644 --- a/chat/core/src/main/java/com/tencent/supersonic/chat/query/BaseSemanticQuery.java +++ b/chat/core/src/main/java/com/tencent/supersonic/chat/query/BaseSemanticQuery.java @@ -27,6 +27,7 @@ import java.util.stream.Collectors; import lombok.ToString; import lombok.extern.slf4j.Slf4j; import org.apache.commons.collections4.CollectionUtils; +import org.apache.commons.lang3.StringUtils; @Slf4j @ToString @@ -39,19 +40,30 @@ public abstract class BaseSemanticQuery implements SemanticQuery, Serializable { @Override public String explain(User user) { ExplainSqlReq explainSqlReq = null; - SqlInfo sqlInfo = parseInfo.getSqlInfo(); try { - QueryS2SQLReq queryS2SQLReq = QueryReqBuilder.buildS2SQLReq(sqlInfo.getCorrectS2SQL(), - parseInfo.getModelId()); - explainSqlReq = ExplainSqlReq.builder() - .queryTypeEnum(QueryTypeEnum.SQL) - .queryReq(queryS2SQLReq) - .build(); - ExplainResp explain = semanticInterpreter.explain(explainSqlReq, user); + ExplainResp explain = null; + SqlInfo sqlInfo = parseInfo.getSqlInfo(); + if (StringUtils.isNotBlank(sqlInfo.getCorrectS2SQL())) { + //sql + QueryS2SQLReq queryS2SQLReq = QueryReqBuilder.buildS2SQLReq(sqlInfo.getCorrectS2SQL(), + parseInfo.getModelId()); + explainSqlReq = ExplainSqlReq.builder() + .queryTypeEnum(QueryTypeEnum.SQL) + .queryReq(queryS2SQLReq) + .build(); + explain = semanticInterpreter.explain(explainSqlReq, user); + } else { + //struct + QueryStructReq queryStructReq = QueryReqBuilder.buildStructReq(parseInfo); + explainSqlReq = ExplainSqlReq.builder() + .queryTypeEnum(QueryTypeEnum.STRUCT) + .queryReq(queryStructReq) + .build(); + explain = semanticInterpreter.explain(explainSqlReq, user); + } if (Objects.nonNull(explain)) { return explain.getSql(); } - return explain.getSql(); } catch (Exception e) { log.error("explain error explainSqlReq:{}", explainSqlReq, e); } diff --git a/chat/core/src/main/java/com/tencent/supersonic/chat/responder/execute/EntityInfoExecuteResponder.java b/chat/core/src/main/java/com/tencent/supersonic/chat/responder/execute/EntityInfoExecuteResponder.java index 07e91fc62..928ebb7e5 100644 --- a/chat/core/src/main/java/com/tencent/supersonic/chat/responder/execute/EntityInfoExecuteResponder.java +++ b/chat/core/src/main/java/com/tencent/supersonic/chat/responder/execute/EntityInfoExecuteResponder.java @@ -24,7 +24,8 @@ public class EntityInfoExecuteResponder implements ExecuteResponder { return; } String queryMode = semanticParseInfo.getQueryMode(); - if (QueryManager.containsPluginQuery(queryMode) || MetricInterpretQuery.QUERY_MODE.equalsIgnoreCase(queryMode)) { + if (QueryManager.containsPluginQuery(queryMode) || MetricInterpretQuery.QUERY_MODE.equalsIgnoreCase( + queryMode)) { return; } SemanticService semanticService = ContextUtils.getBean(SemanticService.class); 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 30ed1fe10..70fce1e3f 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 @@ -26,7 +26,8 @@ public class EntityInfoParseResponder implements ParseResponder { QueryReq queryReq = queryContext.getRequest(); selectedParses.forEach(parseInfo -> { String queryMode = parseInfo.getQueryMode(); - if (QueryManager.containsPluginQuery(queryMode) || MetricInterpretQuery.QUERY_MODE.equalsIgnoreCase(queryMode)) { + if (QueryManager.containsPluginQuery(queryMode) || MetricInterpretQuery.QUERY_MODE.equalsIgnoreCase( + queryMode)) { return; } //1. set entity info 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 b16ff29b3..4dc79cc1d 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 @@ -15,6 +15,7 @@ import com.tencent.supersonic.chat.api.pojo.request.DimensionValueReq; import com.tencent.supersonic.chat.api.pojo.request.ExecuteQueryReq; import com.tencent.supersonic.chat.api.pojo.request.QueryDataReq; import com.tencent.supersonic.chat.api.pojo.request.QueryFilter; +import com.tencent.supersonic.chat.api.pojo.request.QueryFilters; import com.tencent.supersonic.chat.api.pojo.request.QueryReq; import com.tencent.supersonic.chat.api.pojo.request.SolvedQueryReq; import com.tencent.supersonic.chat.api.pojo.response.EntityInfo; @@ -329,6 +330,19 @@ public class QueryServiceImpl implements QueryService { } } semanticQuery.setParseInfo(parseInfo); + //init s2sql + semanticQuery.initS2Sql(user); + QueryReq queryReq = new QueryReq(); + queryReq.setQueryFilters(new QueryFilters()); + queryReq.setUser(user); + + //correct s2sql + semanticCorrectors.stream().forEach(correction -> { + correction.correct(queryReq, semanticQuery.getParseInfo()); + }); + //update parserInfo + parseInfoService.updateParseInfo(semanticQuery.getParseInfo()); + QueryResult queryResult = semanticQuery.execute(user); queryResult.setChatContext(semanticQuery.getParseInfo()); SemanticService semanticService = ContextUtils.getBean(SemanticService.class); @@ -519,7 +533,6 @@ public class QueryServiceImpl implements QueryService { }); } - private SemanticParseInfo getSemanticParseInfo(QueryDataReq queryData, ChatParseDO chatParseDO) { SemanticParseInfo parseInfo = JsonUtil.toObject(chatParseDO.getParseInfo(), SemanticParseInfo.class); if (S2SQLQuery.QUERY_MODE.equals(parseInfo.getQueryMode())) { diff --git a/launchers/standalone/src/main/resources/optimization.properties b/launchers/standalone/src/main/resources/optimization.properties index b99b56a36..941ea88da 100644 --- a/launchers/standalone/src/main/resources/optimization.properties +++ b/launchers/standalone/src/main/resources/optimization.properties @@ -8,4 +8,4 @@ long.text.threshold=0.8 short.text.threshold=0.5 query.text.length.threshold=10 candidate.threshold=0.2 -user.s2ql.switch=true \ No newline at end of file +user.s2SQL.switch=true \ No newline at end of file diff --git a/semantic/query/src/main/java/com/tencent/supersonic/semantic/query/parser/QueryParser.java b/semantic/query/src/main/java/com/tencent/supersonic/semantic/query/parser/QueryParser.java index 067ed2461..6fe9780e4 100644 --- a/semantic/query/src/main/java/com/tencent/supersonic/semantic/query/parser/QueryParser.java +++ b/semantic/query/src/main/java/com/tencent/supersonic/semantic/query/parser/QueryParser.java @@ -38,7 +38,6 @@ public class QueryParser { if (semanticConverter.accept(queryStructReq)) { log.info("SemanticConverter accept [{}]", semanticConverter.getClass().getName()); semanticConverter.converter(catalog, queryStructReq, parseSqlReq, metricReq); - log.info("SemanticConverter accept [{}]", semanticConverter.getClass().getName()); } } log.info("SemanticConverter after {} {} {}", queryStructReq, metricReq, parseSqlReq);