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