neo4j 2.0.0.alpha.5-java → 2.0.0.alpha.6-java
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/CHANGELOG +12 -0
- data/Gemfile +0 -4
- data/README.rdoc +106 -62
- data/lib/neo4j.rb +7 -33
- data/lib/neo4j/performance.rb +43 -0
- data/lib/neo4j/rails/accept_id.rb +19 -18
- data/lib/neo4j/rails/attributes.rb +366 -120
- data/lib/neo4j/rails/finders.rb +41 -15
- data/lib/neo4j/rails/has_n.rb +203 -0
- data/lib/neo4j/rails/identity.rb +25 -0
- data/lib/neo4j/rails/model.rb +65 -242
- data/lib/neo4j/rails/nested_attributes.rb +108 -0
- data/lib/neo4j/rails/node_persistance.rb +56 -0
- data/lib/neo4j/rails/observer.rb +0 -2
- data/lib/neo4j/rails/persistence.rb +32 -154
- data/lib/neo4j/rails/rack_middleware.rb +26 -2
- data/lib/neo4j/rails/rails.rb +9 -6
- data/lib/neo4j/rails/railtie.rb +1 -2
- data/lib/neo4j/rails/relationship.rb +18 -125
- data/lib/neo4j/rails/relationship_persistence.rb +107 -0
- data/lib/neo4j/rails/relationships/node_dsl.rb +72 -44
- data/lib/neo4j/rails/relationships/relationships.rb +187 -59
- data/lib/neo4j/rails/relationships/rels_dsl.rb +18 -17
- data/lib/neo4j/rails/relationships/storage.rb +19 -17
- data/lib/neo4j/rails/timestamps.rb +53 -51
- data/lib/neo4j/rails/transaction.rb +9 -1
- data/lib/neo4j/rails/validations/uniqueness.rb +1 -1
- data/lib/neo4j/rails/versioning/versioning.rb +2 -2
- data/lib/neo4j/version.rb +1 -1
- data/lib/orm_adapter/adapters/neo4j.rb +47 -46
- data/neo4j.gemspec +1 -1
- metadata +10 -69
- data/lib/neo4j/algo/algo.rb +0 -294
- data/lib/neo4j/batch/batch.rb +0 -4
- data/lib/neo4j/batch/indexer.rb +0 -109
- data/lib/neo4j/batch/inserter.rb +0 -179
- data/lib/neo4j/batch/rule_inserter.rb +0 -24
- data/lib/neo4j/batch/rule_node.rb +0 -72
- data/lib/neo4j/config.rb +0 -177
- data/lib/neo4j/core_ext/class/inheritable_attributes.rb +0 -12
- data/lib/neo4j/core_ext/class/rewrite_inheritable_attributes.rb +0 -170
- data/lib/neo4j/database.rb +0 -158
- data/lib/neo4j/equal.rb +0 -21
- data/lib/neo4j/event_handler.rb +0 -263
- data/lib/neo4j/has_list/class_methods.rb +0 -11
- data/lib/neo4j/has_list/has_list.rb +0 -3
- data/lib/neo4j/has_list/mapping.rb +0 -133
- data/lib/neo4j/has_n/class_methods.rb +0 -119
- data/lib/neo4j/has_n/decl_relationship_dsl.rb +0 -246
- data/lib/neo4j/has_n/has_n.rb +0 -3
- data/lib/neo4j/has_n/mapping.rb +0 -98
- data/lib/neo4j/identity_map.rb +0 -140
- data/lib/neo4j/index/class_methods.rb +0 -108
- data/lib/neo4j/index/index.rb +0 -39
- data/lib/neo4j/index/indexer.rb +0 -341
- data/lib/neo4j/index/indexer_registry.rb +0 -68
- data/lib/neo4j/index/lucene_query.rb +0 -256
- data/lib/neo4j/load.rb +0 -25
- data/lib/neo4j/migrations/class_methods.rb +0 -110
- data/lib/neo4j/migrations/extensions.rb +0 -58
- data/lib/neo4j/migrations/lazy_node_mixin.rb +0 -41
- data/lib/neo4j/migrations/migration.rb +0 -112
- data/lib/neo4j/migrations/migrations.rb +0 -6
- data/lib/neo4j/migrations/node_mixin.rb +0 -80
- data/lib/neo4j/migrations/ref_node_wrapper.rb +0 -32
- data/lib/neo4j/model.rb +0 -4
- data/lib/neo4j/neo4j.rb +0 -216
- data/lib/neo4j/node.rb +0 -270
- data/lib/neo4j/node_mixin/class_methods.rb +0 -51
- data/lib/neo4j/node_mixin/node_mixin.rb +0 -141
- data/lib/neo4j/paginated.rb +0 -23
- data/lib/neo4j/property/class_methods.rb +0 -79
- data/lib/neo4j/property/property.rb +0 -111
- data/lib/neo4j/rails/mapping/property.rb +0 -183
- data/lib/neo4j/rails/rel_persistence.rb +0 -237
- data/lib/neo4j/relationship.rb +0 -239
- data/lib/neo4j/relationship_mixin/class_methods.rb +0 -36
- data/lib/neo4j/relationship_mixin/relationship_mixin.rb +0 -142
- data/lib/neo4j/relationship_set.rb +0 -58
- data/lib/neo4j/rels/rels.rb +0 -110
- data/lib/neo4j/rels/traverser.rb +0 -102
- data/lib/neo4j/rule/class_methods.rb +0 -201
- data/lib/neo4j/rule/event_listener.rb +0 -66
- data/lib/neo4j/rule/functions/count.rb +0 -43
- data/lib/neo4j/rule/functions/function.rb +0 -74
- data/lib/neo4j/rule/functions/functions.rb +0 -3
- data/lib/neo4j/rule/functions/sum.rb +0 -29
- data/lib/neo4j/rule/rule.rb +0 -150
- data/lib/neo4j/rule/rule_node.rb +0 -217
- data/lib/neo4j/to_java.rb +0 -31
- data/lib/neo4j/transaction.rb +0 -73
- data/lib/neo4j/traversal/filter_predicate.rb +0 -25
- data/lib/neo4j/traversal/prune_evaluator.rb +0 -14
- data/lib/neo4j/traversal/rel_expander.rb +0 -31
- data/lib/neo4j/traversal/traversal.rb +0 -141
- data/lib/neo4j/traversal/traverser.rb +0 -284
- data/lib/neo4j/type_converters/type_converters.rb +0 -288
@@ -1,103 +1,206 @@
|
|
1
1
|
module Neo4j
|
2
2
|
module Rails
|
3
|
-
module Relationships
|
4
|
-
|
5
|
-
def write_changed_relationships #:nodoc:
|
6
|
-
@_relationships.each_value do |storage|
|
7
|
-
storage.persist
|
8
|
-
end
|
9
|
-
end
|
10
3
|
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
false
|
16
|
-
end
|
4
|
+
# This module overrides the Neo4j::Core::Rels module so that it can handle unpersisted relationships.
|
5
|
+
#
|
6
|
+
module Relationships
|
7
|
+
extend ActiveSupport::Concern
|
17
8
|
|
18
|
-
|
19
|
-
|
20
|
-
|
9
|
+
included do
|
10
|
+
# TODO THIS DOES NOT WORK
|
11
|
+
alias_method :_core_rels, :rels
|
12
|
+
alias_method :_core_rel, :rel
|
13
|
+
alias_method :_core_rel?, :rel?
|
14
|
+
alias_method :_core_outgoing, :outgoing
|
15
|
+
alias_method :_core_incoming, :incoming
|
21
16
|
end
|
22
17
|
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
18
|
+
# Same as {http://rdoc.info/github/andreasronge/neo4j-core/master/Neo4j/Core/Rels#outgoing-instance_method Neo4j::Core::Node#outgoing}
|
19
|
+
# Since the incoming method is redefined we might need the neo4j-core version of this method.
|
20
|
+
# @see #incoming
|
21
|
+
# @api public
|
22
|
+
def _outgoing(rel_type)
|
23
|
+
_core_outgoing(rel_type)
|
27
24
|
end
|
28
25
|
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
def
|
34
|
-
|
26
|
+
# Same as {http://rdoc.info/github/andreasronge/neo4j-core/master/Neo4j/Core/Rels#incoming-instance_method Neo4j::Core::Node#incoming}
|
27
|
+
# Since the incoming method is redefined we might need the neo4j-core version of this method.
|
28
|
+
# @see #incoming
|
29
|
+
# @api public
|
30
|
+
def _incoming(rel_type)
|
31
|
+
_core_incomig(rel_type)
|
35
32
|
end
|
36
33
|
|
37
|
-
#
|
38
|
-
#
|
39
|
-
#
|
34
|
+
# Similar to {http://rdoc.info/github/andreasronge/neo4j-core/master/Neo4j/Core/Rels#outgoing-instance_method Neo4j::Core::Node#outgoing}
|
35
|
+
# but allows traversing both persisted and unpersisted relationship of depth one.
|
36
|
+
# For deeper or more advanced traversals see #_outgoing
|
40
37
|
#
|
41
|
-
#
|
38
|
+
# @example create a relationship between two nodes which is not persisted
|
39
|
+
# node.outgoing(:foo) << other_node
|
40
|
+
#
|
41
|
+
# @example create and persist a relationship between two nodes with given node
|
42
|
+
# node.outgoing(:foo) << other_node
|
43
|
+
# node.save
|
44
|
+
#
|
45
|
+
# @example create a new node with given attributes and persist the relationship
|
46
|
+
# node.outgoing(:foo).create(:name => 'bla')
|
42
47
|
#
|
48
|
+
# @example create a new node with given attributes and but do not persist the relationship
|
49
|
+
# node.outgoing(:foo).new(:name => 'bla')
|
50
|
+
#
|
51
|
+
# @see #rels
|
52
|
+
# @see #_outgoing
|
53
|
+
# @api public
|
54
|
+
# @param [String, Symbol] rel_type the relationship type we want to create or traverse
|
55
|
+
# @return [NodesDSL]
|
43
56
|
def outgoing(rel_type)
|
44
57
|
storage = _create_or_get_storage(rel_type)
|
45
58
|
NodesDSL.new(storage, :outgoing)
|
46
59
|
end
|
47
60
|
|
48
61
|
|
49
|
-
#
|
62
|
+
# Similar to {http://rdoc.info/github/andreasronge/neo4j-core/master/Neo4j/Core/Rels#incoming-instance_method Neo4j::Core::Node#incoming}
|
63
|
+
# but allows traversing both persisted and unpersisted relationship of depth one.
|
50
64
|
# See #outgoing
|
51
65
|
# See, Neo4j::NodeRelationship#outgoing (when node is persisted) which returns a Neo4j::NodeTraverser
|
66
|
+
# @param (see #outgoing)
|
67
|
+
# @api public
|
68
|
+
# @return [NodesDSL]
|
52
69
|
def incoming(rel_type)
|
53
70
|
storage = _create_or_get_storage(rel_type)
|
54
71
|
NodesDSL.new(storage, :incoming)
|
55
72
|
end
|
56
73
|
|
57
|
-
#
|
58
|
-
#
|
59
|
-
# Will also allow to access unsaved relationships - like the #outgoing and #incoming method.
|
60
|
-
# It one argument - the relationship type.
|
61
|
-
#
|
74
|
+
# Allow to access persisted and unpersisted relationships - like the #outgoing and #incoming method.
|
62
75
|
# To only find all the persisted relationship, node._java_node.rels
|
63
76
|
#
|
64
|
-
#
|
65
|
-
#
|
77
|
+
# @example
|
66
78
|
# node.outgoing(:foo) << node2
|
67
|
-
# node.rels(:foo).outgoing #=> [node2]
|
79
|
+
# node.rels(:outgoing, :foo).outgoing #=> [node2]
|
68
80
|
# node.rels(:foo).incoming #=> []
|
69
|
-
# node.rels(:
|
81
|
+
# node.rels(:both) #=> [node2] - incoming and outgoing of any type
|
82
|
+
#
|
83
|
+
# @example All the relationships between me and another node of given dir & type
|
84
|
+
# me.rels(:outgoing, :friends).to_other(node)
|
70
85
|
#
|
71
|
-
|
72
|
-
|
73
|
-
|
86
|
+
# @param [:both, :incoming, :outgoing] dir the direction of the relationship
|
87
|
+
# @param [String, Symbol] rel_type the requested relationship types we want look for, if none it gets relationships of any type
|
88
|
+
# @return [RelsDSL, AllRelsDsl] an object which included the Ruby Enumerable mixin
|
89
|
+
# @note it can return an unpersisted relationship
|
90
|
+
def rels(dir=:both, rel_type=nil)
|
91
|
+
raise "Illegal argument, first argument must be :both, :incoming or :outgoing, got #{dir.inspect}" unless [:incoming, :outgoing, :both].include?(dir)
|
92
|
+
if rel_type.nil?
|
93
|
+
AllRelsDsl.new(@_relationships, _java_node, dir)
|
74
94
|
else
|
75
|
-
storage = _create_or_get_storage(
|
76
|
-
RelsDSL.new(storage)
|
95
|
+
storage = _create_or_get_storage(rel_type)
|
96
|
+
RelsDSL.new(storage, dir)
|
77
97
|
end
|
78
98
|
end
|
79
99
|
|
80
|
-
|
81
|
-
|
100
|
+
# Returns the only relationship of a given type and direction that is attached to this node, or nil.
|
101
|
+
# This is a convenience method that is used in the commonly occuring situation where a node has exactly zero or
|
102
|
+
# one relationships of a given type and direction to another node.
|
103
|
+
# Typically this invariant is maintained by the rest of the code: if at any time more than one such relationships
|
104
|
+
# exist, it is a fatal error that should generate an unchecked exception. This method reflects that semantics and
|
105
|
+
# returns either:
|
106
|
+
#
|
107
|
+
# * nil if there are zero relationships of the given type and direction,
|
108
|
+
# * the relationship if there's exactly one, or
|
109
|
+
# * raise an exception in all other cases.
|
110
|
+
# @param [:both, :incoming, :outgoing] dir the direction of the relationship
|
111
|
+
# @param [Symbol, String] rel_type the type of relationship, see Neo4j::Core::Relationship#rel_type
|
112
|
+
# @return [Neo4j::Relationship, nil, Neo4j::Rails::Relationship] the Relationship or wrapper for the Relationship or nil
|
113
|
+
# @raise an exception if more then one relationship of given type and direction was found
|
114
|
+
# @note it can return an unpersisted relationship
|
115
|
+
def rel(dir, rel_type)
|
116
|
+
raise "Illegal argument, first argument must be :both, :incoming or :outgoing, got #{dir.inspect}" unless [:incoming, :outgoing, :both].include?(dir)
|
117
|
+
storage = _create_or_get_storage(rel_type)
|
118
|
+
storage.single_relationship(dir)
|
82
119
|
end
|
83
120
|
|
84
|
-
|
85
|
-
|
121
|
+
# Check if the given relationship exists
|
122
|
+
# Returns true if there are one or more relationships from this node to other nodes
|
123
|
+
# with the given relationship.
|
124
|
+
#
|
125
|
+
# @param [:both, :incoming, :outgoing] dir optional default :both (either, :outgoing, :incoming, :both)
|
126
|
+
# @param [String,Symbol] rel_type the key and value to be set, default any type
|
127
|
+
# @return [Boolean] true if one or more relationships exists for the given type and dir otherwise false
|
128
|
+
def rel?(dir=:both, rel_type=nil)
|
129
|
+
raise "Illegal argument, first argument must be :both, :incoming or :outgoing, got #{dir.inspect}" unless [:incoming, :outgoing, :both].include?(dir)
|
130
|
+
storage = _create_or_get_storage(rel_type)
|
131
|
+
!!storage.single_relationship(dir)
|
86
132
|
end
|
87
133
|
|
88
|
-
|
89
|
-
|
134
|
+
|
135
|
+
# Works like #rels method but instead returns the nodes.
|
136
|
+
# It does try to load a Ruby wrapper around each node
|
137
|
+
# @param (see #rels)
|
138
|
+
# @return [Enumerable] an Enumeration of either Neo4j::Node objects or wrapped Neo4j::Node objects
|
139
|
+
# @notice it's possible that the same node is returned more then once because of several relationship reaching to the same node, see #outgoing for alternative
|
140
|
+
def nodes(dir, rel_type)
|
141
|
+
raise "Illegal argument, first argument must be :both, :incoming or :outgoing, got #{dir.inspect}" unless [:incoming, :outgoing, :both].include?(dir)
|
142
|
+
storage = _create_or_get_storage(rel_type)
|
143
|
+
NodesDSL.new(storage, dir)
|
90
144
|
end
|
91
145
|
|
92
|
-
|
93
|
-
|
146
|
+
# Returns the only node of a given type and direction that is attached to this node, or nil.
|
147
|
+
# This is a convenience method that is used in the commonly occuring situation where a node has exactly zero or one relationships of a given type and direction to another node.
|
148
|
+
# Typically this invariant is maintained by the rest of the code: if at any time more than one such relationships exist, it is a fatal error that should generate an exception.
|
149
|
+
# This method reflects that semantics and returns either:
|
150
|
+
# * nil if there are zero relationships of the given type and direction,
|
151
|
+
# * the relationship if there's exactly one, or
|
152
|
+
# * throws an unchecked exception in all other cases.
|
153
|
+
#
|
154
|
+
# This method should be used only in situations with an invariant as described above. In those situations, a "state-checking" method (e.g. #rel?) is not required,
|
155
|
+
# because this method behaves correctly "out of the box."
|
156
|
+
#
|
157
|
+
# @param (see #rel)
|
158
|
+
# @see Neo4j::Core::Node#wrapper #wrapper - The method used to wrap the node in a Ruby object if the node was found
|
159
|
+
def node(dir, rel_type)
|
160
|
+
raise "Illegal argument, first argument must be :both, :incoming or :outgoing, got #{dir.inspect}" unless [:incoming, :outgoing, :both].include?(dir)
|
161
|
+
storage = _create_or_get_storage(rel_type)
|
162
|
+
storage.single_node(dir)
|
94
163
|
end
|
95
164
|
|
96
|
-
|
97
|
-
|
165
|
+
|
166
|
+
# @private
|
167
|
+
def initialize_relationships
|
168
|
+
@_relationships = {}
|
169
|
+
end
|
170
|
+
|
171
|
+
# @private
|
172
|
+
def write_changed_relationships #:nodoc:
|
173
|
+
@_relationships.each_value do |storage|
|
174
|
+
storage.persist
|
175
|
+
end
|
98
176
|
end
|
99
177
|
|
100
|
-
|
178
|
+
# @private
|
179
|
+
def relationships_changed?
|
180
|
+
@_relationships.each_value do |storage|
|
181
|
+
return true if !storage.persisted?
|
182
|
+
end
|
183
|
+
false
|
184
|
+
end
|
185
|
+
|
186
|
+
# @private
|
187
|
+
def clear_relationships
|
188
|
+
@_relationships && @_relationships.each_value { |storage| storage.remove_from_identity_map }
|
189
|
+
initialize_relationships
|
190
|
+
end
|
191
|
+
|
192
|
+
# @private
|
193
|
+
def add_outgoing_rel(rel_type, rel)
|
194
|
+
_create_or_get_storage(rel_type).add_outgoing_rel(rel)
|
195
|
+
end
|
196
|
+
|
197
|
+
# @private
|
198
|
+
def add_incoming_rel(rel_type, rel)
|
199
|
+
_create_or_get_storage(rel_type).add_incoming_rel(rel)
|
200
|
+
end
|
201
|
+
|
202
|
+
# @private
|
203
|
+
def add_unpersisted_incoming_rel(rel_type, rel)
|
101
204
|
if (storage = _create_or_get_storage(rel_type))
|
102
205
|
# move the relationship since we are now about to store the relationship
|
103
206
|
storage.add_unpersisted_incoming_rel(rel)
|
@@ -105,7 +208,8 @@ module Neo4j
|
|
105
208
|
end
|
106
209
|
end
|
107
210
|
|
108
|
-
|
211
|
+
# @private
|
212
|
+
def add_unpersisted_outgoing_rel(rel_type, rel)
|
109
213
|
if (storage = _create_or_get_storage(rel_type))
|
110
214
|
# move the relationship since we are now about to store the relationship
|
111
215
|
storage.add_unpersisted_outgoing_rel(rel)
|
@@ -113,18 +217,42 @@ module Neo4j
|
|
113
217
|
end
|
114
218
|
end
|
115
219
|
|
116
|
-
|
220
|
+
# @private
|
221
|
+
def rm_unpersisted_outgoing_rel(rel_type, rel)
|
117
222
|
if (storage = _storage_for(rel_type))
|
118
223
|
storage.rm_unpersisted_outgoing_rel(rel)
|
119
224
|
end
|
120
225
|
end
|
121
226
|
|
122
|
-
|
227
|
+
# @private
|
228
|
+
def rm_unpersisted_incoming_rel(rel_type, rel)
|
123
229
|
if (storage = _storage_for(rel_type))
|
124
230
|
storage.rm_unpersisted_incoming_rel(rel)
|
125
231
|
end
|
126
232
|
end
|
127
233
|
|
234
|
+
protected
|
235
|
+
|
236
|
+
def rm_incoming_rel(rel_type, rel) #:nodoc:
|
237
|
+
_create_or_get_storage(rel_type).rm_incoming_rel(rel)
|
238
|
+
end
|
239
|
+
|
240
|
+
def rm_outgoing_rel(rel_type, rel) #:nodoc:
|
241
|
+
_create_or_get_storage(rel_type).rm_outgoing_rel(rel)
|
242
|
+
end
|
243
|
+
|
244
|
+
def _create_or_get_storage(rel_type) #:nodoc:
|
245
|
+
@_relationships[rel_type.to_sym] ||= Storage.new(self, rel_type)
|
246
|
+
end
|
247
|
+
|
248
|
+
def _create_or_get_storage_for_decl_rels(decl_rels) #:nodoc:
|
249
|
+
@_relationships[decl_rels.rel_type.to_sym] ||= Storage.new(self, decl_rels.rel_type, decl_rels)
|
250
|
+
end
|
251
|
+
|
252
|
+
def _storage_for(rel_type) #:nodoc:
|
253
|
+
@_relationships[rel_type.to_sym]
|
254
|
+
end
|
255
|
+
|
128
256
|
|
129
257
|
end
|
130
258
|
end
|
@@ -7,13 +7,14 @@ module Neo4j
|
|
7
7
|
class AllRelsDsl
|
8
8
|
include Enumerable
|
9
9
|
|
10
|
-
def initialize(rels_stores, node)
|
10
|
+
def initialize(rels_stores, node, dir)
|
11
11
|
@rels_stores = rels_stores
|
12
12
|
@node = node
|
13
|
+
@dir = dir
|
13
14
|
end
|
14
15
|
|
15
16
|
def each
|
16
|
-
@rels_stores.each_value {|storage| storage.relationships(
|
17
|
+
@rels_stores.each_value {|storage| storage.relationships(@dir).each{|r| yield r}}
|
17
18
|
@node && @node.rels.each {|r| yield r}
|
18
19
|
end
|
19
20
|
|
@@ -29,7 +30,7 @@ module Neo4j
|
|
29
30
|
# Notice, only persisted relationships will be returned.
|
30
31
|
def to_other(other)
|
31
32
|
raise('node.rels(...).to_other() not allowed on a node that is not persisted') unless @node
|
32
|
-
@node.rels.to_other(other)
|
33
|
+
@node._java_node.rels(@dir).to_other(other)
|
33
34
|
end
|
34
35
|
|
35
36
|
def delete_all
|
@@ -68,7 +69,7 @@ module Neo4j
|
|
68
69
|
class RelsDSL
|
69
70
|
include Enumerable
|
70
71
|
|
71
|
-
def initialize(storage, dir
|
72
|
+
def initialize(storage, dir)
|
72
73
|
@storage = storage
|
73
74
|
@dir = dir
|
74
75
|
end
|
@@ -76,16 +77,16 @@ module Neo4j
|
|
76
77
|
|
77
78
|
# Same as Neo4j::Rails::Relationships::NodesDSL#build except that you specify the properties of the
|
78
79
|
# relationships and it returns a relationship
|
79
|
-
def build(
|
80
|
-
node = @storage.build(
|
81
|
-
@storage.create_relationship_to(node, @dir)
|
80
|
+
def build(rels_attrs = nil, node_attr = nil)
|
81
|
+
node = @storage.build(node_attr)
|
82
|
+
@storage.create_relationship_to(node, @dir, rels_attrs)
|
82
83
|
end
|
83
84
|
|
84
85
|
# Same as Neo4j::Rails::Relationships::NodesDSL#create except that you specify the properties of the
|
85
86
|
# relationships and it returns a relationship
|
86
|
-
def create(
|
87
|
-
node = @storage.
|
88
|
-
rel = @storage.create_relationship_to(node, @dir)
|
87
|
+
def create(rels_attrs = {}, node_attr = nil)
|
88
|
+
node = @storage.build(node_attr)
|
89
|
+
rel = @storage.create_relationship_to(node, @dir, rels_attrs)
|
89
90
|
node.save
|
90
91
|
rel
|
91
92
|
end
|
@@ -94,7 +95,7 @@ module Neo4j
|
|
94
95
|
# Returns an Enumerable. If the node is not persisted it will raise an error.
|
95
96
|
# Notice, only persisted relationships will be returned.
|
96
97
|
def to_other(other)
|
97
|
-
@storage.to_other(other)
|
98
|
+
@storage.to_other(@dir, other)
|
98
99
|
end
|
99
100
|
|
100
101
|
# Connects this node with an already existing other node with a new relationship.
|
@@ -109,8 +110,8 @@ module Neo4j
|
|
109
110
|
|
110
111
|
# Same as Neo4j::Rails::Relationships::NodesDSL#create! except that you specify the properties of the
|
111
112
|
# relationships and it returns a relationship
|
112
|
-
def create!(
|
113
|
-
node = @storage.create(
|
113
|
+
def create!(rels_attrs)
|
114
|
+
node = @storage.create(rels_attrs)
|
114
115
|
rel = @storage.create_relationship_to(node, @dir)
|
115
116
|
node.save!
|
116
117
|
rel
|
@@ -118,7 +119,7 @@ module Neo4j
|
|
118
119
|
|
119
120
|
# Specifies that we want outgoing (undeclared) relationships.
|
120
121
|
#
|
121
|
-
#
|
122
|
+
# @example
|
122
123
|
# class Thing < Neo4j::Rails::Model
|
123
124
|
# end
|
124
125
|
#
|
@@ -141,13 +142,13 @@ module Neo4j
|
|
141
142
|
end
|
142
143
|
|
143
144
|
# Simply counts all relationships
|
144
|
-
def
|
145
|
-
@storage.
|
145
|
+
def count
|
146
|
+
@storage.count(@dir)
|
146
147
|
end
|
147
148
|
|
148
149
|
# True if no relationship
|
149
150
|
def empty?
|
150
|
-
|
151
|
+
!@storage.relationships?(@dir)
|
151
152
|
end
|
152
153
|
|
153
154
|
# Destroys all relationships object. Will not destroy the nodes.
|
@@ -4,10 +4,9 @@ module Neo4j
|
|
4
4
|
|
5
5
|
# Holds the relationships in memory but also allows read access to persisted relationships
|
6
6
|
class Storage #:nodoc:
|
7
|
-
include Neo4j::ToJava
|
8
7
|
attr_reader :dsl, :node, :rel_type
|
9
8
|
|
10
|
-
def initialize(node, rel_type, dsl)
|
9
|
+
def initialize(node, rel_type, dsl=nil)
|
11
10
|
@rel_type = rel_type.to_sym
|
12
11
|
@node = node
|
13
12
|
@rel_class = (dsl && dsl.relationship_class) || Neo4j::Rails::Relationship
|
@@ -37,17 +36,20 @@ module Neo4j
|
|
37
36
|
@unpersisted_incoming_rels = nil
|
38
37
|
end
|
39
38
|
|
40
|
-
def
|
39
|
+
def count(dir)
|
41
40
|
counter = 0
|
42
41
|
# count persisted relationship
|
43
|
-
@node.
|
42
|
+
@node._rels(dir, @rel_type).each { |*| counter += 1 } if @node.persisted?
|
44
43
|
# count relationship which has not yet been persisted
|
45
44
|
counter += relationships(dir).size
|
46
45
|
counter
|
47
46
|
end
|
48
47
|
|
49
|
-
def to_other(other)
|
50
|
-
|
48
|
+
def to_other(dir, other)
|
49
|
+
raise('node.rels(...).to_other() not allowed on a node that is not persisted') if @node.new_record?
|
50
|
+
all_relationships(dir).find_all do |rel|
|
51
|
+
rel._other_node(@node) == other
|
52
|
+
end
|
51
53
|
end
|
52
54
|
|
53
55
|
def build(attrs)
|
@@ -69,10 +71,6 @@ module Neo4j
|
|
69
71
|
end
|
70
72
|
end
|
71
73
|
|
72
|
-
def java_rel_type
|
73
|
-
type_to_java(rel_type)
|
74
|
-
end
|
75
|
-
|
76
74
|
def each_rel(dir, &block) #:nodoc:
|
77
75
|
relationships(dir).each { |rel| block.call rel }
|
78
76
|
if @node.persisted?
|
@@ -83,7 +81,7 @@ module Neo4j
|
|
83
81
|
|
84
82
|
def cache_relationships(dir)
|
85
83
|
@persisted_relationships[dir] ||= []
|
86
|
-
node.
|
84
|
+
node._rels(dir, @rel_type).each do |rel|
|
87
85
|
@persisted_relationships[dir] << rel.wrapper
|
88
86
|
end
|
89
87
|
end
|
@@ -91,8 +89,8 @@ module Neo4j
|
|
91
89
|
def cache_persisted_nodes_and_relationships(dir)
|
92
90
|
@persisted_related_nodes[dir] ||= []
|
93
91
|
@persisted_node_to_relationships[dir] ||= {}
|
94
|
-
@node.
|
95
|
-
end_node = rel.
|
92
|
+
@node._rels(dir, @rel_type).each do |rel|
|
93
|
+
end_node = rel._other_node(@node._java_node).wrapper
|
96
94
|
@persisted_related_nodes[dir] << end_node
|
97
95
|
@persisted_node_to_relationships[dir][end_node]=rel
|
98
96
|
end
|
@@ -116,10 +114,14 @@ module Neo4j
|
|
116
114
|
end
|
117
115
|
end
|
118
116
|
|
117
|
+
def relationships?(dir)
|
118
|
+
!!relationships(dir).first || (@node.persisted? && @node._rels(dir, @rel_type).first)
|
119
|
+
end
|
120
|
+
|
119
121
|
def single_relationship(dir, raw = false)
|
120
122
|
rel = relationships(dir).first
|
121
123
|
if rel.nil? && @node.persisted?
|
122
|
-
java_rel = @node.
|
124
|
+
java_rel = @node._rel(dir, @rel_type)
|
123
125
|
raw ? java_rel : java_rel && java_rel.wrapper
|
124
126
|
else
|
125
127
|
rel
|
@@ -148,11 +150,11 @@ module Neo4j
|
|
148
150
|
end
|
149
151
|
end
|
150
152
|
|
151
|
-
def create_relationship_to(to, dir)
|
153
|
+
def create_relationship_to(to, dir, attributes=nil)
|
152
154
|
if dir == :outgoing
|
153
|
-
@rel_class.new(@rel_type, @node, to,
|
155
|
+
@rel_class.new(@rel_type, @node, to, attributes)
|
154
156
|
else
|
155
|
-
@rel_class.new(@rel_type, to, @node,
|
157
|
+
@rel_class.new(@rel_type, to, @node, attributes)
|
156
158
|
end
|
157
159
|
end
|
158
160
|
|