Class: PolicyMachineStorageAdapter::ActiveRecord::Assignment
- Inherits:
-
ActiveRecord::Base
- Object
- ActiveRecord::Base
- PolicyMachineStorageAdapter::ActiveRecord::Assignment
- Defined in:
- lib/policy_machine_storage_adapters/active_record.rb
Class Method Summary collapse
Instance Method Summary collapse
Class Method Details
.transitive_closure?(ancestor, descendant) ⇒ Boolean
109 110 111 |
# 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 |
Instance Method Details
#add_to_transitive_closure ⇒ Object
113 114 115 116 117 118 119 120 121 122 |
# 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 ⇒ Object
124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 |
# 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 |