Skip to content

Commit

Permalink
Merge pull request #60 from Exelord/improve-performance
Browse files Browse the repository at this point in the history
Improve AAH performance
  • Loading branch information
Exelord committed Nov 5, 2016
2 parents 3162bd8 + f96096f commit 20105df
Show file tree
Hide file tree
Showing 2 changed files with 33 additions and 22 deletions.
48 changes: 28 additions & 20 deletions lib/monarchy/acts_as_hierarchy.rb
Original file line number Diff line number Diff line change
Expand Up @@ -31,35 +31,43 @@ def include_scopes

scope :accessible_for, (lambda do |user|
Monarchy::Validators.user(user)
where(id: accessible_roots(user).union(accessible_leaves(user)))
user_id = user.id
where(id: accessible_roots_ids(user_id).union(accessible_leaves_ids(user_id)))
end)
end

def accessible_roots(user)
unscoped.joins('INNER JOIN "monarchy_hierarchy_hierarchies" ON '\
'"monarchy_hierarchies"."id" = "monarchy_hierarchy_hierarchies"."ancestor_id"')
.joins('INNER JOIN "monarchy_members" ON '\
'"monarchy_members"."hierarchy_id" = "monarchy_hierarchy_hierarchies"."descendant_id"')
.where(monarchy_members: { user_id: user.id }).distinct
def accessible_roots_ids(user_id)
unscoped.joins('INNER JOIN monarchy_hierarchy_hierarchies ON ' \
'monarchy_hierarchies.id = monarchy_hierarchy_hierarchies.ancestor_id')
.joins('INNER JOIN (SELECT hierarchy_id FROM monarchy_members ' \
"WHERE monarchy_members.user_id = #{user_id}) as members ON " \
'members.hierarchy_id = monarchy_hierarchy_hierarchies.descendant_id').select(:id)
end

def accessible_leaves(user)
descendant_leaves.where('monarchy_hierarchy_hierarchies.descendant_id': descendant_leaves_for_user(user)
.where('monarchy_roles.inherited': false)
.select('monarchy_hierarchy_hierarchies.ancestor_id')).union(
descendant_leaves
.where('monarchy_hierarchy_hierarchies.ancestor_id': descendant_leaves_for_user(user)
.where.not('monarchy_roles.inherited': false))
)
def accessible_leaves_ids(user_id)
ancestor_leaves_for_user(user_id)
.select('monarchy_hierarchy_hierarchies.ancestor_id AS id')
.union(descendant_leaves_for_user(user_id)).select(:id)
end

def descendant_leaves_for_user(user)
descendant_leaves.joins(members: [:roles]).where(monarchy_members: { user_id: user.id })
def ancestor_leaves_for_user(user_id, inherited = false)
inherited = inherited ? 't' : 'f'

unscoped
.joins('INNER JOIN monarchy_hierarchy_hierarchies ON ' \
'monarchy_hierarchies.id = monarchy_hierarchy_hierarchies.descendant_id')
.joins('INNER JOIN (SELECT id, hierarchy_id FROM monarchy_members WHERE ' \
"user_id = #{user_id}) as monarchy_members ON monarchy_members.hierarchy_id = monarchy_hierarchies.id")
.joins('INNER JOIN monarchy_members_roles ON monarchy_members_roles.member_id = monarchy_members.id')
.joins("INNER JOIN (SELECT id, inherited FROM monarchy_roles WHERE inherited = '#{inherited}') as " \
'monarchy_roles ON monarchy_members_roles.role_id = monarchy_roles.id')
end

def descendant_leaves
unscoped.joins('INNER JOIN "monarchy_hierarchy_hierarchies" ON "monarchy_hierarchies"."id" =' \
'"monarchy_hierarchy_hierarchies"."descendant_id"')
def descendant_leaves_for_user(user_id)
ancestor_leaves_for_user(user_id, true)
.joins('INNER JOIN monarchy_hierarchy_hierarchies AS monarchy_descendants ON ' \
'monarchy_descendants.ancestor_id = monarchy_hierarchies.id')
.select('monarchy_descendants.descendant_id AS id')
end
end
end
Expand Down
7 changes: 5 additions & 2 deletions lib/monarchy/acts_as_user.rb
Original file line number Diff line number Diff line change
Expand Up @@ -64,8 +64,11 @@ def accessible_roles_for(resource, inheritnce)
def resource_and_inheritance_roles(resource)
hierarchy_ids = resource.hierarchy.ancestors.select(:id)
Monarchy.role_class.where(id:
Monarchy.role_class.joins(:members).where('monarchy_members.user_id': id)
.where('monarchy_roles.inherited': 't', 'monarchy_members.hierarchy_id': hierarchy_ids)
Monarchy.role_class.joins(:members).where(
'monarchy_members.user_id': id,
'monarchy_roles.inherited': 't',
'monarchy_members.hierarchy_id': hierarchy_ids
)
.select(:inherited_role_id))
.union(resource_roles(resource))
.distinct
Expand Down

0 comments on commit 20105df

Please sign in to comment.