Removes reliance on server specific SQL (#393)
Breaks the retrieval of repositories into two queries This fetches the paged ids in one go, then the actual repository information in a second query Some databases do not support SELECT with * when group by is used.
This commit is contained in:
parent
88f45ce38c
commit
302fa42980
1 changed files with 16 additions and 2 deletions
|
@ -598,15 +598,29 @@ func (org *User) GetUserRepositories(userID int64, page, pageSize int) ([]*Repos
|
|||
if page <= 0 {
|
||||
page = 1
|
||||
}
|
||||
|
||||
repos := make([]*Repository, 0, pageSize)
|
||||
|
||||
if err := x.Select("`repository`.*").
|
||||
if err := x.
|
||||
Select("`repository`.id").
|
||||
Join("INNER", "team_repo", "`team_repo`.repo_id=`repository`.id").
|
||||
Where(cond).
|
||||
GroupBy("`repository`.id").
|
||||
GroupBy("`repository`.id,`repository`.updated_unix").
|
||||
OrderBy("updated_unix DESC").
|
||||
Limit(pageSize, (page-1)*pageSize).
|
||||
Find(&repos); err != nil {
|
||||
return nil, 0, fmt.Errorf("get repository ids: %v", err)
|
||||
}
|
||||
|
||||
repoIDs := make([]int64,pageSize)
|
||||
for i := range repos {
|
||||
repoIDs[i] = repos[i].ID
|
||||
}
|
||||
|
||||
if err := x.
|
||||
Select("`repository`.*").
|
||||
Where(builder.In("`repository`.id",repoIDs)).
|
||||
Find(&repos); err!=nil {
|
||||
return nil, 0, fmt.Errorf("get repositories: %v", err)
|
||||
}
|
||||
|
||||
|
|
Reference in a new issue