diff options
author | Bo-Yi Wu <appleboy.tw@gmail.com> | 2018-09-13 10:33:48 +0800 |
---|---|---|
committer | GitHub <noreply@github.com> | 2018-09-13 10:33:48 +0800 |
commit | ea20adaa84cbff762fcaa7f2d5fa6b7bf56706ec (patch) | |
tree | c2d09da1dcb0a00654963b30dbf5eeb152c83857 /models/repo_list.go | |
parent | 7dd93b2441fc4eac89ccf6b919bf46823334c8bf (diff) | |
download | gitea-ea20adaa84cbff762fcaa7f2d5fa6b7bf56706ec.tar.gz gitea-ea20adaa84cbff762fcaa7f2d5fa6b7bf56706ec.zip |
feat(repo): support search repository by topic name (#4505)
* feat(repo): support search repository by topic name
Diffstat (limited to 'models/repo_list.go')
-rw-r--r-- | models/repo_list.go | 33 |
1 files changed, 30 insertions, 3 deletions
diff --git a/models/repo_list.go b/models/repo_list.go index b1527b73c9..c7e292d8a9 100644 --- a/models/repo_list.go +++ b/models/repo_list.go @@ -131,6 +131,8 @@ type SearchRepoOptions struct { // True -> include just mirrors // False -> include just non-mirrors Mirror util.OptionalBool + // only search topic name + TopicOnly bool } //SearchOrderBy is used to sort the result @@ -184,7 +186,7 @@ func SearchRepositoryByName(opts *SearchRepoOptions) (RepositoryList, int64, err if opts.Collaborate != util.OptionalBoolFalse { collaborateCond := builder.And( - builder.Expr("id IN (SELECT repo_id FROM `access` WHERE access.user_id = ?)", opts.OwnerID), + builder.Expr("repository.id IN (SELECT repo_id FROM `access` WHERE access.user_id = ?)", opts.OwnerID), builder.Neq{"owner_id": opts.OwnerID}) if !opts.Private { collaborateCond = collaborateCond.And(builder.Expr("owner_id NOT IN (SELECT org_id FROM org_user WHERE org_user.uid = ? AND org_user.is_public = ?)", opts.OwnerID, false)) @@ -202,7 +204,14 @@ func SearchRepositoryByName(opts *SearchRepoOptions) (RepositoryList, int64, err } if opts.Keyword != "" { - cond = cond.And(builder.Like{"lower_name", strings.ToLower(opts.Keyword)}) + var keywordCond = builder.NewCond() + if opts.TopicOnly { + keywordCond = keywordCond.Or(builder.Like{"topic.name", strings.ToLower(opts.Keyword)}) + } else { + keywordCond = keywordCond.Or(builder.Like{"lower_name", strings.ToLower(opts.Keyword)}) + keywordCond = keywordCond.Or(builder.Like{"topic.name", strings.ToLower(opts.Keyword)}) + } + cond = cond.And(keywordCond) } if opts.Fork != util.OptionalBoolNone { @@ -224,9 +233,15 @@ func SearchRepositoryByName(opts *SearchRepoOptions) (RepositoryList, int64, err sess.Join("INNER", "star", "star.repo_id = repository.id") } + if opts.Keyword != "" { + sess.Join("LEFT", "repo_topic", "repo_topic.repo_id = repository.id") + sess.Join("LEFT", "topic", "repo_topic.topic_id = topic.id") + } + count, err := sess. Where(cond). Count(new(Repository)) + if err != nil { return nil, 0, fmt.Errorf("Count: %v", err) } @@ -236,11 +251,23 @@ func SearchRepositoryByName(opts *SearchRepoOptions) (RepositoryList, int64, err sess.Join("INNER", "star", "star.repo_id = repository.id") } + if opts.Keyword != "" { + sess.Join("LEFT", "repo_topic", "repo_topic.repo_id = repository.id") + sess.Join("LEFT", "topic", "repo_topic.topic_id = topic.id") + } + + if opts.Keyword != "" { + sess.Select("repository.*") + sess.GroupBy("repository.id") + sess.OrderBy("repository." + opts.OrderBy.String()) + } else { + sess.OrderBy(opts.OrderBy.String()) + } + repos := make(RepositoryList, 0, opts.PageSize) if err = sess. Where(cond). Limit(opts.PageSize, (opts.Page-1)*opts.PageSize). - OrderBy(opts.OrderBy.String()). Find(&repos); err != nil { return nil, 0, fmt.Errorf("Repo: %v", err) } |