Переглянути джерело

This commit will reduce join star, repo_topic, topic tables on repo search, so that fix extra columns problem on mssql (#5136)

* This commit will reduce join star, repo_topic, topic tables on repo search, so that fix extra columns problem on mssql

* fix tests
tags/v1.7.0-dev
Lunny Xiao 5 роки тому
джерело
коміт
10370651fc
2 змінених файлів з 17 додано та 37 видалено
  1. 16
    36
      models/repo_list.go
  2. 1
    1
      models/repo_list_test.go

+ 16
- 36
models/repo_list.go Переглянути файл

cond = cond.And(builder.Eq{"is_private": false}) cond = cond.And(builder.Eq{"is_private": false})
} }


var starred bool
if opts.OwnerID > 0 { if opts.OwnerID > 0 {
if opts.Starred { 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 { } else {
var accessCond = builder.NewCond() var accessCond = builder.NewCond()
if opts.Collaborate != util.OptionalBoolTrue { if opts.Collaborate != util.OptionalBoolTrue {
} }


if opts.Keyword != "" { if opts.Keyword != "" {
var keywordCond = builder.NewCond()
// separate keyword // separate keyword
var subQueryCond = builder.NewCond()
for _, v := range strings.Split(opts.Keyword, ",") { 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) cond = cond.And(keywordCond)
} }
sess := x.NewSession() sess := x.NewSession()
defer sess.Close() 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. count, err := sess.
Where(cond). Where(cond).
Count(new(Repository)) Count(new(Repository))
return nil, 0, fmt.Errorf("Count: %v", 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) repos := make(RepositoryList, 0, opts.PageSize)
if err = sess. if err = sess.
Where(cond). Where(cond).
OrderBy(opts.OrderBy.String()).
Limit(opts.PageSize, (opts.Page-1)*opts.PageSize). Limit(opts.PageSize, (opts.Page-1)*opts.PageSize).
Find(&repos); err != nil { Find(&repos); err != nil {
return nil, 0, fmt.Errorf("Repo: %v", err) return nil, 0, fmt.Errorf("Repo: %v", err)

+ 1
- 1
models/repo_list_test.go Переглянути файл

count: 1}, count: 1},
{name: "AllPublic/OnlySearchMultipleKeywordPublicRepositoriesFromTopic", {name: "AllPublic/OnlySearchMultipleKeywordPublicRepositoriesFromTopic",
opts: &SearchRepoOptions{OwnerID: 21, AllPublic: true, Keyword: "graphql,golang", TopicOnly: true}, opts: &SearchRepoOptions{OwnerID: 21, AllPublic: true, Keyword: "graphql,golang", TopicOnly: true},
count: 3},
count: 2},
} }


for _, testCase := range testCases { for _, testCase := range testCases {

Завантаження…
Відмінити
Зберегти