[improvement][headless] add errorMsg to parse and execute response (#1764) (#1778)

This commit is contained in:
jipeli
2024-10-10 21:27:26 +08:00
committed by GitHub
parent 1b53226645
commit bf1f2ed60a
4 changed files with 33 additions and 16 deletions

View File

@@ -28,4 +28,5 @@ public class QueryResult {
private EntityInfo entityInfo;
private List<SchemaElement> recommendedDimensions;
private AggregateInfo aggregateInfo;
private String errorMsg;
}

View File

@@ -75,22 +75,26 @@ public class SqlExecutor implements ChatQueryExecutor {
sqlReq.setDataSetId(parseInfo.getDataSetId());
long startTime = System.currentTimeMillis();
SemanticQueryResp queryResp = semanticLayer.queryByReq(sqlReq, executeContext.getUser());
QueryResult queryResult = new QueryResult();
queryResult.setChatContext(parseInfo);
queryResult.setQueryMode(parseInfo.getQueryMode());
queryResult.setQueryTimeCost(System.currentTimeMillis() - startTime);
if (queryResp != null) {
queryResult.setQueryAuthorization(queryResp.getQueryAuthorization());
queryResult.setQuerySql(queryResp.getSql());
queryResult.setQueryResults(queryResp.getResultList());
queryResult.setQueryColumns(queryResp.getColumns());
queryResult.setQueryState(QueryState.SUCCESS);
chatCtx.setParseInfo(parseInfo);
chatContextService.updateContext(chatCtx);
} else {
queryResult.setQueryState(QueryState.INVALID);
try {
SemanticQueryResp queryResp =
semanticLayer.queryByReq(sqlReq, executeContext.getUser());
if (queryResp != null) {
queryResult.setQueryAuthorization(queryResp.getQueryAuthorization());
queryResult.setQuerySql(queryResp.getSql());
queryResult.setQueryResults(queryResp.getResultList());
queryResult.setQueryColumns(queryResp.getColumns());
queryResult.setQueryState(QueryState.SUCCESS);
chatCtx.setParseInfo(parseInfo);
chatContextService.updateContext(chatCtx);
} else {
queryResult.setQueryState(QueryState.INVALID);
}
} catch (Exception e) {
queryResult.setErrorMsg(e.getMessage());
}
return queryResult;
}

View File

@@ -105,6 +105,7 @@ public class NL2SQLParser implements ChatQueryParser {
}
parseResp.setState(text2SqlParseResp.getState());
parseResp.getParseTimeCost().setSqlTime(text2SqlParseResp.getParseTimeCost().getSqlTime());
parseResp.setErrorMsg(text2SqlParseResp.getErrorMsg());
formatParseResult(parseResp);
}

View File

@@ -23,6 +23,7 @@ import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Service;
import java.util.ArrayList;
import java.util.List;
import java.util.Objects;
import java.util.stream.Collectors;
@@ -74,7 +75,7 @@ public class ChatWorkflowEngine {
break;
case TRANSLATING:
long start = System.currentTimeMillis();
performTranslating(queryCtx);
performTranslating(queryCtx, parseResult);
parseResult.getParseTimeCost().setSqlTime(System.currentTimeMillis() - start);
queryCtx.setChatWorkflowState(ChatWorkflowState.PROCESSING);
break;
@@ -126,10 +127,13 @@ public class ChatWorkflowEngine {
});
}
private void performTranslating(ChatQueryContext chatQueryContext) {
private void performTranslating(ChatQueryContext chatQueryContext, ParseResp parseResult) {
List<SemanticParseInfo> semanticParseInfos = chatQueryContext.getCandidateQueries().stream()
.map(SemanticQuery::getParseInfo).collect(Collectors.toList());
List<String> errorMsg = new ArrayList<>();
if (StringUtils.isNotBlank(parseResult.getErrorMsg())) {
errorMsg.add(parseResult.getErrorMsg());
}
semanticParseInfos.forEach(parseInfo -> {
try {
SemanticQuery semanticQuery = QueryManager.createQuery(parseInfo.getQueryMode());
@@ -143,7 +147,9 @@ public class ChatWorkflowEngine {
SemanticTranslateResp explain =
queryService.translate(semanticQueryReq, chatQueryContext.getUser());
parseInfo.getSqlInfo().setQuerySQL(explain.getQuerySQL());
if (StringUtils.isNotBlank(explain.getErrMsg())) {
errorMsg.add(explain.getErrMsg());
}
keyPipelineLog.info(
"SqlInfoProcessor results:\n"
+ "Parsed S2SQL: {}\nCorrected S2SQL: {}\nQuery SQL: {}",
@@ -152,7 +158,12 @@ public class ChatWorkflowEngine {
StringUtils.normalizeSpace(parseInfo.getSqlInfo().getQuerySQL()));
} catch (Exception e) {
log.warn("get sql info failed:{}", parseInfo, e);
errorMsg.add(String.format("S2SQL:%s %s", parseInfo.getSqlInfo().getParsedS2SQL(),
e.getMessage()));
}
});
if (!errorMsg.isEmpty()) {
parseResult.setErrorMsg(errorMsg.stream().collect(Collectors.joining("\n")));
}
}
}