public String searchRowNumFunUsedInFilter()

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;
  }