summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLunny Xiao <xiaolunwen@gmail.com>2018-11-01 08:21:31 +0800
committertechknowlogick <hello@techknowlogick.com>2018-10-31 20:21:31 -0400
commit37863693568635593b02cfc414e099d493e5d0c7 (patch)
tree9159de91062dfa847c6898ca67dedf44025376aa
parent79464216d92477c262a5d4c9f23a5e94b3aa3a8e (diff)
downloadgitea-37863693568635593b02cfc414e099d493e5d0c7.tar.gz
gitea-37863693568635593b02cfc414e099d493e5d0c7.zip
This commit will reduce join star, repo_topic, topic tables on repo search, so that fix extra columns problem on mssql (#5136) (#5229)
* This commit will reduce join star, repo_topic, topic tables on repo search, so that fix extra columns problem on mssql * fix tests
-rw-r--r--models/repo_list.go55
-rw-r--r--models/repo_list_test.go3
2 files changed, 22 insertions, 36 deletions
diff --git a/models/repo_list.go b/models/repo_list.go
index c7e292d8a9..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,12 +202,23 @@ func SearchRepositoryByName(opts *SearchRepoOptions) (RepositoryList, int64, err
}
if 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)})
+ // separate keyword
+ var subQueryCond = builder.NewCond()
+ for _, v := range strings.Split(opts.Keyword, ",") {
+ 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)
}
@@ -229,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))
@@ -246,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 8f4947dbb2..c032af2b80 100644
--- a/models/repo_list_test.go
+++ b/models/repo_list_test.go
@@ -237,6 +237,9 @@ func TestSearchRepositoryByTopicName(t *testing.T) {
{name: "AllPublic/OnlySearchPublicRepositoriesFromTopic",
opts: &SearchRepoOptions{OwnerID: 21, AllPublic: true, Keyword: "graphql", TopicOnly: true},
count: 1},
+ {name: "AllPublic/OnlySearchMultipleKeywordPublicRepositoriesFromTopic",
+ opts: &SearchRepoOptions{OwnerID: 21, AllPublic: true, Keyword: "graphql,golang", TopicOnly: true},
+ count: 2},
}
for _, testCase := range testCases {