neo4j 4.0.0 → 4.1.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 +10 -0
- data/Gemfile +6 -16
- data/README.md +5 -2
- data/bin/neo4j-jars +6 -6
- data/lib/neo4j.rb +13 -9
- data/lib/neo4j/active_node.rb +9 -9
- data/lib/neo4j/active_node/dependent.rb +11 -0
- data/lib/neo4j/active_node/dependent/association_methods.rb +28 -0
- data/lib/neo4j/active_node/dependent/query_proxy_methods.rb +48 -0
- data/lib/neo4j/active_node/has_n.rb +124 -112
- data/lib/neo4j/active_node/has_n/association.rb +45 -30
- data/lib/neo4j/active_node/id_property.rb +22 -19
- data/lib/neo4j/active_node/initialize.rb +2 -4
- data/lib/neo4j/active_node/labels.rb +23 -22
- data/lib/neo4j/active_node/node_wrapper.rb +5 -8
- data/lib/neo4j/active_node/orm_adapter.rb +2 -4
- data/lib/neo4j/active_node/persistence.rb +5 -10
- data/lib/neo4j/active_node/property.rb +3 -4
- data/lib/neo4j/active_node/query.rb +27 -6
- data/lib/neo4j/active_node/query/query_proxy.rb +65 -110
- data/lib/neo4j/active_node/query/query_proxy_enumerable.rb +67 -0
- data/lib/neo4j/active_node/query/query_proxy_find_in_batches.rb +0 -1
- data/lib/neo4j/active_node/query/query_proxy_methods.rb +29 -28
- data/lib/neo4j/active_node/query_methods.rb +6 -6
- data/lib/neo4j/active_node/reflection.rb +3 -2
- data/lib/neo4j/active_node/rels.rb +1 -1
- data/lib/neo4j/active_node/scope.rb +13 -8
- data/lib/neo4j/active_node/validations.rb +5 -6
- data/lib/neo4j/active_rel.rb +1 -2
- data/lib/neo4j/active_rel/callbacks.rb +3 -3
- data/lib/neo4j/active_rel/persistence.rb +9 -7
- data/lib/neo4j/active_rel/property.rb +12 -4
- data/lib/neo4j/active_rel/query.rb +6 -8
- data/lib/neo4j/active_rel/rel_wrapper.rb +0 -2
- data/lib/neo4j/active_rel/related_node.rb +4 -5
- data/lib/neo4j/active_rel/types.rb +4 -6
- data/lib/neo4j/active_rel/validations.rb +0 -1
- data/lib/neo4j/config.rb +11 -23
- data/lib/neo4j/core/query.rb +1 -1
- data/lib/neo4j/migration.rb +17 -18
- data/lib/neo4j/paginated.rb +4 -4
- data/lib/neo4j/railtie.rb +19 -19
- data/lib/neo4j/shared.rb +7 -3
- data/lib/neo4j/shared/callbacks.rb +15 -4
- data/lib/neo4j/shared/identity.rb +2 -2
- data/lib/neo4j/shared/persistence.rb +10 -21
- data/lib/neo4j/shared/property.rb +17 -30
- data/lib/neo4j/shared/rel_type_converters.rb +1 -3
- data/lib/neo4j/shared/type_converters.rb +13 -25
- data/lib/neo4j/shared/validations.rb +3 -3
- data/lib/neo4j/tasks/migration.rake +7 -7
- data/lib/neo4j/type_converters.rb +1 -1
- data/lib/neo4j/version.rb +1 -1
- data/lib/rails/generators/neo4j/model/model_generator.rb +16 -12
- data/lib/rails/generators/neo4j_generator.rb +18 -18
- data/neo4j.gemspec +22 -18
- metadata +103 -1
@@ -3,10 +3,10 @@ module Neo4j::ActiveRel
|
|
3
3
|
extend ActiveSupport::Concern
|
4
4
|
include Neo4j::Shared::Property
|
5
5
|
|
6
|
-
%w
|
6
|
+
%w(to_node from_node).each do |direction|
|
7
7
|
define_method("#{direction}") { instance_variable_get("@#{direction}") }
|
8
8
|
define_method("#{direction}=") do |argument|
|
9
|
-
|
9
|
+
fail FrozenRelError, 'Relationship start/end nodes cannot be changed once persisted' if self.persisted?
|
10
10
|
instance_variable_set("@#{direction}", argument)
|
11
11
|
end
|
12
12
|
end
|
@@ -34,7 +34,7 @@ module Neo4j::ActiveRel
|
|
34
34
|
end
|
35
35
|
end
|
36
36
|
|
37
|
-
%w
|
37
|
+
%w(to_class from_class).each do |direction|
|
38
38
|
define_method("#{direction}") { |argument| instance_variable_set("@#{direction}", argument) }
|
39
39
|
define_method("_#{direction}") { instance_variable_get "@#{direction}" }
|
40
40
|
end
|
@@ -45,6 +45,14 @@ module Neo4j::ActiveRel
|
|
45
45
|
def load_entity(id)
|
46
46
|
Neo4j::Node.load(id)
|
47
47
|
end
|
48
|
+
|
49
|
+
def creates_unique_rel
|
50
|
+
@unique = true
|
51
|
+
end
|
52
|
+
|
53
|
+
def unique?
|
54
|
+
!!@unique
|
55
|
+
end
|
48
56
|
end
|
49
57
|
|
50
58
|
private
|
@@ -54,4 +62,4 @@ module Neo4j::ActiveRel
|
|
54
62
|
@to_node = RelatedNode.new(to_node)
|
55
63
|
end
|
56
64
|
end
|
57
|
-
end
|
65
|
+
end
|
@@ -3,18 +3,17 @@ module Neo4j::ActiveRel
|
|
3
3
|
extend ActiveSupport::Concern
|
4
4
|
|
5
5
|
module ClassMethods
|
6
|
-
|
7
6
|
# Returns the object with the specified neo4j id.
|
8
7
|
# @param [String,Fixnum] id of node to find
|
9
8
|
# @param [Neo4j::Session] session optional
|
10
9
|
def find(id, session = self.neo4j_session)
|
11
|
-
|
10
|
+
fail "Unknown argument #{id.class} in find method (expected String or Fixnum)" if not [String, Fixnum].include?(id.class)
|
12
11
|
find_by_id(id, session)
|
13
12
|
end
|
14
13
|
|
15
14
|
# Loads the relationship using its neo_id.
|
16
15
|
def find_by_id(key, session = Neo4j::Session.current!)
|
17
|
-
session.query.match(
|
16
|
+
session.query.match('()-[r]-()').where('ID(r)' => key.to_i).limit(1).return(:r).first.r
|
18
17
|
end
|
19
18
|
|
20
19
|
# Performs a very basic match on the relationship.
|
@@ -22,7 +21,7 @@ module Neo4j::ActiveRel
|
|
22
21
|
# To use a string, prefix the property with "r1"
|
23
22
|
# @example Match with a string
|
24
23
|
# MyRelClass.where('r1.grade > r1')
|
25
|
-
def where(args={})
|
24
|
+
def where(args = {})
|
26
25
|
where_query.where(where_string(args)).pluck(:r1)
|
27
26
|
end
|
28
27
|
|
@@ -33,11 +32,11 @@ module Neo4j::ActiveRel
|
|
33
32
|
end
|
34
33
|
|
35
34
|
def first
|
36
|
-
all_query.limit(1).order(
|
35
|
+
all_query.limit(1).order('ID(r1)').pluck(:r1).first
|
37
36
|
end
|
38
37
|
|
39
38
|
def last
|
40
|
-
all_query.limit(1).order(
|
39
|
+
all_query.limit(1).order('ID(r1) DESC').pluck(:r1).first
|
41
40
|
end
|
42
41
|
|
43
42
|
private
|
@@ -85,7 +84,6 @@ module Neo4j::ActiveRel
|
|
85
84
|
args
|
86
85
|
end
|
87
86
|
end
|
88
|
-
|
89
87
|
end
|
90
88
|
end
|
91
|
-
end
|
89
|
+
end
|
@@ -3,7 +3,6 @@ module Neo4j::ActiveRel
|
|
3
3
|
# It's important (or maybe not really IMPORTANT, but at least worth mentioning) that calling method_missing
|
4
4
|
# will result in a query to load the node if the node is not already loaded.
|
5
5
|
class RelatedNode
|
6
|
-
|
7
6
|
class InvalidParameterError < StandardError; end
|
8
7
|
|
9
8
|
# ActiveRel's related nodes can be initialized with nothing, an integer, or a fully wrapped node.
|
@@ -15,13 +14,13 @@ module Neo4j::ActiveRel
|
|
15
14
|
#
|
16
15
|
# Initialization with a node doesn't appear to happen in the code. TODO: maybe find out why this is an option.
|
17
16
|
def initialize(node = nil)
|
18
|
-
@node = valid_node_param?(node) ? node : (
|
17
|
+
@node = valid_node_param?(node) ? node : (fail InvalidParameterError, 'RelatedNode must be initialized with either a node ID or node')
|
19
18
|
end
|
20
19
|
|
21
20
|
# Loads the node if needed, then conducts comparison.
|
22
|
-
def ==
|
21
|
+
def ==(other)
|
23
22
|
loaded if @node.is_a?(Fixnum)
|
24
|
-
@node ==
|
23
|
+
@node == other
|
25
24
|
end
|
26
25
|
|
27
26
|
# Returns the neo_id of a given node without loading.
|
@@ -53,4 +52,4 @@ module Neo4j::ActiveRel
|
|
53
52
|
node.nil? || node.is_a?(Integer) || node.respond_to?(:neo_id)
|
54
53
|
end
|
55
54
|
end
|
56
|
-
end
|
55
|
+
end
|
@@ -1,6 +1,5 @@
|
|
1
1
|
module Neo4j
|
2
2
|
module ActiveRel
|
3
|
-
|
4
3
|
# provides mapping of type to model name
|
5
4
|
module Types
|
6
5
|
extend ActiveSupport::Concern
|
@@ -21,7 +20,7 @@ module Neo4j
|
|
21
20
|
# which will completely bypass this whole process.
|
22
21
|
WRAPPED_CLASSES = {}
|
23
22
|
|
24
|
-
included do
|
23
|
+
included do
|
25
24
|
type self.name, true
|
26
25
|
end
|
27
26
|
|
@@ -36,12 +35,11 @@ module Neo4j
|
|
36
35
|
end
|
37
36
|
|
38
37
|
# @return [String] a string representing the relationship type that will be created
|
39
|
-
|
40
|
-
|
41
|
-
end
|
38
|
+
attr_reader :rel_type
|
39
|
+
alias_method :_type, :rel_type # Should be deprecated
|
42
40
|
|
43
41
|
def add_wrapped_class(type)
|
44
|
-
#_wrapped_classes[type.to_sym.downcase] = self.name
|
42
|
+
# _wrapped_classes[type.to_sym.downcase] = self.name
|
45
43
|
_wrapped_classes[type.to_sym] = self.name
|
46
44
|
end
|
47
45
|
|
data/lib/neo4j/config.rb
CHANGED
@@ -1,16 +1,12 @@
|
|
1
1
|
module Neo4j
|
2
|
-
|
3
|
-
|
4
2
|
# == Keeps configuration for neo4j
|
5
3
|
#
|
6
4
|
# == Configurations keys
|
7
5
|
#
|
8
6
|
class Config
|
9
|
-
|
10
|
-
DEFAULT_FILE = File.expand_path(File.join(File.dirname(__FILE__), "..", "..", "config", "neo4j", "config.yml"))
|
7
|
+
DEFAULT_FILE = File.expand_path(File.join(File.dirname(__FILE__), '..', '..', 'config', 'neo4j', 'config.yml'))
|
11
8
|
|
12
9
|
class << self
|
13
|
-
|
14
10
|
# @return [Fixnum] The location of the default configuration file.
|
15
11
|
def default_file
|
16
12
|
@default_file ||= DEFAULT_FILE
|
@@ -32,14 +28,13 @@ module Neo4j
|
|
32
28
|
end
|
33
29
|
|
34
30
|
# 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
31
|
# @return [Hash] the configuration
|
41
32
|
def configuration
|
42
|
-
@configuration
|
33
|
+
return @configuration if @configuration
|
34
|
+
|
35
|
+
@configuration = ActiveSupport::HashWithIndifferentAccess.new
|
36
|
+
@configuration.merge!(defaults)
|
37
|
+
@configuration
|
43
38
|
end
|
44
39
|
|
45
40
|
# Yields the configuration
|
@@ -64,14 +59,14 @@ module Neo4j
|
|
64
59
|
# @param [Symbol] key the key to set the parameter for
|
65
60
|
# @param val the value of the parameter.
|
66
61
|
def []=(key, val)
|
67
|
-
|
62
|
+
configuration[key.to_s] = val
|
68
63
|
end
|
69
64
|
|
70
65
|
|
71
66
|
# @param [Symbol] key The key of the config entry value we want
|
72
67
|
# @return the the value of a config entry
|
73
68
|
def [](key)
|
74
|
-
|
69
|
+
configuration[key.to_s]
|
75
70
|
end
|
76
71
|
|
77
72
|
|
@@ -80,7 +75,7 @@ module Neo4j
|
|
80
75
|
# @param [Symbol] key the key of the configuration entry to delete
|
81
76
|
# @return The value of the removed entry.
|
82
77
|
def delete(key)
|
83
|
-
|
78
|
+
configuration.delete(key)
|
84
79
|
end
|
85
80
|
|
86
81
|
|
@@ -94,19 +89,12 @@ module Neo4j
|
|
94
89
|
|
95
90
|
# @return [Hash] The config as a hash.
|
96
91
|
def to_hash
|
97
|
-
|
92
|
+
configuration.to_hash
|
98
93
|
end
|
99
94
|
|
100
95
|
# @return [String] The config as a YAML
|
101
96
|
def to_yaml
|
102
|
-
|
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
|
97
|
+
configuration.to_yaml
|
110
98
|
end
|
111
99
|
|
112
100
|
def class_name_property
|
data/lib/neo4j/core/query.rb
CHANGED
@@ -8,7 +8,7 @@ module Neo4j::Core
|
|
8
8
|
# @return [Neo4j::ActiveNode::Query::QueryProxy] A QueryProxy object.
|
9
9
|
def proxy_as(model, var, optional = false)
|
10
10
|
# TODO: Discuss whether it's necessary to call `break` on the query or if this should be left to the user.
|
11
|
-
Neo4j::ActiveNode::Query::QueryProxy.new(model, nil,
|
11
|
+
Neo4j::ActiveNode::Query::QueryProxy.new(model, nil, starting_query: self.break, node: var, optional: optional)
|
12
12
|
end
|
13
13
|
|
14
14
|
# Calls proxy_as with `optional` set true. This doesn't offer anything different from calling `proxy_as` directly but it may be more readable.
|
data/lib/neo4j/migration.rb
CHANGED
@@ -1,8 +1,7 @@
|
|
1
1
|
module Neo4j
|
2
2
|
class Migration
|
3
|
-
|
4
3
|
def migrate
|
5
|
-
|
4
|
+
fail 'not implemented'
|
6
5
|
end
|
7
6
|
|
8
7
|
def output(string = '')
|
@@ -30,8 +29,8 @@ module Neo4j
|
|
30
29
|
|
31
30
|
def migrate
|
32
31
|
models = ActiveSupport::HashWithIndifferentAccess.new(YAML.load_file(models_filename))[:models]
|
33
|
-
output
|
34
|
-
output
|
32
|
+
output 'This task will add an ID Property every node in the given file.'
|
33
|
+
output 'It may take a significant amount of time, please be patient.'
|
35
34
|
models.each do |model|
|
36
35
|
output
|
37
36
|
output
|
@@ -41,7 +40,7 @@ module Neo4j
|
|
41
40
|
end
|
42
41
|
|
43
42
|
def setup
|
44
|
-
FileUtils.mkdir_p(
|
43
|
+
FileUtils.mkdir_p('db/neo4j-migrate')
|
45
44
|
unless File.file?(models_filename)
|
46
45
|
File.open(models_filename, 'w') do |file|
|
47
46
|
file.write("# Provide models to which IDs should be added.\n# It will only modify nodes that do not have IDs. There is no danger of overwriting data.\n# models: [Student,Lesson,Teacher,Exam]\nmodels: []")
|
@@ -62,7 +61,7 @@ module Neo4j
|
|
62
61
|
last_time_taken = nil
|
63
62
|
|
64
63
|
until nodes_left == 0
|
65
|
-
nodes_left = Neo4j::Session.query.match(n: label).where("NOT has(n.#{property})").return(
|
64
|
+
nodes_left = Neo4j::Session.query.match(n: label).where("NOT has(n.#{property})").return('COUNT(n) AS ids').first.ids
|
66
65
|
|
67
66
|
time_per_node = last_time_taken / max_per_batch if last_time_taken
|
68
67
|
print_output "Running first batch...\r"
|
@@ -108,7 +107,7 @@ module Neo4j
|
|
108
107
|
|
109
108
|
def new_id_for(model)
|
110
109
|
if model.id_property_info[:type][:auto]
|
111
|
-
SecureRandom
|
110
|
+
SecureRandom.uuid
|
112
111
|
else
|
113
112
|
model.new.send(model.id_property_info[:type][:on])
|
114
113
|
end
|
@@ -116,32 +115,32 @@ module Neo4j
|
|
116
115
|
end
|
117
116
|
|
118
117
|
class AddClassnames < Neo4j::Migration
|
119
|
-
|
120
118
|
def initialize(path = default_path)
|
121
119
|
@classnames_filename = 'add_classnames.yml'
|
122
120
|
@classnames_filepath = File.join(joined_path(path), classnames_filename)
|
123
121
|
end
|
124
122
|
|
125
123
|
def migrate
|
126
|
-
output
|
124
|
+
output 'Adding classnames. This make take some time.'
|
127
125
|
execute(true)
|
128
126
|
end
|
129
127
|
|
130
128
|
def test
|
131
|
-
output
|
129
|
+
output 'TESTING! No queries will be executed.'
|
132
130
|
execute(false)
|
133
131
|
end
|
134
132
|
|
135
133
|
def setup
|
136
134
|
output "Creating file #{classnames_filepath}. Please use this as the migration guide."
|
137
|
-
FileUtils.mkdir_p(
|
135
|
+
FileUtils.mkdir_p('db/neo4j-migrate')
|
138
136
|
unless File.file?(classnames_filepath)
|
139
|
-
source = File.join(File.dirname(__FILE__),
|
137
|
+
source = File.join(File.dirname(__FILE__), '..', '..', 'config', 'neo4j', classnames_filename)
|
140
138
|
FileUtils.copy_file(source, classnames_filepath)
|
141
139
|
end
|
142
140
|
end
|
143
141
|
|
144
142
|
private
|
143
|
+
|
145
144
|
attr_reader :classnames_filename, :classnames_filepath, :model_map
|
146
145
|
|
147
146
|
def execute(migrate = false)
|
@@ -165,7 +164,7 @@ module Neo4j
|
|
165
164
|
end
|
166
165
|
|
167
166
|
def file_init
|
168
|
-
@model_map = ActiveSupport::HashWithIndifferentAccess.new(YAML.load_file(classnames_filepath))
|
167
|
+
@model_map = ActiveSupport::HashWithIndifferentAccess.new(YAML.load_file(classnames_filepath))
|
169
168
|
end
|
170
169
|
|
171
170
|
def node_cypher(label, action)
|
@@ -178,11 +177,11 @@ module Neo4j
|
|
178
177
|
label = hash[0]
|
179
178
|
value = hash[1]
|
180
179
|
from = value[:from]
|
181
|
-
|
180
|
+
fail "All relationships require a 'type'" unless value[:type]
|
182
181
|
|
183
|
-
from_cypher = from ? "(from:`#{from}`)" :
|
182
|
+
from_cypher = from ? "(from:`#{from}`)" : '(from)'
|
184
183
|
to = value[:to]
|
185
|
-
to_cypher = to ? "(to:`#{to}`)" :
|
184
|
+
to_cypher = to ? "(to:`#{to}`)" : '(to)'
|
186
185
|
type = "[r:`#{value[:type]}`]"
|
187
186
|
where, phrase_start = action_variables(action, 'r')
|
188
187
|
output "#{phrase_start} _classname '#{label}' where type is '#{value[:type]}' using cypher:"
|
@@ -191,7 +190,7 @@ module Neo4j
|
|
191
190
|
|
192
191
|
def execute_cypher(query_string)
|
193
192
|
output "Modified #{Neo4j::Session.query(query_string).first.modified} records"
|
194
|
-
output
|
193
|
+
output ''
|
195
194
|
end
|
196
195
|
|
197
196
|
def action_variables(action, identifier)
|
@@ -201,7 +200,7 @@ module Neo4j
|
|
201
200
|
when 'add'
|
202
201
|
["WHERE NOT HAS(#{identifier}._classname)", 'Adding']
|
203
202
|
else
|
204
|
-
|
203
|
+
fail "Invalid action #{action} specified"
|
205
204
|
end
|
206
205
|
end
|
207
206
|
end
|
data/lib/neo4j/paginated.rb
CHANGED
@@ -18,8 +18,8 @@ module Neo4j
|
|
18
18
|
Paginated.new(ordered_partial, ordered_source, page)
|
19
19
|
end
|
20
20
|
|
21
|
-
delegate :each, :
|
22
|
-
delegate :pluck, :
|
23
|
-
delegate :size, :[], :
|
21
|
+
delegate :each, to: :items
|
22
|
+
delegate :pluck, to: :items
|
23
|
+
delegate :size, :[], to: :items
|
24
24
|
end
|
25
|
-
end
|
25
|
+
end
|
data/lib/neo4j/railtie.rb
CHANGED
@@ -6,8 +6,8 @@ module Neo4j
|
|
6
6
|
config.neo4j = ActiveSupport::OrderedOptions.new
|
7
7
|
|
8
8
|
# Add ActiveModel translations to the I18n load_path
|
9
|
-
initializer
|
10
|
-
|
9
|
+
initializer 'i18n' do
|
10
|
+
config.i18n.load_path += Dir[File.join(File.dirname(__FILE__), '..', '..', '..', 'config', 'locales', '*.{rb,yml}')]
|
11
11
|
end
|
12
12
|
|
13
13
|
rake_tasks do
|
@@ -20,19 +20,19 @@ module Neo4j
|
|
20
20
|
RUBY_PLATFORM =~ /java/
|
21
21
|
end
|
22
22
|
|
23
|
-
def
|
23
|
+
def setup_default_session(cfg)
|
24
24
|
cfg.session_type ||= :server_db
|
25
|
-
cfg.session_path ||=
|
25
|
+
cfg.session_path ||= 'http://localhost:7474'
|
26
26
|
cfg.session_options ||= {}
|
27
27
|
cfg.sessions ||= []
|
28
28
|
|
29
29
|
unless (uri = URI(cfg.session_path)).user.blank?
|
30
|
-
cfg.session_options.reverse_merge!(
|
30
|
+
cfg.session_options.reverse_merge!(basic_auth: {username: uri.user, password: uri.password})
|
31
31
|
cfg.session_path = cfg.session_path.gsub("#{uri.user}:#{uri.password}@", '')
|
32
32
|
end
|
33
33
|
|
34
34
|
if cfg.sessions.empty?
|
35
|
-
cfg.sessions << {
|
35
|
+
cfg.sessions << {type: cfg.session_type, path: cfg.session_path, options: cfg.session_options}
|
36
36
|
end
|
37
37
|
end
|
38
38
|
|
@@ -46,40 +46,40 @@ module Neo4j
|
|
46
46
|
session.start
|
47
47
|
end
|
48
48
|
|
49
|
-
def open_neo4j_session(
|
50
|
-
|
51
|
-
|
49
|
+
def open_neo4j_session(options)
|
50
|
+
type, name, default, path = options.values_at(:type, :name, :default, :path)
|
51
|
+
|
52
|
+
if !java_platform? && type == :embedded_db
|
53
|
+
fail "Tried to start embedded Neo4j db without using JRuby (got #{RUBY_PLATFORM}), please run `rvm jruby`"
|
52
54
|
end
|
53
55
|
|
54
|
-
session = if
|
55
|
-
Neo4j::Session.open_named(
|
56
|
+
session = if options.key?(:name)
|
57
|
+
Neo4j::Session.open_named(type, name, default, path)
|
56
58
|
else
|
57
|
-
Neo4j::Session.open(
|
59
|
+
Neo4j::Session.open(type, path, options[:options])
|
58
60
|
end
|
59
61
|
|
60
|
-
start_embedded_session(session) if
|
62
|
+
start_embedded_session(session) if type == :embedded_db
|
61
63
|
end
|
62
|
-
|
63
64
|
end
|
64
65
|
|
65
66
|
# Starting Neo after :load_config_initializers allows apps to
|
66
67
|
# register migrations in config/initializers
|
67
|
-
initializer
|
68
|
+
initializer 'neo4j.start', after: :load_config_initializers do |app|
|
68
69
|
cfg = app.config.neo4j
|
69
70
|
# Set Rails specific defaults
|
70
|
-
Neo4j::Railtie.
|
71
|
+
Neo4j::Railtie.setup_default_session(cfg)
|
71
72
|
|
72
73
|
cfg.sessions.each do |session_opts|
|
73
74
|
Neo4j::Railtie.open_neo4j_session(session_opts)
|
74
75
|
end
|
75
|
-
Neo4j::Config.
|
76
|
+
Neo4j::Config.configuration.merge!(cfg.to_hash)
|
76
77
|
|
77
78
|
clear = "\e[0m"
|
78
|
-
red = "\e[31m"
|
79
79
|
yellow = "\e[33m"
|
80
80
|
cyan = "\e[36m"
|
81
81
|
|
82
|
-
ActiveSupport::Notifications.subscribe('neo4j.cypher_query') do |
|
82
|
+
ActiveSupport::Notifications.subscribe('neo4j.cypher_query') do |_, start, finish, _id, payload|
|
83
83
|
ms = (finish - start) * 1000
|
84
84
|
Rails.logger.info " #{cyan}#{payload[:context]}#{clear} #{yellow}#{ms.round}ms#{clear} #{payload[:cypher]}" + (payload[:params].size > 0 ? ' | ' + payload[:params].inspect : '')
|
85
85
|
end
|