mirror of
https://github.com/tencentmusic/supersonic.git
synced 2025-12-11 12:07:42 +00:00
(fix)(headless)Resolve field matching failures in mixed usage of raw and semantic names (#2370)
This commit is contained in:
@@ -47,24 +47,19 @@ public class SqlQueryParser implements QueryParser {
|
|||||||
SqlQuery sqlQuery = queryStatement.getSqlQuery();
|
SqlQuery sqlQuery = queryStatement.getSqlQuery();
|
||||||
List<String> queryFields = SqlSelectHelper.getAllSelectFields(sqlQuery.getSql());
|
List<String> queryFields = SqlSelectHelper.getAllSelectFields(sqlQuery.getSql());
|
||||||
Set<String> queryAliases = SqlSelectHelper.getAliasFields(sqlQuery.getSql());
|
Set<String> queryAliases = SqlSelectHelper.getAliasFields(sqlQuery.getSql());
|
||||||
Set<String> ontologyMetricsDimensions = Collections.synchronizedSet(new HashSet<String>());
|
List<Pair<String, String>> ontologyMetricsDimensionsAndBizName = Collections.synchronizedList(new ArrayList<>());
|
||||||
Set<String> ontologyBizNameMetricsDimensions = Collections.synchronizedSet(new HashSet<>());
|
|
||||||
queryFields.removeAll(queryAliases);
|
queryFields.removeAll(queryAliases);
|
||||||
Ontology ontology = queryStatement.getOntology();
|
Ontology ontology = queryStatement.getOntology();
|
||||||
OntologyQuery ontologyQuery = buildOntologyQuery(ontology, queryFields);
|
OntologyQuery ontologyQuery = buildOntologyQuery(ontology, queryFields);
|
||||||
Set<String> queryFieldsSet = new HashSet<>(queryFields);
|
Set<String> queryFieldsSet = new HashSet<>(queryFields);
|
||||||
ontologyQuery.getMetrics().forEach(m -> {
|
ontologyQuery.getMetrics().forEach(m -> {
|
||||||
ontologyMetricsDimensions.add(m.getName());
|
ontologyMetricsDimensionsAndBizName.add(Pair.of(m.getName(), m.getBizName()));
|
||||||
ontologyBizNameMetricsDimensions.add(m.getBizName());
|
|
||||||
});
|
});
|
||||||
ontologyQuery.getDimensions().forEach(d -> {
|
ontologyQuery.getDimensions().forEach(d -> {
|
||||||
ontologyMetricsDimensions.add(d.getName());
|
ontologyMetricsDimensionsAndBizName.add(Pair.of(d.getName(), d.getBizName()));
|
||||||
ontologyBizNameMetricsDimensions.add(d.getBizName());
|
|
||||||
});
|
});
|
||||||
// check if there are fields not matched with any metric or dimension
|
// check if there are fields not matched with any metric or dimension
|
||||||
|
if (!allFieldMatched(queryFieldsSet, ontologyMetricsDimensionsAndBizName)) {
|
||||||
if (!(queryFieldsSet.containsAll(ontologyMetricsDimensions)
|
|
||||||
|| queryFieldsSet.containsAll(ontologyBizNameMetricsDimensions))) {
|
|
||||||
List<String> semanticFields = Lists.newArrayList();
|
List<String> semanticFields = Lists.newArrayList();
|
||||||
ontologyQuery.getMetrics().forEach(m -> semanticFields.add(m.getName()));
|
ontologyQuery.getMetrics().forEach(m -> semanticFields.add(m.getName()));
|
||||||
ontologyQuery.getDimensions().forEach(d -> semanticFields.add(d.getName()));
|
ontologyQuery.getDimensions().forEach(d -> semanticFields.add(d.getName()));
|
||||||
@@ -103,6 +98,16 @@ public class SqlQueryParser implements QueryParser {
|
|||||||
log.info("parse sqlQuery [{}] ", sqlQuery);
|
log.info("parse sqlQuery [{}] ", sqlQuery);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private boolean allFieldMatched(Set<String> queryFields,
|
||||||
|
List<Pair<String, String>> ontologyMetricsDimensionsAndBizName) {
|
||||||
|
for (Pair<String, String> pair : ontologyMetricsDimensionsAndBizName) {
|
||||||
|
if (!(queryFields.contains(pair.getLeft()) || queryFields.contains(pair.getRight()))) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
private void aliasesWithBackticks(QueryStatement queryStatement) {
|
private void aliasesWithBackticks(QueryStatement queryStatement) {
|
||||||
String sql = queryStatement.getSqlQuery().getSql();
|
String sql = queryStatement.getSqlQuery().getSql();
|
||||||
sql = SqlReplaceHelper.replaceAliasWithBackticks(sql);
|
sql = SqlReplaceHelper.replaceAliasWithBackticks(sql);
|
||||||
|
|||||||
Reference in New Issue
Block a user