neomirror 0.0.2 → 0.0.3
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/README.md +1 -1
- data/lib/neomirror/relationship.rb +33 -25
- data/lib/neomirror/version.rb +1 -1
- data/neomirror.gemspec +1 -1
- data/spec/neomirror/neomirror_spec.rb +8 -0
- data/spec/neomirror/relationship_spec.rb +9 -0
- metadata +4 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 9033be66b0aaf79a9d2f5b946e8e3a19dcc50270
|
4
|
+
data.tar.gz: 56b46cf350db86ff7a25fcc6b9f8d5376ac4cd41
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: c00f6a547613e9bfecae74de9d892f2e20a6ff2d09be8ce961dfa5ff87fc657be2cdd8aca5370983a44fb2b2ef111bf44ddbc790a25a9c39e6051d8654baa1a8
|
7
|
+
data.tar.gz: d7ef2a0cad7a5cedffeed87095c219c7d3a4a66834b743d641862e1a804c457428a85cca48831c98a7d77ef3eca77cb862aba3fc5d9418b09d4b11f4473013ee
|
data/README.md
CHANGED
@@ -163,7 +163,7 @@ class Staff < ActiveRecord::Base
|
|
163
163
|
end
|
164
164
|
```
|
165
165
|
|
166
|
-
Even possible reflect model as node (vertex) and
|
166
|
+
Even possible reflect model as node (vertex) and relationship(s) (edge).
|
167
167
|
|
168
168
|
```ruby
|
169
169
|
class Group < ActiveRecord::Base
|
@@ -19,7 +19,7 @@ module Neomirror::Relationship
|
|
19
19
|
|
20
20
|
# Find declaration by partial options.
|
21
21
|
def rel_mirror(p)
|
22
|
-
return rel_mirrors.first unless p
|
22
|
+
return rel_mirrors.first unless p.present?
|
23
23
|
rel_mirrors.find { |m| (!p[:start_node] || p[:start_node] == m[:start_node]) &&
|
24
24
|
(!p[:end_node] || p[:end_node] == m[:end_node]) && (!p[:type] || p[:type] == m[:type]) }
|
25
25
|
end
|
@@ -35,6 +35,7 @@ module Neomirror::Relationship
|
|
35
35
|
m[:properties] = Neomirror::PropertyCollector.new(&block).properties if block_given?
|
36
36
|
m[:if] = m[:if].to_proc if m[:if]
|
37
37
|
m[:index_name] = "#{m[:start_node] == :self ? class_name.downcase : m[:start_node]}_#{m[:type]}_#{m[:end_node] == :self ? class_name.downcase : m[:end_node]}"
|
38
|
+
m[:complete] = true # indicates a completely filled rel mirror hash (not partial, that used for search)
|
38
39
|
::Neomirror.neo.create_relationship_index(m[:index_name])
|
39
40
|
rel_mirrors << m
|
40
41
|
end
|
@@ -46,59 +47,66 @@ module Neomirror::Relationship
|
|
46
47
|
end
|
47
48
|
|
48
49
|
def neo_relationship(partial_mirror = nil)
|
49
|
-
|
50
|
+
raise "Couldn't find neo_relationship declaration" unless rel_mirror = self.class.rel_mirror(partial_mirror)
|
51
|
+
find_neo_relationship(rel_mirror) || create_neo_relationship(rel_mirror)
|
50
52
|
end
|
51
53
|
alias_method :neo_rel, :neo_relationship
|
52
54
|
|
53
|
-
def neo_relationship_properties(
|
54
|
-
raise "Couldn't find neo_relationship declaration" unless rel_mirror = self.class.rel_mirror(
|
55
|
+
def neo_relationship_properties(rel_mirror = {})
|
56
|
+
raise "Couldn't find neo_relationship declaration" unless rel_mirror[:complete] || (rel_mirror = self.class.rel_mirror(rel_mirror))
|
55
57
|
return nil unless rel_mirror[:properties]
|
56
58
|
rel_mirror[:properties].reduce({}) { |hash, (property, rule)| hash[property] = rule.call(self); hash }
|
57
59
|
end
|
58
60
|
|
59
|
-
def neo_relationship_must_exist?(
|
60
|
-
raise "Couldn't find neo_relationship declaration" unless rel_mirror = self.class.rel_mirror(
|
61
|
+
def neo_relationship_must_exist?(rel_mirror = {})
|
62
|
+
raise "Couldn't find neo_relationship declaration" unless rel_mirror[:complete] || (rel_mirror = self.class.rel_mirror(rel_mirror))
|
61
63
|
!rel_mirror[:if] || !!rel_mirror[:if].call(self)
|
62
64
|
end
|
63
65
|
|
64
|
-
def find_neo_relationship(
|
65
|
-
raise "Couldn't find neo_relationship declaration" unless rel_mirror = self.class.rel_mirror(
|
66
|
+
def find_neo_relationship(rel_mirror = {})
|
67
|
+
raise "Couldn't find neo_relationship declaration" unless rel_mirror[:complete] || (rel_mirror = self.class.rel_mirror(rel_mirror))
|
66
68
|
return nil unless rel = ::Neomirror.neo.get_relationship_index(rel_mirror[:index_name], :id, self.__send__(self.class.neo_primary_key))
|
67
|
-
|
69
|
+
::Neography::Relationship.load(rel, ::Neomirror.neo)
|
68
70
|
end
|
69
71
|
|
70
|
-
def create_neo_relationship(
|
71
|
-
raise "Couldn't find neo_relationship declaration" unless rel_mirror = self.class.rel_mirror(
|
72
|
+
def create_neo_relationship(rel_mirror = {})
|
73
|
+
raise "Couldn't find neo_relationship declaration" unless rel_mirror[:complete] || (rel_mirror = self.class.rel_mirror(rel_mirror))
|
72
74
|
return nil unless (m1 = related_object(rel_mirror[:start_node])) && (m2 = related_object(rel_mirror[:end_node])) &&
|
73
75
|
neo_relationship_must_exist?(rel_mirror)
|
74
|
-
|
75
|
-
::Neomirror.neo.add_relationship_to_index(rel_mirror[:index_name], :id, self.__send__(self.class.neo_primary_key),
|
76
|
-
|
76
|
+
neo_rel = ::Neography::Relationship.create(rel_mirror[:type], m1.neo_node, m2.neo_node, neo_relationship_properties(rel_mirror))
|
77
|
+
::Neomirror.neo.add_relationship_to_index(rel_mirror[:index_name], :id, self.__send__(self.class.neo_primary_key), neo_rel)
|
78
|
+
neo_rel
|
77
79
|
end
|
78
80
|
|
79
81
|
def related_object(method_name)
|
80
82
|
method_name == :self ? self : self.__send__(method_name)
|
81
83
|
end
|
82
84
|
|
83
|
-
def update_neo_relationship(
|
84
|
-
raise "Couldn't find neo_relationship declaration" unless rel_mirror = self.class.rel_mirror(
|
85
|
-
if find_neo_relationship(rel_mirror)
|
85
|
+
def update_neo_relationship(rel_mirror = {})
|
86
|
+
raise "Couldn't find neo_relationship declaration" unless rel_mirror[:complete] || (rel_mirror = self.class.rel_mirror(rel_mirror))
|
87
|
+
if neo_rel = find_neo_relationship(rel_mirror)
|
86
88
|
if related_object(rel_mirror[:start_node]) && related_object(rel_mirror[:end_node]) && neo_relationship_must_exist?(rel_mirror)
|
87
|
-
|
89
|
+
if related_object(rel_mirror[:start_node]).neo_node.id != neo_rel.start_node.id || related_object(rel_mirror[:end_node]).neo_node.id != neo_rel.end_node.id
|
90
|
+
destroy_neo_relationship(rel_mirror, neo_rel: neo_rel)
|
91
|
+
create_neo_relationship(rel_mirror)
|
92
|
+
else
|
93
|
+
::Neomirror.neo.reset_relationship_properties(neo_rel, neo_relationship_properties(rel_mirror))
|
94
|
+
end
|
88
95
|
else
|
89
|
-
|
90
|
-
::Neomirror.neo.delete_relationship(@neo_rel)
|
96
|
+
destroy_neo_relationship(rel_mirror, neo_rel: neo_rel)
|
91
97
|
end
|
92
98
|
else
|
93
99
|
create_neo_relationship(rel_mirror) if neo_relationship_must_exist?(rel_mirror)
|
94
100
|
end
|
95
101
|
end
|
96
102
|
|
97
|
-
def destroy_neo_relationship(
|
98
|
-
raise "Couldn't find neo_relationship declaration" unless rel_mirror = self.class.rel_mirror(
|
99
|
-
if find_neo_relationship(rel_mirror)
|
100
|
-
::Neomirror.neo.remove_relationship_from_index(rel_mirror[:index_name], :id, self.__send__(self.class.neo_primary_key),
|
101
|
-
::Neomirror.neo.delete_relationship(
|
103
|
+
def destroy_neo_relationship(rel_mirror = {}, options = {})
|
104
|
+
raise "Couldn't find neo_relationship declaration" unless rel_mirror[:complete] || (rel_mirror = self.class.rel_mirror(rel_mirror))
|
105
|
+
if neo_rel = options.fetch(:neo_rel, find_neo_relationship(rel_mirror))
|
106
|
+
::Neomirror.neo.remove_relationship_from_index(rel_mirror[:index_name], :id, self.__send__(self.class.neo_primary_key), neo_rel)
|
107
|
+
::Neomirror.neo.delete_relationship(neo_rel)
|
108
|
+
else
|
109
|
+
true
|
102
110
|
end
|
103
111
|
end
|
104
112
|
|
data/lib/neomirror/version.rb
CHANGED
data/neomirror.gemspec
CHANGED
@@ -18,7 +18,7 @@ Gem::Specification.new do |spec|
|
|
18
18
|
spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
|
19
19
|
spec.require_paths = ["lib"]
|
20
20
|
|
21
|
-
spec.add_dependency "neography", ">= 1.
|
21
|
+
spec.add_dependency "neography", ">= 1.3.7"
|
22
22
|
spec.add_development_dependency "bundler", "~> 1.5"
|
23
23
|
spec.add_development_dependency "rake"
|
24
24
|
spec.add_development_dependency "rspec", "~> 2.11"
|
@@ -4,6 +4,7 @@ describe Neomirror do
|
|
4
4
|
describe "Reflection of model as node and relation" do
|
5
5
|
let(:group) { create(:group) }
|
6
6
|
let(:child_group) { create(:group, parent: group) }
|
7
|
+
let(:other_group) { create(:group) }
|
7
8
|
|
8
9
|
it "creates neo4j nodes" do
|
9
10
|
group.find_neo_node.should be_a Neography::Node
|
@@ -21,5 +22,12 @@ describe Neomirror do
|
|
21
22
|
child_group.find_neo_relationship.should be_nil
|
22
23
|
Neomirror.neo.execute_query("MATCH (:Group {id: #{child_group.id}})-[r:CHILD_OF]->(:Group {id: #{group.id}}) RETURN r")["data"].first.should be_nil
|
23
24
|
end
|
25
|
+
|
26
|
+
it "recreates itself if at least one of nodes is changed on update" do
|
27
|
+
child_group.update(parent_id: other_group.id)
|
28
|
+
child_group.find_neo_relationship.should be_a Neography::Relationship
|
29
|
+
Neomirror.neo.execute_query("MATCH (:Group {id: #{child_group.id}})-[r:CHILD_OF]->(:Group {id: #{group.id}}) RETURN r")["data"].first.should be_nil
|
30
|
+
Neomirror.neo.execute_query("MATCH (:Group {id: #{child_group.id}})-[r:CHILD_OF]->(:Group {id: #{other_group.id}}) RETURN r")["data"].first.should be_present
|
31
|
+
end
|
24
32
|
end
|
25
33
|
end
|
@@ -8,6 +8,7 @@ describe Neomirror::Relationship do
|
|
8
8
|
let(:staff_of_premises) { create(:staff, user: user, premises: premises) }
|
9
9
|
let(:staff_of_group) { create(:staff, user: user, group: group) }
|
10
10
|
let(:staff) { create(:staff, user: user, premises: premises, group: group) }
|
11
|
+
let(:other_premises) { create(:premises) }
|
11
12
|
|
12
13
|
describe "#find_neo_relationship" do
|
13
14
|
it "searches neo4j relationship, returns Neography::Relationship instance" do
|
@@ -99,6 +100,14 @@ describe Neomirror::Relationship do
|
|
99
100
|
staff_of_premises.update(premises_id: nil)
|
100
101
|
Neomirror.neo.execute_query("MATCH (:User {id: #{user.id}})-[r:STAFF_OF]->(:Premises {id: #{premises.id}}) RETURN r")["data"].first.should be_nil
|
101
102
|
end
|
103
|
+
|
104
|
+
it "removes itself and recreate if at least one of related object has changed" do
|
105
|
+
staff_of_premises
|
106
|
+
Neomirror.neo.execute_query("MATCH (:User {id: #{user.id}})-[r:STAFF_OF]->(:Premises {id: #{premises.id}}) RETURN r")["data"].first.should be_present
|
107
|
+
staff_of_premises.update(premises_id: other_premises.id)
|
108
|
+
Neomirror.neo.execute_query("MATCH (:User {id: #{user.id}})-[r:STAFF_OF]->(:Premises {id: #{premises.id}}) RETURN r")["data"].first.should be_nil
|
109
|
+
Neomirror.neo.execute_query("MATCH (:User {id: #{user.id}})-[r:STAFF_OF]->(:Premises {id: #{other_premises.id}}) RETURN r")["data"].first.should be_present
|
110
|
+
end
|
102
111
|
end
|
103
112
|
|
104
113
|
describe "#destroy_neo_relationship" do
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: neomirror
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Alex Avoyants
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2014-07-
|
11
|
+
date: 2014-07-04 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: neography
|
@@ -16,14 +16,14 @@ dependencies:
|
|
16
16
|
requirements:
|
17
17
|
- - '>='
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version: 1.
|
19
|
+
version: 1.3.7
|
20
20
|
type: :runtime
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
24
|
- - '>='
|
25
25
|
- !ruby/object:Gem::Version
|
26
|
-
version: 1.
|
26
|
+
version: 1.3.7
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
28
|
name: bundler
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|