Skip to content

Commit 083818c

Browse files
authored
Improve loadprojects for issue list (#25468)
1 parent 5eeddfd commit 083818c

File tree

7 files changed

+41
-30
lines changed

7 files changed

+41
-30
lines changed

models/issues/issue_list.go

Lines changed: 20 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -229,39 +229,41 @@ func (issues IssueList) loadMilestones(ctx context.Context) error {
229229
return nil
230230
}
231231

232-
func (issues IssueList) getProjectIDs() []int64 {
233-
ids := make(container.Set[int64], len(issues))
234-
for _, issue := range issues {
235-
ids.Add(issue.ProjectID())
236-
}
237-
return ids.Values()
238-
}
232+
func (issues IssueList) LoadProjects(ctx context.Context) error {
233+
issueIDs := issues.getIssueIDs()
234+
projectMaps := make(map[int64]*project_model.Project, len(issues))
235+
left := len(issueIDs)
239236

240-
func (issues IssueList) loadProjects(ctx context.Context) error {
241-
projectIDs := issues.getProjectIDs()
242-
if len(projectIDs) == 0 {
243-
return nil
237+
type projectWithIssueID struct {
238+
*project_model.Project `xorm:"extends"`
239+
IssueID int64
244240
}
245241

246-
projectMaps := make(map[int64]*project_model.Project, len(projectIDs))
247-
left := len(projectIDs)
248242
for left > 0 {
249243
limit := db.DefaultMaxInSize
250244
if left < limit {
251245
limit = left
252246
}
247+
248+
projects := make([]*projectWithIssueID, 0, limit)
253249
err := db.GetEngine(ctx).
254-
In("id", projectIDs[:limit]).
255-
Find(&projectMaps)
250+
Table("project").
251+
Select("project.*, project_issue.issue_id").
252+
Join("INNER", "project_issue", "project.id = project_issue.project_id").
253+
In("project_issue.issue_id", issueIDs[:limit]).
254+
Find(&projects)
256255
if err != nil {
257256
return err
258257
}
258+
for _, project := range projects {
259+
projectMaps[project.IssueID] = project.Project
260+
}
259261
left -= limit
260-
projectIDs = projectIDs[limit:]
262+
issueIDs = issueIDs[limit:]
261263
}
262264

263265
for _, issue := range issues {
264-
issue.Project = projectMaps[issue.ProjectID()]
266+
issue.Project = projectMaps[issue.ID]
265267
}
266268
return nil
267269
}
@@ -541,7 +543,7 @@ func (issues IssueList) loadAttributes(ctx context.Context) error {
541543
return fmt.Errorf("issue.loadAttributes: loadMilestones: %w", err)
542544
}
543545

544-
if err := issues.loadProjects(ctx); err != nil {
546+
if err := issues.LoadProjects(ctx); err != nil {
545547
return fmt.Errorf("issue.loadAttributes: loadProjects: %w", err)
546548
}
547549

models/issues/issue_list_test.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -66,8 +66,12 @@ func TestIssueList_LoadAttributes(t *testing.T) {
6666
}
6767
if issue.ID == int64(1) {
6868
assert.Equal(t, int64(400), issue.TotalTrackedTime)
69+
assert.NotNil(t, issue.Project)
6970
} else if issue.ID == int64(2) {
7071
assert.Equal(t, int64(3682), issue.TotalTrackedTime)
72+
assert.Nil(t, issue.Project)
73+
} else {
74+
assert.Nil(t, issue.Project)
7175
}
7276
}
7377
}

models/issues/issue_project.go

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -27,11 +27,6 @@ func (issue *Issue) LoadProject(ctx context.Context) (err error) {
2727
return err
2828
}
2929

30-
// ProjectID return project id if issue was assigned to one
31-
func (issue *Issue) ProjectID() int64 {
32-
return issue.projectID(db.DefaultContext)
33-
}
34-
3530
func (issue *Issue) projectID(ctx context.Context) int64 {
3631
var ip project_model.ProjectIssue
3732
has, err := db.GetEngine(ctx).Where("issue_id=?", issue.ID).Get(&ip)

routers/web/org/projects.go

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -383,7 +383,7 @@ func ViewProject(ctx *context.Context) {
383383
ctx.HTML(http.StatusOK, tplProjectsView)
384384
}
385385

386-
func getActionIssues(ctx *context.Context) []*issues_model.Issue {
386+
func getActionIssues(ctx *context.Context) issues_model.IssueList {
387387
commaSeparatedIssueIDs := ctx.FormString("issue_ids")
388388
if len(commaSeparatedIssueIDs) == 0 {
389389
return nil
@@ -429,9 +429,14 @@ func UpdateIssueProject(ctx *context.Context) {
429429
return
430430
}
431431

432+
if err := issues.LoadProjects(ctx); err != nil {
433+
ctx.ServerError("LoadProjects", err)
434+
return
435+
}
436+
432437
projectID := ctx.FormInt64("id")
433438
for _, issue := range issues {
434-
oldProjectID := issue.ProjectID()
439+
oldProjectID := issue.Project.ID
435440
if oldProjectID == projectID {
436441
continue
437442
}

routers/web/repo/issue.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1984,7 +1984,7 @@ func checkIssueRights(ctx *context.Context, issue *issues_model.Issue) {
19841984
}
19851985
}
19861986

1987-
func getActionIssues(ctx *context.Context) []*issues_model.Issue {
1987+
func getActionIssues(ctx *context.Context) issues_model.IssueList {
19881988
commaSeparatedIssueIDs := ctx.FormString("issue_ids")
19891989
if len(commaSeparatedIssueIDs) == 0 {
19901990
return nil
@@ -2749,7 +2749,7 @@ func UpdateIssueStatus(ctx *context.Context) {
27492749
log.Warn("Unrecognized action: %s", action)
27502750
}
27512751

2752-
if _, err := issues_model.IssueList(issues).LoadRepositories(ctx); err != nil {
2752+
if _, err := issues.LoadRepositories(ctx); err != nil {
27532753
ctx.ServerError("LoadRepositories", err)
27542754
return
27552755
}

routers/web/repo/projects.go

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -378,9 +378,14 @@ func UpdateIssueProject(ctx *context.Context) {
378378
return
379379
}
380380

381+
if err := issues.LoadProjects(ctx); err != nil {
382+
ctx.ServerError("LoadProjects", err)
383+
return
384+
}
385+
381386
projectID := ctx.FormInt64("id")
382387
for _, issue := range issues {
383-
oldProjectID := issue.ProjectID()
388+
oldProjectID := issue.Project.ID
384389
if oldProjectID == projectID {
385390
continue
386391
}

templates/repo/issue/view_content/sidebar.tmpl

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -192,9 +192,9 @@
192192
</div>
193193
</div>
194194
<div class="ui select-project list">
195-
<span class="no-select item {{if .Issue.ProjectID}}gt-hidden{{end}}">{{.locale.Tr "repo.issues.new.no_projects"}}</span>
195+
<span class="no-select item {{if .Issue.Project}}gt-hidden{{end}}">{{.locale.Tr "repo.issues.new.no_projects"}}</span>
196196
<div class="selected">
197-
{{if .Issue.ProjectID}}
197+
{{if .Issue.Project}}
198198
<a class="item muted sidebar-item-link" href="{{.Issue.Project.Link}}">
199199
{{svg .Issue.Project.IconName 18 "gt-mr-3"}}{{.Issue.Project.Title}}
200200
</a>

0 commit comments

Comments
 (0)