Use a UNION query instead of a multitude of left outer joins for performance reasons.

Fixes #159
This commit is contained in:
Jake Moshenko 2015-06-23 17:09:48 -04:00
parent 03e1636ff2
commit 5f1d23c6e8
3 changed files with 24 additions and 15 deletions

View file

@ -1156,18 +1156,27 @@ def update_email(user, new_email, auto_verify=False):
def get_all_user_permissions(user):
UserThroughTeam = User.alias()
return (RepositoryPermission
.select(RepositoryPermission, Role, Repository, Namespace)
.join(Role)
.switch(RepositoryPermission)
.join(Repository)
.join(Namespace, on=(Repository.namespace_user == Namespace.id))
.switch(RepositoryPermission)
.join(User, JOIN_LEFT_OUTER)
.switch(RepositoryPermission)
.join(Team, JOIN_LEFT_OUTER).join(TeamMember, JOIN_LEFT_OUTER)
.join(UserThroughTeam, JOIN_LEFT_OUTER, on=(UserThroughTeam.id == TeamMember.user))
.where((User.id == user) | (UserThroughTeam.id == user)))
base_query = (RepositoryPermission
.select(RepositoryPermission, Role, Repository, Namespace)
.join(Role)
.switch(RepositoryPermission)
.join(Repository)
.join(Namespace, on=(Repository.namespace_user == Namespace.id))
.switch(RepositoryPermission))
direct = (base_query
.clone()
.join(User)
.where(User.id == user))
team = (base_query
.clone()
.join(Team)
.join(TeamMember)
.join(UserThroughTeam, on=(UserThroughTeam.id == TeamMember.user))
.where(UserThroughTeam.id == user))
return direct | team
def delete_prototype_permission(org, uid):
@ -1232,7 +1241,7 @@ def get_org_wide_permissions(user):
def get_all_repo_teams(namespace_name, repository_name):
return (RepositoryPermission.select(Team.name.alias('team_name'), Role.name, RepositoryPermission)
return (RepositoryPermission.select(Team.name, Role.name, RepositoryPermission)
.join(Team)
.switch(RepositoryPermission)
.join(Role)