Skip to content

Commit 12af8c7

Browse files
committed
Use batch database operations instead of one by one to optimze api pulls
1 parent 79d593a commit 12af8c7

File tree

5 files changed

+330
-41
lines changed

5 files changed

+330
-41
lines changed

models/issues/pull_list.go

Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ import (
1616
"code.gitea.io/gitea/modules/log"
1717
"code.gitea.io/gitea/modules/util"
1818

19+
"xorm.io/builder"
1920
"xorm.io/xorm"
2021
)
2122

@@ -240,6 +241,65 @@ func (prs PullRequestList) GetIssueIDs() []int64 {
240241
})
241242
}
242243

244+
func (prs PullRequestList) LoadReviewCommentsCounts(ctx context.Context) (map[int64]int, error) {
245+
issueIDs := prs.GetIssueIDs()
246+
countsMap := make(map[int64]int, len(issueIDs))
247+
counts := make([]struct {
248+
IssueID int64
249+
Count int
250+
}, 0, len(issueIDs))
251+
if err := db.GetEngine(ctx).Select("issue_id, count(*) as count").
252+
Table("comment").In("issue_id", issueIDs).And("type = ?", CommentTypeReview).
253+
GroupBy("issue_id").Find(&counts); err != nil {
254+
return nil, err
255+
}
256+
for _, c := range counts {
257+
countsMap[c.IssueID] = c.Count
258+
}
259+
return countsMap, nil
260+
}
261+
262+
func (prs PullRequestList) LoadReviews(ctx context.Context) (ReviewList, error) {
263+
issueIDs := prs.GetIssueIDs()
264+
reviews := make([]*Review, 0, len(issueIDs))
265+
266+
subQuery := builder.Select("max(id) as id").
267+
From("review").
268+
Where(builder.In("issue_id", issueIDs)).
269+
And(builder.In("`type`", ReviewTypeApprove, ReviewTypeReject, ReviewTypeRequest)).
270+
And(builder.Eq{
271+
"dismissed": false,
272+
"original_author_id": 0,
273+
"reviewer_team_id": 0,
274+
}).
275+
GroupBy("issue_id, reviewer_id")
276+
// Get latest review of each reviewer, sorted in order they were made
277+
if err := db.GetEngine(ctx).In("id", subQuery).OrderBy("review.updated_unix ASC").Find(&reviews); err != nil {
278+
return nil, err
279+
}
280+
281+
teamReviewRequests := make([]*Review, 0, 5)
282+
subQueryTeam := builder.Select("max(id) as id").
283+
From("review").
284+
Where(builder.In("issue_id", issueIDs)).
285+
And(builder.Eq{
286+
"original_author_id": 0,
287+
}).And(builder.Neq{
288+
"reviewer_team_id": 0,
289+
}).
290+
GroupBy("issue_id, reviewer_team_id").
291+
OrderBy("review.updated_unix ASC")
292+
if err := db.GetEngine(ctx).In("id", subQueryTeam).Find(&teamReviewRequests); err != nil {
293+
return nil, err
294+
}
295+
296+
if len(teamReviewRequests) > 0 {
297+
reviews = append(reviews, teamReviewRequests...)
298+
}
299+
300+
return reviews, nil
301+
}
302+
243303
// HasMergedPullRequestInRepo returns whether the user(poster) has merged pull-request in the repo
244304
func HasMergedPullRequestInRepo(ctx context.Context, repoID, posterID int64) (bool, error) {
245305
return db.GetEngine(ctx).

models/issues/review_list.go

Lines changed: 3 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -47,14 +47,9 @@ func (reviews ReviewList) LoadReviewersTeams(ctx context.Context) error {
4747
}
4848
}
4949

50-
teamsMap := make(map[int64]*organization_model.Team, 0)
51-
for _, teamID := range reviewersTeamsIDs {
52-
team, err := organization_model.GetTeamByID(ctx, teamID)
53-
if err != nil {
54-
return err
55-
}
56-
57-
teamsMap[teamID] = team
50+
teamsMap, err := organization_model.GetTeamsByIDs(ctx, reviewersTeamsIDs)
51+
if err != nil {
52+
return err
5853
}
5954

6055
for _, review := range reviews {

models/organization/team_list.go

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -131,3 +131,8 @@ func GetTeamsByOrgIDs(ctx context.Context, orgIDs []int64) (TeamList, error) {
131131
teams := make([]*Team, 0, 10)
132132
return teams, db.GetEngine(ctx).Where(builder.In("org_id", orgIDs)).Find(&teams)
133133
}
134+
135+
func GetTeamsByIDs(ctx context.Context, teamIDs []int64) (map[int64]*Team, error) {
136+
teams := make(map[int64]*Team, len(teamIDs))
137+
return teams, db.GetEngine(ctx).Where(builder.In("`id`", teamIDs)).Find(&teams)
138+
}

routers/api/v1/repo/pull.go

Lines changed: 2 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -139,42 +139,11 @@ func ListPullRequests(ctx *context.APIContext) {
139139
return
140140
}
141141

142-
apiPrs := make([]*api.PullRequest, len(prs))
143-
// NOTE: load repository first, so that issue.Repo will be filled with pr.BaseRepo
144-
if err := prs.LoadRepositories(ctx); err != nil {
145-
ctx.Error(http.StatusInternalServerError, "LoadRepositories", err)
146-
return
147-
}
148-
issueList, err := prs.LoadIssues(ctx)
142+
apiPrs, err := convert.ToAPIPullRequests(ctx, ctx.Repo.Repository, prs, ctx.Doer)
149143
if err != nil {
150-
ctx.Error(http.StatusInternalServerError, "LoadIssues", err)
151-
return
152-
}
153-
154-
if err := issueList.LoadLabels(ctx); err != nil {
155-
ctx.Error(http.StatusInternalServerError, "LoadLabels", err)
156-
return
157-
}
158-
if err := issueList.LoadPosters(ctx); err != nil {
159-
ctx.Error(http.StatusInternalServerError, "LoadPoster", err)
144+
ctx.Error(http.StatusInternalServerError, "ToAPIPullRequests", err)
160145
return
161146
}
162-
if err := issueList.LoadAttachments(ctx); err != nil {
163-
ctx.Error(http.StatusInternalServerError, "LoadAttachments", err)
164-
return
165-
}
166-
if err := issueList.LoadMilestones(ctx); err != nil {
167-
ctx.Error(http.StatusInternalServerError, "LoadMilestones", err)
168-
return
169-
}
170-
if err := issueList.LoadAssignees(ctx); err != nil {
171-
ctx.Error(http.StatusInternalServerError, "LoadAssignees", err)
172-
return
173-
}
174-
175-
for i := range prs {
176-
apiPrs[i] = convert.ToAPIPullRequest(ctx, prs[i], ctx.Doer)
177-
}
178147

179148
ctx.SetLinkHeader(int(maxResults), listOptions.PageSize)
180149
ctx.SetTotalCountHeader(maxResults)

0 commit comments

Comments
 (0)