summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorwangwei <[email protected]>2023-02-14 09:44:00 +0800
committerwangwei <[email protected]>2023-02-24 17:26:19 +0800
commitbf348be8b25e8baa6c35ed9593a2ce3391539ecf (patch)
tree27c593645600e4edd275526b93416eb5550e7e5e
parentc70e354822174d8e88c87c02c7efe6cb4529d6a0 (diff)
fix(子查询): TSG-13676 修复子表查询别名与复合主键重复查询失败BUG、优化子查询
-rw-r--r--main/docs/release/release-364.md5
-rw-r--r--qgw/src/main/java/com/mesalab/qgw/dialect/ClickHouseDialect.java61
2 files changed, 22 insertions, 44 deletions
diff --git a/main/docs/release/release-364.md b/main/docs/release/release-364.md
index d41cb5c7..5e1d940a 100644
--- a/main/docs/release/release-364.md
+++ b/main/docs/release/release-364.md
@@ -5,8 +5,9 @@ Release 364 (TSG-23.02)
* 扩展Schema,新增流量整形统计表traffic_shaping_metrics(TSG-13490)
* 扩展Schema,新增公共字段common_flags_identify_info(TSG-13492)
* 扩展Schema,新增公共字段common_shaping_rule_ids(TSG-13493)
+* 扩展故障诊断接口,Schema诊断支持索引键校验(GAL-257)
* 修改Schema,对common_server_domain列进行展示,支持查询和Report(TSG-13362)
* 修改Schema,隐藏app_extra_info字段(TSG-13479)
* 修改Live Traffic Chart,指标Uncategorized Traffic更改为Unknown App(TSG-13571)
-* 扩展故障诊断接口,Schema诊断支持索引键校验(GAL-257)
-* 修改Schema,隐藏common_direction字段(TSG-13564) \ No newline at end of file
+* 修改Schema,隐藏common_direction字段(TSG-13564)
+* 修复子查询优化,由于结果列别名与子表查询复合主键名称重复导致查询失败BUG(TSG-13676) \ No newline at end of file
diff --git a/qgw/src/main/java/com/mesalab/qgw/dialect/ClickHouseDialect.java b/qgw/src/main/java/com/mesalab/qgw/dialect/ClickHouseDialect.java
index 42c7da21..a9820037 100644
--- a/qgw/src/main/java/com/mesalab/qgw/dialect/ClickHouseDialect.java
+++ b/qgw/src/main/java/com/mesalab/qgw/dialect/ClickHouseDialect.java
@@ -587,11 +587,15 @@ public class ClickHouseDialect extends AbstractDataSourceDialect {
String primaryKey = metadataService.getValueByKeyInSchemaDoc(param.getTableName(), "primary_key");
List<String> indexKey = metadataService.getIndexKey(param.getTableName());
- int i = indexKey.contains(primaryKey) ? indexKey.indexOf(primaryKey) + 1 : indexKey.size();
- String subQueryKey = String.join(",", indexKey.subList(0, i));
- String subQuery = getSubquerySql(subQueryKey, indexTable);
+ indexKey = indexKey.subList(0, indexKey.contains(primaryKey) ? indexKey.indexOf(primaryKey) + 1 : indexKey.size());
+
+ List<String> indexKeyMaster = Lists.newArrayList();
+ String nameMaster = metadataService.getSchemaByName(param.getTableName()).getName();
+ indexKey.forEach(o -> indexKeyMaster.add(nameMaster.concat(".").concat(o)));
+
+ String subQuery = getSubquerySql(String.join(",", indexKey), indexTable);
StringBuffer sb = new StringBuffer();
- sb.append("select ").append(param.getDbQuerySource().getSelectItems()).append(" from ").append(param.getTableName()).append(" where ( ").append(subQueryKey).append(" ) in ( ").append(subQuery).append(")");
+ sb.append("select ").append(param.getDbQuerySource().getSelectItems()).append(" from ").append(param.getTableName()).append(" where ( ").append(String.join(",", indexKeyMaster)).append(" ) in ( ").append(subQuery).append(")");
if (StringUtil.isNotBlank(param.getDbQuerySource().getExpr())) {
sb.append(" and (").append(param.getDbQuerySource().getExpr()).append(")");
}
@@ -611,23 +615,21 @@ public class ClickHouseDialect extends AbstractDataSourceDialect {
* @return
*/
private String getSubQueryByPartitionKey(String sql) {
- String partitionKey = getPartitionKey(param.getTableName());
+ String partitionKey = metadataService.getPartitionKey(param.getTableName());
if (StringUtil.isBlank(partitionKey)) {
log.warn("Partition Key is Empty. Focus in tableName {} schema", param.getTableName());
return sql;
- } else {
- String subQuery = getSubquerySql(partitionKey, param.getTableName());
- subQuery = subQuery.replaceAll("\\\\","$0$0");
- subQuery = subQuery.replaceAll("\\$","\\\\\\$");
- Matcher m = pWhere.matcher(sql);
- StringBuffer sb = new StringBuffer();
- while (m.find()) {
- m.appendReplacement(sb, "where " + partitionKey + " in ( " + subQuery + ") and ");
- }
- m.appendTail(sb);
- return sb.toString();
}
-
+ String subQuery = getSubquerySql(partitionKey, param.getTableName());
+ subQuery = subQuery.replaceAll("\\\\", "$0$0");
+ subQuery = subQuery.replaceAll("\\$", "\\\\\\$");
+ Matcher m = pWhere.matcher(sql);
+ StringBuffer sb = new StringBuffer();
+ while (m.find()) {
+ m.appendReplacement(sb, "where " + metadataService.getSchemaByName(param.getTableName()).getName().concat(".").concat(partitionKey) + " in ( " + subQuery + ") and ");
+ }
+ m.appendTail(sb);
+ return sb.toString();
}
/**
@@ -678,31 +680,6 @@ public class ClickHouseDialect extends AbstractDataSourceDialect {
}
/**
- * 获取当前CK查询中的分区键,用于子查询优化操作;
- * 若分区键被其它列当别名使用,返回空
- *
- * @return
- */
- private String getPartitionKey(String tableName) {
- String partitionKey = metadataService.getPartitionKey(tableName);
-
- if (StringUtil.isNotBlank(partitionKey)) {
- String tempValue = param.getDbQuerySource().getAliasFields().get(partitionKey);
- if (StringUtil.isNotBlank(tempValue)) {
- if (tempValue.contains(partitionKey)) {
- partitionKey = tempValue;
- } else {
- partitionKey = "";
- }
- }
-
- }
-
- return partitionKey;
-
- }
-
- /**
* 判断table是否在DB中
*
* @param tableName