in bigquery-antipattern-recognition/src/main/java/com/google/zetasql/toolkit/antipattern/parser/visitors/rownum/IdentifyLatestRecordVisitor.java [68:97]
public String searchRowNumFunUsedInFilter(ASTNodes.ASTTableSubquery subqueryNode, ASTWhereClause whereNode) {
selectColWithRowNumNode = null;
stringIdAnalyticalFunBeingUsed = null;
ASTNodes.ASTQueryExpression queryExpr = subqueryNode.getSubquery().getQueryExpr() ;
if(queryExpr instanceof ASTNodes.ASTSelect) {
ASTNodes.ASTSelectList selectList = ((ASTSelect) queryExpr).getSelectList();
//search each column until we find a row_number() or rank()
Iterator<ASTSelectColumn> columnsIterator = selectList.getColumns().iterator();
while(columnsIterator.hasNext()) {
ASTSelectColumn col = columnsIterator.next();
if(col.getExpression() instanceof ASTNodes.ASTAnalyticFunctionCall){
ASTNodes.ASTAnalyticFunctionCall analyticFunctionNode = (ASTNodes.ASTAnalyticFunctionCall) col.getExpression();
ASTNodes.ASTFunctionCall functionCallNode = (ASTNodes.ASTFunctionCall) analyticFunctionNode.getExpression();
//search alias for col with row_num or window function
String windowFunIdString = functionCallNode.getFunction().getNames().get(0).getIdString();
if(Arrays.stream(STRING_IDS_ANALYTIC_FUN).anyMatch(windowFunIdString::equals)){
selectColWithRowNumNode = col;
stringIdAnalyticalFunBeingUsed = windowFunIdString;
String rowNumColAlias = col.getAlias().getIdentifier().getIdString();
if(searchRowNumFilterInWhere(whereNode, rowNumColAlias)){
int rowNumColLineNum = ZetaSQLStringParsingHelper.countLine(query, selectColWithRowNumNode.getParseLocationRange().start());
int rowNumFilterLineNum = ZetaSQLStringParsingHelper.countLine(query, filterWithRowNumNode.getParseLocationRange().start());
result.add(String.format(LATEST_RECORD_SUGGESTION_MESSAGE, stringIdAnalyticalFunBeingUsed, rowNumColLineNum, rowNumFilterLineNum));
}
}
}
}
}
return null;
}