Skip to content

Commit b1537d4

Browse files
Simplify function GetReviewersByIssueID
1 parent 2187c6f commit b1537d4

File tree

4 files changed

+43
-62
lines changed

4 files changed

+43
-62
lines changed

models/review.go

Lines changed: 15 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,6 @@ import (
1010
"code.gitea.io/gitea/modules/timeutil"
1111

1212
"xorm.io/builder"
13-
"xorm.io/core"
1413
)
1514

1615
// ReviewType defines the sort of feedback a review gives
@@ -332,47 +331,25 @@ func SubmitReview(doer *User, issue *Issue, reviewType ReviewType, content strin
332331
return review, comm, sess.Commit()
333332
}
334333

335-
// PullReviewersWithType represents the type used to display a review overview
336-
type PullReviewersWithType struct {
337-
User `xorm:"extends"`
338-
Type ReviewType
339-
Official bool
340-
ReviewUpdatedUnix timeutil.TimeStamp `xorm:"review_updated_unix"`
341-
}
334+
// GetReviewersByIssueID gets the latest review of each reviewer for a pull request
335+
func GetReviewersByIssueID(issueID int64) (reviews []*Review, err error) {
336+
sess := x.NewSession()
337+
defer sess.Close()
338+
if err := sess.Begin(); err != nil {
339+
return nil, err
340+
}
342341

343-
// GetReviewersByPullID gets all reviewers for a pull request with the statuses
344-
func GetReviewersByPullID(pullID int64) (issueReviewers []*PullReviewersWithType, err error) {
345-
irs := []*PullReviewersWithType{}
346-
if x.Dialect().DBType() == core.MSSQL {
347-
err = x.SQL(`SELECT [user].*, review.type, review.official, review.review_updated_unix FROM
348-
(SELECT review.id, review.type, review.reviewer_id, review.official, max(review.updated_unix) as review_updated_unix
349-
FROM review WHERE review.issue_id=? AND (review.type = ? OR review.type = ?)
350-
GROUP BY review.id, review.type, review.reviewer_id, review.official) as review
351-
INNER JOIN [user] ON review.reviewer_id = [user].id ORDER BY review_updated_unix DESC`,
352-
pullID, ReviewTypeApprove, ReviewTypeReject).
353-
Find(&irs)
354-
} else {
355-
err = x.Select("`user`.*, review.type, review.official, max(review.updated_unix) as review_updated_unix").
356-
Table("review").
357-
Join("INNER", "`user`", "review.reviewer_id = `user`.id").
358-
Where("review.issue_id = ? AND (review.type = ? OR review.type = ?)",
359-
pullID, ReviewTypeApprove, ReviewTypeReject).
360-
GroupBy("`user`.id, review.type, review.official").
361-
OrderBy("review_updated_unix DESC").
362-
Find(&irs)
342+
if err := sess.SQL("SELECT * FROM review WHERE id IN (SELECT max(id) as id FROM review WHERE issue_id = ? AND type in (?, ?) GROUP BY issue_id, reviewer_id) ORDER BY review.updated_unix ASC",
343+
issueID, ReviewTypeApprove, ReviewTypeReject).
344+
Find(&reviews); err != nil {
345+
return nil, err
363346
}
364347

365-
// We need to group our results by the fields we want, otherwise some databases will fail (only_full_group_by).
366-
// But becaus we're doing this, we need to manually filter out multiple reviews of different types by the
367-
// same person because we only want to show the newest review grouped by user. Thats why we're using a map here.
368-
issueReviewers = []*PullReviewersWithType{}
369-
usersInArray := make(map[int64]bool)
370-
for _, ir := range irs {
371-
if !usersInArray[ir.ID] {
372-
issueReviewers = append(issueReviewers, ir)
373-
usersInArray[ir.ID] = true
348+
for _, review := range reviews {
349+
if err := review.loadReviewer(sess); err != nil {
350+
return nil, err
374351
}
375352
}
376353

377-
return
354+
return reviews, nil
378355
}

models/review_test.go

Lines changed: 20 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -98,32 +98,36 @@ func TestCreateReview(t *testing.T) {
9898
AssertExistsAndLoadBean(t, &Review{Content: "New Review"})
9999
}
100100

101-
func TestGetReviewersByPullID(t *testing.T) {
101+
func TestGetReviewersByIssueID(t *testing.T) {
102102
assert.NoError(t, PrepareTestDatabase())
103103

104104
issue := AssertExistsAndLoadBean(t, &Issue{ID: 3}).(*Issue)
105105
user2 := AssertExistsAndLoadBean(t, &User{ID: 2}).(*User)
106106
user3 := AssertExistsAndLoadBean(t, &User{ID: 3}).(*User)
107107
user4 := AssertExistsAndLoadBean(t, &User{ID: 4}).(*User)
108108

109-
expectedReviews := []*PullReviewersWithType{}
110-
expectedReviews = append(expectedReviews, &PullReviewersWithType{
111-
User: *user2,
112-
Type: ReviewTypeReject,
113-
ReviewUpdatedUnix: 946684810,
109+
expectedReviews := []*Review{}
110+
expectedReviews = append(expectedReviews, &Review{
111+
Reviewer: user2,
112+
Type: ReviewTypeReject,
113+
UpdatedUnix: 946684810,
114114
},
115-
&PullReviewersWithType{
116-
User: *user3,
117-
Type: ReviewTypeReject,
118-
ReviewUpdatedUnix: 946684810,
115+
&Review{
116+
Reviewer: user3,
117+
Type: ReviewTypeReject,
118+
UpdatedUnix: 946684810,
119119
},
120-
&PullReviewersWithType{
121-
User: *user4,
122-
Type: ReviewTypeApprove,
123-
ReviewUpdatedUnix: 946684810,
120+
&Review{
121+
Reviewer: user4,
122+
Type: ReviewTypeApprove,
123+
UpdatedUnix: 946684810,
124124
})
125125

126-
allReviews, err := GetReviewersByPullID(issue.ID)
126+
allReviews, err := GetReviewersByIssueID(issue.ID)
127127
assert.NoError(t, err)
128-
assert.Equal(t, expectedReviews, allReviews)
128+
for i, review := range allReviews {
129+
assert.Equal(t, expectedReviews[i].Reviewer, review.Reviewer)
130+
assert.Equal(t, expectedReviews[i].Type, review.Type)
131+
assert.Equal(t, expectedReviews[i].UpdatedUnix, review.UpdatedUnix)
132+
}
129133
}

routers/repo/issue.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -934,9 +934,9 @@ func ViewIssue(ctx *context.Context) {
934934
}
935935
ctx.Data["IsPullBranchDeletable"] = canDelete && pull.HeadRepo != nil && git.IsBranchExist(pull.HeadRepo.RepoPath(), pull.HeadBranch)
936936

937-
ctx.Data["PullReviewersWithType"], err = models.GetReviewersByPullID(issue.ID)
937+
ctx.Data["PullReviewers"], err = models.GetReviewersByIssueID(issue.ID)
938938
if err != nil {
939-
ctx.ServerError("GetReviewersByPullID", err)
939+
ctx.ServerError("GetReviewersByIssueID", err)
940940
return
941941
}
942942
}

templates/repo/issue/view_content/pull.tmpl

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
1-
{{if gt (len .PullReviewersWithType) 0}}
1+
{{if gt (len .PullReviewers) 0}}
22
<div class="comment box">
33
<div class="content">
44
<div class="ui segment">
55
<h4>{{$.i18n.Tr "repo.issues.review.reviewers"}}</h4>
6-
{{range .PullReviewersWithType}}
7-
{{ $createdStr:= TimeSinceUnix .ReviewUpdatedUnix $.Lang }}
6+
{{range .PullReviewers}}
7+
{{ $createdStr:= TimeSinceUnix .UpdatedUnix $.Lang }}
88
<div class="ui divider"></div>
99
<div class="review-item">
1010
<span class="type-icon text {{if eq .Type 1}}green
@@ -13,10 +13,10 @@
1313
{{else}}grey{{end}}">
1414
<span class="octicon octicon-{{.Type.Icon}}"></span>
1515
</span>
16-
<a class="ui avatar image" href="{{.HomeLink}}">
17-
<img src="{{.RelAvatarLink}}">
16+
<a class="ui avatar image" href="{{.Reviewer.HomeLink}}">
17+
<img src="{{.Reviewer.RelAvatarLink}}">
1818
</a>
19-
<span class="text grey"><a href="{{.HomeLink}}">{{.Name}}</a>
19+
<span class="text grey"><a href="{{.Reviewer.HomeLink}}">{{.Reviewer.Name}}</a>
2020
{{if eq .Type 1}}
2121
{{$.i18n.Tr "repo.issues.review.approve" $createdStr | Safe}}
2222
{{else if eq .Type 2}}

0 commit comments

Comments
 (0)