Class: Neo4j::Rails::Relationships::Storage

Inherits:
Object
  • Object
show all
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)

Instance Method Summary (collapse)

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?

Returns:

  • (Boolean)


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)

Returns:

  • (Boolean)


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)

Returns:

  • (Boolean)


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