@@ -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,12 +202,23 @@ func SearchRepositoryByName(opts *SearchRepoOptions) (RepositoryList, int64, err
204
202
}
205
203
206
204
if opts .Keyword != "" {
207
- var keywordCond = builder .NewCond ()
208
- if opts .TopicOnly {
209
- keywordCond = keywordCond .Or (builder.Like {"topic.name" , strings .ToLower (opts .Keyword )})
210
- } else {
211
- keywordCond = keywordCond .Or (builder.Like {"lower_name" , strings .ToLower (opts .Keyword )})
212
- keywordCond = keywordCond .Or (builder.Like {"topic.name" , strings .ToLower (opts .Keyword )})
205
+ // separate keyword
206
+ var subQueryCond = builder .NewCond ()
207
+ for _ , v := range strings .Split (opts .Keyword , "," ) {
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 )})
220
+ }
221
+ keywordCond = keywordCond .Or (likes )
213
222
}
214
223
cond = cond .And (keywordCond )
215
224
}
@@ -229,15 +238,6 @@ func SearchRepositoryByName(opts *SearchRepoOptions) (RepositoryList, int64, err
229
238
sess := x .NewSession ()
230
239
defer sess .Close ()
231
240
232
- if starred {
233
- sess .Join ("INNER" , "star" , "star.repo_id = repository.id" )
234
- }
235
-
236
- if opts .Keyword != "" {
237
- sess .Join ("LEFT" , "repo_topic" , "repo_topic.repo_id = repository.id" )
238
- sess .Join ("LEFT" , "topic" , "repo_topic.topic_id = topic.id" )
239
- }
240
-
241
241
count , err := sess .
242
242
Where (cond ).
243
243
Count (new (Repository ))
@@ -246,27 +246,10 @@ func SearchRepositoryByName(opts *SearchRepoOptions) (RepositoryList, int64, err
246
246
return nil , 0 , fmt .Errorf ("Count: %v" , err )
247
247
}
248
248
249
- // Set again after reset by Count()
250
- if starred {
251
- sess .Join ("INNER" , "star" , "star.repo_id = repository.id" )
252
- }
253
-
254
- if opts .Keyword != "" {
255
- sess .Join ("LEFT" , "repo_topic" , "repo_topic.repo_id = repository.id" )
256
- sess .Join ("LEFT" , "topic" , "repo_topic.topic_id = topic.id" )
257
- }
258
-
259
- if opts .Keyword != "" {
260
- sess .Select ("repository.*" )
261
- sess .GroupBy ("repository.id" )
262
- sess .OrderBy ("repository." + opts .OrderBy .String ())
263
- } else {
264
- sess .OrderBy (opts .OrderBy .String ())
265
- }
266
-
267
249
repos := make (RepositoryList , 0 , opts .PageSize )
268
250
if err = sess .
269
251
Where (cond ).
252
+ OrderBy (opts .OrderBy .String ()).
270
253
Limit (opts .PageSize , (opts .Page - 1 )* opts .PageSize ).
271
254
Find (& repos ); err != nil {
272
255
return nil , 0 , fmt .Errorf ("Repo: %v" , err )
0 commit comments