private static QuerySpec buildQuerySpec()

in dashboard/server/src/main/java/build/bazel/dashboard/github/issuelist/GithubIssueListRepoPg.java [40:111]


  private static QuerySpec buildQuerySpec(ListParams params) {
    String from =
        " FROM github_issue_status gis INNER JOIN github_issue gi ON (gi.owner, gi.repo,"
            + " gi.issue_number) = (gis.owner, gis.repo, gis.issue_number) INNER JOIN"
            + " github_issue_data gid ON (gid.owner, gid.repo, gid.issue_number) = (gi.owner,"
            + " gi.repo, gi.issue_number)";

    Map<String, Object> bindings = new HashMap<>();
    StringBuilder where = new StringBuilder();

    if (params.getOwner() != null) {
      where.append(" AND gis.owner = :owner");
      bindings.put("owner", params.getOwner());
    }

    if (params.getRepo() != null) {
      where.append(" AND gis.repo = :repo");
      bindings.put("repo", params.getRepo());
    }

    if (params.getIsPullRequest() != null) {
      where.append(" AND gi.is_pull_request = :is_pull_request");
      bindings.put("is_pull_request", params.getIsPullRequest());
    }

    if (params.getStatus() != null) {
      where.append(" AND gis.status = :status");
      bindings.put("status", params.getStatus().toString());
    }

    if (params.getActionOwner() != null) {
      where.append(" AND gis.action_owner = :action_owner");
      bindings.put("action_owner", params.getActionOwner());
    }

    if (params.getLabels() != null && !params.getLabels().isEmpty()) {
      where.append(" AND gi.labels @> :labels");
      bindings.put("labels", params.getLabels().toArray(new String[0]));
    }

    if (where.length() > 0) {
      // Remove heading AND
      where.delete(0, 4);
      where.insert(0, " WHERE");
    }

    String order = " ORDER BY gi.issue_number DESC";

    if (params.getSort() != null) {
      switch (params.getSort()) {
        case EXPECTED_RESPOND_AT_ASC:
          order = " ORDER BY gis.expected_respond_at ASC";
          break;
        case EXPECTED_RESPOND_AT_DESC:
          order = " ORDER BY gis.expected_respond_at DESC";
          break;
      }
    }

    int page = requireNonNull(params.getPage());
    int pageSize = requireNonNull(params.getPageSize());
    int offset = (page - 1) * pageSize;
    String limit = " LIMIT " + pageSize + " OFFSET " + offset;

    return QuerySpec.builder()
        .from(from)
        .where(where.toString())
        .order(order)
        .limit(limit)
        .bindings(bindings)
        .build();
  }