From c5a279b14392738735cb25db260c8058294bfe9c Mon Sep 17 00:00:00 2001 From: Drew DeVault Date: Mon, 13 Apr 2020 15:37:38 -0400 Subject: [PATCH] api: improve repos by owner & repo name perf Thanks ~minus for the SQL-fu --- api/loaders/middleware.go | 27 ++++++++++++++++----------- 1 file changed, 16 insertions(+), 11 deletions(-) diff --git a/api/loaders/middleware.go b/api/loaders/middleware.go index 2fa434c..a1bddcd 100644 --- a/api/loaders/middleware.go +++ b/api/loaders/middleware.go @@ -199,19 +199,24 @@ func fetchRepositoriesByOwnerRepoName(ctx context.Context, _names[i] = name[0] + "/" + name[1] } if rows, err = db.QueryContext(ctx, ` - SELECT DISTINCT `+(&model.Repository{}).Columns(ctx, "repo")+`, + WITH user_repo AS ( + SELECT + substring(un for position('/' in un)-1) AS owner, + substring(un from position('/' in un)+1) AS repo + FROM unnest($2::text[]) un + ) + SELECT DISTINCT + `+(&model.Repository{}).Columns(ctx, "repo")+`, u.username - FROM repository repo - JOIN - "user" u ON repo.owner_id = u.id - FULL OUTER JOIN - access ON repo.id = access.repo_id + FROM user_repo ur + JOIN "user" u ON ur.owner = u.username + JOIN repository repo ON ur.repo = repo.name AND u.id = repo.owner_id + LEFT JOIN access ON repo.id = access.repo_id WHERE - u.username || '/' || repo.name = ANY($2) - AND (access.user_id = $1 - OR repo.owner_id = $1 - OR repo.visibility != 'private') - `, auth.ForContext(ctx).ID, pq.Array(_names)); err != nil { + access.user_id = $1 + OR repo.owner_id = $1 + OR repo.visibility != 'private'`, + auth.ForContext(ctx).ID, pq.Array(_names)); err != nil { panic(err) } defer rows.Close() -- 2.38.4