diff options
| author | wangwei <[email protected]> | 2023-02-14 09:44:00 +0800 |
|---|---|---|
| committer | wangwei <[email protected]> | 2023-02-24 17:26:19 +0800 |
| commit | bf348be8b25e8baa6c35ed9593a2ce3391539ecf (patch) | |
| tree | 27c593645600e4edd275526b93416eb5550e7e5e | |
| parent | c70e354822174d8e88c87c02c7efe6cb4529d6a0 (diff) | |
fix(子查询): TSG-13676 修复子表查询别名与复合主键重复查询失败BUG、优化子查询
| -rw-r--r-- | main/docs/release/release-364.md | 5 | ||||
| -rw-r--r-- | qgw/src/main/java/com/mesalab/qgw/dialect/ClickHouseDialect.java | 61 |
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 |
