neo4j 3.0.0.alpha.8 → 3.0.0.alpha.9
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 +8 -0
- data/Gemfile +1 -1
- data/config/neo4j/config.yml +19 -84
- data/lib/neo4j.rb +5 -2
- data/lib/neo4j.rb~ +40 -0
- data/lib/neo4j/active_node.rb +19 -1
- data/lib/neo4j/active_node/has_n.rb +64 -124
- data/lib/neo4j/active_node/has_n/association.rb +142 -0
- data/lib/neo4j/active_node/id_property.rb +119 -0
- data/lib/neo4j/active_node/identity.rb +0 -5
- data/lib/neo4j/active_node/initialize.rb +1 -0
- data/lib/neo4j/active_node/labels.rb +62 -25
- data/lib/neo4j/active_node/persistence.rb +26 -5
- data/lib/neo4j/active_node/property.rb +121 -18
- data/lib/neo4j/active_node/query.rb +17 -9
- data/lib/neo4j/active_node/query/query_proxy.rb +202 -46
- data/lib/neo4j/active_node/serialized_properties.rb +21 -0
- data/lib/neo4j/config.rb +119 -0
- data/lib/neo4j/paginated.rb +19 -0
- data/lib/neo4j/railtie.rb +1 -0
- data/lib/neo4j/type_converters.rb +49 -3
- data/lib/neo4j/version.rb +1 -1
- data/lib/neo4j/wrapper.rb +15 -10
- data/lib/person.rb~ +9 -0
- data/lib/rails/generators/neo4j_generator.rb +1 -1
- data/lib/test.rb +21 -0
- data/lib/test.rb~ +21 -0
- data/neo4j.gemspec +2 -1
- metadata +27 -5
- data/lib/neo4j/active_node/has_n/decl_rel.rb +0 -252
@@ -0,0 +1,21 @@
|
|
1
|
+
module Neo4j::ActiveNode
|
2
|
+
module SerializedProperties
|
3
|
+
extend ActiveSupport::Concern
|
4
|
+
|
5
|
+
def serialized_properties
|
6
|
+
self.class.serialized_properties
|
7
|
+
end
|
8
|
+
|
9
|
+
module ClassMethods
|
10
|
+
|
11
|
+
def serialized_properties
|
12
|
+
@serialize || {}
|
13
|
+
end
|
14
|
+
|
15
|
+
def serialize(name, coder = JSON)
|
16
|
+
@serialize ||= {}
|
17
|
+
@serialize[name] = coder
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
data/lib/neo4j/config.rb
ADDED
@@ -0,0 +1,119 @@
|
|
1
|
+
module Neo4j
|
2
|
+
|
3
|
+
|
4
|
+
# == Keeps configuration for neo4j
|
5
|
+
#
|
6
|
+
# == Configurations keys
|
7
|
+
#
|
8
|
+
class Config
|
9
|
+
|
10
|
+
DEFAULT_FILE = File.expand_path(File.join(File.dirname(__FILE__), "..", "..", "config", "neo4j", "config.yml"))
|
11
|
+
|
12
|
+
class << self
|
13
|
+
|
14
|
+
# @return [Fixnum] The location of the default configuration file.
|
15
|
+
def default_file
|
16
|
+
@default_file ||= DEFAULT_FILE
|
17
|
+
end
|
18
|
+
|
19
|
+
# Sets the location of the configuration YAML file and old deletes configurations.
|
20
|
+
#
|
21
|
+
# @param [String] file_path represent the path to the file.
|
22
|
+
def default_file=(file_path)
|
23
|
+
delete_all
|
24
|
+
@defaults = nil
|
25
|
+
@default_file = File.expand_path(file_path)
|
26
|
+
end
|
27
|
+
|
28
|
+
# @return [Hash] the default file loaded by yaml
|
29
|
+
def defaults
|
30
|
+
require 'yaml'
|
31
|
+
@defaults ||= ActiveSupport::HashWithIndifferentAccess.new(YAML.load_file(default_file))
|
32
|
+
end
|
33
|
+
|
34
|
+
# Reads from the default_file if configuration is not set already
|
35
|
+
# @return [Hash] the configuration
|
36
|
+
def get_or_setup_configuration
|
37
|
+
@configuration ||= setup
|
38
|
+
end
|
39
|
+
|
40
|
+
# @return [Hash] the configuration
|
41
|
+
def configuration
|
42
|
+
@configuration || {}
|
43
|
+
end
|
44
|
+
|
45
|
+
# Yields the configuration
|
46
|
+
#
|
47
|
+
# @example
|
48
|
+
# Neo4j::Config.use do |config|
|
49
|
+
# config[:storage_path] = '/var/neo4j'
|
50
|
+
# end
|
51
|
+
#
|
52
|
+
# @return nil
|
53
|
+
# @yield config
|
54
|
+
# @yieldparam [Neo4j::Config] config - this configuration class
|
55
|
+
def use
|
56
|
+
@configuration ||= ActiveSupport::HashWithIndifferentAccess.new
|
57
|
+
yield @configuration
|
58
|
+
nil
|
59
|
+
end
|
60
|
+
|
61
|
+
|
62
|
+
# Sets the value of a config entry.
|
63
|
+
#
|
64
|
+
# @param [Symbol] key the key to set the parameter for
|
65
|
+
# @param val the value of the parameter.
|
66
|
+
def []=(key, val)
|
67
|
+
get_or_setup_configuration[key.to_s] = val
|
68
|
+
end
|
69
|
+
|
70
|
+
|
71
|
+
# @param [Symbol] key The key of the config entry value we want
|
72
|
+
# @return the the value of a config entry
|
73
|
+
def [](key)
|
74
|
+
get_or_setup_configuration[key.to_s]
|
75
|
+
end
|
76
|
+
|
77
|
+
|
78
|
+
# Remove the value of a config entry.
|
79
|
+
#
|
80
|
+
# @param [Symbol] key the key of the configuration entry to delete
|
81
|
+
# @return The value of the removed entry.
|
82
|
+
def delete(key)
|
83
|
+
get_or_setup_configuration.delete(key)
|
84
|
+
end
|
85
|
+
|
86
|
+
|
87
|
+
# Remove all configuration. This can be useful for testing purpose.
|
88
|
+
#
|
89
|
+
# @return nil
|
90
|
+
def delete_all
|
91
|
+
@configuration = nil
|
92
|
+
end
|
93
|
+
|
94
|
+
|
95
|
+
# @return [Hash] The config as a hash.
|
96
|
+
def to_hash
|
97
|
+
get_or_setup_configuration.to_hash
|
98
|
+
end
|
99
|
+
|
100
|
+
# @return [String] The config as a YAML
|
101
|
+
def to_yaml
|
102
|
+
get_or_setup_configuration.to_yaml
|
103
|
+
end
|
104
|
+
|
105
|
+
# @return The a new configuration using default values as a hash.
|
106
|
+
def setup
|
107
|
+
@configuration = ActiveSupport::HashWithIndifferentAccess.new
|
108
|
+
@configuration.merge!(defaults)
|
109
|
+
@configuration
|
110
|
+
end
|
111
|
+
|
112
|
+
def class_name_property
|
113
|
+
Neo4j::Config[:class_name_property] || :_classname
|
114
|
+
end
|
115
|
+
|
116
|
+
end
|
117
|
+
end
|
118
|
+
|
119
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
module Neo4j
|
2
|
+
class Paginated
|
3
|
+
include Enumerable
|
4
|
+
attr_reader :items, :total, :current_page
|
5
|
+
|
6
|
+
def initialize(items, total, current_page)
|
7
|
+
@items, @total, @current_page = items, total, current_page
|
8
|
+
end
|
9
|
+
|
10
|
+
def self.create_from(source, page, per_page)
|
11
|
+
#partial = source.drop((page-1) * per_page).first(per_page)
|
12
|
+
partial = source.skip(page-1).limit(per_page)
|
13
|
+
Paginated.new(partial, source.count, page)
|
14
|
+
end
|
15
|
+
|
16
|
+
delegate :each, :to => :items
|
17
|
+
delegate :size, :[], :to => :items
|
18
|
+
end
|
19
|
+
end
|
data/lib/neo4j/railtie.rb
CHANGED
@@ -2,7 +2,6 @@ module Neo4j
|
|
2
2
|
|
3
3
|
module TypeConverters
|
4
4
|
|
5
|
-
|
6
5
|
# Converts Date objects to Java long types. Must be timezone UTC.
|
7
6
|
class DateConverter
|
8
7
|
class << self
|
@@ -79,13 +78,60 @@ module Neo4j
|
|
79
78
|
end
|
80
79
|
end
|
81
80
|
|
81
|
+
# Converts hash to/from YAML
|
82
|
+
class YAMLConverter
|
83
|
+
class << self
|
84
|
+
|
85
|
+
def convert_type
|
86
|
+
Hash
|
87
|
+
end
|
88
|
+
|
89
|
+
def to_db(value)
|
90
|
+
return nil if value.nil?
|
91
|
+
Psych.dump(value)
|
92
|
+
end
|
93
|
+
|
94
|
+
def to_ruby(value)
|
95
|
+
return nil if value.nil?
|
96
|
+
Psych.load(value)
|
97
|
+
end
|
98
|
+
end
|
99
|
+
end
|
100
|
+
|
101
|
+
# Converts hash to/from JSON
|
102
|
+
class JSONConverter
|
103
|
+
class << self
|
104
|
+
|
105
|
+
def convert_type
|
106
|
+
JSON
|
107
|
+
end
|
108
|
+
|
109
|
+
def to_db(value)
|
110
|
+
return nil if value.nil?
|
111
|
+
value.to_json
|
112
|
+
end
|
113
|
+
|
114
|
+
def to_ruby(value)
|
115
|
+
return nil if value.nil?
|
116
|
+
JSON.parse(value, quirks_mode: true)
|
117
|
+
end
|
118
|
+
end
|
119
|
+
end
|
120
|
+
|
121
|
+
|
122
|
+
|
82
123
|
def convert_properties_to(medium, properties)
|
83
124
|
# Perform type conversion
|
125
|
+
serialize = self.respond_to?(:serialized_properties) ? self.serialized_properties : {}
|
84
126
|
properties = properties.inject({}) do |new_attributes, key_value_pair|
|
85
127
|
attr, value = key_value_pair
|
86
|
-
|
128
|
+
|
129
|
+
# skip "secret" undeclared attributes such as uuid
|
130
|
+
next new_attributes unless self.class.attributes[attr]
|
131
|
+
|
132
|
+
type = serialize.has_key?(attr.to_sym) ? serialize[attr.to_sym] : self.class._attribute_type(attr)
|
87
133
|
new_attributes[attr] = if TypeConverters.converters[type].nil?
|
88
|
-
|
134
|
+
value
|
89
135
|
else
|
90
136
|
TypeConverters.send "to_#{medium}", value, type
|
91
137
|
end
|
data/lib/neo4j/version.rb
CHANGED
data/lib/neo4j/wrapper.rb
CHANGED
@@ -4,16 +4,10 @@ class Neo4j::Node
|
|
4
4
|
|
5
5
|
# this is a plugin in the neo4j-core so that the Ruby wrapper will be wrapped around the Neo4j::Node objects
|
6
6
|
def wrapper
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
wrapper_classes = wrappers.map{|w| Neo4j::ActiveNode::Labels._wrapped_labels[w]}
|
12
|
-
most_concrete_class = wrapper_classes.sort.first
|
13
|
-
wrapped_node = most_concrete_class.new
|
14
|
-
wrapped_node.init_on_load(self, self.props)
|
15
|
-
wrapped_node
|
16
|
-
end
|
7
|
+
most_concrete_class = sorted_wrapper_classes
|
8
|
+
wrapped_node = most_concrete_class.new
|
9
|
+
wrapped_node.init_on_load(self, self.props)
|
10
|
+
wrapped_node
|
17
11
|
end
|
18
12
|
|
19
13
|
def checked_labels_set
|
@@ -28,6 +22,17 @@ class Neo4j::Node
|
|
28
22
|
end
|
29
23
|
end
|
30
24
|
|
25
|
+
def sorted_wrapper_classes
|
26
|
+
if self.props.is_a?(Hash) && self.props.has_key?(Neo4j::Config.class_name_property)
|
27
|
+
self.props[Neo4j::Config.class_name_property].constantize
|
28
|
+
else
|
29
|
+
wrappers = _class_wrappers
|
30
|
+
return self if wrappers.nil?
|
31
|
+
wrapper_classes = wrappers.map{|w| Neo4j::ActiveNode::Labels._wrapped_labels[w]}
|
32
|
+
wrapper_classes.sort.first
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
31
36
|
def load_class_from_label(label_name)
|
32
37
|
begin
|
33
38
|
label_name.to_s.split("::").inject(Kernel) {|container, name| container.const_get(name.to_s) }
|
data/lib/person.rb~
ADDED
data/lib/test.rb
ADDED
@@ -0,0 +1,21 @@
|
|
1
|
+
require 'neo4j'
|
2
|
+
s = Neo4j::Session.open
|
3
|
+
class Person
|
4
|
+
include Neo4j::ActiveNode
|
5
|
+
property :name
|
6
|
+
has_many :out, :friends, type: :friends, model_class: self
|
7
|
+
end
|
8
|
+
|
9
|
+
t = Neo4j::Transaction.new
|
10
|
+
|
11
|
+
p = Person.new
|
12
|
+
p.save
|
13
|
+
p.friends << Person.create(name: 'a') << Person.create(name: 'b')
|
14
|
+
id = p.id
|
15
|
+
puts "ID #{id}"
|
16
|
+
puts "FRIENDS #{p.friends.to_a.first.name}"
|
17
|
+
t.fail
|
18
|
+
t.close
|
19
|
+
puts "DONE"
|
20
|
+
|
21
|
+
puts "LOAD #{Neo4j::Node.load(id)}"
|
data/lib/test.rb~
ADDED
@@ -0,0 +1,21 @@
|
|
1
|
+
require 'neo4j'
|
2
|
+
s = Neo4j::Session.open
|
3
|
+
class Person
|
4
|
+
include Neo4j::ActiveNode
|
5
|
+
property :name
|
6
|
+
has_many :out, :friends
|
7
|
+
end
|
8
|
+
|
9
|
+
t = Neo4j::Transaction.new
|
10
|
+
|
11
|
+
p = Person.new
|
12
|
+
p.save
|
13
|
+
p.friends << Person.create << Person.create
|
14
|
+
id = p.id
|
15
|
+
puts "ID #{id}"
|
16
|
+
puts "FRIENDS #{p.friends.to_a.count}"
|
17
|
+
t.fail
|
18
|
+
t.close
|
19
|
+
puts "DONE"
|
20
|
+
|
21
|
+
puts "LOAD #{Neo4j::Node.load(id)}"
|
data/neo4j.gemspec
CHANGED
@@ -31,9 +31,10 @@ It comes included with the Apache Lucene document database.
|
|
31
31
|
|
32
32
|
s.add_dependency('orm_adapter', "~> 0.5.0")
|
33
33
|
s.add_dependency("activemodel", "~> 4")
|
34
|
+
s.add_dependency("activesupport", "~> 4")
|
34
35
|
s.add_dependency("railties", "~> 4")
|
35
36
|
s.add_dependency('active_attr', "~> 0.8")
|
36
|
-
s.add_dependency("neo4j-core", "= 3.0.0.alpha.
|
37
|
+
s.add_dependency("neo4j-core", "= 3.0.0.alpha.19")
|
37
38
|
|
38
39
|
if RUBY_PLATFORM =~ /java/
|
39
40
|
s.add_dependency("neo4j-community", '~> 2.0')
|
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: 3.0.0.alpha.
|
4
|
+
version: 3.0.0.alpha.9
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Andreas Ronge
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2014-
|
11
|
+
date: 2014-08-14 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: orm_adapter
|
@@ -38,6 +38,20 @@ dependencies:
|
|
38
38
|
- - "~>"
|
39
39
|
- !ruby/object:Gem::Version
|
40
40
|
version: '4'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: activesupport
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - "~>"
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '4'
|
48
|
+
type: :runtime
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - "~>"
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '4'
|
41
55
|
- !ruby/object:Gem::Dependency
|
42
56
|
name: railties
|
43
57
|
requirement: !ruby/object:Gem::Requirement
|
@@ -72,14 +86,14 @@ dependencies:
|
|
72
86
|
requirements:
|
73
87
|
- - '='
|
74
88
|
- !ruby/object:Gem::Version
|
75
|
-
version: 3.0.0.alpha.
|
89
|
+
version: 3.0.0.alpha.19
|
76
90
|
type: :runtime
|
77
91
|
prerelease: false
|
78
92
|
version_requirements: !ruby/object:Gem::Requirement
|
79
93
|
requirements:
|
80
94
|
- - '='
|
81
95
|
- !ruby/object:Gem::Version
|
82
|
-
version: 3.0.0.alpha.
|
96
|
+
version: 3.0.0.alpha.19
|
83
97
|
description: "You can think of Neo4j as a high-performance graph engine with all the
|
84
98
|
features of a mature and robust database.\nThe programmer works with an object-oriented,
|
85
99
|
flexible network structure rather than with strict and static tables \nyet enjoys
|
@@ -100,11 +114,13 @@ files:
|
|
100
114
|
- config/locales/en.yml
|
101
115
|
- config/neo4j/config.yml
|
102
116
|
- lib/neo4j.rb
|
117
|
+
- lib/neo4j.rb~
|
103
118
|
- lib/neo4j/active_node.rb
|
104
119
|
- lib/neo4j/active_node/callbacks.rb
|
105
120
|
- lib/neo4j/active_node/has_n.rb
|
106
|
-
- lib/neo4j/active_node/has_n/
|
121
|
+
- lib/neo4j/active_node/has_n/association.rb
|
107
122
|
- lib/neo4j/active_node/has_n/nodes.rb
|
123
|
+
- lib/neo4j/active_node/id_property.rb
|
108
124
|
- lib/neo4j/active_node/identity.rb
|
109
125
|
- lib/neo4j/active_node/initialize.rb
|
110
126
|
- lib/neo4j/active_node/labels.rb
|
@@ -115,14 +131,20 @@ files:
|
|
115
131
|
- lib/neo4j/active_node/query/query_proxy.rb
|
116
132
|
- lib/neo4j/active_node/quick_query.rb
|
117
133
|
- lib/neo4j/active_node/rels.rb
|
134
|
+
- lib/neo4j/active_node/serialized_properties.rb
|
118
135
|
- lib/neo4j/active_node/validations.rb
|
136
|
+
- lib/neo4j/config.rb
|
137
|
+
- lib/neo4j/paginated.rb
|
119
138
|
- lib/neo4j/railtie.rb
|
120
139
|
- lib/neo4j/type_converters.rb
|
121
140
|
- lib/neo4j/version.rb
|
122
141
|
- lib/neo4j/wrapper.rb
|
142
|
+
- lib/person.rb~
|
123
143
|
- lib/rails/generators/neo4j/model/model_generator.rb
|
124
144
|
- lib/rails/generators/neo4j/model/templates/model.erb
|
125
145
|
- lib/rails/generators/neo4j_generator.rb
|
146
|
+
- lib/test.rb
|
147
|
+
- lib/test.rb~
|
126
148
|
- neo4j.gemspec
|
127
149
|
homepage: http://github.com/andreasronge/neo4j/tree
|
128
150
|
licenses:
|