From ec1e63e2f23eb587436083fc4e59e34122d4d0e4 Mon Sep 17 00:00:00 2001 From: jipengli Date: Mon, 9 Oct 2023 12:00:25 +0800 Subject: [PATCH] (improvement)(semantic) fixed queryBySql execute error on mysql <=5.7 --- .../semantic/api/query/request/ParseSqlReq.java | 1 + .../supersonic/semantic/query/parser/QueryParser.java | 3 ++- .../query/parser/convert/CalculateAggConverter.java | 8 ++------ .../query/parser/convert/QueryReqConverter.java | 7 +++++++ .../semantic/query/utils/QueryStructUtils.java | 11 +++++++++++ 5 files changed, 23 insertions(+), 7 deletions(-) diff --git a/semantic/api/src/main/java/com/tencent/supersonic/semantic/api/query/request/ParseSqlReq.java b/semantic/api/src/main/java/com/tencent/supersonic/semantic/api/query/request/ParseSqlReq.java index 6c1281d59..50216b67e 100644 --- a/semantic/api/src/main/java/com/tencent/supersonic/semantic/api/query/request/ParseSqlReq.java +++ b/semantic/api/src/main/java/com/tencent/supersonic/semantic/api/query/request/ParseSqlReq.java @@ -14,6 +14,7 @@ public class ParseSqlReq { private String sql = ""; private List tables; private boolean supportWith = true; + private boolean withAlias = true; public Map getVariables() { if (variables == null) { diff --git a/semantic/query/src/main/java/com/tencent/supersonic/semantic/query/parser/QueryParser.java b/semantic/query/src/main/java/com/tencent/supersonic/semantic/query/parser/QueryParser.java index 7fb6f4107..3124b1416 100644 --- a/semantic/query/src/main/java/com/tencent/supersonic/semantic/query/parser/QueryParser.java +++ b/semantic/query/src/main/java/com/tencent/supersonic/semantic/query/parser/QueryParser.java @@ -79,7 +79,8 @@ public class QueryParser { } else { sql = sqlCommend.getSql(); for (String[] tb : tables) { - sql = StringUtils.replace(sql, tb[0], "(" + tb[1] + ")", -1); + sql = StringUtils.replace(sql, tb[0], + "(" + tb[1] + ") " + (sqlCommend.isWithAlias() ? "" : tb[0]), -1); } } queryStatement.setSql(sql); diff --git a/semantic/query/src/main/java/com/tencent/supersonic/semantic/query/parser/convert/CalculateAggConverter.java b/semantic/query/src/main/java/com/tencent/supersonic/semantic/query/parser/convert/CalculateAggConverter.java index 02e47b149..b092e0511 100644 --- a/semantic/query/src/main/java/com/tencent/supersonic/semantic/query/parser/convert/CalculateAggConverter.java +++ b/semantic/query/src/main/java/com/tencent/supersonic/semantic/query/parser/convert/CalculateAggConverter.java @@ -42,8 +42,6 @@ public class CalculateAggConverter implements SemanticConverter { @Value("${metricParser.agg.default:sum}") private String metricAggDefault; - @Value("${metricParser.agg.mysql.lowVersion:5.7}") - private String mysqlLowVersion; public CalculateAggConverter( @@ -83,8 +81,7 @@ public class CalculateAggConverter implements SemanticConverter { metricTableName, sqlGenerateUtils.getGroupBy(queryStructCmd), sqlGenerateUtils.getOrderBy(queryStructCmd), sqlGenerateUtils.getLimit(queryStructCmd)); - if (engineTypeEnum.equals(engineTypeEnum.MYSQL) && Objects.nonNull(version) && version.startsWith( - mysqlLowVersion)) { + if (!queryStructUtils.isSupportWith(engineTypeEnum, version)) { sqlCommand.setSupportWith(false); sql = String.format("select %s from %s t0 %s %s %s", sqlGenerateUtils.getSelect(queryStructCmd), metricTableName, @@ -173,8 +170,7 @@ public class CalculateAggConverter implements SemanticConverter { case MYSQL: case DORIS: case CLICKHOUSE: - if (engineTypeEnum.equals(EngineTypeEnum.MYSQL) && Objects.nonNull(version) && version.startsWith( - mysqlLowVersion)) { + if (!queryStructUtils.isSupportWith(engineTypeEnum, version)) { sqlCommand.setSupportWith(false); sql = new MysqlEngineSql().sql(queryStructCmd, isOver, metricTableName); } else { diff --git a/semantic/query/src/main/java/com/tencent/supersonic/semantic/query/parser/convert/QueryReqConverter.java b/semantic/query/src/main/java/com/tencent/supersonic/semantic/query/parser/convert/QueryReqConverter.java index fdcd5b982..8952df501 100644 --- a/semantic/query/src/main/java/com/tencent/supersonic/semantic/query/parser/convert/QueryReqConverter.java +++ b/semantic/query/src/main/java/com/tencent/supersonic/semantic/query/parser/convert/QueryReqConverter.java @@ -15,6 +15,7 @@ import com.tencent.supersonic.semantic.model.domain.Catalog; import com.tencent.supersonic.semantic.model.domain.ModelService; import com.tencent.supersonic.semantic.model.domain.adaptor.engineadapter.EngineAdaptor; import com.tencent.supersonic.semantic.model.domain.adaptor.engineadapter.EngineAdaptorFactory; +import com.tencent.supersonic.semantic.model.domain.pojo.EngineTypeEnum; import com.tencent.supersonic.semantic.query.persistence.pojo.QueryStatement; import com.tencent.supersonic.semantic.query.service.SemanticQueryEngine; import com.tencent.supersonic.semantic.query.utils.QueryStructUtils; @@ -90,6 +91,12 @@ public class QueryReqConverter { BeanUtils.copyProperties(databaseReq, result); result.setRootPath(domainService.getModelFullPathMap().get(databaseReq.getModelId())); result.setTables(tables); + DatabaseResp database = catalog.getDatabaseByModelId(databaseReq.getModelId()); + if (!queryStructUtils.isSupportWith(EngineTypeEnum.valueOf(database.getType().toUpperCase()), + database.getVersion())) { + result.setSupportWith(false); + result.setWithAlias(false); + } QueryStatement queryStatement = parserService.physicalSql(result); queryStatement.setSql(String.format(SqlExecuteReq.LIMIT_WRAPPER, queryStatement.getSql())); diff --git a/semantic/query/src/main/java/com/tencent/supersonic/semantic/query/utils/QueryStructUtils.java b/semantic/query/src/main/java/com/tencent/supersonic/semantic/query/utils/QueryStructUtils.java index 94c6c06a4..e7a5141a0 100644 --- a/semantic/query/src/main/java/com/tencent/supersonic/semantic/query/utils/QueryStructUtils.java +++ b/semantic/query/src/main/java/com/tencent/supersonic/semantic/query/utils/QueryStructUtils.java @@ -21,6 +21,7 @@ import com.tencent.supersonic.semantic.api.query.request.QueryDslReq; import com.tencent.supersonic.semantic.api.query.request.QueryStructReq; import com.tencent.supersonic.semantic.model.domain.Catalog; +import com.tencent.supersonic.semantic.model.domain.pojo.EngineTypeEnum; import java.util.ArrayList; import java.util.Arrays; import java.util.HashSet; @@ -50,6 +51,8 @@ public class QueryStructUtils { private final Catalog catalog; @Value("${internal.metric.cnt.suffix:internal_cnt}") private String internalMetricNameSuffix; + @Value("${metricParser.agg.mysql.lowVersion:5.7}") + private String mysqlLowVersion; @Autowired private SchemaService schemaService; @@ -226,5 +229,13 @@ public class QueryStructUtils { return internalMetricName; } + public boolean isSupportWith(EngineTypeEnum engineTypeEnum, String version) { + if (engineTypeEnum.equals(EngineTypeEnum.MYSQL) && Objects.nonNull(version) && version.startsWith( + mysqlLowVersion)) { + return false; + } + return true; + } + }