(improvement)(chat) Make s2ql switch compatible, executeDirectQuery also needs to perform corrections, and update ParserInfo. (#355)

This commit is contained in:
lexluo09
2023-11-10 14:31:02 +08:00
committed by GitHub
parent bf3a111e55
commit e537b738e4
6 changed files with 40 additions and 14 deletions

View File

@@ -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);
}

View File

@@ -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);

View File

@@ -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

View File

@@ -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())) {

View File

@@ -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
user.s2SQL.switch=true

View File

@@ -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);