in bigquery-antipattern-recognition/src/main/java/com/google/zetasql/toolkit/antipattern/rewriter/gemini/QueryVisitorRewriter.java [69:115]
public String checkAntiPattern(String queryStr,
AntiPatternVisitor visitorThatFoundAntiPattern,
Integer llmRetries) throws Exception {
InputQuery inputQuery = new InputQuery(queryStr, "intermediate_rewrite");
List<AntiPatternVisitor> visitorsThatFoundAntiPatterns = new ArrayList<>();
try {
// get only the visitor that we want to check
List<AntiPatternVisitor> parserVisitorList = antiPatternHelper
.getParserVisitorList(inputQuery.getQuery())
.stream()
.filter(ap -> Objects.equals(ap.getName(), visitorThatFoundAntiPattern.getName()))
.collect(Collectors.toList());
// parser visitors
this.antiPatternHelper.checkForAntiPatternsInQueryWithParserVisitors(inputQuery, visitorsThatFoundAntiPatterns, parserVisitorList);
// analyzer visitor
if (this.antiPatternHelper.getUseAnalizer() && visitorThatFoundAntiPattern.getName().equals(JoinOrderVisitor.NAME)) {
this.antiPatternHelper.checkForAntiPatternsInQueryWithAnalyzerVisitors(inputQuery, visitorsThatFoundAntiPatterns);
}
if (! visitorsThatFoundAntiPatterns.isEmpty()) {
if (llmRetries <= 0) {
if (this.llmStrictValidation) {
throw new TTLExpiredDuringRewriteException("LLM couldn't solve the specific anti pattern");
}
return queryStr;
}
llmRetries--;
queryStr = this.rewriteSQL(queryStr, visitorThatFoundAntiPattern, llmRetries);
}
return queryStr;
} catch (SqlException sqlException) {
logger.error("The generated query has a syntax error :" + sqlException.getMessage());
if (llmRetries <= 0) {
if (this.llmStrictValidation) {
throw new TTLExpiredDuringRewriteException("LLM couldn't solve the specific anti pattern");
}
return queryStr;
}
llmRetries--;
queryStr = this.fixSyntaxError(queryStr, sqlException.getMessage(), this.antiPatternHelper.getProject());
return this.checkAntiPattern(queryStr, visitorThatFoundAntiPattern, llmRetries);
}
}