diff --git a/chat/api/src/main/java/com/tencent/supersonic/chat/api/pojo/response/QueryResult.java b/chat/api/src/main/java/com/tencent/supersonic/chat/api/pojo/response/QueryResult.java index 345f96035..52f32b2e5 100644 --- a/chat/api/src/main/java/com/tencent/supersonic/chat/api/pojo/response/QueryResult.java +++ b/chat/api/src/main/java/com/tencent/supersonic/chat/api/pojo/response/QueryResult.java @@ -28,4 +28,5 @@ public class QueryResult { private EntityInfo entityInfo; private List recommendedDimensions; private AggregateInfo aggregateInfo; + private String errorMsg; } diff --git a/chat/server/src/main/java/com/tencent/supersonic/chat/server/executor/SqlExecutor.java b/chat/server/src/main/java/com/tencent/supersonic/chat/server/executor/SqlExecutor.java index 41a99aac3..80704303c 100644 --- a/chat/server/src/main/java/com/tencent/supersonic/chat/server/executor/SqlExecutor.java +++ b/chat/server/src/main/java/com/tencent/supersonic/chat/server/executor/SqlExecutor.java @@ -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; } diff --git a/chat/server/src/main/java/com/tencent/supersonic/chat/server/parser/NL2SQLParser.java b/chat/server/src/main/java/com/tencent/supersonic/chat/server/parser/NL2SQLParser.java index 9dbdd67a8..91af7493d 100644 --- a/chat/server/src/main/java/com/tencent/supersonic/chat/server/parser/NL2SQLParser.java +++ b/chat/server/src/main/java/com/tencent/supersonic/chat/server/parser/NL2SQLParser.java @@ -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); } diff --git a/headless/server/src/main/java/com/tencent/supersonic/headless/server/utils/ChatWorkflowEngine.java b/headless/server/src/main/java/com/tencent/supersonic/headless/server/utils/ChatWorkflowEngine.java index 8568fee8e..5efcc3dca 100644 --- a/headless/server/src/main/java/com/tencent/supersonic/headless/server/utils/ChatWorkflowEngine.java +++ b/headless/server/src/main/java/com/tencent/supersonic/headless/server/utils/ChatWorkflowEngine.java @@ -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 semanticParseInfos = chatQueryContext.getCandidateQueries().stream() .map(SemanticQuery::getParseInfo).collect(Collectors.toList()); - + List 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"))); + } } }