@@ -173,11 +173,9 @@ func SearchRepositoryByName(opts *SearchRepoOptions) (RepositoryList, int64, err
173
173
cond = cond .And (builder.Eq {"is_private" : false })
174
174
}
175
175
176
- var starred bool
177
176
if opts .OwnerID > 0 {
178
177
if opts .Starred {
179
- starred = true
180
- cond = builder.Eq {"star.uid" : opts .OwnerID }
178
+ cond = cond .And (builder .In ("id" , builder .Select ("repo_id" ).From ("star" ).Where (builder.Eq {"uid" : opts .OwnerID })))
181
179
} else {
182
180
var accessCond = builder .NewCond ()
183
181
if opts .Collaborate != util .OptionalBoolTrue {
@@ -204,15 +202,23 @@ func SearchRepositoryByName(opts *SearchRepoOptions) (RepositoryList, int64, err
204
202
}
205
203
206
204
if opts .Keyword != "" {
207
- var keywordCond = builder .NewCond ()
208
205
// separate keyword
206
+ var subQueryCond = builder .NewCond ()
209
207
for _ , v := range strings .Split (opts .Keyword , "," ) {
210
- if opts .TopicOnly {
211
- keywordCond = keywordCond .Or (builder.Like {"topic.name" , strings .ToLower (v )})
212
- } else {
213
- keywordCond = keywordCond .Or (builder.Like {"lower_name" , strings .ToLower (v )})
214
- keywordCond = keywordCond .Or (builder.Like {"topic.name" , strings .ToLower (v )})
208
+ subQueryCond = subQueryCond .Or (builder.Like {"topic.name" , strings .ToLower (v )})
209
+ }
210
+ subQuery := builder .Select ("repo_topic.repo_id" ).From ("repo_topic" ).
211
+ Join ("INNER" , "topic" , "topic.id = repo_topic.topic_id" ).
212
+ Where (subQueryCond ).
213
+ GroupBy ("repo_topic.repo_id" )
214
+
215
+ var keywordCond = builder .In ("id" , subQuery )
216
+ if ! opts .TopicOnly {
217
+ var likes = builder .NewCond ()
218
+ for _ , v := range strings .Split (opts .Keyword , "," ) {
219
+ likes = likes .Or (builder.Like {"lower_name" , strings .ToLower (v )})
215
220
}
221
+ keywordCond = keywordCond .Or (likes )
216
222
}
217
223
cond = cond .And (keywordCond )
218
224
}
@@ -232,15 +238,6 @@ func SearchRepositoryByName(opts *SearchRepoOptions) (RepositoryList, int64, err
232
238
sess := x .NewSession ()
233
239
defer sess .Close ()
234
240
235
- if starred {
236
- sess .Join ("INNER" , "star" , "star.repo_id = repository.id" )
237
- }
238
-
239
- if opts .Keyword != "" {
240
- sess .Join ("LEFT" , "repo_topic" , "repo_topic.repo_id = repository.id" )
241
- sess .Join ("LEFT" , "topic" , "repo_topic.topic_id = topic.id" )
242
- }
243
-
244
241
count , err := sess .
245
242
Where (cond ).
246
243
Count (new (Repository ))
@@ -249,27 +246,10 @@ func SearchRepositoryByName(opts *SearchRepoOptions) (RepositoryList, int64, err
249
246
return nil , 0 , fmt .Errorf ("Count: %v" , err )
250
247
}
251
248
252
- // Set again after reset by Count()
253
- if starred {
254
- sess .Join ("INNER" , "star" , "star.repo_id = repository.id" )
255
- }
256
-
257
- if opts .Keyword != "" {
258
- sess .Join ("LEFT" , "repo_topic" , "repo_topic.repo_id = repository.id" )
259
- sess .Join ("LEFT" , "topic" , "repo_topic.topic_id = topic.id" )
260
- }
261
-
262
- if opts .Keyword != "" {
263
- sess .Select ("repository.*" )
264
- sess .GroupBy ("repository.id" )
265
- sess .OrderBy ("repository." + opts .OrderBy .String ())
266
- } else {
267
- sess .OrderBy (opts .OrderBy .String ())
268
- }
269
-
270
249
repos := make (RepositoryList , 0 , opts .PageSize )
271
250
if err = sess .
272
251
Where (cond ).
252
+ OrderBy (opts .OrderBy .String ()).
273
253
Limit (opts .PageSize , (opts .Page - 1 )* opts .PageSize ).
274
254
Find (& repos ); err != nil {
275
255
return nil , 0 , fmt .Errorf ("Repo: %v" , err )
0 commit comments