mirror of
https://github.com/tencentmusic/supersonic.git
synced 2025-12-10 19:51:00 +00:00
(improvement)(headless)Remove unnecessary performExecution method from ChatQueryService.
This commit is contained in:
@@ -28,6 +28,7 @@ import com.tencent.supersonic.headless.api.pojo.response.QueryResult;
|
|||||||
import com.tencent.supersonic.headless.api.pojo.response.SearchResult;
|
import com.tencent.supersonic.headless.api.pojo.response.SearchResult;
|
||||||
import com.tencent.supersonic.headless.server.facade.service.ChatQueryService;
|
import com.tencent.supersonic.headless.server.facade.service.ChatQueryService;
|
||||||
import com.tencent.supersonic.headless.server.facade.service.RetrieveService;
|
import com.tencent.supersonic.headless.server.facade.service.RetrieveService;
|
||||||
|
import com.tencent.supersonic.headless.server.facade.service.SemanticLayerService;
|
||||||
import lombok.extern.slf4j.Slf4j;
|
import lombok.extern.slf4j.Slf4j;
|
||||||
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
import org.springframework.stereotype.Service;
|
import org.springframework.stereotype.Service;
|
||||||
@@ -48,6 +49,9 @@ public class ChatServiceImpl implements ChatService {
|
|||||||
private RetrieveService retrieveService;
|
private RetrieveService retrieveService;
|
||||||
@Autowired
|
@Autowired
|
||||||
private AgentService agentService;
|
private AgentService agentService;
|
||||||
|
@Autowired
|
||||||
|
private SemanticLayerService semanticLayerService;
|
||||||
|
|
||||||
private List<ChatParser> chatParsers = ComponentFactory.getChatParsers();
|
private List<ChatParser> chatParsers = ComponentFactory.getChatParsers();
|
||||||
private List<ChatExecutor> chatExecutors = ComponentFactory.getChatExecutors();
|
private List<ChatExecutor> chatExecutors = ComponentFactory.getChatExecutors();
|
||||||
private List<ParseResultProcessor> parseResultProcessors = ComponentFactory.getParseProcessors();
|
private List<ParseResultProcessor> parseResultProcessors = ComponentFactory.getParseProcessors();
|
||||||
|
|||||||
@@ -1,10 +1,14 @@
|
|||||||
package com.tencent.supersonic.headless.server.facade.rest;
|
package com.tencent.supersonic.headless.server.facade.rest;
|
||||||
|
|
||||||
|
import com.tencent.supersonic.auth.api.authentication.pojo.User;
|
||||||
import com.tencent.supersonic.auth.api.authentication.utils.UserHolder;
|
import com.tencent.supersonic.auth.api.authentication.utils.UserHolder;
|
||||||
|
import com.tencent.supersonic.headless.api.pojo.SemanticParseInfo;
|
||||||
import com.tencent.supersonic.headless.api.pojo.request.QueryNLReq;
|
import com.tencent.supersonic.headless.api.pojo.request.QueryNLReq;
|
||||||
import com.tencent.supersonic.headless.api.pojo.response.MapResp;
|
import com.tencent.supersonic.headless.api.pojo.request.QuerySqlReq;
|
||||||
|
import com.tencent.supersonic.headless.api.pojo.response.ParseResp;
|
||||||
import com.tencent.supersonic.headless.server.facade.service.ChatQueryService;
|
import com.tencent.supersonic.headless.server.facade.service.ChatQueryService;
|
||||||
import com.tencent.supersonic.headless.server.facade.service.RetrieveService;
|
import com.tencent.supersonic.headless.server.facade.service.RetrieveService;
|
||||||
|
import com.tencent.supersonic.headless.server.facade.service.SemanticLayerService;
|
||||||
import lombok.extern.slf4j.Slf4j;
|
import lombok.extern.slf4j.Slf4j;
|
||||||
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
import org.springframework.web.bind.annotation.PostMapping;
|
import org.springframework.web.bind.annotation.PostMapping;
|
||||||
@@ -25,6 +29,9 @@ public class ChatQueryApiController {
|
|||||||
@Autowired
|
@Autowired
|
||||||
private RetrieveService retrieveService;
|
private RetrieveService retrieveService;
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private SemanticLayerService semanticLayerService;
|
||||||
|
|
||||||
@PostMapping("/chat/search")
|
@PostMapping("/chat/search")
|
||||||
public Object search(@RequestBody QueryNLReq queryNLReq,
|
public Object search(@RequestBody QueryNLReq queryNLReq,
|
||||||
HttpServletRequest request,
|
HttpServletRequest request,
|
||||||
@@ -34,9 +41,9 @@ public class ChatQueryApiController {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@PostMapping("/chat/map")
|
@PostMapping("/chat/map")
|
||||||
public MapResp map(@RequestBody QueryNLReq queryNLReq,
|
public Object map(@RequestBody QueryNLReq queryNLReq,
|
||||||
HttpServletRequest request,
|
HttpServletRequest request,
|
||||||
HttpServletResponse response) {
|
HttpServletResponse response) {
|
||||||
queryNLReq.setUser(UserHolder.findUser(request, response));
|
queryNLReq.setUser(UserHolder.findUser(request, response));
|
||||||
return chatQueryService.performMapping(queryNLReq);
|
return chatQueryService.performMapping(queryNLReq);
|
||||||
}
|
}
|
||||||
@@ -49,4 +56,21 @@ public class ChatQueryApiController {
|
|||||||
return chatQueryService.performParsing(queryNLReq);
|
return chatQueryService.performParsing(queryNLReq);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@PostMapping("/chat")
|
||||||
|
public Object queryByNL(@RequestBody QueryNLReq queryNLReq,
|
||||||
|
HttpServletRequest request,
|
||||||
|
HttpServletResponse response) throws Exception {
|
||||||
|
User user = UserHolder.findUser(request, response);
|
||||||
|
ParseResp parseResp = chatQueryService.performParsing(queryNLReq);
|
||||||
|
if (parseResp.getState().equals(ParseResp.ParseState.COMPLETED)) {
|
||||||
|
SemanticParseInfo parseInfo = parseResp.getSelectedParses().get(0);
|
||||||
|
QuerySqlReq sqlReq = new QuerySqlReq();
|
||||||
|
sqlReq.setSql(parseInfo.getSqlInfo().getCorrectedS2SQL());
|
||||||
|
sqlReq.setSqlInfo(parseInfo.getSqlInfo());
|
||||||
|
return semanticLayerService.queryByReq(sqlReq, user);
|
||||||
|
}
|
||||||
|
|
||||||
|
throw new RuntimeException("Failed to parse natural language query: " + queryNLReq.getQueryText());
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -24,7 +24,7 @@ public class DataSetQueryApiController {
|
|||||||
@Autowired
|
@Autowired
|
||||||
private DataSetService dataSetService;
|
private DataSetService dataSetService;
|
||||||
@Autowired
|
@Autowired
|
||||||
private SemanticLayerService queryService;
|
private SemanticLayerService semanticLayerService;
|
||||||
|
|
||||||
@PostMapping("/dataSet")
|
@PostMapping("/dataSet")
|
||||||
public Object queryByDataSet(@RequestBody QueryDataSetReq queryDataSetReq,
|
public Object queryByDataSet(@RequestBody QueryDataSetReq queryDataSetReq,
|
||||||
@@ -32,7 +32,7 @@ public class DataSetQueryApiController {
|
|||||||
HttpServletResponse response) throws Exception {
|
HttpServletResponse response) throws Exception {
|
||||||
User user = UserHolder.findUser(request, response);
|
User user = UserHolder.findUser(request, response);
|
||||||
SemanticQueryReq queryReq = dataSetService.convert(queryDataSetReq);
|
SemanticQueryReq queryReq = dataSetService.convert(queryDataSetReq);
|
||||||
return queryService.queryByReq(queryReq, user);
|
return semanticLayerService.queryByReq(queryReq, user);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -25,7 +25,7 @@ import javax.servlet.http.HttpServletResponse;
|
|||||||
public class MetricQueryApiController {
|
public class MetricQueryApiController {
|
||||||
|
|
||||||
@Autowired
|
@Autowired
|
||||||
private SemanticLayerService queryService;
|
private SemanticLayerService semanticLayerService;
|
||||||
|
|
||||||
@Autowired
|
@Autowired
|
||||||
private MetricService metricService;
|
private MetricService metricService;
|
||||||
@@ -39,7 +39,7 @@ public class MetricQueryApiController {
|
|||||||
HttpServletResponse response) throws Exception {
|
HttpServletResponse response) throws Exception {
|
||||||
User user = UserHolder.findUser(request, response);
|
User user = UserHolder.findUser(request, response);
|
||||||
QueryStructReq queryStructReq = metricService.convert(queryMetricReq);
|
QueryStructReq queryStructReq = metricService.convert(queryMetricReq);
|
||||||
return queryService.queryByReq(queryStructReq.convert(true), user);
|
return semanticLayerService.queryByReq(queryStructReq.convert(true), user);
|
||||||
}
|
}
|
||||||
|
|
||||||
@PostMapping("/download/metric")
|
@PostMapping("/download/metric")
|
||||||
|
|||||||
@@ -30,7 +30,7 @@ import java.util.stream.Collectors;
|
|||||||
public class SqlQueryApiController {
|
public class SqlQueryApiController {
|
||||||
|
|
||||||
@Autowired
|
@Autowired
|
||||||
private SemanticLayerService queryService;
|
private SemanticLayerService semanticLayerService;
|
||||||
|
|
||||||
@Autowired
|
@Autowired
|
||||||
private ChatQueryService chatQueryService;
|
private ChatQueryService chatQueryService;
|
||||||
@@ -43,7 +43,7 @@ public class SqlQueryApiController {
|
|||||||
String sql = querySqlReq.getSql();
|
String sql = querySqlReq.getSql();
|
||||||
querySqlReq.setSql(StringUtil.replaceBackticks(sql));
|
querySqlReq.setSql(StringUtil.replaceBackticks(sql));
|
||||||
chatQueryService.correct(querySqlReq, user);
|
chatQueryService.correct(querySqlReq, user);
|
||||||
return queryService.queryByReq(querySqlReq, user);
|
return semanticLayerService.queryByReq(querySqlReq, user);
|
||||||
}
|
}
|
||||||
|
|
||||||
@PostMapping("/sqls")
|
@PostMapping("/sqls")
|
||||||
@@ -63,7 +63,7 @@ public class SqlQueryApiController {
|
|||||||
List<CompletableFuture<SemanticQueryResp>> futures = semanticQueryReqs.stream()
|
List<CompletableFuture<SemanticQueryResp>> futures = semanticQueryReqs.stream()
|
||||||
.map(querySqlReq -> CompletableFuture.supplyAsync(() -> {
|
.map(querySqlReq -> CompletableFuture.supplyAsync(() -> {
|
||||||
try {
|
try {
|
||||||
return queryService.queryByReq(querySqlReq, user);
|
return semanticLayerService.queryByReq(querySqlReq, user);
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
log.error("querySqlReq:{},queryByReq error:", querySqlReq, e);
|
log.error("querySqlReq:{},queryByReq error:", querySqlReq, e);
|
||||||
return new SemanticQueryResp();
|
return new SemanticQueryResp();
|
||||||
@@ -88,7 +88,7 @@ public class SqlQueryApiController {
|
|||||||
List<SemanticQueryResp> semanticQueryRespList = new ArrayList<>();
|
List<SemanticQueryResp> semanticQueryRespList = new ArrayList<>();
|
||||||
try {
|
try {
|
||||||
for (SemanticQueryReq semanticQueryReq : semanticQueryReqs) {
|
for (SemanticQueryReq semanticQueryReq : semanticQueryReqs) {
|
||||||
SemanticQueryResp semanticQueryResp = queryService.queryByReq(semanticQueryReq, user);
|
SemanticQueryResp semanticQueryResp = semanticLayerService.queryByReq(semanticQueryReq, user);
|
||||||
semanticQueryRespList.add(semanticQueryResp);
|
semanticQueryRespList.add(semanticQueryResp);
|
||||||
}
|
}
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
|
|||||||
@@ -20,14 +20,14 @@ import org.springframework.web.bind.annotation.RestController;
|
|||||||
public class TagQueryApiController {
|
public class TagQueryApiController {
|
||||||
|
|
||||||
@Autowired
|
@Autowired
|
||||||
private SemanticLayerService queryService;
|
private SemanticLayerService semanticLayerService;
|
||||||
|
|
||||||
@PostMapping("/tag")
|
@PostMapping("/tag")
|
||||||
public Object queryByTag(@RequestBody QueryStructReq queryStructReq,
|
public Object queryByTag(@RequestBody QueryStructReq queryStructReq,
|
||||||
HttpServletRequest request,
|
HttpServletRequest request,
|
||||||
HttpServletResponse response) throws Exception {
|
HttpServletResponse response) throws Exception {
|
||||||
User user = UserHolder.findUser(request, response);
|
User user = UserHolder.findUser(request, response);
|
||||||
return queryService.queryByReq(queryStructReq.convert(), user);
|
return semanticLayerService.queryByReq(queryStructReq.convert(), user);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -4,7 +4,6 @@ import com.tencent.supersonic.auth.api.authentication.pojo.User;
|
|||||||
import com.tencent.supersonic.headless.api.pojo.SemanticParseInfo;
|
import com.tencent.supersonic.headless.api.pojo.SemanticParseInfo;
|
||||||
import com.tencent.supersonic.headless.api.pojo.SqlEvaluation;
|
import com.tencent.supersonic.headless.api.pojo.SqlEvaluation;
|
||||||
import com.tencent.supersonic.headless.api.pojo.request.DimensionValueReq;
|
import com.tencent.supersonic.headless.api.pojo.request.DimensionValueReq;
|
||||||
import com.tencent.supersonic.headless.api.pojo.request.ExecuteQueryReq;
|
|
||||||
import com.tencent.supersonic.headless.api.pojo.request.QueryDataReq;
|
import com.tencent.supersonic.headless.api.pojo.request.QueryDataReq;
|
||||||
import com.tencent.supersonic.headless.api.pojo.request.QueryMapReq;
|
import com.tencent.supersonic.headless.api.pojo.request.QueryMapReq;
|
||||||
import com.tencent.supersonic.headless.api.pojo.request.QueryNLReq;
|
import com.tencent.supersonic.headless.api.pojo.request.QueryNLReq;
|
||||||
@@ -21,19 +20,16 @@ public interface ChatQueryService {
|
|||||||
|
|
||||||
MapResp performMapping(QueryNLReq queryNLReq);
|
MapResp performMapping(QueryNLReq queryNLReq);
|
||||||
|
|
||||||
MapInfoResp map(QueryMapReq queryMapReq);
|
|
||||||
|
|
||||||
ParseResp performParsing(QueryNLReq queryNLReq);
|
ParseResp performParsing(QueryNLReq queryNLReq);
|
||||||
|
|
||||||
@Deprecated
|
|
||||||
QueryResult performExecution(ExecuteQueryReq queryReq) throws Exception;
|
|
||||||
|
|
||||||
SemanticParseInfo queryContext(Integer chatId);
|
SemanticParseInfo queryContext(Integer chatId);
|
||||||
|
|
||||||
QueryResult executeDirectQuery(QueryDataReq queryData, User user) throws Exception;
|
QueryResult executeDirectQuery(QueryDataReq queryData, User user) throws Exception;
|
||||||
|
|
||||||
Object queryDimensionValue(DimensionValueReq dimensionValueReq, User user) throws Exception;
|
Object queryDimensionValue(DimensionValueReq dimensionValueReq, User user) throws Exception;
|
||||||
|
|
||||||
|
MapInfoResp map(QueryMapReq queryMapReq);
|
||||||
|
|
||||||
void correct(QuerySqlReq querySqlReq, User user);
|
void correct(QuerySqlReq querySqlReq, User user);
|
||||||
|
|
||||||
SqlEvaluation validate(QuerySqlReq querySqlReq, User user);
|
SqlEvaluation validate(QuerySqlReq querySqlReq, User user);
|
||||||
|
|||||||
@@ -7,6 +7,6 @@ import java.util.List;
|
|||||||
|
|
||||||
public interface RetrieveService {
|
public interface RetrieveService {
|
||||||
|
|
||||||
List<SearchResult> retrieve(QueryNLReq queryCtx);
|
List<SearchResult> retrieve(QueryNLReq queryNLReq);
|
||||||
|
|
||||||
}
|
}
|
||||||
@@ -25,9 +25,7 @@ import com.tencent.supersonic.headless.api.pojo.SemanticParseInfo;
|
|||||||
import com.tencent.supersonic.headless.api.pojo.SemanticSchema;
|
import com.tencent.supersonic.headless.api.pojo.SemanticSchema;
|
||||||
import com.tencent.supersonic.headless.api.pojo.SqlEvaluation;
|
import com.tencent.supersonic.headless.api.pojo.SqlEvaluation;
|
||||||
import com.tencent.supersonic.headless.api.pojo.SqlInfo;
|
import com.tencent.supersonic.headless.api.pojo.SqlInfo;
|
||||||
import com.tencent.supersonic.headless.api.pojo.enums.CostType;
|
|
||||||
import com.tencent.supersonic.headless.api.pojo.request.DimensionValueReq;
|
import com.tencent.supersonic.headless.api.pojo.request.DimensionValueReq;
|
||||||
import com.tencent.supersonic.headless.api.pojo.request.ExecuteQueryReq;
|
|
||||||
import com.tencent.supersonic.headless.api.pojo.request.QueryNLReq;
|
import com.tencent.supersonic.headless.api.pojo.request.QueryNLReq;
|
||||||
import com.tencent.supersonic.headless.api.pojo.request.QueryDataReq;
|
import com.tencent.supersonic.headless.api.pojo.request.QueryDataReq;
|
||||||
import com.tencent.supersonic.headless.api.pojo.request.QueryDimValueReq;
|
import com.tencent.supersonic.headless.api.pojo.request.QueryDimValueReq;
|
||||||
@@ -62,7 +60,6 @@ import com.tencent.supersonic.headless.chat.query.llm.s2sql.LLMSqlQuery;
|
|||||||
import com.tencent.supersonic.headless.server.facade.service.ChatQueryService;
|
import com.tencent.supersonic.headless.server.facade.service.ChatQueryService;
|
||||||
import com.tencent.supersonic.headless.server.facade.service.SemanticLayerService;
|
import com.tencent.supersonic.headless.server.facade.service.SemanticLayerService;
|
||||||
import com.tencent.supersonic.headless.server.utils.ChatWorkflowEngine;
|
import com.tencent.supersonic.headless.server.utils.ChatWorkflowEngine;
|
||||||
import com.tencent.supersonic.headless.server.persistence.dataobject.StatisticsDO;
|
|
||||||
import com.tencent.supersonic.headless.server.pojo.MetaFilter;
|
import com.tencent.supersonic.headless.server.pojo.MetaFilter;
|
||||||
import com.tencent.supersonic.headless.server.utils.ComponentFactory;
|
import com.tencent.supersonic.headless.server.utils.ComponentFactory;
|
||||||
import com.tencent.supersonic.headless.server.web.service.ChatContextService;
|
import com.tencent.supersonic.headless.server.web.service.ChatContextService;
|
||||||
@@ -176,36 +173,6 @@ public class ChatQueryServiceImpl implements ChatQueryService {
|
|||||||
return queryCtx;
|
return queryCtx;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
@Deprecated
|
|
||||||
public QueryResult performExecution(ExecuteQueryReq queryReq) throws Exception {
|
|
||||||
List<StatisticsDO> timeCostDOList = new ArrayList<>();
|
|
||||||
SemanticParseInfo parseInfo = queryReq.getParseInfo();
|
|
||||||
SemanticQuery semanticQuery = QueryManager.createQuery(parseInfo.getQueryMode());
|
|
||||||
if (semanticQuery == null) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
semanticQuery.setParseInfo(parseInfo);
|
|
||||||
|
|
||||||
// in order to support multi-turn conversation, chat context is needed
|
|
||||||
ChatContext chatCtx = chatContextService.getOrCreateContext(queryReq.getChatId());
|
|
||||||
long startTime = System.currentTimeMillis();
|
|
||||||
SemanticQueryReq semanticQueryReq = semanticQuery.buildSemanticQueryReq();
|
|
||||||
QueryResult queryResult = doExecution(semanticQueryReq, parseInfo, queryReq.getUser());
|
|
||||||
timeCostDOList.add(StatisticsDO.builder().cost((int) (System.currentTimeMillis() - startTime))
|
|
||||||
.interfaceName(semanticQuery.getClass().getSimpleName()).type(CostType.QUERY.getType()).build());
|
|
||||||
queryResult.setQueryTimeCost(timeCostDOList.get(0).getCost().longValue());
|
|
||||||
queryResult.setChatContext(parseInfo);
|
|
||||||
// update chat context after a successful semantic query
|
|
||||||
if (QueryState.SUCCESS.equals(queryResult.getQueryState()) && queryReq.isSaveAnswer()) {
|
|
||||||
chatCtx.setParseInfo(parseInfo);
|
|
||||||
chatContextService.updateContext(chatCtx);
|
|
||||||
}
|
|
||||||
chatCtx.setQueryText(queryReq.getQueryText());
|
|
||||||
chatCtx.setUser(queryReq.getUser().getName());
|
|
||||||
return queryResult;
|
|
||||||
}
|
|
||||||
|
|
||||||
private QueryResult doExecution(SemanticQueryReq semanticQueryReq,
|
private QueryResult doExecution(SemanticQueryReq semanticQueryReq,
|
||||||
SemanticParseInfo parseInfo, User user) throws Exception {
|
SemanticParseInfo parseInfo, User user) throws Exception {
|
||||||
SemanticQueryResp queryResp = semanticLayerService.queryByReq(semanticQueryReq, user);
|
SemanticQueryResp queryResp = semanticLayerService.queryByReq(semanticQueryReq, user);
|
||||||
|
|||||||
@@ -76,8 +76,9 @@ public class S2SemanticLayerService implements SemanticLayerService {
|
|||||||
private final DataSetService dataSetService;
|
private final DataSetService dataSetService;
|
||||||
private final SchemaService schemaService;
|
private final SchemaService schemaService;
|
||||||
private final SemanticTranslator semanticTranslator;
|
private final SemanticTranslator semanticTranslator;
|
||||||
|
|
||||||
private final MetricDrillDownChecker metricDrillDownChecker;
|
private final MetricDrillDownChecker metricDrillDownChecker;
|
||||||
|
private QueryCache queryCache = ComponentFactory.getQueryCache();
|
||||||
|
private List<QueryExecutor> queryExecutors = ComponentFactory.getQueryExecutors();
|
||||||
|
|
||||||
public S2SemanticLayerService(
|
public S2SemanticLayerService(
|
||||||
StatUtils statUtils,
|
StatUtils statUtils,
|
||||||
@@ -102,6 +103,18 @@ public class S2SemanticLayerService implements SemanticLayerService {
|
|||||||
return schemaService.getDataSetSchema(id);
|
return schemaService.getDataSetSchema(id);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@S2DataPermission
|
||||||
|
@Override
|
||||||
|
public SemanticTranslateResp translate(SemanticQueryReq queryReq, User user) throws Exception {
|
||||||
|
QueryStatement queryStatement = buildQueryStatement(queryReq, user);
|
||||||
|
semanticTranslator.translate(queryStatement);
|
||||||
|
return SemanticTranslateResp.builder()
|
||||||
|
.querySQL(queryStatement.getSql())
|
||||||
|
.isOk(queryStatement.isOk())
|
||||||
|
.errMsg(queryStatement.getErrMsg())
|
||||||
|
.build();
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@S2DataPermission
|
@S2DataPermission
|
||||||
@SneakyThrows
|
@SneakyThrows
|
||||||
@@ -111,8 +124,9 @@ public class S2SemanticLayerService implements SemanticLayerService {
|
|||||||
try {
|
try {
|
||||||
//1.initStatInfo
|
//1.initStatInfo
|
||||||
statUtils.initStatInfo(queryReq, user);
|
statUtils.initStatInfo(queryReq, user);
|
||||||
|
|
||||||
//2.query from cache
|
//2.query from cache
|
||||||
QueryCache queryCache = ComponentFactory.getQueryCache();
|
|
||||||
String cacheKey = queryCache.getCacheKey(queryReq);
|
String cacheKey = queryCache.getCacheKey(queryReq);
|
||||||
log.debug("cacheKey:{}", cacheKey);
|
log.debug("cacheKey:{}", cacheKey);
|
||||||
Object query = queryCache.query(queryReq, cacheKey);
|
Object query = queryCache.query(queryReq, cacheKey);
|
||||||
@@ -122,19 +136,35 @@ public class S2SemanticLayerService implements SemanticLayerService {
|
|||||||
return queryResp;
|
return queryResp;
|
||||||
}
|
}
|
||||||
StatUtils.get().setUseResultCache(false);
|
StatUtils.get().setUseResultCache(false);
|
||||||
|
|
||||||
//3 query
|
//3 query
|
||||||
QueryStatement queryStatement = buildQueryStatement(queryReq, user);
|
QueryStatement queryStatement = buildQueryStatement(queryReq, user);
|
||||||
SemanticQueryResp result = doQuery(queryStatement);
|
SemanticQueryResp queryResp = null;
|
||||||
|
|
||||||
|
// skip translation if already done.
|
||||||
|
if (!queryStatement.isTranslated()) {
|
||||||
|
semanticTranslator.translate(queryStatement);
|
||||||
|
}
|
||||||
|
queryPreCheck(queryStatement);
|
||||||
|
|
||||||
|
for (QueryExecutor queryExecutor : queryExecutors) {
|
||||||
|
if (queryExecutor.accept(queryStatement)) {
|
||||||
|
queryResp = queryExecutor.execute(queryStatement);
|
||||||
|
queryUtils.fillItemNameInfo(queryResp, queryStatement.getSemanticSchemaResp());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
//4 reset cache and set stateInfo
|
//4 reset cache and set stateInfo
|
||||||
Boolean setCacheSuccess = queryCache.put(cacheKey, result);
|
Boolean setCacheSuccess = queryCache.put(cacheKey, queryResp);
|
||||||
if (setCacheSuccess) {
|
if (setCacheSuccess) {
|
||||||
// if result is not null, update cache data
|
// if result is not null, update cache data
|
||||||
statUtils.updateResultCacheKey(cacheKey);
|
statUtils.updateResultCacheKey(cacheKey);
|
||||||
}
|
}
|
||||||
if (Objects.isNull(result)) {
|
if (Objects.isNull(queryResp)) {
|
||||||
state = TaskStatusEnum.ERROR;
|
state = TaskStatusEnum.ERROR;
|
||||||
}
|
}
|
||||||
return result;
|
|
||||||
|
return queryResp;
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
log.error("exception in queryByStruct, e: ", e);
|
log.error("exception in queryByStruct, e: ", e);
|
||||||
state = TaskStatusEnum.ERROR;
|
state = TaskStatusEnum.ERROR;
|
||||||
@@ -144,6 +174,49 @@ public class S2SemanticLayerService implements SemanticLayerService {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
@SneakyThrows
|
||||||
|
public SemanticQueryResp queryDimValue(QueryDimValueReq queryDimValueReq, User user) {
|
||||||
|
QuerySqlReq querySqlReq = buildQuerySqlReq(queryDimValueReq);
|
||||||
|
return queryByReq(querySqlReq, user);
|
||||||
|
}
|
||||||
|
|
||||||
|
public EntityInfo getEntityInfo(SemanticParseInfo parseInfo, DataSetSchema dataSetSchema, User user) {
|
||||||
|
if (parseInfo != null && parseInfo.getDataSetId() != null && parseInfo.getDataSetId() > 0) {
|
||||||
|
EntityInfo entityInfo = getEntityBasicInfo(dataSetSchema);
|
||||||
|
if (parseInfo.getDimensionFilters().size() <= 0 || entityInfo.getDataSetInfo() == null) {
|
||||||
|
entityInfo.setMetrics(null);
|
||||||
|
entityInfo.setDimensions(null);
|
||||||
|
return entityInfo;
|
||||||
|
}
|
||||||
|
String primaryKey = entityInfo.getDataSetInfo().getPrimaryKey();
|
||||||
|
if (StringUtils.isNotBlank(primaryKey)) {
|
||||||
|
String entityId = "";
|
||||||
|
for (QueryFilter chatFilter : parseInfo.getDimensionFilters()) {
|
||||||
|
if (chatFilter != null && chatFilter.getBizName() != null && chatFilter.getBizName()
|
||||||
|
.equals(primaryKey)) {
|
||||||
|
if (chatFilter.getOperator().equals(FilterOperatorEnum.EQUALS)) {
|
||||||
|
entityId = chatFilter.getValue().toString();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
entityInfo.setEntityId(entityId);
|
||||||
|
try {
|
||||||
|
fillEntityInfoValue(entityInfo, dataSetSchema, user);
|
||||||
|
return entityInfo;
|
||||||
|
} catch (Exception e) {
|
||||||
|
log.error("setMainModel error", e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public List<ItemResp> getDomainDataSetTree() {
|
||||||
|
return schemaService.getDomainDataSetTree();
|
||||||
|
}
|
||||||
|
|
||||||
private QueryStatement buildSqlQueryStatement(QuerySqlReq querySqlReq, User user) throws Exception {
|
private QueryStatement buildSqlQueryStatement(QuerySqlReq querySqlReq, User user) throws Exception {
|
||||||
//If dataSetId or DataSetName is empty, parse dataSetId from the SQL
|
//If dataSetId or DataSetName is empty, parse dataSetId from the SQL
|
||||||
if (querySqlReq.needGetDataSetId()) {
|
if (querySqlReq.needGetDataSetId()) {
|
||||||
@@ -171,8 +244,8 @@ public class S2SemanticLayerService implements SemanticLayerService {
|
|||||||
if (semanticQueryReq instanceof QueryMultiStructReq) {
|
if (semanticQueryReq instanceof QueryMultiStructReq) {
|
||||||
queryStatement = buildMultiStructQueryStatement((QueryMultiStructReq) semanticQueryReq, user);
|
queryStatement = buildMultiStructQueryStatement((QueryMultiStructReq) semanticQueryReq, user);
|
||||||
}
|
}
|
||||||
if (Objects.nonNull(queryStatement) && Objects.nonNull(semanticQueryReq.getSqlInfo()) && StringUtils.isNotBlank(
|
if (Objects.nonNull(queryStatement) && Objects.nonNull(semanticQueryReq.getSqlInfo())
|
||||||
semanticQueryReq.getSqlInfo().getQuerySQL())) {
|
&& StringUtils.isNotBlank(semanticQueryReq.getSqlInfo().getQuerySQL())) {
|
||||||
queryStatement.setSql(semanticQueryReq.getSqlInfo().getQuerySQL());
|
queryStatement.setSql(semanticQueryReq.getSqlInfo().getQuerySQL());
|
||||||
queryStatement.setDataSetId(semanticQueryReq.getDataSetId());
|
queryStatement.setDataSetId(semanticQueryReq.getDataSetId());
|
||||||
queryStatement.setIsTranslated(true);
|
queryStatement.setIsTranslated(true);
|
||||||
@@ -218,29 +291,6 @@ public class S2SemanticLayerService implements SemanticLayerService {
|
|||||||
return schemaFilterReq;
|
return schemaFilterReq;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
@SneakyThrows
|
|
||||||
public SemanticQueryResp queryDimValue(QueryDimValueReq queryDimValueReq, User user) {
|
|
||||||
QuerySqlReq querySqlReq = buildQuerySqlReq(queryDimValueReq);
|
|
||||||
return queryByReq(querySqlReq, user);
|
|
||||||
}
|
|
||||||
|
|
||||||
@S2DataPermission
|
|
||||||
@Override
|
|
||||||
public SemanticTranslateResp translate(SemanticQueryReq queryReq, User user) throws Exception {
|
|
||||||
QueryStatement queryStatement = buildQueryStatement(queryReq, user);
|
|
||||||
semanticTranslator.translate(queryStatement);
|
|
||||||
return SemanticTranslateResp.builder()
|
|
||||||
.querySQL(queryStatement.getSql())
|
|
||||||
.isOk(queryStatement.isOk())
|
|
||||||
.errMsg(queryStatement.getErrMsg())
|
|
||||||
.build();
|
|
||||||
}
|
|
||||||
|
|
||||||
public List<ItemResp> getDomainDataSetTree() {
|
|
||||||
return schemaService.getDomainDataSetTree();
|
|
||||||
}
|
|
||||||
|
|
||||||
private QuerySqlReq buildQuerySqlReq(QueryDimValueReq queryDimValueReq) {
|
private QuerySqlReq buildQuerySqlReq(QueryDimValueReq queryDimValueReq) {
|
||||||
QuerySqlReq querySqlReq = new QuerySqlReq();
|
QuerySqlReq querySqlReq = new QuerySqlReq();
|
||||||
List<ModelResp> modelResps = schemaService.getModelList(Lists.newArrayList(queryDimValueReq.getModelId()));
|
List<ModelResp> modelResps = schemaService.getModelList(Lists.newArrayList(queryDimValueReq.getModelId()));
|
||||||
@@ -263,68 +313,12 @@ public class S2SemanticLayerService implements SemanticLayerService {
|
|||||||
return querySqlReq;
|
return querySqlReq;
|
||||||
}
|
}
|
||||||
|
|
||||||
private SemanticQueryResp doQuery(QueryStatement queryStatement) {
|
|
||||||
SemanticQueryResp semanticQueryResp = null;
|
|
||||||
try {
|
|
||||||
//1 translate
|
|
||||||
if (!queryStatement.isTranslated()) {
|
|
||||||
semanticTranslator.translate(queryStatement);
|
|
||||||
}
|
|
||||||
//2. query pre-check
|
|
||||||
queryPreCheck(queryStatement);
|
|
||||||
|
|
||||||
//3 execute
|
|
||||||
for (QueryExecutor queryExecutor : ComponentFactory.getQueryExecutors()) {
|
|
||||||
if (queryExecutor.accept(queryStatement)) {
|
|
||||||
semanticQueryResp = queryExecutor.execute(queryStatement);
|
|
||||||
queryUtils.fillItemNameInfo(semanticQueryResp, queryStatement.getSemanticSchemaResp());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return semanticQueryResp;
|
|
||||||
} catch (Exception e) {
|
|
||||||
log.error("exception in query, e: ", e);
|
|
||||||
throw e;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private void queryPreCheck(QueryStatement queryStatement) {
|
private void queryPreCheck(QueryStatement queryStatement) {
|
||||||
//Check whether the dimensions of the metric drill-down are correct temporarily,
|
//Check whether the dimensions of the metric drill-down are correct temporarily,
|
||||||
//add the abstraction of a validator later.
|
//add the abstraction of a validator later.
|
||||||
metricDrillDownChecker.checkQuery(queryStatement);
|
metricDrillDownChecker.checkQuery(queryStatement);
|
||||||
}
|
}
|
||||||
|
|
||||||
public EntityInfo getEntityInfo(SemanticParseInfo parseInfo, DataSetSchema dataSetSchema, User user) {
|
|
||||||
if (parseInfo != null && parseInfo.getDataSetId() != null && parseInfo.getDataSetId() > 0) {
|
|
||||||
EntityInfo entityInfo = getEntityBasicInfo(dataSetSchema);
|
|
||||||
if (parseInfo.getDimensionFilters().size() <= 0 || entityInfo.getDataSetInfo() == null) {
|
|
||||||
entityInfo.setMetrics(null);
|
|
||||||
entityInfo.setDimensions(null);
|
|
||||||
return entityInfo;
|
|
||||||
}
|
|
||||||
String primaryKey = entityInfo.getDataSetInfo().getPrimaryKey();
|
|
||||||
if (StringUtils.isNotBlank(primaryKey)) {
|
|
||||||
String entityId = "";
|
|
||||||
for (QueryFilter chatFilter : parseInfo.getDimensionFilters()) {
|
|
||||||
if (chatFilter != null && chatFilter.getBizName() != null && chatFilter.getBizName()
|
|
||||||
.equals(primaryKey)) {
|
|
||||||
if (chatFilter.getOperator().equals(FilterOperatorEnum.EQUALS)) {
|
|
||||||
entityId = chatFilter.getValue().toString();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
entityInfo.setEntityId(entityId);
|
|
||||||
try {
|
|
||||||
fillEntityInfoValue(entityInfo, dataSetSchema, user);
|
|
||||||
return entityInfo;
|
|
||||||
} catch (Exception e) {
|
|
||||||
log.error("setMainModel error", e);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
private EntityInfo getEntityBasicInfo(DataSetSchema dataSetSchema) {
|
private EntityInfo getEntityBasicInfo(DataSetSchema dataSetSchema) {
|
||||||
|
|
||||||
EntityInfo entityInfo = new EntityInfo();
|
EntityInfo entityInfo = new EntityInfo();
|
||||||
|
|||||||
Reference in New Issue
Block a user