diff --git a/models/repo_list.go b/models/repo_list.go index 4368057e04..049d1834f7 100644 --- a/models/repo_list.go +++ b/models/repo_list.go @@ -173,11 +173,9 @@ func SearchRepositoryByName(opts *SearchRepoOptions) (RepositoryList, int64, err cond = cond.And(builder.Eq{"is_private": false}) } - var starred bool if opts.OwnerID > 0 { if opts.Starred { - starred = true - cond = builder.Eq{"star.uid": opts.OwnerID} + cond = cond.And(builder.In("id", builder.Select("repo_id").From("star").Where(builder.Eq{"uid": opts.OwnerID}))) } else { var accessCond = builder.NewCond() if opts.Collaborate != util.OptionalBoolTrue { @@ -204,15 +202,23 @@ func SearchRepositoryByName(opts *SearchRepoOptions) (RepositoryList, int64, err } if opts.Keyword != "" { - var keywordCond = builder.NewCond() // separate keyword + var subQueryCond = builder.NewCond() for _, v := range strings.Split(opts.Keyword, ",") { - if opts.TopicOnly { - keywordCond = keywordCond.Or(builder.Like{"topic.name", strings.ToLower(v)}) - } else { - keywordCond = keywordCond.Or(builder.Like{"lower_name", strings.ToLower(v)}) - keywordCond = keywordCond.Or(builder.Like{"topic.name", strings.ToLower(v)}) + subQueryCond = subQueryCond.Or(builder.Like{"topic.name", strings.ToLower(v)}) + } + subQuery := builder.Select("repo_topic.repo_id").From("repo_topic"). + Join("INNER", "topic", "topic.id = repo_topic.topic_id"). + Where(subQueryCond). + GroupBy("repo_topic.repo_id") + + var keywordCond = builder.In("id", subQuery) + if !opts.TopicOnly { + var likes = builder.NewCond() + for _, v := range strings.Split(opts.Keyword, ",") { + likes = likes.Or(builder.Like{"lower_name", strings.ToLower(v)}) } + keywordCond = keywordCond.Or(likes) } cond = cond.And(keywordCond) } @@ -232,15 +238,6 @@ func SearchRepositoryByName(opts *SearchRepoOptions) (RepositoryList, int64, err sess := x.NewSession() defer sess.Close() - if starred { - 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)) @@ -249,27 +246,10 @@ func SearchRepositoryByName(opts *SearchRepoOptions) (RepositoryList, int64, err return nil, 0, fmt.Errorf("Count: %v", err) } - // Set again after reset by Count() - if starred { - 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). + OrderBy(opts.OrderBy.String()). Limit(opts.PageSize, (opts.Page-1)*opts.PageSize). Find(&repos); err != nil { return nil, 0, fmt.Errorf("Repo: %v", err) diff --git a/models/repo_list_test.go b/models/repo_list_test.go index 2f9a149188..c032af2b80 100644 --- a/models/repo_list_test.go +++ b/models/repo_list_test.go @@ -239,7 +239,7 @@ func TestSearchRepositoryByTopicName(t *testing.T) { count: 1}, {name: "AllPublic/OnlySearchMultipleKeywordPublicRepositoriesFromTopic", opts: &SearchRepoOptions{OwnerID: 21, AllPublic: true, Keyword: "graphql,golang", TopicOnly: true}, - count: 3}, + count: 2}, } for _, testCase := range testCases {