private static StatementContext compileStatement(
      String query, Scan scan, List<Object> binds, Integer limit, Set<Expression> extractedNodes)
      throws SQLException {
    SQLParser parser = new SQLParser(query);
    SelectStatement statement = parser.parseQuery();
    statement = RHSLiteralStatementRewriter.normalizeWhereClause(statement);
    PhoenixConnection pconn =
        DriverManager.getConnection(getUrl(), TEST_PROPERTIES).unwrap(PhoenixConnection.class);
    ColumnResolver resolver = FromCompiler.getResolver(statement, pconn);
    StatementContext context =
        new StatementContext(pconn, resolver, binds, statement.getBindCount(), scan);

    Integer actualLimit = LimitCompiler.getLimit(context, statement.getLimit());
    assertEquals(limit, actualLimit);
    GroupBy groupBy = GroupByCompiler.getGroupBy(statement, context);
    statement = HavingCompiler.moveToWhereClause(statement, context, groupBy);
    WhereCompiler.compileWhereClause(
        context, statement.getWhere(), extractedNodes, statement.getHint());
    return context;
  }