mirror of
https://github.com/tencentmusic/supersonic.git
synced 2025-12-11 12:07:42 +00:00
Merge pull request #179 from jipeli/master
(improvement)(semantic) fixed queryBySql execute error on mysql <=5.7
This commit is contained in:
@@ -14,6 +14,7 @@ public class ParseSqlReq {
|
|||||||
private String sql = "";
|
private String sql = "";
|
||||||
private List<MetricTable> tables;
|
private List<MetricTable> tables;
|
||||||
private boolean supportWith = true;
|
private boolean supportWith = true;
|
||||||
|
private boolean withAlias = true;
|
||||||
|
|
||||||
public Map<String, String> getVariables() {
|
public Map<String, String> getVariables() {
|
||||||
if (variables == null) {
|
if (variables == null) {
|
||||||
|
|||||||
@@ -79,7 +79,8 @@ public class QueryParser {
|
|||||||
} else {
|
} else {
|
||||||
sql = sqlCommend.getSql();
|
sql = sqlCommend.getSql();
|
||||||
for (String[] tb : tables) {
|
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);
|
queryStatement.setSql(sql);
|
||||||
|
|||||||
@@ -42,8 +42,6 @@ public class CalculateAggConverter implements SemanticConverter {
|
|||||||
@Value("${metricParser.agg.default:sum}")
|
@Value("${metricParser.agg.default:sum}")
|
||||||
private String metricAggDefault;
|
private String metricAggDefault;
|
||||||
|
|
||||||
@Value("${metricParser.agg.mysql.lowVersion:5.7}")
|
|
||||||
private String mysqlLowVersion;
|
|
||||||
|
|
||||||
|
|
||||||
public CalculateAggConverter(
|
public CalculateAggConverter(
|
||||||
@@ -83,8 +81,7 @@ public class CalculateAggConverter implements SemanticConverter {
|
|||||||
metricTableName,
|
metricTableName,
|
||||||
sqlGenerateUtils.getGroupBy(queryStructCmd), sqlGenerateUtils.getOrderBy(queryStructCmd),
|
sqlGenerateUtils.getGroupBy(queryStructCmd), sqlGenerateUtils.getOrderBy(queryStructCmd),
|
||||||
sqlGenerateUtils.getLimit(queryStructCmd));
|
sqlGenerateUtils.getLimit(queryStructCmd));
|
||||||
if (engineTypeEnum.equals(engineTypeEnum.MYSQL) && Objects.nonNull(version) && version.startsWith(
|
if (!queryStructUtils.isSupportWith(engineTypeEnum, version)) {
|
||||||
mysqlLowVersion)) {
|
|
||||||
sqlCommand.setSupportWith(false);
|
sqlCommand.setSupportWith(false);
|
||||||
sql = String.format("select %s from %s t0 %s %s %s", sqlGenerateUtils.getSelect(queryStructCmd),
|
sql = String.format("select %s from %s t0 %s %s %s", sqlGenerateUtils.getSelect(queryStructCmd),
|
||||||
metricTableName,
|
metricTableName,
|
||||||
@@ -173,8 +170,7 @@ public class CalculateAggConverter implements SemanticConverter {
|
|||||||
case MYSQL:
|
case MYSQL:
|
||||||
case DORIS:
|
case DORIS:
|
||||||
case CLICKHOUSE:
|
case CLICKHOUSE:
|
||||||
if (engineTypeEnum.equals(EngineTypeEnum.MYSQL) && Objects.nonNull(version) && version.startsWith(
|
if (!queryStructUtils.isSupportWith(engineTypeEnum, version)) {
|
||||||
mysqlLowVersion)) {
|
|
||||||
sqlCommand.setSupportWith(false);
|
sqlCommand.setSupportWith(false);
|
||||||
sql = new MysqlEngineSql().sql(queryStructCmd, isOver, metricTableName);
|
sql = new MysqlEngineSql().sql(queryStructCmd, isOver, metricTableName);
|
||||||
} else {
|
} else {
|
||||||
|
|||||||
@@ -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.ModelService;
|
||||||
import com.tencent.supersonic.semantic.model.domain.adaptor.engineadapter.EngineAdaptor;
|
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.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.persistence.pojo.QueryStatement;
|
||||||
import com.tencent.supersonic.semantic.query.service.SemanticQueryEngine;
|
import com.tencent.supersonic.semantic.query.service.SemanticQueryEngine;
|
||||||
import com.tencent.supersonic.semantic.query.utils.QueryStructUtils;
|
import com.tencent.supersonic.semantic.query.utils.QueryStructUtils;
|
||||||
@@ -90,6 +91,12 @@ public class QueryReqConverter {
|
|||||||
BeanUtils.copyProperties(databaseReq, result);
|
BeanUtils.copyProperties(databaseReq, result);
|
||||||
result.setRootPath(domainService.getModelFullPathMap().get(databaseReq.getModelId()));
|
result.setRootPath(domainService.getModelFullPathMap().get(databaseReq.getModelId()));
|
||||||
result.setTables(tables);
|
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 queryStatement = parserService.physicalSql(result);
|
||||||
queryStatement.setSql(String.format(SqlExecuteReq.LIMIT_WRAPPER, queryStatement.getSql()));
|
queryStatement.setSql(String.format(SqlExecuteReq.LIMIT_WRAPPER, queryStatement.getSql()));
|
||||||
|
|||||||
@@ -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.api.query.request.QueryStructReq;
|
||||||
import com.tencent.supersonic.semantic.model.domain.Catalog;
|
import com.tencent.supersonic.semantic.model.domain.Catalog;
|
||||||
|
|
||||||
|
import com.tencent.supersonic.semantic.model.domain.pojo.EngineTypeEnum;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
import java.util.HashSet;
|
import java.util.HashSet;
|
||||||
@@ -50,6 +51,8 @@ public class QueryStructUtils {
|
|||||||
private final Catalog catalog;
|
private final Catalog catalog;
|
||||||
@Value("${internal.metric.cnt.suffix:internal_cnt}")
|
@Value("${internal.metric.cnt.suffix:internal_cnt}")
|
||||||
private String internalMetricNameSuffix;
|
private String internalMetricNameSuffix;
|
||||||
|
@Value("${metricParser.agg.mysql.lowVersion:5.7}")
|
||||||
|
private String mysqlLowVersion;
|
||||||
@Autowired
|
@Autowired
|
||||||
private SchemaService schemaService;
|
private SchemaService schemaService;
|
||||||
|
|
||||||
@@ -226,5 +229,13 @@ public class QueryStructUtils {
|
|||||||
return internalMetricName;
|
return internalMetricName;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public boolean isSupportWith(EngineTypeEnum engineTypeEnum, String version) {
|
||||||
|
if (engineTypeEnum.equals(EngineTypeEnum.MYSQL) && Objects.nonNull(version) && version.startsWith(
|
||||||
|
mysqlLowVersion)) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user