neo4j 6.0.0.rc.4 → 6.0.0
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.
- checksums.yaml +4 -4
- data/CHANGELOG.md +6 -0
- data/lib/neo4j.rb +0 -1
- data/lib/neo4j/active_node.rb +10 -0
- data/lib/neo4j/active_node/has_n.rb +36 -18
- data/lib/neo4j/active_node/persistence.rb +2 -3
- data/lib/neo4j/active_node/query/query_proxy.rb +7 -2
- data/lib/neo4j/active_node/unpersisted.rb +29 -34
- data/lib/neo4j/version.rb +1 -1
- metadata +4 -5
- data/lib/neo4j/active_node/query/query_proxy_unpersisted.rb +0 -13
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 5e75b34e6d901afdd9e426ecdb467541b6d89c28
|
4
|
+
data.tar.gz: ddc468292508fcfff1ad7371977503ec7a0274ae
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 9cb421908fc3da97ba84eb9a7c5254a3f5d6568dd1bd9cdeadae15fdea333881113327a7710b1eb1094a2cb32a37330005653c97be07689ea194d64780add3bb
|
7
|
+
data.tar.gz: 8542d356502f221d0e054e913608aa1eb4134999495b309c589473f9c6850d4012096ef8c331f61c4c7880925b7634ecf525af1982d5160557b30f6ae07add9a
|
data/CHANGELOG.md
CHANGED
@@ -3,6 +3,12 @@ All notable changes to this project will be documented in this file.
|
|
3
3
|
This file should follow the standards specified on [http://keepachangelog.com/]
|
4
4
|
This project adheres to [Semantic Versioning](http://semver.org/).
|
5
5
|
|
6
|
+
## [Unreleased]
|
7
|
+
|
8
|
+
### Fixed
|
9
|
+
|
10
|
+
- Refactor unpersisted association logic to store objects directly on the object rather than the association proxy since different association proxies may be created at different times (see #1043)
|
11
|
+
|
6
12
|
## [6.0.0.rc.4] - 11-19-2015
|
7
13
|
|
8
14
|
### Fixed
|
data/lib/neo4j.rb
CHANGED
@@ -61,7 +61,6 @@ require 'neo4j/active_node/dependent'
|
|
61
61
|
require 'neo4j/active_node/dependent/query_proxy_methods'
|
62
62
|
require 'neo4j/active_node/dependent/association_methods'
|
63
63
|
require 'neo4j/active_node/query_methods'
|
64
|
-
require 'neo4j/active_node/query/query_proxy_unpersisted'
|
65
64
|
require 'neo4j/active_node/query/query_proxy_methods'
|
66
65
|
require 'neo4j/active_node/query/query_proxy_enumerable'
|
67
66
|
require 'neo4j/active_node/query/query_proxy_find_in_batches'
|
data/lib/neo4j/active_node.rb
CHANGED
@@ -50,6 +50,16 @@ module Neo4j
|
|
50
50
|
_persisted_obj || fail('Tried to access native neo4j object on a non persisted object')
|
51
51
|
end
|
52
52
|
|
53
|
+
module ClassMethods
|
54
|
+
def nodeify(object)
|
55
|
+
if object.is_a?(::Neo4j::ActiveNode) || object.nil?
|
56
|
+
object
|
57
|
+
else
|
58
|
+
self.find(object)
|
59
|
+
end
|
60
|
+
end
|
61
|
+
end
|
62
|
+
|
53
63
|
included do
|
54
64
|
include Neo4j::Timestamps if Neo4j::Config[:record_timestamps]
|
55
65
|
|
@@ -8,8 +8,10 @@ module Neo4j::ActiveNode
|
|
8
8
|
# It uses a QueryProxy to get results
|
9
9
|
# But also caches results and can have results cached on it
|
10
10
|
class AssociationProxy
|
11
|
-
def initialize(query_proxy, cached_result = nil)
|
11
|
+
def initialize(query_proxy, deferred_objects = [], cached_result = nil)
|
12
12
|
@query_proxy = query_proxy
|
13
|
+
@deferred_objects = deferred_objects
|
14
|
+
|
13
15
|
cache_result(cached_result)
|
14
16
|
|
15
17
|
# Represents the thing which can be enumerated
|
@@ -48,21 +50,27 @@ module Neo4j::ActiveNode
|
|
48
50
|
end
|
49
51
|
|
50
52
|
def result
|
51
|
-
|
53
|
+
(@deferred_objects || []) + result_without_deferred
|
54
|
+
end
|
52
55
|
|
53
|
-
|
56
|
+
def result_without_deferred
|
57
|
+
cache_query_proxy_result if !@cached_result
|
54
58
|
|
55
59
|
@cached_result
|
56
60
|
end
|
57
61
|
|
58
62
|
def result_nodes
|
59
|
-
return
|
63
|
+
return result_objects if !@query_proxy.model
|
60
64
|
|
61
|
-
|
65
|
+
result_objects.map do |object|
|
62
66
|
object.is_a?(Neo4j::ActiveNode) ? object : @query_proxy.model.find(object)
|
63
67
|
end
|
64
68
|
end
|
65
69
|
|
70
|
+
def result_objects
|
71
|
+
@deferred_objects + result_without_deferred
|
72
|
+
end
|
73
|
+
|
66
74
|
def result_ids
|
67
75
|
result.map do |object|
|
68
76
|
object.is_a?(Neo4j::ActiveNode) ? object.id : object
|
@@ -80,9 +88,7 @@ module Neo4j::ActiveNode
|
|
80
88
|
end
|
81
89
|
|
82
90
|
def cache_query_proxy_result
|
83
|
-
@query_proxy.to_a.tap
|
84
|
-
cache_result(result)
|
85
|
-
end
|
91
|
+
@query_proxy.to_a.tap { |result| cache_result(result) }
|
86
92
|
end
|
87
93
|
|
88
94
|
def clear_cache_result
|
@@ -93,6 +99,12 @@ module Neo4j::ActiveNode
|
|
93
99
|
!!@cached_result
|
94
100
|
end
|
95
101
|
|
102
|
+
def replace_with(*args)
|
103
|
+
@cached_result = nil
|
104
|
+
|
105
|
+
@query_proxy.public_send(:replace_with, *args)
|
106
|
+
end
|
107
|
+
|
96
108
|
QUERY_PROXY_METHODS = [:<<, :delete]
|
97
109
|
CACHED_RESULT_METHODS = []
|
98
110
|
|
@@ -177,7 +189,7 @@ module Neo4j::ActiveNode
|
|
177
189
|
private
|
178
190
|
|
179
191
|
def fresh_association_proxy(name, options = {}, cached_result = nil)
|
180
|
-
AssociationProxy.new(association_query_proxy(name, options), cached_result)
|
192
|
+
AssociationProxy.new(association_query_proxy(name, options), deferred_nodes_for_association(name), cached_result)
|
181
193
|
end
|
182
194
|
|
183
195
|
def previous_proxy_results_by_previous_id(result_cache, association_name)
|
@@ -356,6 +368,8 @@ module Neo4j::ActiveNode
|
|
356
368
|
define_method("#{name}=") do |other_nodes|
|
357
369
|
association_proxy_cache.clear
|
358
370
|
|
371
|
+
clear_deferred_nodes_for_association(name)
|
372
|
+
|
359
373
|
Neo4j::Transaction.run { association_proxy(name).replace_with(other_nodes) }
|
360
374
|
end
|
361
375
|
end
|
@@ -366,6 +380,7 @@ module Neo4j::ActiveNode
|
|
366
380
|
end
|
367
381
|
|
368
382
|
define_method_unless_defined("#{name.to_s.singularize}_ids=") do |ids|
|
383
|
+
clear_deferred_nodes_for_association(name)
|
369
384
|
association_proxy(name).replace_with(ids)
|
370
385
|
end
|
371
386
|
|
@@ -415,7 +430,13 @@ module Neo4j::ActiveNode
|
|
415
430
|
if options[:rel_length] && !options[:rel_length].is_a?(Fixnum)
|
416
431
|
association_proxy
|
417
432
|
else
|
418
|
-
|
433
|
+
target_class = self.class.send(:association_target_class, name)
|
434
|
+
o = association_proxy.result.first
|
435
|
+
if target_class
|
436
|
+
target_class.send(:nodeify, o)
|
437
|
+
else
|
438
|
+
o
|
439
|
+
end
|
419
440
|
end
|
420
441
|
end
|
421
442
|
end
|
@@ -428,7 +449,8 @@ module Neo4j::ActiveNode
|
|
428
449
|
Neo4j::Transaction.run { association_proxy(name).replace_with(other_node) }
|
429
450
|
# handle_non_persisted_node(other_node)
|
430
451
|
else
|
431
|
-
|
452
|
+
defer_create(name, other_node, clear: true)
|
453
|
+
other_node
|
432
454
|
end
|
433
455
|
end
|
434
456
|
end
|
@@ -457,8 +479,7 @@ module Neo4j::ActiveNode
|
|
457
479
|
end
|
458
480
|
|
459
481
|
def association_proxy(name, options = {})
|
460
|
-
|
461
|
-
AssociationProxy.new(query_proxy)
|
482
|
+
AssociationProxy.new(association_query_proxy(name, options))
|
462
483
|
end
|
463
484
|
|
464
485
|
def association_target_class(name)
|
@@ -478,11 +499,8 @@ module Neo4j::ActiveNode
|
|
478
499
|
end
|
479
500
|
|
480
501
|
def default_association_query_proxy
|
481
|
-
Neo4j::ActiveNode::Query::QueryProxy.new("::#{self.name}".constantize,
|
482
|
-
nil,
|
483
|
-
session: neo4j_session,
|
484
|
-
query_proxy: nil,
|
485
|
-
context: "#{self.name}")
|
502
|
+
Neo4j::ActiveNode::Query::QueryProxy.new("::#{self.name}".constantize, nil,
|
503
|
+
session: neo4j_session, query_proxy: nil, context: "#{self.name}")
|
486
504
|
end
|
487
505
|
|
488
506
|
def build_association(macro, direction, name, options)
|
@@ -85,10 +85,9 @@ module Neo4j::ActiveNode
|
|
85
85
|
# build the processable hash before it begins. If there are nodes and associations that
|
86
86
|
# need to be created after the node is saved, a new transaction is started.
|
87
87
|
def cascade_save
|
88
|
-
|
89
|
-
Neo4j::Transaction.run(!deferred_nodes.blank?) do
|
88
|
+
Neo4j::Transaction.run(pending_deferred_creations?) do
|
90
89
|
result = yield
|
91
|
-
process_unpersisted_nodes!
|
90
|
+
process_unpersisted_nodes!
|
92
91
|
result
|
93
92
|
end
|
94
93
|
end
|
@@ -6,7 +6,6 @@ module Neo4j
|
|
6
6
|
include Neo4j::ActiveNode::Query::QueryProxyMethods
|
7
7
|
include Neo4j::ActiveNode::Query::QueryProxyFindInBatches
|
8
8
|
include Neo4j::ActiveNode::Query::QueryProxyEagerLoading
|
9
|
-
include Neo4j::ActiveNode::Query::QueryProxyUnpersisted
|
10
9
|
include Neo4j::ActiveNode::Dependent::QueryProxyMethods
|
11
10
|
|
12
11
|
# The most recent node to start a QueryProxy chain.
|
@@ -164,7 +163,13 @@ module Neo4j
|
|
164
163
|
|
165
164
|
# To add a relationship for the node for the association on this QueryProxy
|
166
165
|
def <<(other_node)
|
167
|
-
@start_object._persisted_obj
|
166
|
+
if @start_object._persisted_obj
|
167
|
+
create(other_node, {})
|
168
|
+
elsif @association
|
169
|
+
@start_object.defer_create(@association.name, other_node)
|
170
|
+
else
|
171
|
+
fail 'Another crazy error!'
|
172
|
+
end
|
168
173
|
self
|
169
174
|
end
|
170
175
|
|
@@ -1,52 +1,47 @@
|
|
1
1
|
module Neo4j
|
2
2
|
module ActiveNode
|
3
3
|
module Unpersisted
|
4
|
-
|
5
|
-
|
4
|
+
# The values in this Hash are returned and used outside by reference
|
5
|
+
# so any modifications to the Array should be in-place
|
6
|
+
def deferred_create_cache
|
7
|
+
@deferred_create_cache ||= {}
|
6
8
|
end
|
7
9
|
|
8
|
-
def
|
9
|
-
|
10
|
+
def defer_create(association_name, object, options = {})
|
11
|
+
clear_deferred_nodes_for_association(association_name) if options[:clear]
|
12
|
+
|
13
|
+
deferred_nodes_for_association(association_name) << object
|
10
14
|
end
|
11
15
|
|
12
|
-
|
16
|
+
def deferred_nodes_for_association(association_name)
|
17
|
+
deferred_create_cache[association_name.to_sym] ||= []
|
18
|
+
end
|
13
19
|
|
14
|
-
|
15
|
-
|
16
|
-
# and returns them as { association_name => [[nodes_for_persistence], :operator] }
|
17
|
-
def pending_associations_with_nodes
|
18
|
-
return unless pending_associations?
|
19
|
-
{}.tap do |deferred_nodes|
|
20
|
-
pending_associations.uniq.each do |association_name|
|
21
|
-
nodes_for_creation = association_proxy(association_name)
|
22
|
-
nodes_for_creation = nodes_for_creation.reject(&:persisted?) if self.persisted?
|
23
|
-
|
24
|
-
deferred_nodes[association_name] = nodes_for_creation
|
25
|
-
end
|
26
|
-
end
|
20
|
+
def pending_deferred_creations?
|
21
|
+
!deferred_create_cache.values.all?(&:empty?)
|
27
22
|
end
|
28
23
|
|
29
|
-
|
30
|
-
|
31
|
-
deferred_nodes.each_pair do |k, v|
|
32
|
-
save_and_associate_queue(k, v)
|
33
|
-
end
|
24
|
+
def clear_deferred_nodes_for_association(association_name)
|
25
|
+
deferred_nodes_for_association(association_name.to_sym).clear
|
34
26
|
end
|
35
27
|
|
28
|
+
private
|
36
29
|
|
37
|
-
def
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
30
|
+
def process_unpersisted_nodes!
|
31
|
+
deferred_create_cache.each do |association_name, nodes|
|
32
|
+
association_proxy = association_proxy(association_name)
|
33
|
+
|
34
|
+
nodes.each do |node|
|
35
|
+
if node.respond_to?(:changed?)
|
36
|
+
node.save if node.changed? || !node.persisted?
|
37
|
+
fail "Unable to defer node persistence, could not save #{node.inspect}" unless node.persisted?
|
38
|
+
end
|
39
|
+
|
40
|
+
association_proxy << node
|
41
|
+
end
|
43
42
|
|
44
|
-
|
45
|
-
if node.respond_to?(:changed?)
|
46
|
-
node.save if node.changed? || !node.persisted?
|
47
|
-
fail "Unable to defer node persistence, could not save #{node.inspect}" unless node.persisted?
|
43
|
+
@deferred_create_cache = {}
|
48
44
|
end
|
49
|
-
association_proxy(association_name) << node
|
50
45
|
end
|
51
46
|
end
|
52
47
|
end
|
data/lib/neo4j/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: neo4j
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 6.0.0
|
4
|
+
version: 6.0.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Andreas Ronge, Brian Underwood, Chris Grigg
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-11-
|
11
|
+
date: 2015-11-24 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: orm_adapter
|
@@ -251,7 +251,6 @@ files:
|
|
251
251
|
- lib/neo4j/active_node/query/query_proxy_find_in_batches.rb
|
252
252
|
- lib/neo4j/active_node/query/query_proxy_link.rb
|
253
253
|
- lib/neo4j/active_node/query/query_proxy_methods.rb
|
254
|
-
- lib/neo4j/active_node/query/query_proxy_unpersisted.rb
|
255
254
|
- lib/neo4j/active_node/query_methods.rb
|
256
255
|
- lib/neo4j/active_node/reflection.rb
|
257
256
|
- lib/neo4j/active_node/rels.rb
|
@@ -327,9 +326,9 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
327
326
|
version: 1.9.3
|
328
327
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
329
328
|
requirements:
|
330
|
-
- - "
|
329
|
+
- - ">="
|
331
330
|
- !ruby/object:Gem::Version
|
332
|
-
version:
|
331
|
+
version: '0'
|
333
332
|
requirements: []
|
334
333
|
rubyforge_project: neo4j
|
335
334
|
rubygems_version: 2.4.5.1
|
@@ -1,13 +0,0 @@
|
|
1
|
-
module Neo4j
|
2
|
-
module ActiveNode
|
3
|
-
module Query
|
4
|
-
module QueryProxyUnpersisted
|
5
|
-
def defer_create(other_node)
|
6
|
-
@start_object.pending_associations << @association.name
|
7
|
-
|
8
|
-
@start_object.association_proxy(@association.name).add_to_cache(other_node)
|
9
|
-
end
|
10
|
-
end
|
11
|
-
end
|
12
|
-
end
|
13
|
-
end
|