[fix][headless] fix struct parse error (#633)

This commit is contained in:
jipeli
2024-01-16 23:04:00 +08:00
committed by GitHub
parent af103f3aa3
commit 7707179faa
2 changed files with 23 additions and 16 deletions

View File

@@ -23,6 +23,12 @@ import com.tencent.supersonic.headless.core.pojo.QueryStatement;
import com.tencent.supersonic.headless.server.service.DownloadService; import com.tencent.supersonic.headless.server.service.DownloadService;
import com.tencent.supersonic.headless.server.service.HeadlessQueryEngine; import com.tencent.supersonic.headless.server.service.HeadlessQueryEngine;
import com.tencent.supersonic.headless.server.service.QueryService; import com.tencent.supersonic.headless.server.service.QueryService;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.validation.Valid;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeanUtils; import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
@@ -31,11 +37,6 @@ import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController; import org.springframework.web.bind.annotation.RestController;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.validation.Valid;
import java.util.List;
@RestController @RestController
@RequestMapping("/api/semantic/query") @RequestMapping("/api/semantic/query")
@Slf4j @Slf4j
@@ -69,22 +70,22 @@ public class QueryController {
@PostMapping("/queryMetricDataById") @PostMapping("/queryMetricDataById")
public ItemQueryResultResp queryMetricDataById(@Valid @RequestBody QueryItemReq queryApiReq, public ItemQueryResultResp queryMetricDataById(@Valid @RequestBody QueryItemReq queryApiReq,
HttpServletRequest request) throws Exception { HttpServletRequest request) throws Exception {
return queryService.queryMetricDataById(queryApiReq, request); return queryService.queryMetricDataById(queryApiReq, request);
} }
@PostMapping("/download/struct") @PostMapping("/download/struct")
public void downloadByStruct(@RequestBody DownloadStructReq downloadStructReq, public void downloadByStruct(@RequestBody DownloadStructReq downloadStructReq,
HttpServletRequest request, HttpServletRequest request,
HttpServletResponse response) throws Exception { HttpServletResponse response) throws Exception {
User user = UserHolder.findUser(request, response); User user = UserHolder.findUser(request, response);
downloadService.downloadByStruct(downloadStructReq, user, response); downloadService.downloadByStruct(downloadStructReq, user, response);
} }
@PostMapping("/download/batch") @PostMapping("/download/batch")
public void downloadBatch(@RequestBody BatchDownloadReq batchDownloadReq, public void downloadBatch(@RequestBody BatchDownloadReq batchDownloadReq,
HttpServletRequest request, HttpServletRequest request,
HttpServletResponse response) throws Exception { HttpServletResponse response) throws Exception {
User user = UserHolder.findUser(request, response); User user = UserHolder.findUser(request, response);
downloadService.batchDownload(batchDownloadReq, user, response); downloadService.batchDownload(batchDownloadReq, user, response);
} }
@@ -97,6 +98,9 @@ public class QueryController {
@PostMapping("/struct/parse") @PostMapping("/struct/parse")
public SqlParserResp parseByStruct(@RequestBody ParseSqlReq parseSqlReq) throws Exception { public SqlParserResp parseByStruct(@RequestBody ParseSqlReq parseSqlReq) throws Exception {
QueryStructReq queryStructCmd = new QueryStructReq(); QueryStructReq queryStructCmd = new QueryStructReq();
Set<Long> models = new HashSet<>();
models.add(Long.valueOf(parseSqlReq.getRootPath()));
queryStructCmd.setModelIds(models);
QueryStatement queryStatement = headlessQueryEngine.physicalSql(queryStructCmd, parseSqlReq); QueryStatement queryStatement = headlessQueryEngine.physicalSql(queryStructCmd, parseSqlReq);
SqlParserResp sqlParserResp = new SqlParserResp(); SqlParserResp sqlParserResp = new SqlParserResp();
BeanUtils.copyProperties(queryStatement, sqlParserResp); BeanUtils.copyProperties(queryStatement, sqlParserResp);

View File

@@ -6,21 +6,21 @@ import com.tencent.supersonic.headless.api.request.ParseSqlReq;
import com.tencent.supersonic.headless.api.request.QueryStructReq; import com.tencent.supersonic.headless.api.request.QueryStructReq;
import com.tencent.supersonic.headless.api.response.ModelSchemaResp; import com.tencent.supersonic.headless.api.response.ModelSchemaResp;
import com.tencent.supersonic.headless.api.response.QueryResultWithSchemaResp; import com.tencent.supersonic.headless.api.response.QueryResultWithSchemaResp;
import com.tencent.supersonic.headless.core.executor.QueryExecutor;
import com.tencent.supersonic.headless.core.optimizer.QueryOptimizer; import com.tencent.supersonic.headless.core.optimizer.QueryOptimizer;
import com.tencent.supersonic.headless.core.parser.QueryParser; import com.tencent.supersonic.headless.core.parser.QueryParser;
import com.tencent.supersonic.headless.core.parser.calcite.s2sql.HeadlessModel; import com.tencent.supersonic.headless.core.parser.calcite.s2sql.HeadlessModel;
import com.tencent.supersonic.headless.core.pojo.QueryStatement; import com.tencent.supersonic.headless.core.pojo.QueryStatement;
import com.tencent.supersonic.headless.core.utils.ComponentFactory; import com.tencent.supersonic.headless.core.utils.ComponentFactory;
import com.tencent.supersonic.headless.core.executor.QueryExecutor;
import com.tencent.supersonic.headless.server.manager.HeadlessSchemaManager; import com.tencent.supersonic.headless.server.manager.HeadlessSchemaManager;
import com.tencent.supersonic.headless.server.service.Catalog; import com.tencent.supersonic.headless.server.service.Catalog;
import com.tencent.supersonic.headless.server.service.HeadlessQueryEngine; import com.tencent.supersonic.headless.server.service.HeadlessQueryEngine;
import com.tencent.supersonic.headless.server.utils.QueryStructUtils; import com.tencent.supersonic.headless.server.utils.QueryStructUtils;
import com.tencent.supersonic.headless.server.utils.QueryUtils; import com.tencent.supersonic.headless.server.utils.QueryUtils;
import java.util.List;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
import org.springframework.util.CollectionUtils; import org.springframework.util.CollectionUtils;
import java.util.List;
@Slf4j @Slf4j
@Component @Component
@@ -33,8 +33,8 @@ public class HeadlessQueryEngineImpl implements HeadlessQueryEngine {
private final HeadlessSchemaManager headlessSchemaManager; private final HeadlessSchemaManager headlessSchemaManager;
public HeadlessQueryEngineImpl(QueryParser queryParser, Catalog catalog, public HeadlessQueryEngineImpl(QueryParser queryParser, Catalog catalog,
QueryUtils queryUtils, HeadlessSchemaManager headlessSchemaManager, QueryUtils queryUtils, HeadlessSchemaManager headlessSchemaManager,
QueryStructUtils queryStructUtils) { QueryStructUtils queryStructUtils) {
this.queryParser = queryParser; this.queryParser = queryParser;
this.catalog = catalog; this.catalog = catalog;
this.queryUtils = queryUtils; this.queryUtils = queryUtils;
@@ -82,19 +82,22 @@ public class HeadlessQueryEngineImpl implements HeadlessQueryEngine {
} }
@Override @Override
public QueryStatement physicalSql(QueryStructReq queryStructCmd, ParseSqlReq sqlCommend) { public QueryStatement physicalSql(QueryStructReq queryStructCmd, ParseSqlReq sqlCommend) throws Exception {
QueryStatement queryStatement = new QueryStatement(); QueryStatement queryStatement = new QueryStatement();
queryStatement.setSql(sqlCommend.getSql());
queryStatement.setQueryStructReq(queryStructCmd); queryStatement.setQueryStructReq(queryStructCmd);
queryStatement.setParseSqlReq(sqlCommend); queryStatement.setParseSqlReq(sqlCommend);
queryStatement.setIsS2SQL(true); queryStatement.setIsS2SQL(true);
queryStatement.setHeadlessModel(getHeadLessModel(queryStatement));
return optimize(queryStructCmd, queryParser.parser(sqlCommend, queryStatement)); return optimize(queryStructCmd, queryParser.parser(sqlCommend, queryStatement));
} }
public QueryStatement physicalSql(QueryStructReq queryStructCmd, MetricQueryReq metricCommand) { public QueryStatement physicalSql(QueryStructReq queryStructCmd, MetricQueryReq metricCommand) throws Exception {
QueryStatement queryStatement = new QueryStatement(); QueryStatement queryStatement = new QueryStatement();
queryStatement.setQueryStructReq(queryStructCmd); queryStatement.setQueryStructReq(queryStructCmd);
queryStatement.setMetricReq(metricCommand); queryStatement.setMetricReq(metricCommand);
queryStatement.setIsS2SQL(false); queryStatement.setIsS2SQL(false);
queryStatement.setHeadlessModel(getHeadLessModel(queryStatement));
return queryParser.parser(queryStatement); return queryParser.parser(queryStatement);
} }