Class: Neo4j::Rails::Relationships::Storage
- Inherits:
-
Object
- Object
- Neo4j::Rails::Relationships::Storage
- Defined in:
- lib/neo4j/rails/relationships/storage.rb
Overview
Holds the relationships in memory but also allows read access to persisted relationships
Instance Attribute Summary (collapse)
-
- (Object) dsl
readonly
:nodoc:.
-
- (Object) node
readonly
:nodoc:.
-
- (Object) rel_type
readonly
:nodoc:.
Instance Method Summary (collapse)
- - (Object) add_incoming_rel(rel)
- - (Object) add_outgoing_rel(rel)
-
- (Object) add_unpersisted_incoming_rel(rel)
Makes the given relationship available in callbacks.
-
- (Object) add_unpersisted_outgoing_rel(rel)
Makes the given relationship available in callbacks.
- - (Object) all_relationships(dir)
- - (Object) build(attrs)
- - (Object) cache_persisted_nodes_and_relationships(dir)
- - (Object) cache_relationships(dir)
- - (Object) clear_unpersisted
- - (Object) count(dir)
- - (Object) create(attrs)
- - (Object) create_relationship_to(to, dir, attributes = nil)
- - (Object) destroy_rels(dir, *nodes)
- - (Object) destroy_single_relationship(dir)
- - (Object) each_node(dir, &block)
-
- (Object) each_rel(dir, &block)
:nodoc:.
-
- (Storage) initialize(node, rel_type, dsl = nil)
constructor
A new instance of Storage.
- - (Object) persist
- - (Boolean) persisted?
- - (Boolean) relationship_deleted?(dir, node)
- - (Object) relationships(dir)
- - (Boolean) relationships?(dir)
- - (Object) remove_from_identity_map
- - (Object) rm_incoming_rel(rel)
- - (Object) rm_outgoing_rel(rel)
- - (Object) rm_unpersisted_incoming_rel(rel)
- - (Object) rm_unpersisted_outgoing_rel(rel)
- - (Object) single_node(dir)
- - (Object) single_relationship(dir, raw = false)
- - (Object) to_other(dir, other)
-
- (Object) to_s
:nodoc:.
Constructor Details
- (Storage) initialize(node, rel_type, dsl = nil)
A new instance of Storage
9 10 11 12 13 14 15 16 17 18 19 |
# File 'lib/neo4j/rails/relationships/storage.rb', line 9 def initialize(node, rel_type, dsl=nil) @rel_type = rel_type.to_sym @node = node @rel_class = (dsl && dsl.relationship_class) || Neo4j::Rails::Relationship @target_class = (dsl && dsl.target_class) || Neo4j::Rails::Model @outgoing_rels = [] @incoming_rels = [] @persisted_related_nodes = {} @persisted_relationships = {} @persisted_node_to_relationships = {} end |
Instance Attribute Details
- (Object) dsl (readonly)
:nodoc:
7 8 9 |
# File 'lib/neo4j/rails/relationships/storage.rb', line 7 def dsl @dsl end |
- (Object) node (readonly)
:nodoc:
7 8 9 |
# File 'lib/neo4j/rails/relationships/storage.rb', line 7 def node @node end |
- (Object) rel_type (readonly)
:nodoc:
7 8 9 |
# File 'lib/neo4j/rails/relationships/storage.rb', line 7 def rel_type @rel_type end |
Instance Method Details
- (Object) add_incoming_rel(rel)
162 163 164 |
# File 'lib/neo4j/rails/relationships/storage.rb', line 162 def add_incoming_rel(rel) @incoming_rels << rel end |
- (Object) add_outgoing_rel(rel)
166 167 168 |
# File 'lib/neo4j/rails/relationships/storage.rb', line 166 def add_outgoing_rel(rel) @outgoing_rels << rel end |
- (Object) add_unpersisted_incoming_rel(rel)
Makes the given relationship available in callbacks
171 172 173 174 |
# File 'lib/neo4j/rails/relationships/storage.rb', line 171 def add_unpersisted_incoming_rel(rel) @unpersisted_incoming_rels ||= [] @unpersisted_incoming_rels << rel end |
- (Object) add_unpersisted_outgoing_rel(rel)
Makes the given relationship available in callbacks
177 178 179 180 |
# File 'lib/neo4j/rails/relationships/storage.rb', line 177 def add_unpersisted_outgoing_rel(rel) @unpersisted_outgoing_rels ||= [] @unpersisted_outgoing_rels << rel end |
- (Object) all_relationships(dir)
136 137 138 |
# File 'lib/neo4j/rails/relationships/storage.rb', line 136 def all_relationships(dir) Enumerator.new(self, :each_rel, dir) end |
- (Object) build(attrs)
55 56 57 |
# File 'lib/neo4j/rails/relationships/storage.rb', line 55 def build(attrs) @target_class.new(attrs) end |
- (Object) cache_persisted_nodes_and_relationships(dir)
89 90 91 92 93 94 95 96 97 |
# File 'lib/neo4j/rails/relationships/storage.rb', line 89 def cache_persisted_nodes_and_relationships(dir) @persisted_related_nodes[dir] ||= [] @persisted_node_to_relationships[dir] ||= {} @node._rels(dir, @rel_type).each do |rel| end_node = rel._other_node(@node._java_node).wrapper @persisted_related_nodes[dir] << end_node @persisted_node_to_relationships[dir][end_node]=rel end end |
- (Object) cache_relationships(dir)
82 83 84 85 86 87 |
# File 'lib/neo4j/rails/relationships/storage.rb', line 82 def cache_relationships(dir) @persisted_relationships[dir] ||= [] node._rels(dir, @rel_type).each do |rel| @persisted_relationships[dir] << rel.wrapper end end |
- (Object) clear_unpersisted
25 26 27 28 29 30 |
# File 'lib/neo4j/rails/relationships/storage.rb', line 25 def clear_unpersisted @outgoing_rels.clear @incoming_rels.clear @unpersisted_outgoing_rels = nil @unpersisted_incoming_rels = nil end |
- (Object) count(dir)
39 40 41 42 43 44 45 46 |
# File 'lib/neo4j/rails/relationships/storage.rb', line 39 def count(dir) counter = 0 # count persisted relationship @node._rels(dir, @rel_type).each { |*| counter += 1 } if @node.persisted? # count relationship which has not yet been persisted counter += relationships(dir).size counter end |
- (Object) create(attrs)
59 60 61 |
# File 'lib/neo4j/rails/relationships/storage.rb', line 59 def create(attrs) @target_class.create(attrs) end |
- (Object) create_relationship_to(to, dir, attributes = nil)
153 154 155 156 157 158 159 160 |
# File 'lib/neo4j/rails/relationships/storage.rb', line 153 def create_relationship_to(to, dir, attributes=nil) # puts "create_relationship_to #{@node.class}/#{@node.neo_id}, to #{to.class}/#{to.neo_id}" if dir == :outgoing @rel_class.new(@rel_type, @node, to, attributes) else @rel_class.new(@rel_type, to, @node, attributes) end end |
- (Object) destroy_rels(dir, *nodes)
145 146 147 148 149 150 151 |
# File 'lib/neo4j/rails/relationships/storage.rb', line 145 def destroy_rels(dir, *nodes) all_relationships(dir).each do |rel| node = dir == :outgoing ? rel.end_node : rel.start_node dir == :incoming ? rm_incoming_rel(rel) : rm_outgoing_rel(rel) rel.destroy if nodes.include?(node) end end |
- (Object) destroy_single_relationship(dir)
131 132 133 134 |
# File 'lib/neo4j/rails/relationships/storage.rb', line 131 def destroy_single_relationship(dir) rel = single_relationship(dir) rel && rel.destroy && relationships(dir).delete(rel) end |
- (Object) each_node(dir, &block)
103 104 105 106 107 108 109 110 111 112 113 114 115 |
# File 'lib/neo4j/rails/relationships/storage.rb', line 103 def each_node(dir, &block) relationships(dir).each do |rel| if rel.start_node == @node block.call rel.end_node else block.call rel.start_node end end if @node.persisted? cache_persisted_nodes_and_relationships(dir) if @persisted_related_nodes[dir].nil? @persisted_related_nodes[dir].each {|node| block.call node unless relationship_deleted?(dir,node)} end end |
- (Object) each_rel(dir, &block)
:nodoc:
74 75 76 77 78 79 80 |
# File 'lib/neo4j/rails/relationships/storage.rb', line 74 def each_rel(dir, &block) #:nodoc: relationships(dir).each { |rel| block.call rel } if @node.persisted? cache_relationships(dir) if @persisted_relationships[dir].nil? @persisted_relationships[dir].each {|rel| block.call rel unless !rel.exist?} end end |
- (Object) persist
204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 |
# File 'lib/neo4j/rails/relationships/storage.rb', line 204 def persist out_rels = @outgoing_rels.clone in_rels = @incoming_rels.clone [@outgoing_rels, @incoming_rels, @persisted_related_nodes, @persisted_node_to_relationships, @persisted_relationships].each{|c| c.clear} out_rels.each do |rel| success = rel.persisted? || rel.save # don't think this can happen - just in case, TODO raise "Can't save outgoing #{rel}, validation errors ? #{rel.errors.inspect}" unless success end in_rels.each do |rel| success = rel.persisted? || rel.save # don't think this can happen - just in case, TODO raise "Can't save incoming #{rel}, validation errors ? #{rel.errors.inspect}" unless success end end |
- (Boolean) persisted?
200 201 202 |
# File 'lib/neo4j/rails/relationships/storage.rb', line 200 def persisted? @outgoing_rels.empty? && @incoming_rels.empty? end |
- (Boolean) relationship_deleted?(dir, node)
99 100 101 |
# File 'lib/neo4j/rails/relationships/storage.rb', line 99 def relationship_deleted?(dir,node) @persisted_node_to_relationships[dir][node].nil? || !@persisted_node_to_relationships[dir][node].exist? end |
- (Object) relationships(dir)
63 64 65 66 67 68 69 70 71 72 |
# File 'lib/neo4j/rails/relationships/storage.rb', line 63 def relationships(dir) case dir when :outgoing @unpersisted_outgoing_rels || @outgoing_rels when :incoming @unpersisted_incoming_rels || @incoming_rels when :both @incoming_rels + @outgoing_rels end end |
- (Boolean) relationships?(dir)
117 118 119 |
# File 'lib/neo4j/rails/relationships/storage.rb', line 117 def relationships?(dir) !!relationships(dir).first || (@node.persisted? && @node._rels(dir, @rel_type).first) end |
- (Object) remove_from_identity_map
32 33 34 35 36 37 |
# File 'lib/neo4j/rails/relationships/storage.rb', line 32 def remove_from_identity_map @outgoing_rels.each {|r| Neo4j::IdentityMap.remove(r._java_rel)} @incoming_rels.each {|r| Neo4j::IdentityMap.remove(r._java_rel)} @unpersisted_outgoing_rels = nil @unpersisted_incoming_rels = nil end |
- (Object) rm_incoming_rel(rel)
182 183 184 |
# File 'lib/neo4j/rails/relationships/storage.rb', line 182 def rm_incoming_rel(rel) @incoming_rels.delete(rel) end |
- (Object) rm_outgoing_rel(rel)
186 187 188 |
# File 'lib/neo4j/rails/relationships/storage.rb', line 186 def rm_outgoing_rel(rel) @outgoing_rels.delete(rel) end |
- (Object) rm_unpersisted_incoming_rel(rel)
190 191 192 193 |
# File 'lib/neo4j/rails/relationships/storage.rb', line 190 def rm_unpersisted_incoming_rel(rel) @unpersisted_incoming_rels.delete(rel) @unpersisted_incoming_rels = nil if @unpersisted_incoming_rels.empty? end |
- (Object) rm_unpersisted_outgoing_rel(rel)
195 196 197 198 |
# File 'lib/neo4j/rails/relationships/storage.rb', line 195 def rm_unpersisted_outgoing_rel(rel) @unpersisted_outgoing_rels.delete(rel) @unpersisted_outgoing_rels = nil if @unpersisted_outgoing_rels.empty? end |
- (Object) single_node(dir)
140 141 142 143 |
# File 'lib/neo4j/rails/relationships/storage.rb', line 140 def single_node(dir) rel = single_relationship(dir, true) rel && rel.other_node(@node) end |
- (Object) single_relationship(dir, raw = false)
121 122 123 124 125 126 127 128 129 |
# File 'lib/neo4j/rails/relationships/storage.rb', line 121 def single_relationship(dir, raw = false) rel = relationships(dir).first if rel.nil? && @node.persisted? java_rel = @node._rel(dir, @rel_type) raw ? java_rel : java_rel && java_rel.wrapper else rel end end |
- (Object) to_other(dir, other)
48 49 50 51 52 53 |
# File 'lib/neo4j/rails/relationships/storage.rb', line 48 def to_other(dir, other) raise('node.rels(...).to_other() not allowed on a node that is not persisted') if @node.new_record? all_relationships(dir).find_all do |rel| rel._other_node(@node) == other._java_node end end |
- (Object) to_s
:nodoc:
21 22 23 |
# File 'lib/neo4j/rails/relationships/storage.rb', line 21 def to_s #:nodoc: "Storage #{object_id} node: #{@node.id} rel_type: #{@rel_type} outgoing #{@outgoing_rels.size}/#{@unpersisted_outgoing_rels && @unpersisted_outgoing_rels.size} incoming #{@incoming_rels.size}/#{@unpersisted_incoming_rels && @unpersisted_incoming_rels.size}" end |