class PolicyMachineStorageAdapter::ActiveRecord::Assignment
Public Class Methods
transitive_closure?(ancestor, descendant)
click to toggle source
# File lib/policy_machine_storage_adapters/active_record.rb, line 109 def self.transitive_closure?(ancestor, descendant) TransitiveClosure.exists?(ancestor_id: ancestor.id, descendant_id: descendant.id) end
Public Instance Methods
add_to_transitive_closure()
click to toggle source
# File lib/policy_machine_storage_adapters/active_record.rb, line 113 def add_to_transitive_closure connection.execute("Insert ignore into transitive_closure values (#{parent_id}, #{child_id})") connection.execute("Insert ignore into transitive_closure select parents_ancestors.ancestor_id, childs_descendants.descendant_id from transitive_closure parents_ancestors, transitive_closure childs_descendants where (parents_ancestors.descendant_id = #{parent_id} or parents_ancestors.ancestor_id = #{parent_id}) and (childs_descendants.ancestor_id = #{child_id} or childs_descendants.descendant_id = #{child_id})") end
remove_from_transitive_closure()
click to toggle source
# File lib/policy_machine_storage_adapters/active_record.rb, line 124 def remove_from_transitive_closure parents_ancestors = connection.execute("Select ancestor_id from transitive_closure where descendant_id=#{parent_id}") childs_descendants = connection.execute("Select descendant_id from transitive_closure where ancestor_id=#{child_id}") parents_ancestors = parents_ancestors.to_a.<<(parent_id).join(',') childs_descendants = childs_descendants.to_a.<<(child_id).join(',') connection.execute("Delete from transitive_closure where ancestor_id in (#{parents_ancestors}) and descendant_id in (#{childs_descendants}) and not exists (Select * from assignments where parent_id=ancestor_id and child_id=descendant_id) ") connection.execute("Insert ignore into transitive_closure select ancestors_surviving_relationships.ancestor_id, descendants_surviving_relationships.descendant_id from transitive_closure ancestors_surviving_relationships, transitive_closure descendants_surviving_relationships where (ancestors_surviving_relationships.ancestor_id in (#{parents_ancestors})) and (descendants_surviving_relationships.descendant_id in (#{childs_descendants})) and (ancestors_surviving_relationships.descendant_id = descendants_surviving_relationships.ancestor_id) ") end