From 50b0036d0fd29364ae3645e01b7308e45144075a Mon Sep 17 00:00:00 2001 From: jipeli <54889677+jipeli@users.noreply.github.com> Date: Fri, 11 Oct 2024 12:00:41 +0800 Subject: [PATCH] [improvement][headless] Fix permission exception loss (#1764) (#1782) --- .../chat/server/executor/SqlExecutor.java | 29 +++++++++---------- .../supersonic/common/util/StringUtil.java | 17 +++++++++++ .../api/pojo/response/SemanticQueryResp.java | 6 ++++ .../headless/core/executor/JdbcExecutor.java | 11 +++++-- .../service/impl/S2SemanticLayerService.java | 3 ++ 5 files changed, 47 insertions(+), 19 deletions(-) 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 80704303c..bbf481bef 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 @@ -79,23 +79,20 @@ public class SqlExecutor implements ChatQueryExecutor { queryResult.setChatContext(parseInfo); queryResult.setQueryMode(parseInfo.getQueryMode()); queryResult.setQueryTimeCost(System.currentTimeMillis() - startTime); - 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()); + 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); + queryResult.setErrorMsg(queryResp.getErrorMsg()); + chatCtx.setParseInfo(parseInfo); + chatContextService.updateContext(chatCtx); + } else { + queryResult.setQueryState(QueryState.INVALID); } + return queryResult; } } diff --git a/common/src/main/java/com/tencent/supersonic/common/util/StringUtil.java b/common/src/main/java/com/tencent/supersonic/common/util/StringUtil.java index 2b83736e1..dd592bb38 100644 --- a/common/src/main/java/com/tencent/supersonic/common/util/StringUtil.java +++ b/common/src/main/java/com/tencent/supersonic/common/util/StringUtil.java @@ -51,4 +51,21 @@ public class StringUtil { } return sql.replaceAll("`", ""); } + + public static String append(String old, String add) { + return append(old, add, "\n"); + } + + public static String append(String old, String add, String split) { + if (StringUtils.isNotBlank(old)) { + if (StringUtils.isNotBlank(add)) { + return String.format("%s%s%s", old, split, add); + } + return old; + } + if (StringUtils.isNotBlank(add)) { + return add; + } + return null; + } } diff --git a/headless/api/src/main/java/com/tencent/supersonic/headless/api/pojo/response/SemanticQueryResp.java b/headless/api/src/main/java/com/tencent/supersonic/headless/api/pojo/response/SemanticQueryResp.java index 112bdd7af..0512ae59e 100644 --- a/headless/api/src/main/java/com/tencent/supersonic/headless/api/pojo/response/SemanticQueryResp.java +++ b/headless/api/src/main/java/com/tencent/supersonic/headless/api/pojo/response/SemanticQueryResp.java @@ -3,6 +3,7 @@ package com.tencent.supersonic.headless.api.pojo.response; import com.google.common.collect.Lists; import com.tencent.supersonic.common.pojo.QueryAuthorization; import com.tencent.supersonic.common.pojo.QueryColumn; +import com.tencent.supersonic.common.util.StringUtil; import com.tencent.supersonic.headless.api.pojo.QueryResult; import com.tencent.supersonic.headless.api.pojo.enums.SemanticType; import lombok.Data; @@ -20,6 +21,7 @@ public class SemanticQueryResp extends QueryResult> { String sql; QueryAuthorization queryAuthorization; boolean useCache; + private String errorMsg; public List getMetricColumns() { return columns.stream() @@ -32,4 +34,8 @@ public class SemanticQueryResp extends QueryResult> { queryColumn -> !SemanticType.NUMBER.name().equals(queryColumn.getShowType())) .collect(Collectors.toList()); } + + public void appendErrorMsg(String msg) { + errorMsg = StringUtil.append(errorMsg, msg); + } } diff --git a/headless/core/src/main/java/com/tencent/supersonic/headless/core/executor/JdbcExecutor.java b/headless/core/src/main/java/com/tencent/supersonic/headless/core/executor/JdbcExecutor.java index 36a9d7ece..be4791287 100644 --- a/headless/core/src/main/java/com/tencent/supersonic/headless/core/executor/JdbcExecutor.java +++ b/headless/core/src/main/java/com/tencent/supersonic/headless/core/executor/JdbcExecutor.java @@ -40,9 +40,14 @@ public class JdbcExecutor implements QueryExecutor { log.info("executing SQL: {}", sql); Database database = queryStatement.getSemanticModel().getDatabase(); SemanticQueryResp queryResultWithColumns = new SemanticQueryResp(); - SqlUtils sqlUtil = sqlUtils.init(database); - sqlUtil.queryInternal(queryStatement.getSql(), queryResultWithColumns); - queryResultWithColumns.setSql(sql); + try { + SqlUtils sqlUtil = sqlUtils.init(database); + sqlUtil.queryInternal(queryStatement.getSql(), queryResultWithColumns); + queryResultWithColumns.setSql(sql); + } catch (Exception e) { + log.error("queryInternal error [{}]", e); + queryResultWithColumns.setErrorMsg(e.getMessage()); + } return queryResultWithColumns; } } diff --git a/headless/server/src/main/java/com/tencent/supersonic/headless/server/facade/service/impl/S2SemanticLayerService.java b/headless/server/src/main/java/com/tencent/supersonic/headless/server/facade/service/impl/S2SemanticLayerService.java index 358047542..abe3beeda 100644 --- a/headless/server/src/main/java/com/tencent/supersonic/headless/server/facade/service/impl/S2SemanticLayerService.java +++ b/headless/server/src/main/java/com/tencent/supersonic/headless/server/facade/service/impl/S2SemanticLayerService.java @@ -9,6 +9,7 @@ import com.tencent.supersonic.common.pojo.enums.FilterOperatorEnum; import com.tencent.supersonic.common.pojo.enums.QueryType; import com.tencent.supersonic.common.pojo.enums.TaskStatusEnum; import com.tencent.supersonic.common.pojo.enums.TimeDimensionEnum; +import com.tencent.supersonic.common.util.StringUtil; import com.tencent.supersonic.headless.api.pojo.*; import com.tencent.supersonic.headless.api.pojo.DetailTypeDefaultConfig; import com.tencent.supersonic.headless.api.pojo.enums.SemanticType; @@ -165,6 +166,8 @@ public class S2SemanticLayerService implements SemanticLayerService { } if (Objects.isNull(queryResp)) { state = TaskStatusEnum.ERROR; + } else { + queryResp.appendErrorMsg(queryStatement.getErrMsg()); } return queryResp;