Skip to content

Commit f3a43b4

Browse files
committed
use GetLatestCommitStatuses instead GetLatestCommitStatus to reduce db operations
1 parent deb88a4 commit f3a43b4

File tree

5 files changed

+102
-15
lines changed

5 files changed

+102
-15
lines changed

models/status.go

Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ package models
66

77
import (
88
"container/list"
9+
"errors"
910
"fmt"
1011
"strings"
1112

@@ -15,6 +16,7 @@ import (
1516
"code.gitea.io/gitea/modules/util"
1617
api "code.gitea.io/sdk/gitea"
1718

19+
"github.com/go-xorm/builder"
1820
"github.com/go-xorm/xorm"
1921
)
2022

@@ -157,6 +159,59 @@ func GetLatestCommitStatus(repo *Repository, sha string, page int) ([]*CommitSta
157159
return statuses, x.In("id", ids).Find(&statuses)
158160
}
159161

162+
// GetLatestCommitStatuses returns all statuses with given repoIDs and shas
163+
func GetLatestCommitStatuses(repoIDs []int64, shas []string) ([][]*CommitStatus, error) {
164+
if len(repoIDs) != len(shas) {
165+
return nil, errors.New("parameter repoIDs should have the same size of shas")
166+
}
167+
168+
var results = make([]struct {
169+
ID int64
170+
RepoID int64
171+
}, 0, 10*len(repoIDs))
172+
173+
var cond = builder.NewCond()
174+
for i := 0; i < len(repoIDs); i++ {
175+
cond = cond.Or(builder.Eq{
176+
"repo_id": repoIDs[i],
177+
"sha": shas[i],
178+
})
179+
}
180+
181+
err := x.Table(&CommitStatus{}).
182+
Where(cond).
183+
Select("max( id ) as id, repo_id").
184+
GroupBy("context").OrderBy("max( id ) desc").Find(&results)
185+
if err != nil {
186+
return nil, err
187+
}
188+
189+
var returns = make([][]*CommitStatus, len(repoIDs))
190+
if len(results) == 0 {
191+
return returns, nil
192+
}
193+
194+
var ids = make([]int64, 0, len(results))
195+
var repoIDsMap = make(map[int64][]int64, len(repoIDs))
196+
for _, res := range results {
197+
ids = append(ids, res.ID)
198+
repoIDsMap[res.RepoID] = append(repoIDsMap[res.RepoID], res.ID)
199+
}
200+
201+
statuses := make(map[int64]*CommitStatus, len(ids))
202+
err = x.In("id", ids).Find(&statuses)
203+
if err != nil {
204+
return nil, err
205+
}
206+
207+
for i := 0; i < len(repoIDs); i++ {
208+
for _, id := range repoIDsMap[repoIDs[i]] {
209+
returns[i] = append(returns[i], statuses[id])
210+
}
211+
}
212+
return returns, nil
213+
}
214+
160215
// GetCommitStatus populates a given status for a given commit.
161216
// NOTE: If ID or Index isn't given, and only Context, TargetURL and/or Description
162217
// is given, the CommitStatus created _last_ will be returned.

routers/repo/issue.go

Lines changed: 21 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -186,7 +186,9 @@ func issues(ctx *context.Context, milestoneID int64, isPullOption util.OptionalB
186186
}
187187
}
188188

