neo4j 1.0.0.beta.9 → 1.0.0.beta.10
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/README.rdoc +5 -1971
- data/lib/neo4j/mapping/class_methods/relationship.rb +2 -2
- data/lib/neo4j/mapping/decl_relationship_dsl.rb +6 -1
- data/lib/neo4j/mapping/has_n.rb +17 -1
- data/lib/neo4j/node_traverser.rb +14 -1
- data/lib/neo4j/rails/model.rb +127 -31
- data/lib/neo4j/rails/tx_methods.rb +11 -0
- data/lib/neo4j/rails/value.rb +44 -1
- data/lib/neo4j/version.rb +1 -1
- data/lib/neo4j.rb +1 -0
- metadata +4 -59
- data/lib/neo4j.old/batch_inserter.rb +0 -144
- data/lib/neo4j.old/config.rb +0 -138
- data/lib/neo4j.old/event_handler.rb +0 -73
- data/lib/neo4j.old/extensions/activemodel.rb +0 -158
- data/lib/neo4j.old/extensions/aggregate/aggregate_enum.rb +0 -40
- data/lib/neo4j.old/extensions/aggregate/ext/node_mixin.rb +0 -69
- data/lib/neo4j.old/extensions/aggregate/node_aggregate.rb +0 -8
- data/lib/neo4j.old/extensions/aggregate/node_aggregate_mixin.rb +0 -331
- data/lib/neo4j.old/extensions/aggregate/node_aggregator.rb +0 -216
- data/lib/neo4j.old/extensions/aggregate/node_group.rb +0 -43
- data/lib/neo4j.old/extensions/aggregate/prop_group.rb +0 -30
- data/lib/neo4j.old/extensions/aggregate/property_enum.rb +0 -24
- data/lib/neo4j.old/extensions/aggregate/props_aggregate.rb +0 -8
- data/lib/neo4j.old/extensions/aggregate/props_aggregate_mixin.rb +0 -31
- data/lib/neo4j.old/extensions/aggregate/props_aggregator.rb +0 -80
- data/lib/neo4j.old/extensions/aggregate.rb +0 -12
- data/lib/neo4j.old/extensions/find_path.rb +0 -117
- data/lib/neo4j.old/extensions/graph_algo/all_simple_paths.rb +0 -133
- data/lib/neo4j.old/extensions/graph_algo/neo4j-graph-algo-0.3.jar +0 -0
- data/lib/neo4j.old/extensions/graph_algo.rb +0 -1
- data/lib/neo4j.old/extensions/reindexer.rb +0 -104
- data/lib/neo4j.old/extensions/rest/rest.rb +0 -336
- data/lib/neo4j.old/extensions/rest/rest_mixin.rb +0 -193
- data/lib/neo4j.old/extensions/rest/server.rb +0 -50
- data/lib/neo4j.old/extensions/rest/stubs.rb +0 -141
- data/lib/neo4j.old/extensions/rest.rb +0 -21
- data/lib/neo4j.old/extensions/rest_master.rb +0 -34
- data/lib/neo4j.old/extensions/rest_slave.rb +0 -31
- data/lib/neo4j.old/extensions/tx_tracker.rb +0 -392
- data/lib/neo4j.old/indexer.rb +0 -187
- data/lib/neo4j.old/jars/geronimo-jta_1.1_spec-1.1.1.jar +0 -0
- data/lib/neo4j.old/jars/neo4j-kernel-1.0.jar +0 -0
- data/lib/neo4j.old/jars.rb +0 -6
- data/lib/neo4j.old/mixins/java_list_mixin.rb +0 -139
- data/lib/neo4j.old/mixins/java_node_mixin.rb +0 -205
- data/lib/neo4j.old/mixins/java_property_mixin.rb +0 -169
- data/lib/neo4j.old/mixins/java_relationship_mixin.rb +0 -60
- data/lib/neo4j.old/mixins/migration_mixin.rb +0 -157
- data/lib/neo4j.old/mixins/node_mixin.rb +0 -249
- data/lib/neo4j.old/mixins/property_class_methods.rb +0 -265
- data/lib/neo4j.old/mixins/rel_class_methods.rb +0 -167
- data/lib/neo4j.old/mixins/relationship_mixin.rb +0 -103
- data/lib/neo4j.old/neo.rb +0 -247
- data/lib/neo4j.old/node.rb +0 -49
- data/lib/neo4j.old/reference_node.rb +0 -15
- data/lib/neo4j.old/relationship.rb +0 -85
- data/lib/neo4j.old/relationships/decl_relationship_dsl.rb +0 -164
- data/lib/neo4j.old/relationships/has_list.rb +0 -101
- data/lib/neo4j.old/relationships/has_n.rb +0 -129
- data/lib/neo4j.old/relationships/node_traverser.rb +0 -138
- data/lib/neo4j.old/relationships/relationship_dsl.rb +0 -149
- data/lib/neo4j.old/relationships/traversal_position.rb +0 -50
- data/lib/neo4j.old/relationships/wrappers.rb +0 -51
- data/lib/neo4j.old/search_result.rb +0 -72
- data/lib/neo4j.old/transaction.rb +0 -254
- data/lib/neo4j.old/version.rb +0 -3
@@ -35,7 +35,7 @@ module Neo4j::Mapping
|
|
35
35
|
Neo4j::Mapping::HasN.new(self, dsl).rels
|
36
36
|
end}, __FILE__, __LINE__)
|
37
37
|
|
38
|
-
_decl_rels[rel_type.to_sym] = Neo4j::Mapping::DeclRelationshipDsl.new(rel_type, params)
|
38
|
+
_decl_rels[rel_type.to_sym] = Neo4j::Mapping::DeclRelationshipDsl.new(rel_type, false, params)
|
39
39
|
end
|
40
40
|
|
41
41
|
|
@@ -84,7 +84,7 @@ module Neo4j::Mapping
|
|
84
84
|
[*r][0]
|
85
85
|
end}, __FILE__, __LINE__)
|
86
86
|
|
87
|
-
_decl_rels[rel_type.to_sym] = Neo4j::Mapping::DeclRelationshipDsl.new(rel_type, params)
|
87
|
+
_decl_rels[rel_type.to_sym] = Neo4j::Mapping::DeclRelationshipDsl.new(rel_type, true, params)
|
88
88
|
end
|
89
89
|
|
90
90
|
end
|
@@ -35,15 +35,20 @@ module Neo4j::Mapping
|
|
35
35
|
attr_reader :to_type, :to_class, :cascade_delete_prop_name, :counter, :rel_id, :direction
|
36
36
|
CASCADE_DELETE_PROP_NAMES = {:outgoing => :_cascade_delete_outgoing, :incoming => :_cascade_delete_incoming}
|
37
37
|
|
38
|
-
def initialize(rel_id, params)
|
38
|
+
def initialize(rel_id, has_one, params)
|
39
39
|
@direction = :outgoing
|
40
40
|
@rel_id = rel_id
|
41
41
|
@to_type = rel_id
|
42
|
+
@has_one = has_one
|
42
43
|
@namespace_type = rel_id
|
43
44
|
@cascade_delete_prop_name = CASCADE_DELETE_PROP_NAMES[params[:cascade_delete]]
|
44
45
|
@counter = params[:counter] == true
|
45
46
|
end
|
46
47
|
|
48
|
+
def has_one?
|
49
|
+
@has_one
|
50
|
+
end
|
51
|
+
|
47
52
|
# If a counter was specified in the dsl for counting number of nodes in this relationship.
|
48
53
|
#
|
49
54
|
def counter?
|
data/lib/neo4j/mapping/has_n.rb
CHANGED
@@ -24,6 +24,22 @@ module Neo4j
|
|
24
24
|
@traverser = Neo4j::NodeTraverser.new(node._java_node, @dsl.namespace_type, @direction)
|
25
25
|
end
|
26
26
|
|
27
|
+
def size
|
28
|
+
[*self].size
|
29
|
+
end
|
30
|
+
|
31
|
+
alias_method :length, :size
|
32
|
+
|
33
|
+
def [](index)
|
34
|
+
each_with_index {|node,i| break node if index == i}
|
35
|
+
end
|
36
|
+
|
37
|
+
# Pretend we are an array - this is neccessarly for Rails actionpack/actionview/formhelper to work with this
|
38
|
+
def is_a?(type)
|
39
|
+
# ActionView requires this for nested attributes to work
|
40
|
+
return true if Array == type
|
41
|
+
super
|
42
|
+
end
|
27
43
|
|
28
44
|
# Returns the relationships instead of the nodes.
|
29
45
|
#
|
@@ -43,7 +59,7 @@ module Neo4j
|
|
43
59
|
# morpheus.friends.depth(3).each { ... }
|
44
60
|
#
|
45
61
|
# ==== Arguments
|
46
|
-
# d
|
62
|
+
# d:: the depth or :all if traversing to the end of the network (symbol or fixnum)
|
47
63
|
# ==== Return
|
48
64
|
# self
|
49
65
|
#
|
data/lib/neo4j/node_traverser.rb
CHANGED
@@ -51,6 +51,9 @@ module Neo4j
|
|
51
51
|
end
|
52
52
|
|
53
53
|
|
54
|
+
def to_s
|
55
|
+
"NodeTraverser [from: #{@from.neo_id} depth: #{@depth} type: #{@type} dir:#{@dir}"
|
56
|
+
end
|
54
57
|
|
55
58
|
def <<(other_node)
|
56
59
|
new(other_node)
|
@@ -118,10 +121,20 @@ module Neo4j
|
|
118
121
|
[*self].size
|
119
122
|
end
|
120
123
|
|
124
|
+
alias_method :length, :size
|
125
|
+
|
126
|
+
def [](index)
|
127
|
+
each_with_index {|node,i| break node if index == i}
|
128
|
+
end
|
129
|
+
|
130
|
+
def empty?
|
131
|
+
first == nil
|
132
|
+
end
|
133
|
+
|
121
134
|
def each
|
122
135
|
iter = iterator
|
123
136
|
while (iter.hasNext) do
|
124
|
-
yield
|
137
|
+
yield iter.next.wrapper
|
125
138
|
end
|
126
139
|
end
|
127
140
|
|
data/lib/neo4j/rails/model.rb
CHANGED
@@ -7,6 +7,8 @@ class Neo4j::Model
|
|
7
7
|
extend ActiveModel::Naming
|
8
8
|
extend ActiveModel::Callbacks
|
9
9
|
extend Neo4j::Validations::ClassMethods
|
10
|
+
extend Neo4j::TxMethods
|
11
|
+
|
10
12
|
define_model_callbacks :create, :save, :update, :destroy
|
11
13
|
|
12
14
|
|
@@ -39,7 +41,7 @@ class Neo4j::Model
|
|
39
41
|
# --------------------------------------
|
40
42
|
|
41
43
|
def id
|
42
|
-
|
44
|
+
neo_id.nil? ? nil : neo_id.to_s
|
43
45
|
end
|
44
46
|
|
45
47
|
def to_param
|
@@ -83,7 +85,7 @@ class Neo4j::Model
|
|
83
85
|
|
84
86
|
|
85
87
|
def read_attribute_for_validation(key)
|
86
|
-
respond_to?(key)? send(key) : self[key]
|
88
|
+
respond_to?(key) ? send(key) : self[key]
|
87
89
|
end
|
88
90
|
|
89
91
|
def attributes=(values)
|
@@ -98,26 +100,63 @@ class Neo4j::Model
|
|
98
100
|
|
99
101
|
|
100
102
|
# Updates this resource with all the attributes from the passed-in Hash and requests that the record be saved.
|
101
|
-
# If the saving fails because of a connection or remote service error, an exception will be raised.
|
102
103
|
# If saving fails because the resource is invalid then false will be returned.
|
103
104
|
def update_attributes(attributes)
|
104
|
-
Neo4j::Rails::Transaction.running? ? update_attributes_in_tx(attributes) : Neo4j::Rails::Transaction.run { update_attributes_in_tx(attributes) }
|
105
|
-
end
|
106
|
-
|
107
|
-
def update_attributes_in_tx(attributes)
|
108
105
|
self.attributes=attributes
|
109
106
|
save
|
110
107
|
end
|
111
108
|
|
112
109
|
def update_attributes!(attributes)
|
113
|
-
Neo4j::Rails::Transaction.running? ? update_attributes_in_tx!(attributes) : Neo4j::Rails::Transaction.run { update_attributes_in_tx!(attributes) }
|
114
|
-
end
|
115
|
-
|
116
|
-
def update_attributes_in_tx!(attributes)
|
117
110
|
self.attributes=attributes
|
118
111
|
save!
|
119
112
|
end
|
120
113
|
|
114
|
+
def update_nested_attributes(rel_type, clazz, has_one, attr, options)
|
115
|
+
allow_destroy,reject_if = [options[:allow_destroy], options[:reject_if]] if options
|
116
|
+
|
117
|
+
if new?
|
118
|
+
# We are updating a node that was created with the 'new' method.
|
119
|
+
# The relationship will only be kept in the Value object.
|
120
|
+
outgoing(rel_type)<<clazz.new(attr) unless reject_if?(reject_if,attr)
|
121
|
+
else
|
122
|
+
# We have a node that was created with the #create method - has real Neo4j relationships
|
123
|
+
# does it exist ?
|
124
|
+
found = if has_one
|
125
|
+
# id == nil that means we have a has_one relationship
|
126
|
+
outgoing(rel_type).first
|
127
|
+
else
|
128
|
+
# do we have an ID ?
|
129
|
+
id = attr[:id]
|
130
|
+
# this is a has_n relationship, find which one we want to update
|
131
|
+
id && outgoing(rel_type).find { |n| n.id == id }
|
132
|
+
end
|
133
|
+
|
134
|
+
# Check if we want to destroy not found nodes (e.g. {..., :_destroy => '1' } ?
|
135
|
+
destroy = attr[:_destroy]
|
136
|
+
if found
|
137
|
+
if destroy
|
138
|
+
found.destroy if allow_destroy
|
139
|
+
else
|
140
|
+
found.update_attributes_in_tx(attr) # it already exist, so update that one
|
141
|
+
end
|
142
|
+
elsif !destroy && !reject_if?(reject_if,attr)
|
143
|
+
new_node = clazz.new(attr)
|
144
|
+
saved = new_node.save
|
145
|
+
outgoing(rel_type) << new_node if saved
|
146
|
+
end
|
147
|
+
end
|
148
|
+
end
|
149
|
+
|
150
|
+
def reject_if?(proc_or_symbol, attr)
|
151
|
+
return false if proc_or_symbol.nil?
|
152
|
+
if proc_or_symbol.is_a?(Symbol)
|
153
|
+
meth = method(proc_or_symbol)
|
154
|
+
meth.arity == 0 ? meth.call : meth.call(attr)
|
155
|
+
else
|
156
|
+
proc_or_symbol.call(attr)
|
157
|
+
end
|
158
|
+
end
|
159
|
+
|
121
160
|
def delete
|
122
161
|
super
|
123
162
|
@_deleted = true
|
@@ -125,13 +164,10 @@ class Neo4j::Model
|
|
125
164
|
end
|
126
165
|
|
127
166
|
def save
|
128
|
-
|
167
|
+
valid = valid?
|
168
|
+
if valid
|
129
169
|
# if we are trying to save a value then we should create a real node
|
130
|
-
|
131
|
-
_run_save_callbacks { save_in_tx }
|
132
|
-
else
|
133
|
-
Neo4j::Rails::Transaction.run { _run_save_callbacks { save_in_tx } }
|
134
|
-
end
|
170
|
+
valid = _run_save_callbacks { create_or_update_node }
|
135
171
|
@_created_record = false
|
136
172
|
true
|
137
173
|
else
|
@@ -140,12 +176,14 @@ class Neo4j::Model
|
|
140
176
|
Neo4j::Rails::Transaction.fail if Neo4j::Rails::Transaction.running? && !_java_node.kind_of?(Neo4j::Value)
|
141
177
|
false
|
142
178
|
end
|
179
|
+
valid
|
143
180
|
end
|
144
181
|
|
145
|
-
def
|
146
|
-
|
182
|
+
def create_or_update_node
|
183
|
+
valid = true
|
147
184
|
if _java_node.kind_of?(Neo4j::Value)
|
148
185
|
node = Neo4j::Node.new(props)
|
186
|
+
valid = _java_node.save_nested(node)
|
149
187
|
init_on_load(node)
|
150
188
|
init_on_create
|
151
189
|
end
|
@@ -155,6 +193,7 @@ class Neo4j::Model
|
|
155
193
|
else
|
156
194
|
_run_update_callbacks { clear_changes }
|
157
195
|
end
|
196
|
+
valid
|
158
197
|
end
|
159
198
|
|
160
199
|
def clear_changes
|
@@ -178,7 +217,11 @@ class Neo4j::Model
|
|
178
217
|
# Returns true if this object hasn’t been saved yet — that is, a record for the object doesn’t exist yet; otherwise, returns false.
|
179
218
|
def new_record?()
|
180
219
|
# it is new if the model has been created with either the new or create method
|
181
|
-
|
220
|
+
new? || @_created_record == true
|
221
|
+
end
|
222
|
+
|
223
|
+
def new?
|
224
|
+
_java_node.kind_of?(Neo4j::Value)
|
182
225
|
end
|
183
226
|
|
184
227
|
def del
|
@@ -187,29 +230,53 @@ class Neo4j::Model
|
|
187
230
|
end
|
188
231
|
|
189
232
|
def destroy
|
190
|
-
|
233
|
+
_run_update_callbacks { del }
|
191
234
|
end
|
192
235
|
|
193
236
|
def destroyed?()
|
194
237
|
@_deleted
|
195
238
|
end
|
196
239
|
|
240
|
+
tx_methods :destroy, :create_or_update_node, :update_attributes, :update_attributes!
|
197
241
|
|
198
242
|
# --------------------------------------
|
199
243
|
# Class Methods
|
200
244
|
# --------------------------------------
|
201
245
|
|
202
246
|
class << self
|
247
|
+
extend Neo4j::TxMethods
|
248
|
+
|
203
249
|
# returns a value object instead of creating a new node
|
204
250
|
def new(*args)
|
205
251
|
value = Neo4j::Value.new
|
206
252
|
wrapped = self.orig_new
|
207
253
|
wrapped.init_on_load(value)
|
208
254
|
wrapped.attributes=args[0] if args[0].respond_to?(:each_pair)
|
255
|
+
|
256
|
+
wrapped.class._decl_rels.each_pair do |field, dsl|
|
257
|
+
|
258
|
+
meta = class << wrapped;
|
259
|
+
self;
|
260
|
+
end
|
261
|
+
|
262
|
+
wrapped.class._decl_rels.each_pair do |field, dsl|
|
263
|
+
meta.send(:define_method, field) do
|
264
|
+
if new?
|
265
|
+
value.outgoing(dsl.namespace_type)
|
266
|
+
else
|
267
|
+
self.outgoing(dsl.namespace_type)
|
268
|
+
end
|
269
|
+
end if dsl.direction == :outgoing
|
270
|
+
|
271
|
+
meta.send(:define_method, field) do
|
272
|
+
raise "NOT IMPLEMENTED #{field} (incoming relationship) FOR #new method, please create a new model with the create method instead"
|
273
|
+
end if dsl.direction == :incoming
|
274
|
+
end
|
275
|
+
end
|
276
|
+
|
209
277
|
wrapped
|
210
278
|
end
|
211
279
|
|
212
|
-
|
213
280
|
# Handle Model.find(params[:id])
|
214
281
|
def find(*args)
|
215
282
|
if args.length == 1 && String === args[0] && args[0].to_i != 0
|
@@ -236,26 +303,55 @@ class Neo4j::Model
|
|
236
303
|
alias_method :_orig_create, :create
|
237
304
|
|
238
305
|
def create(*)
|
239
|
-
|
240
|
-
end
|
241
|
-
|
242
|
-
def create!(*args)
|
243
|
-
Neo4j::Rails::Transaction.running? ? create_in_tx!(_orig_create(*args)) : Neo4j::Rails::Transaction.run { create_in_tx!(_orig_create(*args)) }
|
244
|
-
end
|
245
|
-
|
246
|
-
def create_in_tx(model)
|
306
|
+
model = super
|
247
307
|
model.save
|
248
308
|
model
|
249
309
|
end
|
250
310
|
|
251
|
-
def
|
311
|
+
def create!(*args)
|
312
|
+
model = _orig_create(*args)
|
252
313
|
model.save!
|
253
314
|
model
|
254
315
|
end
|
255
316
|
|
317
|
+
tx_methods :create, :create!
|
318
|
+
|
319
|
+
|
256
320
|
def transaction(&block)
|
257
321
|
Neo4j::Rails::Transaction.run &block
|
258
322
|
end
|
323
|
+
|
324
|
+
def accepts_nested_attributes_for(*attr_names)
|
325
|
+
options = attr_names.pop if attr_names[-1].is_a?(Hash)
|
326
|
+
|
327
|
+
attr_names.each do |association_name|
|
328
|
+
rel = self._decl_rels[association_name.to_sym]
|
329
|
+
raise "No relationship declared with has_n or has_one with type #{association_name}" unless rel
|
330
|
+
to_class = rel.to_class
|
331
|
+
raise "Can't use accepts_nested_attributes_for(#{association_name}) since it has not defined which class it has a relationship to, use has_n(#{association_name}).to(MyOtherClass)" unless to_class
|
332
|
+
type = rel.namespace_type
|
333
|
+
has_one = rel.has_one?
|
334
|
+
|
335
|
+
send(:define_method, "#{association_name}_attributes=") do |attributes|
|
336
|
+
if has_one
|
337
|
+
update_nested_attributes(type, to_class, true, attributes, options)
|
338
|
+
else
|
339
|
+
if attributes.is_a?(Array)
|
340
|
+
attributes.each do |attr|
|
341
|
+
update_nested_attributes(type, to_class, false, attr, options)
|
342
|
+
end
|
343
|
+
else
|
344
|
+
attributes.each_value do |attr|
|
345
|
+
update_nested_attributes(type, to_class, false, attr, options)
|
346
|
+
end
|
347
|
+
end
|
348
|
+
end
|
349
|
+
end
|
350
|
+
tx_methods("#{association_name}_attributes=")
|
351
|
+
end
|
352
|
+
end
|
353
|
+
|
259
354
|
end
|
260
355
|
|
261
356
|
end
|
357
|
+
|
@@ -0,0 +1,11 @@
|
|
1
|
+
module Neo4j::TxMethods
|
2
|
+
def tx_methods(*methods)
|
3
|
+
methods.each do |method|
|
4
|
+
tx_method = "#{method}_in_tx"
|
5
|
+
send(:alias_method, tx_method, method)
|
6
|
+
send(:define_method, method) do |*args|
|
7
|
+
Neo4j::Rails::Transaction.running? ? send(tx_method, *args) : Neo4j::Rails::Transaction.run { send(tx_method, *args) }
|
8
|
+
end
|
9
|
+
end
|
10
|
+
end
|
11
|
+
end
|
data/lib/neo4j/rails/value.rb
CHANGED
@@ -10,6 +10,7 @@ module Neo4j
|
|
10
10
|
if args[0].respond_to?(:each_pair)
|
11
11
|
args[0].each_pair { |k, v| set_property(k.to_s, v) }
|
12
12
|
end
|
13
|
+
@rels = {} # a hash of all relationship with key type
|
13
14
|
end
|
14
15
|
|
15
16
|
# override Neo4j::Property#props
|
@@ -38,6 +39,48 @@ module Neo4j
|
|
38
39
|
@props.delete(key)
|
39
40
|
end
|
40
41
|
|
41
|
-
|
42
|
+
def outgoing(type)
|
43
|
+
@rels[type.to_sym] ||= OutgoingRels.new
|
44
|
+
end
|
45
|
+
|
46
|
+
def save_nested(root_node)
|
47
|
+
valid = true
|
48
|
+
@rels.each_pair do |type, rel|
|
49
|
+
rel.each do |new_node|
|
50
|
+
if new_node.save
|
51
|
+
root_node.outgoing(type) << new_node
|
52
|
+
else
|
53
|
+
valid = false
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
57
|
+
valid
|
58
|
+
end
|
59
|
+
|
60
|
+
class OutgoingRels
|
61
|
+
include Enumerable
|
62
|
+
def initialize
|
63
|
+
@nodes = []
|
64
|
+
end
|
65
|
+
|
66
|
+
def <<(other)
|
67
|
+
@nodes << other
|
68
|
+
end
|
42
69
|
|
70
|
+
def each
|
71
|
+
@nodes.each {|n| yield n}
|
72
|
+
end
|
73
|
+
|
74
|
+
def empty?
|
75
|
+
@nodes.empty?
|
76
|
+
end
|
77
|
+
|
78
|
+
def is_a?(type)
|
79
|
+
# ActionView requires this for nested attributes to work
|
80
|
+
return true if Array == type
|
81
|
+
super
|
82
|
+
end
|
83
|
+
end
|
84
|
+
|
85
|
+
end
|
43
86
|
end
|
data/lib/neo4j/version.rb
CHANGED
data/lib/neo4j.rb
CHANGED
metadata
CHANGED
@@ -7,8 +7,8 @@ version: !ruby/object:Gem::Version
|
|
7
7
|
- 0
|
8
8
|
- 0
|
9
9
|
- beta
|
10
|
-
-
|
11
|
-
version: 1.0.0.beta.
|
10
|
+
- 10
|
11
|
+
version: 1.0.0.beta.10
|
12
12
|
platform: ruby
|
13
13
|
authors:
|
14
14
|
- Andreas Ronge
|
@@ -16,7 +16,7 @@ autorequire:
|
|
16
16
|
bindir: bin
|
17
17
|
cert_chain: []
|
18
18
|
|
19
|
-
date: 2010-10-
|
19
|
+
date: 2010-10-08 00:00:00 +02:00
|
20
20
|
default_executable:
|
21
21
|
dependencies:
|
22
22
|
- !ruby/object:Gem::Dependency
|
@@ -101,62 +101,6 @@ extra_rdoc_files:
|
|
101
101
|
- README.rdoc
|
102
102
|
files:
|
103
103
|
- lib/neo4j.rb
|
104
|
-
- lib/neo4j.old/reference_node.rb
|
105
|
-
- lib/neo4j.old/event_handler.rb
|
106
|
-
- lib/neo4j.old/indexer.rb
|
107
|
-
- lib/neo4j.old/search_result.rb
|
108
|
-
- lib/neo4j.old/config.rb
|
109
|
-
- lib/neo4j.old/neo.rb
|
110
|
-
- lib/neo4j.old/transaction.rb
|
111
|
-
- lib/neo4j.old/node.rb
|
112
|
-
- lib/neo4j.old/jars.rb
|
113
|
-
- lib/neo4j.old/batch_inserter.rb
|
114
|
-
- lib/neo4j.old/version.rb
|
115
|
-
- lib/neo4j.old/relationship.rb
|
116
|
-
- lib/neo4j.old/relationships/node_traverser.rb
|
117
|
-
- lib/neo4j.old/relationships/decl_relationship_dsl.rb
|
118
|
-
- lib/neo4j.old/relationships/wrappers.rb
|
119
|
-
- lib/neo4j.old/relationships/has_n.rb
|
120
|
-
- lib/neo4j.old/relationships/relationship_dsl.rb
|
121
|
-
- lib/neo4j.old/relationships/has_list.rb
|
122
|
-
- lib/neo4j.old/relationships/traversal_position.rb
|
123
|
-
- lib/neo4j.old/mixins/java_node_mixin.rb
|
124
|
-
- lib/neo4j.old/mixins/java_relationship_mixin.rb
|
125
|
-
- lib/neo4j.old/mixins/migration_mixin.rb
|
126
|
-
- lib/neo4j.old/mixins/node_mixin.rb
|
127
|
-
- lib/neo4j.old/mixins/java_property_mixin.rb
|
128
|
-
- lib/neo4j.old/mixins/java_list_mixin.rb
|
129
|
-
- lib/neo4j.old/mixins/relationship_mixin.rb
|
130
|
-
- lib/neo4j.old/mixins/rel_class_methods.rb
|
131
|
-
- lib/neo4j.old/mixins/property_class_methods.rb
|
132
|
-
- lib/neo4j.old/jars/neo4j-kernel-1.0.jar
|
133
|
-
- lib/neo4j.old/jars/geronimo-jta_1.1_spec-1.1.1.jar
|
134
|
-
- lib/neo4j.old/extensions/aggregate.rb
|
135
|
-
- lib/neo4j.old/extensions/find_path.rb
|
136
|
-
- lib/neo4j.old/extensions/reindexer.rb
|
137
|
-
- lib/neo4j.old/extensions/graph_algo.rb
|
138
|
-
- lib/neo4j.old/extensions/rest.rb
|
139
|
-
- lib/neo4j.old/extensions/tx_tracker.rb
|
140
|
-
- lib/neo4j.old/extensions/rest_slave.rb
|
141
|
-
- lib/neo4j.old/extensions/activemodel.rb
|
142
|
-
- lib/neo4j.old/extensions/rest_master.rb
|
143
|
-
- lib/neo4j.old/extensions/rest/server.rb
|
144
|
-
- lib/neo4j.old/extensions/rest/rest.rb
|
145
|
-
- lib/neo4j.old/extensions/rest/rest_mixin.rb
|
146
|
-
- lib/neo4j.old/extensions/rest/stubs.rb
|
147
|
-
- lib/neo4j.old/extensions/graph_algo/neo4j-graph-algo-0.3.jar
|
148
|
-
- lib/neo4j.old/extensions/graph_algo/all_simple_paths.rb
|
149
|
-
- lib/neo4j.old/extensions/aggregate/node_aggregate.rb
|
150
|
-
- lib/neo4j.old/extensions/aggregate/node_aggregate_mixin.rb
|
151
|
-
- lib/neo4j.old/extensions/aggregate/props_aggregator.rb
|
152
|
-
- lib/neo4j.old/extensions/aggregate/prop_group.rb
|
153
|
-
- lib/neo4j.old/extensions/aggregate/node_aggregator.rb
|
154
|
-
- lib/neo4j.old/extensions/aggregate/props_aggregate.rb
|
155
|
-
- lib/neo4j.old/extensions/aggregate/props_aggregate_mixin.rb
|
156
|
-
- lib/neo4j.old/extensions/aggregate/property_enum.rb
|
157
|
-
- lib/neo4j.old/extensions/aggregate/aggregate_enum.rb
|
158
|
-
- lib/neo4j.old/extensions/aggregate/node_group.rb
|
159
|
-
- lib/neo4j.old/extensions/aggregate/ext/node_mixin.rb
|
160
104
|
- lib/neo4j/event_handler.rb
|
161
105
|
- lib/neo4j/node_traverser.rb
|
162
106
|
- lib/neo4j/relationship_traverser.rb
|
@@ -179,6 +123,7 @@ files:
|
|
179
123
|
- lib/neo4j/rails/railtie.rb
|
180
124
|
- lib/neo4j/rails/lucene_connection_closer.rb
|
181
125
|
- lib/neo4j/rails/transaction.rb
|
126
|
+
- lib/neo4j/rails/tx_methods.rb
|
182
127
|
- lib/neo4j/rails/value.rb
|
183
128
|
- lib/neo4j/rails/validations/uniqueness.rb
|
184
129
|
- lib/neo4j/jars/lucene-core-3.0.1.jar
|
@@ -1,144 +0,0 @@
|
|
1
|
-
module Neo4j
|
2
|
-
|
3
|
-
class BatchItem # :nodoc:
|
4
|
-
attr_accessor :_wrapper, :neo_id
|
5
|
-
|
6
|
-
include Neo4j::JavaPropertyMixin
|
7
|
-
|
8
|
-
def initialize(neo_id, inserter)
|
9
|
-
@neo_id = neo_id
|
10
|
-
@inserter = inserter
|
11
|
-
end
|
12
|
-
|
13
|
-
def getId(); neo_id end
|
14
|
-
|
15
|
-
def has_property?(key)
|
16
|
-
props.include?(key.to_s)
|
17
|
-
end
|
18
|
-
|
19
|
-
def get_property(key)
|
20
|
-
props[key]
|
21
|
-
end
|
22
|
-
|
23
|
-
def props
|
24
|
-
# not sure why I have to do it like this, Strange why I can't use the Java Hash ?
|
25
|
-
# gets java.lang.UnsupportedOperationException: null, in java/util/AbstractMap.java:186:in `put'
|
26
|
-
java_props = @inserter.getNodeProperties(neo_id)
|
27
|
-
ruby_props = {}
|
28
|
-
java_props.keySet().each{|k| ruby_props[k] = java_props[k]}
|
29
|
-
ruby_props
|
30
|
-
end
|
31
|
-
|
32
|
-
|
33
|
-
def setProperty(key, value)
|
34
|
-
ruby_props = props
|
35
|
-
ruby_props[key.to_s] = value
|
36
|
-
@inserter.setNodeProperties(neo_id, ruby_props)
|
37
|
-
|
38
|
-
if (wrapper_class and key[0, 1] != '_') # do not want events on internal properties
|
39
|
-
wrapper_class.indexer.on_property_changed(wrapper, key)
|
40
|
-
end
|
41
|
-
end
|
42
|
-
end
|
43
|
-
|
44
|
-
# Neo4j has a batch insert mode that drops support for transactions and concurrency in favor of insertion speed.
|
45
|
-
# This is useful when you have a big dataset that needs to be loaded once. In our experience, the batch inserter will
|
46
|
-
# typically inject data around five times faster than running in normal transactional mode.
|
47
|
-
#
|
48
|
-
# === Usage
|
49
|
-
#
|
50
|
-
# The initialize method takes a code block that will use the BatchInserter.
|
51
|
-
#
|
52
|
-
# Neo4j::BatchInserter.new do |b|
|
53
|
-
# a = Neo4j::Node.new :name => 'a'
|
54
|
-
# b = Neo4j::Node.new :name => 'b'
|
55
|
-
# c = Foo.new :key1 => 'val1', :key2 => 'val2'
|
56
|
-
# c[:name] = "c"
|
57
|
-
# Neo4j::Relationship.new(:friend, a, b, :since => '2001-01-01')
|
58
|
-
# Neo4j::Relationship.new(:friend, Neo4j.ref_node, c, :since => '2001-01-01')
|
59
|
-
# end
|
60
|
-
#
|
61
|
-
# After the code block the normal creation for nodes and relationship will be used.
|
62
|
-
# Traversals inside the batch inserter block is not possible.
|
63
|
-
# The BatchInserter can be used together with Neo4j Migrations (see Neo4j#migration)
|
64
|
-
#
|
65
|
-
class BatchInserter
|
66
|
-
|
67
|
-
# See class description for usage.
|
68
|
-
#
|
69
|
-
# === Parameters
|
70
|
-
# storage_path:: optional, the location of the neo4j dabase on file system, default Neo4j::Config[:storage_path]
|
71
|
-
# db_version:: optional, sets version number on reference node, default nil -> do not set this property
|
72
|
-
def initialize(storage_path = Neo4j::Config[:storage_path], db_version=nil) # :yields: batch_inserter
|
73
|
-
# create the batch inserter
|
74
|
-
inserter = org.neo4j.kernel.impl.batchinsert.BatchInserterImpl.new(storage_path)
|
75
|
-
|
76
|
-
# save original methods
|
77
|
-
create_node_meth = Neo4j.method(:create_node)
|
78
|
-
create_rel_meth = Neo4j.method(:create_rel)
|
79
|
-
ref_node_meth = Neo4j.method(:ref_node)
|
80
|
-
instance_meth = Neo4j.method(:instance)
|
81
|
-
|
82
|
-
# replace methods
|
83
|
-
neo4j_meta = (class << Neo4j; self; end)
|
84
|
-
neo4j_meta.instance_eval do
|
85
|
-
define_method(:create_node) do |props|
|
86
|
-
props ||= {}
|
87
|
-
id = inserter.createNode(props.keys.inject({}) {|hash, key| hash[key.to_s] = props[key]; hash})
|
88
|
-
BatchItem.new(id, inserter)
|
89
|
-
end
|
90
|
-
define_method(:create_rel) do |type, from_node, to_node, props|
|
91
|
-
props = Hash[*props.map{|k, v| [k.to_s, v]}.flatten] if props
|
92
|
-
java_type = org.neo4j.graphdb.DynamicRelationshipType.withName(type.to_s)
|
93
|
-
id = inserter.createRelationship(from_node.neo_id, to_node.neo_id, java_type, props)
|
94
|
-
BatchItem.new(id, inserter)
|
95
|
-
end
|
96
|
-
define_method(:ref_node) do
|
97
|
-
BatchItem.new(inserter.getReferenceNode, inserter)
|
98
|
-
end
|
99
|
-
define_method(:instance) do
|
100
|
-
Neo4j::BatchInstance.new
|
101
|
-
end
|
102
|
-
end
|
103
|
-
|
104
|
-
begin
|
105
|
-
yield inserter
|
106
|
-
Neo4j.ref_node[:db_version] = db_version if db_version
|
107
|
-
ensure
|
108
|
-
inserter.shutdown
|
109
|
-
# restore old methods
|
110
|
-
neo4j_meta.instance_eval do
|
111
|
-
define_method(:create_node, create_node_meth)
|
112
|
-
define_method(:create_rel, create_rel_meth)
|
113
|
-
define_method(:ref_node, ref_node_meth)
|
114
|
-
define_method(:instance, instance_meth)
|
115
|
-
end
|
116
|
-
end
|
117
|
-
end
|
118
|
-
|
119
|
-
# This method is used if the batch inserter is used from the Migration API.
|
120
|
-
#
|
121
|
-
# === Parameters
|
122
|
-
# context:: the context on which the batch inserter code block is evaluated in, not used.
|
123
|
-
# version:: optional, if given then will set the property db_version on the context
|
124
|
-
def self.execute(context, version=nil, &block)
|
125
|
-
# Neo4j must not be running while using batch inserter, stop it just in case ...
|
126
|
-
Neo4j::Transaction.finish
|
127
|
-
Neo4j.stop
|
128
|
-
|
129
|
-
BatchInserter.new(Neo4j::Config[:storage_path], version, &block)
|
130
|
-
|
131
|
-
Neo4j.start
|
132
|
-
end
|
133
|
-
end
|
134
|
-
|
135
|
-
# Used instead of Neo4j.instance object - will happily accept any methods - like transaction methods.
|
136
|
-
class BatchInstance # :nodoc:
|
137
|
-
def method_missing(m, *args, &block)
|
138
|
-
return BatchInstance.new
|
139
|
-
end
|
140
|
-
end
|
141
|
-
end
|
142
|
-
|
143
|
-
|
144
|
-
|