Single permission query optimization

This commit is contained in:
Akita Noek
2016-01-29 15:13:24 -05:00
parent 5b50ebb8da
commit cf298f6803

View File

@@ -29,15 +29,23 @@ class ResourceMixin(models.Model):
`myresource.get_permissions(user)`. `myresource.get_permissions(user)`.
''' '''
perm_clause = '' aggregate_where_clause = ''
aggregates = '' aggregates = ''
for perm in permissions: group_clause = ''
if not perm_clause: where_clause = ''
perm_clause = 'WHERE '
else: if len(permissions) > 1:
perm_clause += ' AND ' group_clause = 'GROUP BY %s.resource_id' % RolePermission._meta.db_table
perm_clause += '"%s" = %d' % (perm, int(permissions[perm])) for perm in permissions:
aggregates += ', MAX("%s") as "%s"' % (perm, perm) if not aggregate_where_clause:
aggregate_where_clause = 'WHERE '
else:
aggregate_where_clause += ' AND '
aggregate_where_clause += '"%s" = %d' % (perm, int(permissions[perm]))
aggregates += ', MAX("%s") as "%s"' % (perm, perm)
if len(permissions) == 1:
perm = list(permissions.keys())[0]
where_clause = 'AND "%s" = %d' % (perm, int(permissions[perm]))
return cls.objects.extra( return cls.objects.extra(
where=[ where=[
@@ -51,24 +59,28 @@ class ResourceMixin(models.Model):
LEFT JOIN %(rbac_permission)s LEFT JOIN %(rbac_permission)s
ON (%(rbac_permission)s.role_id = %(rbac_role_hierachy)s.role_id) ON (%(rbac_permission)s.role_id = %(rbac_role_hierachy)s.role_id)
WHERE %(rbac_role)s_members.user_id=%(user_id)d WHERE %(rbac_role)s_members.user_id=%(user_id)d
GROUP BY %(rbac_permission)s.resource_id %(where_clause)s
%(group_clause)s
) summarized_permissions ) summarized_permissions
%(perm_clause)s %(aggregate_where_clause)s
) )
''' '''
% %
{ {
'table_name': cls._meta.db_table, 'table_name' : cls._meta.db_table,
'aggregates': aggregates, 'aggregates' : aggregates,
'user_id': user.id, 'user_id' : user.id,
'perm_clause': perm_clause, 'aggregate_where_clause' : aggregate_where_clause,
'rbac_role': Role._meta.db_table, 'group_clause' : group_clause,
'rbac_permission': RolePermission._meta.db_table, 'where_clause' : where_clause,
'rbac_role_hierachy': RoleHierarchy._meta.db_table 'rbac_role' : Role._meta.db_table,
'rbac_permission' : RolePermission._meta.db_table,
'rbac_role_hierachy' : RoleHierarchy._meta.db_table
} }
] ]
) )
def get_permissions(self, user): def get_permissions(self, user):
''' '''
Returns a dict (or None) of the permissions a user has for a given Returns a dict (or None) of the permissions a user has for a given