mirror of
https://github.com/tencentmusic/supersonic.git
synced 2025-12-11 12:07:42 +00:00
(improvement)(semantic) fixed withAs not supported on CK version lower than 20.4 (#305)
Co-authored-by: jipengli <jipengli@tencent.com>
This commit is contained in:
@@ -25,4 +25,25 @@ public class StringUtil {
|
|||||||
return where.replace("\"", "\\\\\"");
|
return where.replace("\"", "\\\\\"");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @param v1
|
||||||
|
* @param v2
|
||||||
|
* @return value 0 if v1 equal to v2; less than 0 if v1 is less than v2; greater than 0 if v1 is greater than v2
|
||||||
|
*/
|
||||||
|
public static int compareVersion(String v1, String v2) {
|
||||||
|
String[] v1s = v1.split("\\.");
|
||||||
|
String[] v2s = v2.split("\\.");
|
||||||
|
int length = Math.min(v1s.length, v2s.length);
|
||||||
|
for (int i = 0; i < length; i++) {
|
||||||
|
Integer vv1 = Integer.parseInt(v1s[i]);
|
||||||
|
Integer vv2 = Integer.parseInt(v2s[i]);
|
||||||
|
int compare = vv1.compareTo(vv2);
|
||||||
|
if (compare != 0) {
|
||||||
|
return compare;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return v1s.length - v2s.length;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
@@ -44,7 +44,6 @@ public class CalculateAggConverter implements SemanticConverter {
|
|||||||
private String metricAggDefault;
|
private String metricAggDefault;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
public CalculateAggConverter(
|
public CalculateAggConverter(
|
||||||
SemanticQueryEngine parserService,
|
SemanticQueryEngine parserService,
|
||||||
@Lazy QueryStructUtils queryStructUtils,
|
@Lazy QueryStructUtils queryStructUtils,
|
||||||
@@ -57,7 +56,7 @@ public class CalculateAggConverter implements SemanticConverter {
|
|||||||
|
|
||||||
public interface EngineSql {
|
public interface EngineSql {
|
||||||
|
|
||||||
String sql(QueryStructReq queryStructCmd, boolean isOver, String metricSql);
|
String sql(QueryStructReq queryStructCmd, boolean isOver, boolean asWith, String metricSql);
|
||||||
}
|
}
|
||||||
|
|
||||||
public ParseSqlReq generateSqlCommend(QueryStructReq queryStructCmd, EngineTypeEnum engineTypeEnum, String version)
|
public ParseSqlReq generateSqlCommend(QueryStructReq queryStructCmd, EngineTypeEnum engineTypeEnum, String version)
|
||||||
@@ -166,16 +165,18 @@ public class CalculateAggConverter implements SemanticConverter {
|
|||||||
String sql = "";
|
String sql = "";
|
||||||
switch (engineTypeEnum) {
|
switch (engineTypeEnum) {
|
||||||
case H2:
|
case H2:
|
||||||
sql = new H2EngineSql().sql(queryStructCmd, isOver, metricTableName);
|
sql = new H2EngineSql().sql(queryStructCmd, isOver, true, metricTableName);
|
||||||
break;
|
break;
|
||||||
case MYSQL:
|
case MYSQL:
|
||||||
case DORIS:
|
case DORIS:
|
||||||
case CLICKHOUSE:
|
case CLICKHOUSE:
|
||||||
if (!queryStructUtils.isSupportWith(engineTypeEnum, version)) {
|
if (!queryStructUtils.isSupportWith(engineTypeEnum, version)) {
|
||||||
sqlCommand.setSupportWith(false);
|
sqlCommand.setSupportWith(false);
|
||||||
sql = new MysqlEngineSql().sql(queryStructCmd, isOver, metricTableName);
|
}
|
||||||
|
if (!engineTypeEnum.equals(engineTypeEnum.CLICKHOUSE)) {
|
||||||
|
sql = new MysqlEngineSql().sql(queryStructCmd, isOver, sqlCommand.isSupportWith(), metricTableName);
|
||||||
} else {
|
} else {
|
||||||
sql = new CkEngineSql().sql(queryStructCmd, isOver, metricTableName);
|
sql = new CkEngineSql().sql(queryStructCmd, isOver, sqlCommand.isSupportWith(), metricTableName);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
@@ -248,7 +249,7 @@ public class CalculateAggConverter implements SemanticConverter {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String sql(QueryStructReq queryStructCmd, boolean isOver, String metricSql) {
|
public String sql(QueryStructReq queryStructCmd, boolean isOver, boolean asWith, String metricSql) {
|
||||||
String sql = String.format(
|
String sql = String.format(
|
||||||
"select %s from ( select %s , %s from %s t0 left join %s t1 on %s ) metric_tb_src %s %s ",
|
"select %s from ( select %s , %s from %s t0 left join %s t1 on %s ) metric_tb_src %s %s ",
|
||||||
getOverSelect(queryStructCmd, isOver), getAllSelect(queryStructCmd, "t0."),
|
getOverSelect(queryStructCmd, isOver), getAllSelect(queryStructCmd, "t0."),
|
||||||
@@ -292,15 +293,22 @@ public class CalculateAggConverter implements SemanticConverter {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String sql(QueryStructReq queryStructCmd, boolean isOver, String metricSql) {
|
public String sql(QueryStructReq queryStructCmd, boolean isOver, boolean asWith, String metricSql) {
|
||||||
String sql = String.format(
|
if (!asWith) {
|
||||||
|
return String.format(
|
||||||
|
"select %s from ( select %s , %s from %s t0 left join %s t1 on %s ) metric_tb_src %s %s ",
|
||||||
|
getOverSelect(queryStructCmd, isOver), getAllSelect(queryStructCmd, "t0."),
|
||||||
|
getAllJoinSelect(queryStructCmd, "t1."), metricSql, metricSql,
|
||||||
|
getJoinOn(queryStructCmd, isOver, "t0.", "t1."),
|
||||||
|
getOrderBy(queryStructCmd), getLimit(queryStructCmd));
|
||||||
|
}
|
||||||
|
return String.format(
|
||||||
",t0 as (select * from %s),t1 as (select * from %s) select %s from ( select %s , %s "
|
",t0 as (select * from %s),t1 as (select * from %s) select %s from ( select %s , %s "
|
||||||
+ "from t0 left join t1 on %s ) metric_tb_src %s %s ",
|
+ "from t0 left join t1 on %s ) metric_tb_src %s %s ",
|
||||||
metricSql, metricSql, getOverSelect(queryStructCmd, isOver), getAllSelect(queryStructCmd, "t0."),
|
metricSql, metricSql, getOverSelect(queryStructCmd, isOver), getAllSelect(queryStructCmd, "t0."),
|
||||||
getAllJoinSelect(queryStructCmd, "t1."),
|
getAllJoinSelect(queryStructCmd, "t1."),
|
||||||
getJoinOn(queryStructCmd, isOver, "t0.", "t1."),
|
getJoinOn(queryStructCmd, isOver, "t0.", "t1."),
|
||||||
getOrderBy(queryStructCmd), getLimit(queryStructCmd));
|
getOrderBy(queryStructCmd), getLimit(queryStructCmd));
|
||||||
return sql;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -368,7 +376,7 @@ public class CalculateAggConverter implements SemanticConverter {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String sql(QueryStructReq queryStructCmd, boolean isOver, String metricSql) {
|
public String sql(QueryStructReq queryStructCmd, boolean isOver, boolean asWith, String metricSql) {
|
||||||
String sql = String.format(
|
String sql = String.format(
|
||||||
"select %s from ( select %s , %s from %s t0 left join %s t1 on %s ) metric_tb_src %s %s ",
|
"select %s from ( select %s , %s from %s t0 left join %s t1 on %s ) metric_tb_src %s %s ",
|
||||||
getOverSelect(queryStructCmd, isOver), getAllSelect(queryStructCmd, "t0."),
|
getOverSelect(queryStructCmd, isOver), getAllSelect(queryStructCmd, "t0."),
|
||||||
|
|||||||
@@ -11,10 +11,11 @@ import com.tencent.supersonic.common.pojo.Aggregator;
|
|||||||
import com.tencent.supersonic.common.pojo.DateConf;
|
import com.tencent.supersonic.common.pojo.DateConf;
|
||||||
import com.tencent.supersonic.common.pojo.DateConf.DateMode;
|
import com.tencent.supersonic.common.pojo.DateConf.DateMode;
|
||||||
import com.tencent.supersonic.common.pojo.enums.TypeEnums;
|
import com.tencent.supersonic.common.pojo.enums.TypeEnums;
|
||||||
|
import com.tencent.supersonic.common.util.StringUtil;
|
||||||
import com.tencent.supersonic.common.util.jsqlparser.FilterExpression;
|
import com.tencent.supersonic.common.util.jsqlparser.FilterExpression;
|
||||||
import com.tencent.supersonic.common.util.jsqlparser.SqlParserSelectHelper;
|
|
||||||
import com.tencent.supersonic.common.util.jsqlparser.SqlParserRemoveHelper;
|
|
||||||
import com.tencent.supersonic.common.util.jsqlparser.SqlParserAddHelper;
|
import com.tencent.supersonic.common.util.jsqlparser.SqlParserAddHelper;
|
||||||
|
import com.tencent.supersonic.common.util.jsqlparser.SqlParserRemoveHelper;
|
||||||
|
import com.tencent.supersonic.common.util.jsqlparser.SqlParserSelectHelper;
|
||||||
import com.tencent.supersonic.semantic.api.model.pojo.ItemDateFilter;
|
import com.tencent.supersonic.semantic.api.model.pojo.ItemDateFilter;
|
||||||
import com.tencent.supersonic.semantic.api.model.pojo.SchemaItem;
|
import com.tencent.supersonic.semantic.api.model.pojo.SchemaItem;
|
||||||
import com.tencent.supersonic.semantic.api.model.request.ModelSchemaFilterReq;
|
import com.tencent.supersonic.semantic.api.model.request.ModelSchemaFilterReq;
|
||||||
@@ -73,6 +74,8 @@ public class QueryStructUtils {
|
|||||||
private String internalMetricNameSuffix;
|
private String internalMetricNameSuffix;
|
||||||
@Value("${metricParser.agg.mysql.lowVersion:5.7}")
|
@Value("${metricParser.agg.mysql.lowVersion:5.7}")
|
||||||
private String mysqlLowVersion;
|
private String mysqlLowVersion;
|
||||||
|
@Value("${metricParser.agg.ck.lowVersion:20.4}")
|
||||||
|
private String ckLowVersion;
|
||||||
@Autowired
|
@Autowired
|
||||||
private SchemaService schemaService;
|
private SchemaService schemaService;
|
||||||
|
|
||||||
@@ -263,6 +266,11 @@ public class QueryStructUtils {
|
|||||||
mysqlLowVersion)) {
|
mysqlLowVersion)) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
if (engineTypeEnum.equals(EngineTypeEnum.CLICKHOUSE) && Objects.nonNull(version)
|
||||||
|
&& StringUtil.compareVersion(version,
|
||||||
|
ckLowVersion) < 0) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user