Skip to content

Commit

Permalink
Use joins instead of multiple lookups in groups sql
Browse files Browse the repository at this point in the history
Currently to determine a user's groups (or vice versa) we do
- 1 lookup for the user.
- 1 lookup for the association table.
- n lookups for the n groups the user has.

The association and groups lookup are replaced with a join query.

Fixes: bug 1218675
Change-Id: I560659eda1a30635399829e1c86f06734c90f9e2
(cherry picked from commit 6f9b75e)
  • Loading branch information
Jamie Lennox authored and dirkmueller committed Sep 9, 2013
1 parent 6792499 commit 53ff445
Showing 1 changed file with 7 additions and 8 deletions.
15 changes: 7 additions & 8 deletions keystone/identity/backends/sql.py
Expand Up @@ -721,18 +721,17 @@ def remove_user_from_group(self, user_id, group_id):
def list_groups_for_user(self, user_id):
session = self.get_session()
self.get_user(user_id)
query = session.query(UserGroupMembership)
query = query.filter_by(user_id=user_id)
membership_refs = query.all()
return [self.get_group(x.group_id) for x in membership_refs]
query = session.query(Group).join(UserGroupMembership)
query = query.filter(UserGroupMembership.user_id == user_id)
return [g.to_dict() for g in query]

def list_users_in_group(self, group_id):
session = self.get_session()
self.get_group(group_id)
query = session.query(UserGroupMembership)
query = query.filter_by(group_id=group_id)
membership_refs = query.all()
return [self.get_user(x.user_id) for x in membership_refs]
query = session.query(User).join(UserGroupMembership)
query = query.filter(UserGroupMembership.group_id == group_id)

return [identity.filter_user(u.to_dict()) for u in query]

def delete_user(self, user_id):
session = self.get_session()
Expand Down

0 comments on commit 53ff445

Please sign in to comment.