in bigquery-antipattern-recognition/src/main/java/com/google/zetasql/toolkit/antipattern/util/AntiPatternHelper.java [101:137]
public void checkForAntiPatternsInQueryWithAnalyzerVisitors(InputQuery inputQuery, List<AntiPatternVisitor> visitorsThatFoundAntiPatterns) {
String query = inputQuery.getQuery();
String currentProject;
if (inputQuery.getProjectId() == null) {
currentProject = this.project;
} else {
currentProject = inputQuery.getProjectId();
}
BigQueryCatalog catalog = new BigQueryCatalog("");
if ((this.analyzerProject == null || !this.analyzerProject.equals(currentProject))) {
this.analyzerProject = inputQuery.getProjectId();
catalog = new BigQueryCatalog(this.analyzerProject, this.resourceProvider);
catalog.addAllTablesUsedInQuery(query, this.analyzerOptions);
}
JoinOrderVisitor visitor = new JoinOrderVisitor(this.service);
if(this.visitorMetricsMap.get(visitor.getName()) == null) {
this.visitorMetricsMap.put(visitor.getName(), 0);
this.visitorMetricsMap.merge(visitor.getName(), 1, Integer::sum);
}
try {
logger.info("Analyzing query with id: " + inputQuery.getQueryId() +
" For anti-pattern:" + visitor.getName());
Iterator<ResolvedNodes.ResolvedStatement> statementIterator = this.analyzer.analyzeStatements(query, catalog);
statementIterator.forEachRemaining(statement -> statement.accept(visitor));
String result = visitor.getResult();
if (result.length() > 0) {
visitorsThatFoundAntiPatterns.add(visitor);
}
} catch (Exception e) {
logger.error("Error analyzing query with id: " + inputQuery.getQueryId() +
" For anti-pattern:" + visitor.getName());
logger.error(e.getMessage(), e);
}
}