···
···
func GetPullsWithLimit(e Execer, limit int, filters ...filter) ([]*models.Pull, error) {
111
-
pulls := make(map[int]*models.Pull)
112
+
pulls := make(map[syntax.ATURI]*models.Pull)
···
pull.ParentChangeId = parentChangeId.String
214
-
pulls[pull.PullId] = &pull
215
+
pulls[pull.PullAt()] = &pull
217
-
// get latest round no. for each pull
218
-
inClause := strings.TrimSuffix(strings.Repeat("?, ", len(pulls)), ", ")
219
-
submissionsQuery := fmt.Sprintf(`
221
-
id, pull_id, round_number, patch, created, source_rev
225
-
repo_at in (%s) and pull_id in (%s)
226
-
`, inClause, inClause)
228
-
args = make([]any, len(pulls)*2)
230
-
for _, p := range pulls {
231
-
args[idx] = p.RepoAt
234
-
for _, p := range pulls {
235
-
args[idx] = p.PullId
238
-
submissionsRows, err := e.Query(submissionsQuery, args...)
242
-
defer submissionsRows.Close()
244
-
for submissionsRows.Next() {
245
-
var s models.PullSubmission
246
-
var sourceRev sql.NullString
247
-
var createdAt string
248
-
err := submissionsRows.Scan(
260
-
createdTime, err := time.Parse(time.RFC3339, createdAt)
264
-
s.Created = createdTime
266
-
if sourceRev.Valid {
267
-
s.SourceRev = sourceRev.String
270
-
if p, ok := pulls[s.PullId]; ok {
271
-
p.Submissions = make([]*models.PullSubmission, s.RoundNumber+1)
272
-
p.Submissions[s.RoundNumber] = &s
275
-
if err := rows.Err(); err != nil {
279
-
// get comment count on latest submission on each pull
280
-
inClause = strings.TrimSuffix(strings.Repeat("?, ", len(pulls)), ", ")
281
-
commentsQuery := fmt.Sprintf(`
287
-
submission_id in (%s)
218
+
var pullAts []syntax.ATURI
for _, p := range pulls {
294
-
args = append(args, p.Submissions[p.LastRoundNumber()].ID)
220
+
pullAts = append(pullAts, p.PullAt())
296
-
commentsRows, err := e.Query(commentsQuery, args...)
222
+
submissionsMap, err := GetPullSubmissions(e, FilterIn("pull_at", pullAts))
224
+
return nil, fmt.Errorf("failed to get submissions: %w", err)
300
-
defer commentsRows.Close()
302
-
for commentsRows.Next() {
303
-
var commentCount, pullId int
304
-
err := commentsRows.Scan(
311
-
if p, ok := pulls[pullId]; ok {
312
-
p.Submissions[p.LastRoundNumber()].Comments = make([]models.PullComment, commentCount)
227
+
for pullAt, submissions := range submissionsMap {
228
+
if p, ok := pulls[pullAt]; ok {
229
+
p.Submissions = submissions
315
-
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) {
355
-
repo_at = ? and pull_id = ?
357
-
row := e.QueryRow(query, repoAt, pullId)
359
-
var pull models.Pull
360
-
var createdAt string
361
-
var sourceBranch, sourceRepoAt, stackId, changeId, parentChangeId sql.NullString
369
-
&pull.TargetBranch,
249
+
pulls, err := GetPullsWithLimit(e, 1, FilterEq("repo_at", repoAt), FilterEq("pull_id", pullId))
383
-
createdTime, err := time.Parse(time.RFC3339, createdAt)
254
+
return nil, sql.ErrNoRows
387
-
pull.Created = createdTime
390
-
if sourceBranch.Valid {
391
-
pull.PullSource = &models.PullSource{
392
-
Branch: sourceBranch.String,
394
-
if sourceRepoAt.Valid {
395
-
sourceRepoAtParsed, err := syntax.ParseATURI(sourceRepoAt.String)
399
-
pull.PullSource.RepoAt = &sourceRepoAtParsed
257
+
return pulls[0], nil
404
-
pull.StackId = stackId.String
406
-
if changeId.Valid {
407
-
pull.ChangeId = changeId.String
260
+
// mapping from pull -> pull submissions
261
+
func GetPullSubmissions(e Execer, filters ...filter) (map[syntax.ATURI][]*models.PullSubmission, error) {
262
+
var conditions []string
264
+
for _, filter := range filters {
265
+
conditions = append(conditions, filter.Condition())
266
+
args = append(args, filter.Arg()...)
409
-
if parentChangeId.Valid {
410
-
pull.ParentChangeId = parentChangeId.String
270
+
if conditions != nil {
271
+
whereClause = " where " + strings.Join(conditions, " and ")
413
-
submissionsQuery := `
274
+
query := fmt.Sprintf(`
415
-
id, pull_id, repo_at, round_number, patch, created, source_rev
419
-
repo_at = ? and pull_id = ?
421
-
submissionsRows, err := e.Query(submissionsQuery, repoAt, pullId)
289
+
rows, err := e.Query(query, args...)
425
-
defer submissionsRows.Close()
427
-
submissionsMap := make(map[int]*models.PullSubmission)
295
+
submissionMap := make(map[int]*models.PullSubmission)
429
-
for submissionsRows.Next() {
var submission models.PullSubmission
431
-
var submissionCreatedStr string
432
-
var submissionSourceRev sql.NullString
433
-
err := submissionsRows.Scan(
299
+
var createdAt string
300
+
var sourceRev sql.NullString
435
-
&submission.PullId,
436
-
&submission.RepoAt,
303
+
&submission.PullAt,
439
-
&submissionCreatedStr,
440
-
&submissionSourceRev,
446
-
submissionCreatedTime, err := time.Parse(time.RFC3339, submissionCreatedStr)
313
+
createdTime, err := time.Parse(time.RFC3339, createdAt)
450
-
submission.Created = submissionCreatedTime
317
+
submission.Created = createdTime
452
-
if submissionSourceRev.Valid {
453
-
submission.SourceRev = submissionSourceRev.String
319
+
if sourceRev.Valid {
320
+
submission.SourceRev = sourceRev.String
456
-
submissionsMap[submission.ID] = &submission
323
+
submissionMap[submission.ID] = &submission
326
+
if err := rows.Err(); err != nil {
458
-
if err = submissionsRows.Close(); err != nil {
330
+
// Get comments for all submissions using GetPullComments
331
+
submissionIds := slices.Collect(maps.Keys(submissionMap))
332
+
comments, err := GetPullComments(e, FilterIn("submission_id", submissionIds))
461
-
if len(submissionsMap) == 0 {
336
+
for _, comment := range comments {
337
+
if submission, ok := submissionMap[comment.SubmissionId]; ok {
338
+
submission.Comments = append(submission.Comments, comment)
342
+
// order the submissions by pull_at
343
+
m := make(map[syntax.ATURI][]*models.PullSubmission)
344
+
for _, s := range submissionMap {
345
+
m[s.PullAt] = append(m[s.PullAt], s)
351
+
func GetPullComments(e Execer, filters ...filter) ([]models.PullComment, error) {
352
+
var conditions []string
466
-
for k := range submissionsMap {
467
-
args = append(args, k)
354
+
for _, filter := range filters {
355
+
conditions = append(conditions, filter.Condition())
356
+
args = append(args, filter.Arg()...)
469
-
inClause := strings.TrimSuffix(strings.Repeat("?, ", len(submissionsMap)), ", ")
470
-
commentsQuery := fmt.Sprintf(`
360
+
if conditions != nil {
361
+
whereClause = " where " + strings.Join(conditions, " and ")
364
+
query := fmt.Sprintf(`
···
483
-
submission_id IN (%s)
487
-
commentsRows, err := e.Query(commentsQuery, args...)
381
+
rows, err := e.Query(query, args...)
491
-
defer commentsRows.Close()
493
-
for commentsRows.Next() {
387
+
var comments []models.PullComment
var comment models.PullComment
495
-
var commentCreatedStr string
496
-
err := commentsRows.Scan(
390
+
var createdAt string
···
504
-
&commentCreatedStr,
510
-
commentCreatedTime, err := time.Parse(time.RFC3339, commentCreatedStr)
405
+
if t, err := time.Parse(time.RFC3339, createdAt); err == nil {
406
+
comment.Created = t
514
-
comment.Created = commentCreatedTime
516
-
// Add the comment to its submission
517
-
if submission, ok := submissionsMap[comment.SubmissionId]; ok {
518
-
submission.Comments = append(submission.Comments, comment)
522
-
if err = commentsRows.Err(); err != nil {
526
-
var pullSourceRepo *models.Repo
527
-
if pull.PullSource != nil {
528
-
if pull.PullSource.RepoAt != nil {
529
-
pullSourceRepo, err = GetRepoByAtUri(e, pull.PullSource.RepoAt.String())
531
-
log.Printf("failed to get repo by at uri: %v", err)
533
-
pull.PullSource.Repo = pullSourceRepo
409
+
comments = append(comments, comment)
538
-
pull.Submissions = make([]*models.PullSubmission, len(submissionsMap))
539
-
for _, submission := range submissionsMap {
540
-
pull.Submissions[submission.RoundNumber] = submission
412
+
if err := rows.Err(); err != nil {
416
+
return comments, nil
// timeframe here is directly passed into the sql query filter, and any