]> source.dussan.org Git - gitea.git/commitdiff
This commit will reduce join star, repo_topic, topic tables on repo search, so that...
authorLunny Xiao <xiaolunwen@gmail.com>
Tue, 30 Oct 2018 21:48:37 +0000 (05:48 +0800)
committertechknowlogick <hello@techknowlogick.com>
Tue, 30 Oct 2018 21:48:37 +0000 (17:48 -0400)
* This commit will reduce join star, repo_topic, topic tables on repo search, so that fix extra columns problem on mssql

* fix tests

models/repo_list.go
models/repo_list_test.go

index 4368057e04fe02fb210a45d905c18816275f1a46..049d1834f7cc00a9e551c27d588bbcc1b6e1c7fb 100644 (file)
@@ -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)
index 2f9a1491887b901b408332211796fd5745ca464e..c032af2b80ce6d3442d38fbe49ed7ffe0713f092 100644 (file)
@@ -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 {