From 431aa60e4d744309628fd1959927a07220e4a206 Mon Sep 17 00:00:00 2001 From: lwhy <72678624+luowanghaoyun@users.noreply.github.com> Date: Sun, 21 Sep 2025 23:24:04 +0800 Subject: [PATCH] (fix)(headless)Resolve field matching failures in mixed usage of raw and semantic names (#2370) --- .../translator/parser/SqlQueryParser.java | 23 +++++++++++-------- 1 file changed, 14 insertions(+), 9 deletions(-) diff --git a/headless/core/src/main/java/com/tencent/supersonic/headless/core/translator/parser/SqlQueryParser.java b/headless/core/src/main/java/com/tencent/supersonic/headless/core/translator/parser/SqlQueryParser.java index cd8a95c1e..675ff84f6 100644 --- a/headless/core/src/main/java/com/tencent/supersonic/headless/core/translator/parser/SqlQueryParser.java +++ b/headless/core/src/main/java/com/tencent/supersonic/headless/core/translator/parser/SqlQueryParser.java @@ -47,24 +47,19 @@ public class SqlQueryParser implements QueryParser { SqlQuery sqlQuery = queryStatement.getSqlQuery(); List queryFields = SqlSelectHelper.getAllSelectFields(sqlQuery.getSql()); Set queryAliases = SqlSelectHelper.getAliasFields(sqlQuery.getSql()); - Set ontologyMetricsDimensions = Collections.synchronizedSet(new HashSet()); - Set ontologyBizNameMetricsDimensions = Collections.synchronizedSet(new HashSet<>()); + List> ontologyMetricsDimensionsAndBizName = Collections.synchronizedList(new ArrayList<>()); queryFields.removeAll(queryAliases); Ontology ontology = queryStatement.getOntology(); OntologyQuery ontologyQuery = buildOntologyQuery(ontology, queryFields); Set queryFieldsSet = new HashSet<>(queryFields); ontologyQuery.getMetrics().forEach(m -> { - ontologyMetricsDimensions.add(m.getName()); - ontologyBizNameMetricsDimensions.add(m.getBizName()); + ontologyMetricsDimensionsAndBizName.add(Pair.of(m.getName(), m.getBizName())); }); ontologyQuery.getDimensions().forEach(d -> { - ontologyMetricsDimensions.add(d.getName()); - ontologyBizNameMetricsDimensions.add(d.getBizName()); + ontologyMetricsDimensionsAndBizName.add(Pair.of(d.getName(), d.getBizName())); }); // check if there are fields not matched with any metric or dimension - - if (!(queryFieldsSet.containsAll(ontologyMetricsDimensions) - || queryFieldsSet.containsAll(ontologyBizNameMetricsDimensions))) { + if (!allFieldMatched(queryFieldsSet, ontologyMetricsDimensionsAndBizName)) { List semanticFields = Lists.newArrayList(); ontologyQuery.getMetrics().forEach(m -> semanticFields.add(m.getName())); ontologyQuery.getDimensions().forEach(d -> semanticFields.add(d.getName())); @@ -103,6 +98,16 @@ public class SqlQueryParser implements QueryParser { log.info("parse sqlQuery [{}] ", sqlQuery); } + private boolean allFieldMatched(Set queryFields, + List> ontologyMetricsDimensionsAndBizName) { + for (Pair pair : ontologyMetricsDimensionsAndBizName) { + if (!(queryFields.contains(pair.getLeft()) || queryFields.contains(pair.getRight()))) { + return false; + } + } + return true; + } + private void aliasesWithBackticks(QueryStatement queryStatement) { String sql = queryStatement.getSqlQuery().getSql(); sql = SqlReplaceHelper.replaceAliasWithBackticks(sql);