···
···
func GetPullsWithLimit(e Execer, limit int, filters ...filter) ([]*models.Pull, error) {
-
pulls := make(map[int]*models.Pull)
···
pull.ParentChangeId = parentChangeId.String
-
pulls[pull.PullId] = &pull
-
// get latest round no. for each pull
-
inClause := strings.TrimSuffix(strings.Repeat("?, ", len(pulls)), ", ")
-
submissionsQuery := fmt.Sprintf(`
-
id, pull_id, round_number, patch, created, source_rev
-
repo_at in (%s) and pull_id in (%s)
-
args = make([]any, len(pulls)*2)
-
for _, p := range pulls {
-
for _, p := range pulls {
-
submissionsRows, err := e.Query(submissionsQuery, args...)
-
defer submissionsRows.Close()
-
for submissionsRows.Next() {
-
var s models.PullSubmission
-
var sourceRev sql.NullString
-
err := submissionsRows.Scan(
-
createdTime, err := time.Parse(time.RFC3339, createdAt)
-
s.Created = createdTime
-
s.SourceRev = sourceRev.String
-
if p, ok := pulls[s.PullId]; ok {
-
p.Submissions = make([]*models.PullSubmission, s.RoundNumber+1)
-
p.Submissions[s.RoundNumber] = &s
-
if err := rows.Err(); err != nil {
-
// get comment count on latest submission on each pull
-
inClause = strings.TrimSuffix(strings.Repeat("?, ", len(pulls)), ", ")
-
commentsQuery := fmt.Sprintf(`
for _, p := range pulls {
-
args = append(args, p.Submissions[p.LastRoundNumber()].ID)
-
commentsRows, err := e.Query(commentsQuery, args...)
-
defer commentsRows.Close()
-
for commentsRows.Next() {
-
var commentCount, pullId int
-
err := commentsRows.Scan(
-
if p, ok := pulls[pullId]; ok {
-
p.Submissions[p.LastRoundNumber()].Comments = make([]models.PullComment, commentCount)
-
if err := rows.Err(); err != nil {
orderedByPullId := []*models.Pull{}
for _, p := range pulls {
···
func GetPull(e Execer, repoAt syntax.ATURI, pullId int) (*models.Pull, error) {
-
repo_at = ? and pull_id = ?
-
row := e.QueryRow(query, repoAt, pullId)
-
var sourceBranch, sourceRepoAt, stackId, changeId, parentChangeId sql.NullString
-
createdTime, err := time.Parse(time.RFC3339, createdAt)
-
pull.Created = createdTime
-
if sourceBranch.Valid {
-
pull.PullSource = &models.PullSource{
-
Branch: sourceBranch.String,
-
if sourceRepoAt.Valid {
-
sourceRepoAtParsed, err := syntax.ParseATURI(sourceRepoAt.String)
-
pull.PullSource.RepoAt = &sourceRepoAtParsed
-
pull.StackId = stackId.String
-
pull.ChangeId = changeId.String
-
if parentChangeId.Valid {
-
pull.ParentChangeId = parentChangeId.String
-
id, pull_id, repo_at, round_number, patch, created, source_rev
-
repo_at = ? and pull_id = ?
-
submissionsRows, err := e.Query(submissionsQuery, repoAt, pullId)
-
defer submissionsRows.Close()
-
submissionsMap := make(map[int]*models.PullSubmission)
-
for submissionsRows.Next() {
var submission models.PullSubmission
-
var submissionCreatedStr string
-
var submissionSourceRev sql.NullString
-
err := submissionsRows.Scan(
-
submissionCreatedTime, err := time.Parse(time.RFC3339, submissionCreatedStr)
-
submission.Created = submissionCreatedTime
-
if submissionSourceRev.Valid {
-
submission.SourceRev = submissionSourceRev.String
-
submissionsMap[submission.ID] = &submission
-
if err = submissionsRows.Close(); err != nil {
-
if len(submissionsMap) == 0 {
-
for k := range submissionsMap {
-
inClause := strings.TrimSuffix(strings.Repeat("?, ", len(submissionsMap)), ", ")
-
commentsQuery := fmt.Sprintf(`
···
-
commentsRows, err := e.Query(commentsQuery, args...)
-
defer commentsRows.Close()
-
for commentsRows.Next() {
var comment models.PullComment
-
var commentCreatedStr string
-
err := commentsRows.Scan(
···
-
commentCreatedTime, err := time.Parse(time.RFC3339, commentCreatedStr)
-
comment.Created = commentCreatedTime
-
// Add the comment to its submission
-
if submission, ok := submissionsMap[comment.SubmissionId]; ok {
-
submission.Comments = append(submission.Comments, comment)
-
if err = commentsRows.Err(); err != nil {
-
var pullSourceRepo *models.Repo
-
if pull.PullSource != nil {
-
if pull.PullSource.RepoAt != nil {
-
pullSourceRepo, err = GetRepoByAtUri(e, pull.PullSource.RepoAt.String())
-
log.Printf("failed to get repo by at uri: %v", err)
-
pull.PullSource.Repo = pullSourceRepo
-
pull.Submissions = make([]*models.PullSubmission, len(submissionsMap))
-
for _, submission := range submissionsMap {
-
pull.Submissions[submission.RoundNumber] = submission
// timeframe here is directly passed into the sql query filter, and any
···
···
func GetPullsWithLimit(e Execer, limit int, filters ...filter) ([]*models.Pull, error) {
+
pulls := make(map[syntax.ATURI]*models.Pull)
···
pull.ParentChangeId = parentChangeId.String
+
pulls[pull.PullAt()] = &pull
+
var pullAts []syntax.ATURI
for _, p := range pulls {
+
pullAts = append(pullAts, p.PullAt())
+
submissionsMap, err := GetPullSubmissions(e, FilterIn("pull_at", pullAts))
+
return nil, fmt.Errorf("failed to get submissions: %w", err)
+
for pullAt, submissions := range submissionsMap {
+
if p, ok := pulls[pullAt]; ok {
+
p.Submissions = submissions
orderedByPullId := []*models.Pull{}
for _, p := range pulls {
···
func GetPull(e Execer, repoAt syntax.ATURI, pullId int) (*models.Pull, error) {
+
pulls, err := GetPullsWithLimit(e, 1, FilterEq("repo_at", repoAt), FilterEq("pull_id", pullId))
+
return nil, sql.ErrNoRows
+
// mapping from pull -> pull submissions
+
func GetPullSubmissions(e Execer, filters ...filter) (map[syntax.ATURI][]*models.PullSubmission, error) {
+
var conditions []string
+
for _, filter := range filters {
+
conditions = append(conditions, filter.Condition())
+
args = append(args, filter.Arg()...)
+
whereClause = " where " + strings.Join(conditions, " and ")
+
rows, err := e.Query(query, args...)
+
submissionMap := make(map[int]*models.PullSubmission)
var submission models.PullSubmission
+
var sourceRev sql.NullString
+
createdTime, err := time.Parse(time.RFC3339, createdAt)
+
submission.Created = createdTime
+
submission.SourceRev = sourceRev.String
+
submissionMap[submission.ID] = &submission
+
if err := rows.Err(); err != nil {
+
// Get comments for all submissions using GetPullComments
+
submissionIds := slices.Collect(maps.Keys(submissionMap))
+
comments, err := GetPullComments(e, FilterIn("submission_id", submissionIds))
+
for _, comment := range comments {
+
if submission, ok := submissionMap[comment.SubmissionId]; ok {
+
submission.Comments = append(submission.Comments, comment)
+
// order the submissions by pull_at
+
m := make(map[syntax.ATURI][]*models.PullSubmission)
+
for _, s := range submissionMap {
+
m[s.PullAt] = append(m[s.PullAt], s)
+
func GetPullComments(e Execer, filters ...filter) ([]models.PullComment, error) {
+
var conditions []string
+
for _, filter := range filters {
+
conditions = append(conditions, filter.Condition())
+
args = append(args, filter.Arg()...)
+
whereClause = " where " + strings.Join(conditions, " and ")
···
+
rows, err := e.Query(query, args...)
+
var comments []models.PullComment
var comment models.PullComment
···
+
if t, err := time.Parse(time.RFC3339, createdAt); err == nil {
+
comments = append(comments, comment)
+
if err := rows.Err(); err != nil {
// timeframe here is directly passed into the sql query filter, and any