From a8edb4b1cddb815c33dfd769b2c7fdb8a179aec8 Mon Sep 17 00:00:00 2001 From: Bo-Yi Wu Date: Wed, 15 Feb 2017 09:10:46 +0800 Subject: [PATCH 1/2] refactor: small optimize for sql query --- models/repo.go | 42 ++++++++++++++++++++++-------------------- models/star.go | 8 +++----- routers/home.go | 14 +++----------- 3 files changed, 28 insertions(+), 36 deletions(-) diff --git a/models/repo.go b/models/repo.go index d83c5fd6ab04a..69044afff03f1 100644 --- a/models/repo.go +++ b/models/repo.go @@ -1184,26 +1184,22 @@ func CountUserRepositories(userID int64, private bool) int64 { } // Repositories returns all repositories -func Repositories(opts *SearchRepoOptions) (_ []*Repository, err error) { +func Repositories(opts *SearchRepoOptions) (_ RepositoryList, err error) { if len(opts.OrderBy) == 0 { opts.OrderBy = "id ASC" } - repos := make([]*Repository, 0, opts.PageSize) - return repos, x.Limit(opts.PageSize, (opts.Page-1)*opts.PageSize).OrderBy(opts.OrderBy).Find(&repos) -} + repos := make(RepositoryList, 0, opts.PageSize) -// RepositoriesWithUsers returns number of repos in given page. -func RepositoriesWithUsers(opts *SearchRepoOptions) (_ []*Repository, err error) { - repos, err := Repositories(opts) - if err != nil { - return nil, fmt.Errorf("Repositories: %v", err) + if err = x. + Limit(opts.PageSize, (opts.Page-1)*opts.PageSize). + OrderBy(opts.OrderBy). + Find(&repos); err != nil { + return nil, fmt.Errorf("Repo: %v", err) } - for i := range repos { - if err = repos[i].GetOwner(); err != nil { - return nil, err - } + if err = repos.loadAttributes(x); err != nil { + return nil, fmt.Errorf("LoadAttributes: %v", err) } return repos, nil @@ -1716,7 +1712,7 @@ func GetUserMirrorRepositories(userID int64) ([]*Repository, error) { } // GetRecentUpdatedRepositories returns the list of repositories that are recently updated. -func GetRecentUpdatedRepositories(opts *SearchRepoOptions) (repos []*Repository, err error) { +func GetRecentUpdatedRepositories(opts *SearchRepoOptions) (repos RepositoryList, err error) { if len(opts.OrderBy) == 0 { opts.OrderBy = "updated_unix DESC" } @@ -1739,9 +1735,17 @@ func GetRecentUpdatedRepositories(opts *SearchRepoOptions) (repos []*Repository, } } - return repos, sess. + if err = sess. OrderBy(opts.OrderBy). - Find(&repos) + Find(&repos); err != nil { + return nil, fmt.Errorf("Repo: %v", err) + } + + if err = repos.loadAttributes(x); err != nil { + return nil, fmt.Errorf("LoadAttributes: %v", err) + } + + return repos, nil } func getRepositoryCount(e Engine, u *User) (int64, error) { @@ -1848,10 +1852,8 @@ func SearchRepositoryByName(opts *SearchRepoOptions) (repos RepositoryList, _ in return nil, 0, fmt.Errorf("Repo: %v", err) } - if opts.Starred { - if err = repos.loadAttributes(x); err != nil { - return nil, 0, fmt.Errorf("LoadAttributes: %v", err) - } + if err = repos.loadAttributes(x); err != nil { + return nil, 0, fmt.Errorf("LoadAttributes: %v", err) } return repos, count, nil diff --git a/models/star.go b/models/star.go index 7525c8a6fa8d4..96f876ba0a8f2 100644 --- a/models/star.go +++ b/models/star.go @@ -71,7 +71,7 @@ func (repo *Repository) GetStargazers(page int) ([]*User, error) { } // GetStarredRepos returns the repos the user starred. -func (u *User) GetStarredRepos(private bool, page, pageSize int, orderBy string) (repos []*Repository, err error) { +func (u *User) GetStarredRepos(private bool, page, pageSize int, orderBy string) (repos RepositoryList, err error) { if len(orderBy) == 0 { orderBy = "updated_unix DESC" } @@ -95,10 +95,8 @@ func (u *User) GetStarredRepos(private bool, page, pageSize int, orderBy string) return } - for _, repo := range repos { - if err = repo.GetOwner(); err != nil { - return - } + if err = repos.loadAttributes(x); err != nil { + return } return diff --git a/routers/home.go b/routers/home.go index 6f211f4f62c25..3de32b52e72df 100644 --- a/routers/home.go +++ b/routers/home.go @@ -6,16 +6,15 @@ package routers import ( "bytes" - "fmt" "strings" - "github.com/Unknwon/paginater" - "code.gitea.io/gitea/models" "code.gitea.io/gitea/modules/base" "code.gitea.io/gitea/modules/context" "code.gitea.io/gitea/modules/setting" "code.gitea.io/gitea/routers/user" + + "github.com/Unknwon/paginater" ) const ( @@ -55,7 +54,7 @@ func Home(ctx *context.Context) { // RepoSearchOptions when calling search repositories type RepoSearchOptions struct { Counter func(bool) int64 - Ranger func(*models.SearchRepoOptions) ([]*models.Repository, error) + Ranger func(*models.SearchRepoOptions) (models.RepositoryList, error) Searcher *models.User Private bool PageSize int @@ -132,13 +131,6 @@ func RenderRepoSearch(ctx *context.Context, opts *RepoSearchOptions) { ctx.Data["Keyword"] = keyword ctx.Data["Total"] = count ctx.Data["Page"] = paginater.New(int(count), opts.PageSize, page, 5) - - for _, repo := range repos { - if err = repo.GetOwner(); err != nil { - ctx.Handle(500, "GetOwner", fmt.Errorf("%d: %v", repo.ID, err)) - return - } - } ctx.Data["Repos"] = repos ctx.HTML(200, opts.TplName) From aa9fac15fc3d44e5aa221e8681e364f5ac1658b1 Mon Sep 17 00:00:00 2001 From: Bo-Yi Wu Date: Wed, 15 Feb 2017 10:22:08 +0800 Subject: [PATCH 2/2] fix: get owner name if Searcher is not nil or user star page. --- models/repo.go | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/models/repo.go b/models/repo.go index 69044afff03f1..5ce337a651468 100644 --- a/models/repo.go +++ b/models/repo.go @@ -1198,8 +1198,10 @@ func Repositories(opts *SearchRepoOptions) (_ RepositoryList, err error) { return nil, fmt.Errorf("Repo: %v", err) } - if err = repos.loadAttributes(x); err != nil { - return nil, fmt.Errorf("LoadAttributes: %v", err) + if opts.Searcher != nil || opts.Starred { + if err = repos.loadAttributes(x); err != nil { + return nil, fmt.Errorf("LoadAttributes: %v", err) + } } return repos, nil @@ -1741,8 +1743,10 @@ func GetRecentUpdatedRepositories(opts *SearchRepoOptions) (repos RepositoryList return nil, fmt.Errorf("Repo: %v", err) } - if err = repos.loadAttributes(x); err != nil { - return nil, fmt.Errorf("LoadAttributes: %v", err) + if opts.Searcher != nil || opts.Starred { + if err = repos.loadAttributes(x); err != nil { + return nil, fmt.Errorf("LoadAttributes: %v", err) + } } return repos, nil @@ -1852,8 +1856,10 @@ func SearchRepositoryByName(opts *SearchRepoOptions) (repos RepositoryList, _ in return nil, 0, fmt.Errorf("Repo: %v", err) } - if err = repos.loadAttributes(x); err != nil { - return nil, 0, fmt.Errorf("LoadAttributes: %v", err) + if opts.Searcher != nil || opts.Starred { + if err = repos.loadAttributes(x); err != nil { + return nil, 0, fmt.Errorf("LoadAttributes: %v", err) + } } return repos, count, nil