(improvement)(semantic) fixed queryBySql execute error on mysql <=5.7

This commit is contained in:
jipengli
2023-10-09 12:00:25 +08:00
parent 8487966888
commit ec1e63e2f2
5 changed files with 23 additions and 7 deletions

View File

@@ -14,6 +14,7 @@ public class ParseSqlReq {
private String sql = "";
private List<MetricTable> tables;
private boolean supportWith = true;
private boolean withAlias = true;
public Map<String, String> getVariables() {
if (variables == null) {

View File

@@ -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);

View File

@@ -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 {

View File

@@ -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()));

View File

@@ -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;
}
}