diff options
author | Lunny Xiao <xiaolunwen@gmail.com> | 2023-06-24 23:31:28 +0800 |
---|---|---|
committer | GitHub <noreply@github.com> | 2023-06-24 15:31:28 +0000 |
commit | 083818cb85f87e3adb0952f25d8fb2c2107364e2 (patch) | |
tree | 9fe820b4089dd3048f84062749da60caca8dce3f /models/issues/issue_list.go | |
parent | 5eeddfde10302634bb7f90a81422becfdbc1e17e (diff) | |
download | gitea-083818cb85f87e3adb0952f25d8fb2c2107364e2.tar.gz gitea-083818cb85f87e3adb0952f25d8fb2c2107364e2.zip |
Improve loadprojects for issue list (#25468)
Diffstat (limited to 'models/issues/issue_list.go')
-rw-r--r-- | models/issues/issue_list.go | 38 |
1 files changed, 20 insertions, 18 deletions
diff --git a/models/issues/issue_list.go b/models/issues/issue_list.go index dad21c1477..9cc41ec6ab 100644 --- a/models/issues/issue_list.go +++ b/models/issues/issue_list.go @@ -229,39 +229,41 @@ func (issues IssueList) loadMilestones(ctx context.Context) error { return nil } -func (issues IssueList) getProjectIDs() []int64 { - ids := make(container.Set[int64], len(issues)) - for _, issue := range issues { - ids.Add(issue.ProjectID()) - } - return ids.Values() -} +func (issues IssueList) LoadProjects(ctx context.Context) error { + issueIDs := issues.getIssueIDs() + projectMaps := make(map[int64]*project_model.Project, len(issues)) + left := len(issueIDs) -func (issues IssueList) loadProjects(ctx context.Context) error { - projectIDs := issues.getProjectIDs() - if len(projectIDs) == 0 { - return nil + type projectWithIssueID struct { + *project_model.Project `xorm:"extends"` + IssueID int64 } - projectMaps := make(map[int64]*project_model.Project, len(projectIDs)) - left := len(projectIDs) for left > 0 { limit := db.DefaultMaxInSize if left < limit { limit = left } + + projects := make([]*projectWithIssueID, 0, limit) err := db.GetEngine(ctx). - In("id", projectIDs[:limit]). - Find(&projectMaps) + Table("project"). + Select("project.*, project_issue.issue_id"). + Join("INNER", "project_issue", "project.id = project_issue.project_id"). + In("project_issue.issue_id", issueIDs[:limit]). + Find(&projects) if err != nil { return err } + for _, project := range projects { + projectMaps[project.IssueID] = project.Project + } left -= limit - projectIDs = projectIDs[limit:] + issueIDs = issueIDs[limit:] } for _, issue := range issues { - issue.Project = projectMaps[issue.ProjectID()] + issue.Project = projectMaps[issue.ID] } return nil } @@ -541,7 +543,7 @@ func (issues IssueList) loadAttributes(ctx context.Context) error { return fmt.Errorf("issue.loadAttributes: loadMilestones: %w", err) } - if err := issues.loadProjects(ctx); err != nil { + if err := issues.LoadProjects(ctx); err != nil { return fmt.Errorf("issue.loadAttributes: loadProjects: %w", err) } |