189-
var issuesStates = make([]*models.CommitStatus, 0, len(issues))
189+
var repoIDs = make([]int64, 0, len(issues))
190+
var shas = make([]string, 0, len(issues))
191+
var pullIDs = make([]int64, 0, len(issues))
190192
// Get posters.
191193
for i, issue := range issues {
192194
// Check read status
@@ -198,15 +200,28 @@ func issues(ctx *context.Context, milestoneID int64, isPullOption util.OptionalB
198200
}
199201

200202
if issue.IsPull {
201-
issue.LoadAttributes()
202-
statuses, err := models.GetLatestCommitStatus(ctx.Repo.Repository, issue.PullRequest.MergeBase, 0)
203-
if err != nil {
204-
log.Error(3, "GetLatestCommitStatus: %v", err)
203+
if err := issue.LoadAttributes(); err != nil {
204+
ctx.ServerError("LoadAttributes", err)
205+
return
205206
}
206207

207-
issuesStates = append(issuesStates, models.CalcCommitStatus(statuses))
208+
repoIDs = append(repoIDs, ctx.Repo.Repository.ID)
209+
shas = append(shas, issue.PullRequest.MergeBase)
210+
pullIDs = append(pullIDs, issue.ID)
208211
}
209212
}
213+
214+
commitStatuses, err := models.GetLatestCommitStatuses(repoIDs, shas)
215+
if err != nil {
216+
ctx.ServerError("GetLatestCommitStatuses", err)
217+
return
218+
}
219+
220+
var issuesStates = make(map[int64]*models.CommitStatus, len(issues))
221+
for i, statuses := range commitStatuses {
222+
issuesStates[pullIDs[i]] = models.CalcCommitStatus(statuses)
223+
}
224+
210225
ctx.Data["Issues"] = issues
211226
ctx.Data["IssuesStates"] = issuesStates
212227

routers/user/home.go

Lines changed: 22 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,6 @@ import (
1212
"code.gitea.io/gitea/models"
1313
"code.gitea.io/gitea/modules/base"
1414
"code.gitea.io/gitea/modules/context"
15-
"code.gitea.io/gitea/modules/log"
1615
"code.gitea.io/gitea/modules/setting"
1716
"code.gitea.io/gitea/modules/util"
1817

@@ -306,21 +305,37 @@ func Issues(ctx *context.Context) {
306305
return
307306
}
308307

309-
var issuesStates = make([]*models.CommitStatus, 0, len(issues))
308+
var repoIDs = make([]int64, 0, len(issues))
309+
var shas = make([]string, 0, len(issues))
310+
var pullIDs = make([]int64, 0, len(issues))
310311
for _, issue := range issues {
311312
issue.Repo = showReposMap[issue.RepoID]
312313

313314
if issue.IsPull {
314-
issue.LoadAttributes()
315-
statuses, err := models.GetLatestCommitStatus(issue.Repo, issue.PullRequest.MergeBase, 0)
316-
if err != nil {
317-
log.Error(3, "GetLatestCommitStatus: %v", err)
315+
if err := issue.LoadAttributes(); err != nil {
316+
ctx.ServerError("LoadAttributes", fmt.Errorf("%v", err))
317+
return
318318
}
319319

320-
issuesStates = append(issuesStates, models.CalcCommitStatus(statuses))
320+
repoIDs = append(repoIDs, issue.Repo.ID)
321+
shas = append(shas, issue.PullRequest.MergeBase)
322+
pullIDs = append(pullIDs, issue.ID)
321323
}
322324
}
323325

326+
commitStatuses, err := models.GetLatestCommitStatuses(repoIDs, shas)
327+
if err != nil {
328+
ctx.ServerError("GetLatestCommitStatuses", err)
329+
return
330+
}
331+
332+
var issuesStates = make(map[int64]*models.CommitStatus, len(issues))
333+
for i, statuses := range commitStatuses {
334+
issuesStates[pullIDs[i]] = models.CalcCommitStatus(statuses)
335+
}
336+
337+
ctx.Data["IssuesStates"] = issuesStates
338+
324339
issueStats, err := models.GetUserIssueStats(models.UserIssueStatsOptions{
325340
UserID: ctxUser.ID,
326341
RepoID: repoID,

templates/repo/issue/list.tmpl

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -187,7 +187,7 @@
187187
<div class="ui {{if $issue.IsRead}}black{{else}}green{{end}} label">#{{$issue.Index}}</div>
188188
<a class="title has-emoji" href="{{$.Link}}/{{$issue.Index}}">{{$issue.Title}}</a>
189189
{{if $issue.IsPull}}
190-
{{template "repo/commit_status" (index $.IssuesStates $index)}}
190+
{{template "repo/commit_status" (index $.IssuesStates $issue.ID)}}
191191
{{end}}
192192
{{if $issue.Ref}}
193193
<a class="ui label" href="{{$.RepoLink}}/src/branch/{{$issue.Ref}}">{{$issue.Ref}}</a>

templates/user/dashboard/issues.tmpl

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,9 @@
6363
<li class="item">
6464
<div class="ui label">{{if not $.RepoID}}{{$issue.Repo.FullName}}{{end}}#{{$issue.Index}}</div>
6565
<a class="title has-emoji" href="{{AppSubUrl}}/{{$issue.Repo.Owner.Name}}/{{$issue.Repo.Name}}/issues/{{$issue.Index}}">{{$issue.Title}}</a>
66-
66+
{{if $issue.IsPull}}
67+
{{template "repo/commit_status" (index $.IssuesStates $issue.ID)}}
68+
{{end}}
6769
{{with $issue.Labels}}
6870
{{/* If we have any labels, we should show them
6971
with a 2.5 line height, this way they don't look

0 commit comments

Comments
 (0)