(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.ToString;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.lang3.StringUtils;
@Slf4j @Slf4j
@ToString @ToString
@@ -39,19 +40,30 @@ public abstract class BaseSemanticQuery implements SemanticQuery, Serializable {
@Override @Override
public String explain(User user) { public String explain(User user) {
ExplainSqlReq explainSqlReq = null; ExplainSqlReq explainSqlReq = null;
SqlInfo sqlInfo = parseInfo.getSqlInfo();
try { try {
ExplainResp explain = null;
SqlInfo sqlInfo = parseInfo.getSqlInfo();
if (StringUtils.isNotBlank(sqlInfo.getCorrectS2SQL())) {
//sql
QueryS2SQLReq queryS2SQLReq = QueryReqBuilder.buildS2SQLReq(sqlInfo.getCorrectS2SQL(), QueryS2SQLReq queryS2SQLReq = QueryReqBuilder.buildS2SQLReq(sqlInfo.getCorrectS2SQL(),
parseInfo.getModelId()); parseInfo.getModelId());
explainSqlReq = ExplainSqlReq.builder() explainSqlReq = ExplainSqlReq.builder()
.queryTypeEnum(QueryTypeEnum.SQL) .queryTypeEnum(QueryTypeEnum.SQL)
.queryReq(queryS2SQLReq) .queryReq(queryS2SQLReq)
.build(); .build();
ExplainResp explain = semanticInterpreter.explain(explainSqlReq, user); 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)) { if (Objects.nonNull(explain)) {
return explain.getSql(); return explain.getSql();
} }
return explain.getSql();
} catch (Exception e) { } catch (Exception e) {
log.error("explain error explainSqlReq:{}", explainSqlReq, e); log.error("explain error explainSqlReq:{}", explainSqlReq, e);
} }

View File

@@ -24,7 +24,8 @@ public class EntityInfoExecuteResponder implements ExecuteResponder {
return; return;
} }
String queryMode = semanticParseInfo.getQueryMode(); String queryMode = semanticParseInfo.getQueryMode();
if (QueryManager.containsPluginQuery(queryMode) || MetricInterpretQuery.QUERY_MODE.equalsIgnoreCase(queryMode)) { if (QueryManager.containsPluginQuery(queryMode) || MetricInterpretQuery.QUERY_MODE.equalsIgnoreCase(
queryMode)) {
return; return;
} }
SemanticService semanticService = ContextUtils.getBean(SemanticService.class); SemanticService semanticService = ContextUtils.getBean(SemanticService.class);

View File

@@ -26,7 +26,8 @@ public class EntityInfoParseResponder implements ParseResponder {
QueryReq queryReq = queryContext.getRequest(); QueryReq queryReq = queryContext.getRequest();
selectedParses.forEach(parseInfo -> { selectedParses.forEach(parseInfo -> {
String queryMode = parseInfo.getQueryMode(); String queryMode = parseInfo.getQueryMode();
if (QueryManager.containsPluginQuery(queryMode) || MetricInterpretQuery.QUERY_MODE.equalsIgnoreCase(queryMode)) { if (QueryManager.containsPluginQuery(queryMode) || MetricInterpretQuery.QUERY_MODE.equalsIgnoreCase(
queryMode)) {
return; return;
} }
//1. set entity info //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.ExecuteQueryReq;
import com.tencent.supersonic.chat.api.pojo.request.QueryDataReq; 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.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.QueryReq;
import com.tencent.supersonic.chat.api.pojo.request.SolvedQueryReq; import com.tencent.supersonic.chat.api.pojo.request.SolvedQueryReq;
import com.tencent.supersonic.chat.api.pojo.response.EntityInfo; import com.tencent.supersonic.chat.api.pojo.response.EntityInfo;
@@ -329,6 +330,19 @@ public class QueryServiceImpl implements QueryService {
} }
} }
semanticQuery.setParseInfo(parseInfo); 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 queryResult = semanticQuery.execute(user);
queryResult.setChatContext(semanticQuery.getParseInfo()); queryResult.setChatContext(semanticQuery.getParseInfo());
SemanticService semanticService = ContextUtils.getBean(SemanticService.class); SemanticService semanticService = ContextUtils.getBean(SemanticService.class);
@@ -519,7 +533,6 @@ public class QueryServiceImpl implements QueryService {
}); });
} }
private SemanticParseInfo getSemanticParseInfo(QueryDataReq queryData, ChatParseDO chatParseDO) { private SemanticParseInfo getSemanticParseInfo(QueryDataReq queryData, ChatParseDO chatParseDO) {
SemanticParseInfo parseInfo = JsonUtil.toObject(chatParseDO.getParseInfo(), SemanticParseInfo.class); SemanticParseInfo parseInfo = JsonUtil.toObject(chatParseDO.getParseInfo(), SemanticParseInfo.class);
if (S2SQLQuery.QUERY_MODE.equals(parseInfo.getQueryMode())) { if (S2SQLQuery.QUERY_MODE.equals(parseInfo.getQueryMode())) {

View File

@@ -8,4 +8,4 @@ long.text.threshold=0.8
short.text.threshold=0.5 short.text.threshold=0.5
query.text.length.threshold=10 query.text.length.threshold=10
candidate.threshold=0.2 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)) { if (semanticConverter.accept(queryStructReq)) {
log.info("SemanticConverter accept [{}]", semanticConverter.getClass().getName()); log.info("SemanticConverter accept [{}]", semanticConverter.getClass().getName());
semanticConverter.converter(catalog, queryStructReq, parseSqlReq, metricReq); semanticConverter.converter(catalog, queryStructReq, parseSqlReq, metricReq);
log.info("SemanticConverter accept [{}]", semanticConverter.getClass().getName());
} }
} }
log.info("SemanticConverter after {} {} {}", queryStructReq, metricReq, parseSqlReq); log.info("SemanticConverter after {} {} {}", queryStructReq, metricReq, parseSqlReq);