[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 EntityInfo entityInfo;
private List<SchemaElement> recommendedDimensions; private List<SchemaElement> recommendedDimensions;
private AggregateInfo aggregateInfo; private AggregateInfo aggregateInfo;
private String errorMsg;
} }

View File

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

View File

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

View File

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