n4j 0.0.1.4 → 0.0.1.5
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/lib/n4j/entity.rb +18 -8
- data/lib/n4j/field.rb +4 -4
- data/lib/n4j/index.rb +62 -0
- data/lib/n4j/node.rb +9 -7
- data/lib/n4j/representation.rb +5 -2
- data/lib/n4j/request.rb +7 -3
- data/lib/n4j/version.rb +1 -1
- metadata +16 -11
data/lib/n4j/entity.rb
CHANGED
@@ -12,11 +12,11 @@ module N4j
|
|
12
12
|
include N4j::Field
|
13
13
|
|
14
14
|
extend ActiveModel::Callbacks
|
15
|
-
define_model_callbacks :initialize
|
15
|
+
define_model_callbacks :initialize, :save
|
16
16
|
|
17
17
|
include Representation
|
18
18
|
|
19
|
-
|
19
|
+
attr_writer :from_neo4j
|
20
20
|
attr_accessor :destroyed
|
21
21
|
attribute :data
|
22
22
|
end
|
@@ -33,6 +33,10 @@ module N4j
|
|
33
33
|
end
|
34
34
|
end
|
35
35
|
|
36
|
+
def from_neo4j
|
37
|
+
@from_neo4j ||= HashWithIndifferentAccess.new
|
38
|
+
end
|
39
|
+
|
36
40
|
def note_update!
|
37
41
|
changed_attributes.clear
|
38
42
|
end
|
@@ -72,12 +76,18 @@ module N4j
|
|
72
76
|
end
|
73
77
|
|
74
78
|
def save
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
79
|
+
run_callbacks :save do
|
80
|
+
updateable_bundle = create_bundle.select(&:persist_hash)
|
81
|
+
commands = updateable_bundle.collect {|entity| entity.persist_hash(:id => entity.place_in_batch) }
|
82
|
+
index_commands = create_bundle.select do |entity|
|
83
|
+
entity.class.ancestors.
|
84
|
+
include?(N4j::Node)
|
85
|
+
end.collect(&:index_hashes).compact.flatten
|
86
|
+
results = N4j.batch(commands + index_commands)
|
87
|
+
updateable_bundle.zip(results).each do |entity,result|
|
88
|
+
entity.load_neo4j_data(result['body'])
|
89
|
+
entity.post_save
|
90
|
+
end
|
81
91
|
end
|
82
92
|
end
|
83
93
|
|
data/lib/n4j/field.rb
CHANGED
@@ -7,20 +7,20 @@ module N4j::Field
|
|
7
7
|
define_method name do
|
8
8
|
data_access(name.to_s)
|
9
9
|
end
|
10
|
-
|
10
|
+
|
11
11
|
define_method "#{name}=" do |value|
|
12
12
|
data_set(name, value)
|
13
13
|
end
|
14
14
|
end
|
15
15
|
end
|
16
|
-
|
16
|
+
|
17
17
|
def data_access(key)
|
18
|
-
data[key]
|
18
|
+
data && data[key.to_s]
|
19
19
|
end
|
20
20
|
|
21
21
|
def data_set(key, new_value)
|
22
22
|
new_data = data.merge({key.to_s => new_value})
|
23
23
|
self.data = new_data
|
24
24
|
end
|
25
|
-
|
25
|
+
|
26
26
|
end
|
data/lib/n4j/index.rb
ADDED
@@ -0,0 +1,62 @@
|
|
1
|
+
module N4j::Node::Index
|
2
|
+
extend ActiveSupport::Concern
|
3
|
+
included do
|
4
|
+
N4j.batch([{:to => "#{N4j.neo4j_url_prefix}/index/node/", :method => "POST", :body => {:name => index_name}}])
|
5
|
+
class_attribute :indexes
|
6
|
+
end
|
7
|
+
module ClassMethods
|
8
|
+
def find_by_index(key, value)
|
9
|
+
search_url = "#{N4j.neo4j_url_prefix}
|
10
|
+
/index/node
|
11
|
+
/#{index_name}
|
12
|
+
/#{CGI.escape(key.to_s)}
|
13
|
+
/#{CGI.escape(value)}".gsub(/\s+/,'')
|
14
|
+
result = N4j.batch([{:to => search_url,:method => 'GET'}]).first['body'].first
|
15
|
+
new(result) if result
|
16
|
+
end
|
17
|
+
|
18
|
+
def index_name
|
19
|
+
model_name.i18n_key
|
20
|
+
end
|
21
|
+
|
22
|
+
def index(key)
|
23
|
+
self.indexes ||= []
|
24
|
+
self.indexes << key
|
25
|
+
|
26
|
+
define_singleton_method "find_by_#{key}" do |value|
|
27
|
+
find_by_index(key, value)
|
28
|
+
end
|
29
|
+
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
def add_to_index(key)
|
34
|
+
index = {
|
35
|
+
"value" => send(key),
|
36
|
+
"uri" => url,
|
37
|
+
"key" => key
|
38
|
+
}
|
39
|
+
|
40
|
+
N4j.batch([{:to => "#{index_path}",:method => 'POST',:body => index }])
|
41
|
+
end
|
42
|
+
|
43
|
+
def index_path
|
44
|
+
"#{N4j.neo4j_url_prefix}/index/node/#{self.class.index_name}"
|
45
|
+
end
|
46
|
+
|
47
|
+
def index_hashes # (opts ={}) <- the normal argument pattern doesn't really work here.
|
48
|
+
if (indexes = self.class.indexes)
|
49
|
+
indexes.collect do |index|
|
50
|
+
if (value = send(index))
|
51
|
+
index = {
|
52
|
+
"value" => send(index),
|
53
|
+
"uri" => url,
|
54
|
+
"key" => index
|
55
|
+
}
|
56
|
+
{:to => "#{index_path}",:method => 'POST',:body => index }
|
57
|
+
end
|
58
|
+
end.compact
|
59
|
+
end
|
60
|
+
end
|
61
|
+
|
62
|
+
end
|
data/lib/n4j/node.rb
CHANGED
@@ -1,27 +1,29 @@
|
|
1
1
|
module N4j::Node
|
2
|
-
|
2
|
+
|
3
3
|
autoload :AutoRelate, 'n4j/auto_relate'
|
4
|
-
|
4
|
+
autoload :Index, 'n4j/index'
|
5
|
+
|
5
6
|
extend ActiveSupport::Concern
|
6
7
|
included do
|
7
8
|
include AutoRelate
|
9
|
+
include Index
|
8
10
|
# include N4j::Entity
|
9
11
|
end
|
10
12
|
module ClassMethods
|
11
13
|
def find(n)
|
12
14
|
find_by_node_id(n)
|
13
15
|
end
|
14
|
-
|
16
|
+
|
15
17
|
def find_by_node_id(n)
|
16
18
|
find_by_path("/node/#{n}")
|
17
19
|
end
|
18
|
-
|
20
|
+
|
19
21
|
def find_by_path(path)
|
20
22
|
path.sub!(N4j.neo4j_url_prefix,'')
|
21
23
|
result = N4j.batch([{:to => path, :method => 'GET'}])
|
22
|
-
new(result.first['body'])
|
24
|
+
new(result.first['body'])
|
23
25
|
end
|
24
|
-
|
26
|
+
|
25
27
|
def service_root
|
26
28
|
find_by_node_id(0)
|
27
29
|
end
|
@@ -30,7 +32,7 @@ module N4j::Node
|
|
30
32
|
def initialize(hsh)
|
31
33
|
super(hsh)
|
32
34
|
unless N4j.neo4j_hash?(hsh)
|
33
|
-
self.data = hsh
|
35
|
+
self.data = HashWithIndifferentAccess.new.merge(hsh)
|
34
36
|
end
|
35
37
|
end
|
36
38
|
|
data/lib/n4j/representation.rb
CHANGED
@@ -19,11 +19,14 @@ module N4j::Entity::Representation
|
|
19
19
|
end
|
20
20
|
|
21
21
|
def url
|
22
|
-
from_neo4j['self']
|
22
|
+
from_neo4j['self'] || place_in_batch_path
|
23
23
|
end
|
24
24
|
|
25
25
|
def path
|
26
|
-
from_neo4j_relative['self'] ||
|
26
|
+
from_neo4j_relative['self'] || place_in_batch_path
|
27
|
+
end
|
28
|
+
|
29
|
+
def place_in_batch_path
|
27
30
|
(place_in_batch ? "{#{place_in_batch}}" : nil)
|
28
31
|
end
|
29
32
|
|
data/lib/n4j/request.rb
CHANGED
@@ -10,7 +10,7 @@ module N4j::Request
|
|
10
10
|
end
|
11
11
|
|
12
12
|
def port
|
13
|
-
config = YAML.load_file("
|
13
|
+
config = YAML.load_file("config/n4j.yml")
|
14
14
|
config[Rails.env]['port']
|
15
15
|
end
|
16
16
|
|
@@ -20,8 +20,12 @@ module N4j::Request
|
|
20
20
|
|
21
21
|
def batch(commands) # [{'to'=> '', 'method' => '', 'body' => '', 'id' => 0},...]
|
22
22
|
commands.flatten!
|
23
|
-
commands.each_with_index {|command, index| command[:id] ||= index }
|
24
|
-
|
23
|
+
# commands.each_with_index {|command, index| command[:id] ||= index }
|
24
|
+
commands.inject(0) do |index, command|
|
25
|
+
command[:id] = command[:id] || (index + 1)
|
26
|
+
end
|
27
|
+
puts "Batch job: "
|
28
|
+
commands.each {|c| puts " #{c}"}
|
25
29
|
begin
|
26
30
|
result = RestClient.post("#{neo4j_url_prefix}/batch",
|
27
31
|
commands.to_json,
|
data/lib/n4j/version.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: n4j
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.1.
|
4
|
+
version: 0.0.1.5
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,12 +9,11 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2012-02-
|
13
|
-
default_executable:
|
12
|
+
date: 2012-02-26 00:00:00.000000000 Z
|
14
13
|
dependencies:
|
15
14
|
- !ruby/object:Gem::Dependency
|
16
15
|
name: rest-client
|
17
|
-
requirement: &
|
16
|
+
requirement: &70305424386120 !ruby/object:Gem::Requirement
|
18
17
|
none: false
|
19
18
|
requirements:
|
20
19
|
- - ! '>='
|
@@ -22,10 +21,10 @@ dependencies:
|
|
22
21
|
version: '0'
|
23
22
|
type: :runtime
|
24
23
|
prerelease: false
|
25
|
-
version_requirements: *
|
24
|
+
version_requirements: *70305424386120
|
26
25
|
- !ruby/object:Gem::Dependency
|
27
26
|
name: activesupport
|
28
|
-
requirement: &
|
27
|
+
requirement: &70305424385700 !ruby/object:Gem::Requirement
|
29
28
|
none: false
|
30
29
|
requirements:
|
31
30
|
- - ! '>='
|
@@ -33,10 +32,10 @@ dependencies:
|
|
33
32
|
version: '0'
|
34
33
|
type: :runtime
|
35
34
|
prerelease: false
|
36
|
-
version_requirements: *
|
35
|
+
version_requirements: *70305424385700
|
37
36
|
- !ruby/object:Gem::Dependency
|
38
37
|
name: activemodel
|
39
|
-
requirement: &
|
38
|
+
requirement: &70305424385280 !ruby/object:Gem::Requirement
|
40
39
|
none: false
|
41
40
|
requirements:
|
42
41
|
- - ! '>='
|
@@ -44,7 +43,7 @@ dependencies:
|
|
44
43
|
version: '0'
|
45
44
|
type: :runtime
|
46
45
|
prerelease: false
|
47
|
-
version_requirements: *
|
46
|
+
version_requirements: *70305424385280
|
48
47
|
description: A little spiked out thing.
|
49
48
|
email:
|
50
49
|
- samsm@samsm.com
|
@@ -64,6 +63,7 @@ files:
|
|
64
63
|
- lib/n4j/cypher.rb
|
65
64
|
- lib/n4j/entity.rb
|
66
65
|
- lib/n4j/field.rb
|
66
|
+
- lib/n4j/index.rb
|
67
67
|
- lib/n4j/node.rb
|
68
68
|
- lib/n4j/populate.rb
|
69
69
|
- lib/n4j/railtie.rb
|
@@ -87,7 +87,6 @@ files:
|
|
87
87
|
- test/field_test.rb
|
88
88
|
- test/test_helper.rb
|
89
89
|
- tmp/pids/.gitkeep
|
90
|
-
has_rdoc: true
|
91
90
|
homepage: ''
|
92
91
|
licenses: []
|
93
92
|
post_install_message:
|
@@ -100,15 +99,21 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
100
99
|
- - ! '>='
|
101
100
|
- !ruby/object:Gem::Version
|
102
101
|
version: '0'
|
102
|
+
segments:
|
103
|
+
- 0
|
104
|
+
hash: -2230038907754236757
|
103
105
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
104
106
|
none: false
|
105
107
|
requirements:
|
106
108
|
- - ! '>='
|
107
109
|
- !ruby/object:Gem::Version
|
108
110
|
version: '0'
|
111
|
+
segments:
|
112
|
+
- 0
|
113
|
+
hash: -2230038907754236757
|
109
114
|
requirements: []
|
110
115
|
rubyforge_project: n4j
|
111
|
-
rubygems_version: 1.
|
116
|
+
rubygems_version: 1.8.10
|
112
117
|
signing_key:
|
113
118
|
specification_version: 3
|
114
119
|
summary: Help using Neo4j Rest server.
|