(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:
jipeli
2023-11-01 17:57:38 +08:00
committed by GitHub
parent 8f37c3175f
commit 372e4acc2c
3 changed files with 49 additions and 12 deletions

View File

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

View File

@@ -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."),

View File

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