neo4j 9.3.0 → 9.4.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 +5 -5
- data/CHANGELOG.md +14 -0
- data/lib/neo4j.rb +1 -2
- data/lib/neo4j/active_node/enum.rb +1 -1
- data/lib/neo4j/active_node/has_n.rb +6 -6
- data/lib/neo4j/active_node/id_property.rb +3 -3
- data/lib/neo4j/active_node/labels.rb +2 -2
- data/lib/neo4j/active_node/query/query_proxy.rb +3 -6
- data/lib/neo4j/active_node/query/query_proxy_eager_loading.rb +41 -24
- data/lib/neo4j/active_node/scope.rb +6 -7
- data/lib/neo4j/config.rb +4 -0
- data/lib/neo4j/core/query_ext.rb +24 -0
- data/lib/neo4j/migration.rb +3 -1
- data/lib/neo4j/railtie.rb +19 -21
- data/lib/neo4j/session_manager.rb +28 -17
- data/lib/neo4j/shared/enum.rb +3 -3
- data/lib/neo4j/shared/initialize.rb +1 -1
- data/lib/neo4j/shared/type_converters.rb +1 -1
- data/lib/neo4j/tasks/migration.rake +1 -0
- data/lib/neo4j/version.rb +1 -1
- data/lib/rails/generators/neo4j/model/model_generator.rb +2 -2
- data/neo4j.gemspec +4 -3
- metadata +67 -45
- data/lib/neo4j/core/query.rb +0 -22
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: ddd749f4da3296fd19bb4c39c1981e3b612d58715fcfbc7bf4e7267811284312
|
4
|
+
data.tar.gz: a39833454052a0fee01b2fbcc781d4334521a1f32415e410e711daa1867eeff0
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: bb6c4d92ca9cf8544e33da06b29568e44f24ba8f87a5a861256a1cdb369acf536467ccbaafcd102b7ad04457c9da69149c0e0cec92c290b85869ef55063318ff
|
7
|
+
data.tar.gz: 3ee2eaf941aa6e406d7a764c843dbd2b51502452d2682512bb6c512077003c9a9f5021b905332fc7a8bb1480fa80fce49e82b055f60f058345474d9f9d67ce40
|
data/CHANGELOG.md
CHANGED
@@ -3,6 +3,20 @@ 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
|
+
## [9.4.0] 2018-12-20
|
7
|
+
|
8
|
+
## Added
|
9
|
+
|
10
|
+
- `verbose_query_logs` configuration option to allow outputting of source location of queries
|
11
|
+
- Adaptor classes loaded dynamically on demand
|
12
|
+
- Optionally specify the full adaptor class name instead of session type only (supports driver adaptor)
|
13
|
+
|
14
|
+
## Fixed
|
15
|
+
|
16
|
+
- Wrong conflicting node aliases on same `branch` usage (see #1526)
|
17
|
+
- Incorrect order when `order` and `with_associations` are used together
|
18
|
+
- `ScopeEvalContext` redirects now all method missing calls to QueryProxy or Target
|
19
|
+
|
6
20
|
## [9.3.0] 2018-07-12
|
7
21
|
|
8
22
|
## Added
|
data/lib/neo4j.rb
CHANGED
@@ -239,7 +239,7 @@ module Neo4j::ActiveNode
|
|
239
239
|
query_proxy = self.class.as(:previous).where(neo_id: result_cache.map(&:neo_id))
|
240
240
|
query_proxy = self.class.send(:association_query_proxy, association_name, previous_query_proxy: query_proxy, node: :next, optional: true)
|
241
241
|
|
242
|
-
Hash[*query_proxy.pluck('ID(previous)', 'collect(next)').flatten(1)].
|
242
|
+
Hash[*query_proxy.pluck('ID(previous)', 'collect(next)').flatten(1)].each_value do |records|
|
243
243
|
records.each do |record|
|
244
244
|
record.instance_variable_set('@source_proxy_result_cache', records)
|
245
245
|
end
|
@@ -248,8 +248,7 @@ module Neo4j::ActiveNode
|
|
248
248
|
|
249
249
|
# rubocop:disable Metrics/ModuleLength
|
250
250
|
module ClassMethods
|
251
|
-
# rubocop:
|
252
|
-
# rubocop:disable Style/PredicateName
|
251
|
+
# rubocop:disable Naming/PredicateName
|
253
252
|
|
254
253
|
# :nocov:
|
255
254
|
def has_association?(name)
|
@@ -259,7 +258,7 @@ module Neo4j::ActiveNode
|
|
259
258
|
end
|
260
259
|
# :nocov:
|
261
260
|
|
262
|
-
# rubocop:enable
|
261
|
+
# rubocop:enable Naming/PredicateName
|
263
262
|
|
264
263
|
def association?(name)
|
265
264
|
!!associations[name.to_sym]
|
@@ -360,7 +359,7 @@ module Neo4j::ActiveNode
|
|
360
359
|
# **Available values:** ``:delete``, ``:delete_orphans``, ``:destroy``, ``:destroy_orphans``
|
361
360
|
# (note that the ``:destroy_orphans`` option is known to be "very metal". Caution advised)
|
362
361
|
#
|
363
|
-
def has_many(direction, name, options = {}) # rubocop:disable
|
362
|
+
def has_many(direction, name, options = {}) # rubocop:disable Naming/PredicateName
|
364
363
|
name = name.to_sym
|
365
364
|
build_association(:has_many, direction, name, options)
|
366
365
|
|
@@ -377,7 +376,7 @@ module Neo4j::ActiveNode
|
|
377
376
|
# See :ref:`#has_many <Neo4j/ActiveNode/HasN/ClassMethods#has_many>` for anything
|
378
377
|
# not specified here
|
379
378
|
#
|
380
|
-
def has_one(direction, name, options = {}) # rubocop:disable
|
379
|
+
def has_one(direction, name, options = {}) # rubocop:disable Naming/PredicateName
|
381
380
|
name = name.to_sym
|
382
381
|
build_association(:has_one, direction, name, options)
|
383
382
|
|
@@ -578,5 +577,6 @@ module Neo4j::ActiveNode
|
|
578
577
|
associations.key?(name) && parent_associations[name] != associations[name]
|
579
578
|
end
|
580
579
|
end
|
580
|
+
# rubocop:enable Metrics/ModuleLength
|
581
581
|
end
|
582
582
|
end
|
@@ -145,13 +145,13 @@ module Neo4j::ActiveNode
|
|
145
145
|
TypeMethods.define_id_methods(self, name, conf)
|
146
146
|
end
|
147
147
|
|
148
|
-
# rubocop:disable
|
148
|
+
# rubocop:disable Naming/PredicateName
|
149
149
|
def has_id_property?
|
150
150
|
ActiveSupport::Deprecation.warn 'has_id_property? is deprecated and may be removed from future releases, use id_property? instead.', caller
|
151
151
|
|
152
152
|
id_property?
|
153
153
|
end
|
154
|
-
# rubocop:enable
|
154
|
+
# rubocop:enable Naming/PredicateName
|
155
155
|
|
156
156
|
def id_property?
|
157
157
|
id_property_info && !id_property_info.empty?
|
@@ -209,7 +209,7 @@ MSG
|
|
209
209
|
end
|
210
210
|
|
211
211
|
def id_property_name_type_value
|
212
|
-
name, type, value = Neo4j::Config.to_hash.values_at(
|
212
|
+
name, type, value = Neo4j::Config.to_hash.values_at('id_property', 'id_property_type', 'id_property_type_value')
|
213
213
|
|
214
214
|
unless name == :neo_id || (name && type && value)
|
215
215
|
name = :uuid
|
@@ -166,13 +166,13 @@ module Neo4j
|
|
166
166
|
@mapped_label_name = name.to_sym
|
167
167
|
end
|
168
168
|
|
169
|
-
# rubocop:disable
|
169
|
+
# rubocop:disable Naming/AccessorMethodName
|
170
170
|
def set_mapped_label_name(name)
|
171
171
|
ActiveSupport::Deprecation.warn 'set_mapped_label_name is deprecated, use self.mapped_label_name= instead.', caller
|
172
172
|
|
173
173
|
self.mapped_label_name = name
|
174
174
|
end
|
175
|
-
# rubocop:enable
|
175
|
+
# rubocop:enable Naming/AccessorMethodName
|
176
176
|
|
177
177
|
private
|
178
178
|
|
@@ -66,7 +66,7 @@ module Neo4j
|
|
66
66
|
# in the QueryProxy chain.
|
67
67
|
attr_reader :node_var
|
68
68
|
def identity
|
69
|
-
@node_var || _result_string
|
69
|
+
@node_var || _result_string(_chain_level + 1)
|
70
70
|
end
|
71
71
|
alias node_identity identity
|
72
72
|
|
@@ -309,11 +309,8 @@ module Neo4j
|
|
309
309
|
Neo4j::ActiveBase.new_query(context: @context)
|
310
310
|
end
|
311
311
|
|
312
|
-
|
313
|
-
|
314
|
-
s = (self.association && self.association.name) || (self.model && self.model.name) || ''
|
315
|
-
|
316
|
-
s ? "result_#{s}".downcase.tr(':', '').to_sym : :result
|
312
|
+
def _result_string(index = nil)
|
313
|
+
"result_#{(association || model).try(:name)}#{index}".downcase.tr(':', '').to_sym
|
317
314
|
end
|
318
315
|
|
319
316
|
def _session
|
@@ -31,9 +31,9 @@ module Neo4j
|
|
31
31
|
if spec.is_a?(Array)
|
32
32
|
spec.each { |s| add_spec(s) }
|
33
33
|
elsif spec.is_a?(Hash)
|
34
|
-
spec
|
34
|
+
process_hash(spec)
|
35
35
|
else
|
36
|
-
self[spec] ||=
|
36
|
+
self[spec] ||= self.class.new(model, spec)
|
37
37
|
end
|
38
38
|
end
|
39
39
|
|
@@ -41,6 +41,10 @@ module Neo4j
|
|
41
41
|
values.flat_map { |v| [[*prefix, v]] + v.paths(*prefix, v) }
|
42
42
|
end
|
43
43
|
|
44
|
+
def process_hash(spec)
|
45
|
+
spec.each { |k, v| (self[k] ||= self.class.new(model, k)).add_spec(v) }
|
46
|
+
end
|
47
|
+
|
44
48
|
private
|
45
49
|
|
46
50
|
def target_class(model, key)
|
@@ -56,7 +60,7 @@ module Neo4j
|
|
56
60
|
|
57
61
|
def perform_query
|
58
62
|
@_cache = IdentityMap.new
|
59
|
-
|
63
|
+
build_query
|
60
64
|
.map do |record, eager_data|
|
61
65
|
cache_and_init(record, with_associations_tree)
|
62
66
|
eager_data.zip(with_associations_tree.paths.map(&:last)).each do |eager_records, element|
|
@@ -82,7 +86,11 @@ module Neo4j
|
|
82
86
|
end
|
83
87
|
|
84
88
|
def with_associations_tree
|
85
|
-
@with_associations_tree ||=
|
89
|
+
@with_associations_tree ||= association_tree_class.new(model)
|
90
|
+
end
|
91
|
+
|
92
|
+
def association_tree_class
|
93
|
+
AssociationTree
|
86
94
|
end
|
87
95
|
|
88
96
|
def with_associations_tree=(tree)
|
@@ -106,19 +114,19 @@ module Neo4j
|
|
106
114
|
end
|
107
115
|
|
108
116
|
def init_associations(node, element)
|
109
|
-
element.
|
117
|
+
element.each_key { |key| node.association_proxy(key).init_cache }
|
110
118
|
end
|
111
119
|
|
112
120
|
def cache_and_init(node, element)
|
113
121
|
@_cache.add(node).tap { |n| init_associations(n, element) }
|
114
122
|
end
|
115
123
|
|
116
|
-
def with_associations_return_clause
|
117
|
-
|
124
|
+
def with_associations_return_clause
|
125
|
+
path_names.map { |n| var(n, :collection, &:itself) }.join(',')
|
118
126
|
end
|
119
127
|
|
120
|
-
def
|
121
|
-
|
128
|
+
def var(*parts)
|
129
|
+
yield(escape(parts.compact.join('_')))
|
122
130
|
end
|
123
131
|
|
124
132
|
# In neo4j version 2.1.8 this fails due to a bug:
|
@@ -128,8 +136,12 @@ module Neo4j
|
|
128
136
|
# and this
|
129
137
|
# MATCH (`n`) WITH `n` AS `n` RETURN `n`
|
130
138
|
# does not
|
131
|
-
def
|
132
|
-
|
139
|
+
def var_fix(*var)
|
140
|
+
var(*var, &method(:as_alias))
|
141
|
+
end
|
142
|
+
|
143
|
+
def as_alias(var)
|
144
|
+
"#{var} AS #{var}"
|
133
145
|
end
|
134
146
|
|
135
147
|
def escape(s)
|
@@ -144,25 +156,31 @@ module Neo4j
|
|
144
156
|
with_associations_tree.paths.map { |path| path_name(path) }
|
145
157
|
end
|
146
158
|
|
159
|
+
def build_query
|
160
|
+
before_pluck(query_from_association_tree).pluck(identity, "[#{with_associations_return_clause}]")
|
161
|
+
end
|
162
|
+
|
163
|
+
def before_pluck(query)
|
164
|
+
query_from_chain(@order_chain, query, identity)
|
165
|
+
end
|
166
|
+
|
147
167
|
def query_from_association_tree
|
148
|
-
|
149
|
-
|
150
|
-
with_association_query_part(query, path,
|
151
|
-
|
168
|
+
previous_with_vars = []
|
169
|
+
with_associations_tree.paths.inject(query_as(identity).with(ensure_distinct(identity))) do |query, path|
|
170
|
+
with_association_query_part(query, path, previous_with_vars).tap do
|
171
|
+
previous_with_vars << var_fix(path_name(path), :collection)
|
152
172
|
end
|
153
173
|
end
|
154
|
-
query_from_chain(@order_chain, no_order_query, identity)
|
155
|
-
.pluck(identity, "[#{with_associations_return_clause}]")
|
156
174
|
end
|
157
175
|
|
158
|
-
def with_association_query_part(base_query, path,
|
159
|
-
optional_match_with_where(base_query, path)
|
176
|
+
def with_association_query_part(base_query, path, previous_with_vars)
|
177
|
+
optional_match_with_where(base_query, path, previous_with_vars)
|
160
178
|
.with(identity,
|
161
179
|
"[collect(#{escape("#{path_name(path)}_rel")}), collect(#{escape path_name(path)})] AS #{escape("#{path_name(path)}_collection")}",
|
162
|
-
*
|
180
|
+
*previous_with_vars)
|
163
181
|
end
|
164
182
|
|
165
|
-
def optional_match_with_where(base_query, path)
|
183
|
+
def optional_match_with_where(base_query, path, _)
|
166
184
|
path
|
167
185
|
.each_with_index.map { |_, index| path[0..index] }
|
168
186
|
.inject(optional_match(base_query, path)) do |query, path_prefix|
|
@@ -183,9 +201,8 @@ module Neo4j
|
|
183
201
|
end
|
184
202
|
|
185
203
|
def chain
|
186
|
-
@order_chain
|
187
|
-
|
188
|
-
other_chain
|
204
|
+
@order_chain = @chain.select { |link| link.clause == :order } unless with_associations_tree.empty?
|
205
|
+
@chain
|
189
206
|
end
|
190
207
|
end
|
191
208
|
end
|
@@ -51,13 +51,13 @@ module Neo4j::ActiveNode
|
|
51
51
|
end
|
52
52
|
end
|
53
53
|
|
54
|
-
# rubocop:disable
|
54
|
+
# rubocop:disable Naming/PredicateName
|
55
55
|
def has_scope?(name)
|
56
56
|
ActiveSupport::Deprecation.warn 'has_scope? is deprecated and may be removed from future releases, use scope? instead.', caller
|
57
57
|
|
58
58
|
scope?(name)
|
59
59
|
end
|
60
|
-
# rubocop:enable
|
60
|
+
# rubocop:enable Naming/PredicateName
|
61
61
|
|
62
62
|
# @return [Boolean] true if model has access to scope with this name
|
63
63
|
def scope?(name)
|
@@ -116,13 +116,12 @@ module Neo4j::ActiveNode
|
|
116
116
|
end
|
117
117
|
end
|
118
118
|
|
119
|
+
# method_missing is not delegated to super class but to aggregated class
|
120
|
+
# rubocop:disable Style/MethodMissingSuper
|
119
121
|
def method_missing(name, *params, &block)
|
120
|
-
|
121
|
-
query_proxy_or_target.public_send(name, *params, &block)
|
122
|
-
else
|
123
|
-
super
|
124
|
-
end
|
122
|
+
query_proxy_or_target.public_send(name, *params, &block)
|
125
123
|
end
|
124
|
+
# rubocop:enable Style/MethodMissingSuper
|
126
125
|
|
127
126
|
private
|
128
127
|
|
data/lib/neo4j/config.rb
CHANGED
@@ -0,0 +1,24 @@
|
|
1
|
+
module Neo4j
|
2
|
+
module Core
|
3
|
+
class Query
|
4
|
+
# Creates a Neo4j::ActiveNode::Query::QueryProxy object that builds off of a Core::Query object.
|
5
|
+
#
|
6
|
+
# @param [Class] model An ActiveNode model to be used as the start of a new QueryuProxy chain
|
7
|
+
# @param [Symbol] var The variable to be used to refer to the object from within the new QueryProxy
|
8
|
+
# @param [Boolean] optional Indicate whether the new QueryProxy will use MATCH or OPTIONAL MATCH.
|
9
|
+
# @return [Neo4j::ActiveNode::Query::QueryProxy] A QueryProxy object.
|
10
|
+
def proxy_as(model, var, optional = false)
|
11
|
+
# TODO: Discuss whether it's necessary to call `break` on the query or if this should be left to the user.
|
12
|
+
Neo4j::ActiveNode::Query::QueryProxy.new(model, nil, node: var, optional: optional, starting_query: self, chain_level: @proxy_chain_level)
|
13
|
+
end
|
14
|
+
|
15
|
+
# Calls proxy_as with `optional` set true. This doesn't offer anything different from calling `proxy_as` directly but it may be more readable.
|
16
|
+
def proxy_as_optional(model, var)
|
17
|
+
proxy_as(model, var, true)
|
18
|
+
end
|
19
|
+
|
20
|
+
# For instances where you turn a QueryProxy into a Query and then back to a QueryProxy with `#proxy_as`
|
21
|
+
attr_accessor :proxy_chain_level
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
data/lib/neo4j/migration.rb
CHANGED
@@ -27,7 +27,9 @@ module Neo4j
|
|
27
27
|
FileUtils.mkdir_p('db/neo4j-migrate')
|
28
28
|
end
|
29
29
|
|
30
|
-
|
30
|
+
def query(*args)
|
31
|
+
Neo4j::ActiveBase.current_session.query(*args)
|
32
|
+
end
|
31
33
|
|
32
34
|
class AddIdProperty < Neo4j::Migration
|
33
35
|
include Neo4j::Migrations::Helpers::IdProperty
|
data/lib/neo4j/railtie.rb
CHANGED
@@ -3,9 +3,7 @@ require 'rails/railtie'
|
|
3
3
|
require 'neo4j/session_manager'
|
4
4
|
# Need the action_dispatch railtie to have action_dispatch.rescue_responses initialized correctly
|
5
5
|
require 'action_dispatch/railtie'
|
6
|
-
require 'neo4j/core/cypher_session/adaptors
|
7
|
-
require 'neo4j/core/cypher_session/adaptors/bolt'
|
8
|
-
require 'neo4j/core/cypher_session/adaptors/embedded'
|
6
|
+
require 'neo4j/core/cypher_session/adaptors'
|
9
7
|
|
10
8
|
module Neo4j
|
11
9
|
class Railtie < ::Rails::Railtie
|
@@ -38,6 +36,7 @@ module Neo4j
|
|
38
36
|
|
39
37
|
console do
|
40
38
|
Neo4j::Config[:logger] = ActiveSupport::Logger.new(STDOUT)
|
39
|
+
Neo4j::Config[:verbose_query_logs] = false
|
41
40
|
end
|
42
41
|
|
43
42
|
# Starting Neo after :load_config_initializers allows apps to
|
@@ -62,18 +61,22 @@ module Neo4j
|
|
62
61
|
def setup!(neo4j_config = empty_config)
|
63
62
|
wait_for_connection = neo4j_config.wait_for_connection
|
64
63
|
type, url, path, options = final_session_config!(neo4j_config).values_at(:type, :url, :path, :options)
|
65
|
-
|
64
|
+
type ||= default_session_type
|
65
|
+
options ||= {}
|
66
|
+
register_neo4j_cypher_logging(type, options)
|
66
67
|
|
67
|
-
Neo4j::SessionManager.open_neo4j_session(type
|
68
|
+
Neo4j::SessionManager.open_neo4j_session(type,
|
68
69
|
url || path || default_session_path_or_url,
|
69
70
|
wait_for_connection,
|
70
|
-
options
|
71
|
+
options)
|
71
72
|
end
|
72
73
|
|
73
74
|
def final_session_config!(neo4j_config)
|
74
75
|
support_deprecated_session_configs!(neo4j_config)
|
75
76
|
|
76
|
-
neo4j_config[:session].empty? ? yaml_config_data : neo4j_config[:session]
|
77
|
+
(neo4j_config[:session].empty? ? yaml_config_data : neo4j_config[:session]).dup.tap do |result|
|
78
|
+
result[:type] ||= URI(result[:url]).scheme if result[:url]
|
79
|
+
end
|
77
80
|
end
|
78
81
|
|
79
82
|
def support_deprecated_session_configs!(neo4j_config)
|
@@ -120,7 +123,7 @@ module Neo4j
|
|
120
123
|
end.detect(&:exist?)
|
121
124
|
end
|
122
125
|
|
123
|
-
def register_neo4j_cypher_logging(session_type)
|
126
|
+
def register_neo4j_cypher_logging(session_type, options)
|
124
127
|
return if @neo4j_cypher_logging_registered
|
125
128
|
|
126
129
|
Neo4j::Core::Query.pretty_cypher = Neo4j::Config[:pretty_logged_cypher_queries]
|
@@ -129,23 +132,18 @@ module Neo4j
|
|
129
132
|
(Neo4j::Config[:logger] ||= Rails.logger).debug message
|
130
133
|
end
|
131
134
|
Neo4j::Core::CypherSession::Adaptors::Base.subscribe_to_query(&logger_proc)
|
132
|
-
subscribe_to_session_type_logging!(session_type, logger_proc)
|
135
|
+
subscribe_to_session_type_logging!(session_type, options, logger_proc)
|
133
136
|
|
134
137
|
@neo4j_cypher_logging_registered = true
|
135
138
|
end
|
136
139
|
|
137
|
-
|
138
|
-
|
139
|
-
|
140
|
-
|
141
|
-
|
142
|
-
|
143
|
-
|
144
|
-
if TYPE_SUBSCRIBERS.key?(session_type.to_sym)
|
145
|
-
TYPE_SUBSCRIBERS[session_type.to_sym].call(&logger_proc)
|
146
|
-
else
|
147
|
-
fail ArgumentError, "Invalid session type: #{session_type.inspect} (expected one of #{TYPE_SUBSCRIBERS.keys.inspect})"
|
148
|
-
end
|
140
|
+
def subscribe_to_session_type_logging!(session_type, options, logger_proc)
|
141
|
+
SessionManager
|
142
|
+
.adaptor_class(session_type, options)
|
143
|
+
.send(
|
144
|
+
[:embedded, :embedded_db].include?(session_type.to_sym) ? :subscribe_to_transaction : :subscribe_to_request,
|
145
|
+
&logger_proc
|
146
|
+
)
|
149
147
|
end
|
150
148
|
end
|
151
149
|
end
|
@@ -1,8 +1,5 @@
|
|
1
1
|
require 'active_support/core_ext/hash'
|
2
2
|
require 'active_support/ordered_options'
|
3
|
-
require 'neo4j/core/cypher_session/adaptors/http'
|
4
|
-
require 'neo4j/core/cypher_session/adaptors/bolt'
|
5
|
-
require 'neo4j/core/cypher_session/adaptors/embedded'
|
6
3
|
|
7
4
|
module Neo4j
|
8
5
|
class SessionManager
|
@@ -11,12 +8,18 @@ module Neo4j
|
|
11
8
|
enable_unlimited_strength_crypto! if java_platform? && session_type_is_embedded?(type)
|
12
9
|
|
13
10
|
adaptor = wait_for_value(wait_for_connection, Neo4j::Core::CypherSession::ConnectionFailedError) do
|
14
|
-
|
11
|
+
verbose_query_logs = Neo4j::Config.fetch(:verbose_query_logs, false)
|
12
|
+
cypher_session_adaptor(type, url_or_path, options.merge(wrap_level: :proc,
|
13
|
+
verbose_query_logs: verbose_query_logs))
|
15
14
|
end
|
16
15
|
|
17
16
|
Neo4j::Core::CypherSession.new(adaptor)
|
18
17
|
end
|
19
18
|
|
19
|
+
def adaptor_class(type, options)
|
20
|
+
options[:adaptor_class] || adaptor_class_by_type(type.to_sym)
|
21
|
+
end
|
22
|
+
|
20
23
|
protected
|
21
24
|
|
22
25
|
def session_type_is_embedded?(session_type)
|
@@ -31,20 +34,8 @@ module Neo4j
|
|
31
34
|
restricted_field.set nil, false
|
32
35
|
end
|
33
36
|
|
34
|
-
# TODO: Deprecate embedded_db and http in favor of embedded and http
|
35
|
-
#
|
36
37
|
def cypher_session_adaptor(type, path_or_url, options = {})
|
37
|
-
|
38
|
-
when :embedded_db, :embedded
|
39
|
-
Neo4j::Core::CypherSession::Adaptors::Embedded.new(path_or_url, options)
|
40
|
-
when :http
|
41
|
-
Neo4j::Core::CypherSession::Adaptors::HTTP.new(path_or_url, options)
|
42
|
-
when :bolt
|
43
|
-
Neo4j::Core::CypherSession::Adaptors::Bolt.new(path_or_url, options)
|
44
|
-
else
|
45
|
-
extra = ' (`server_db` has been replaced by `http` or `bolt`)'
|
46
|
-
fail ArgumentError, "Invalid session type: #{type.inspect}#{extra if type.to_sym == :server_db}"
|
47
|
-
end
|
38
|
+
adaptor_class(type, options).new(path_or_url, options)
|
48
39
|
end
|
49
40
|
|
50
41
|
def java_platform?
|
@@ -69,6 +60,26 @@ module Neo4j
|
|
69
60
|
end
|
70
61
|
end
|
71
62
|
end
|
63
|
+
|
64
|
+
private
|
65
|
+
|
66
|
+
def adaptor_class_by_type(type)
|
67
|
+
ActiveSupport::Deprecation.warn('`embedded_db` session type is deprecated, please use `embedded`') if type == :embedded_db
|
68
|
+
case type
|
69
|
+
when :embedded_db, :embedded
|
70
|
+
require 'neo4j/core/cypher_session/adaptors/embedded'
|
71
|
+
Neo4j::Core::CypherSession::Adaptors::Embedded
|
72
|
+
when :http
|
73
|
+
require 'neo4j/core/cypher_session/adaptors/http'
|
74
|
+
Neo4j::Core::CypherSession::Adaptors::HTTP
|
75
|
+
when :bolt
|
76
|
+
require 'neo4j/core/cypher_session/adaptors/bolt'
|
77
|
+
Neo4j::Core::CypherSession::Adaptors::Bolt
|
78
|
+
else
|
79
|
+
extra = ' (`server_db` has been replaced by `http` or `bolt`)'
|
80
|
+
fail ArgumentError, "Invalid session type: #{type.inspect} (expected one of [:http, :bolt, :embedded])#{extra if type == :server_db}"
|
81
|
+
end
|
82
|
+
end
|
72
83
|
end
|
73
84
|
end
|
74
85
|
end
|
data/lib/neo4j/shared/enum.rb
CHANGED
@@ -67,7 +67,7 @@ module Neo4j::Shared
|
|
67
67
|
end
|
68
68
|
|
69
69
|
unless case_sensitive
|
70
|
-
enum_keys.
|
70
|
+
enum_keys.each_key do |key|
|
71
71
|
fail ArgumentError, 'Enum keys must be lowercase unless _case_sensitive = true' unless key.downcase == key
|
72
72
|
end
|
73
73
|
end
|
@@ -130,7 +130,7 @@ module Neo4j::Shared
|
|
130
130
|
end
|
131
131
|
|
132
132
|
def define_enum_methods_?(property_name, enum_keys, options)
|
133
|
-
enum_keys.
|
133
|
+
enum_keys.each_key do |enum_value|
|
134
134
|
method_name = build_method_name(enum_value, property_name, options)
|
135
135
|
check_enum_method_conflicts! property_name, :"#{method_name}?"
|
136
136
|
define_method("#{method_name}?") do
|
@@ -140,7 +140,7 @@ module Neo4j::Shared
|
|
140
140
|
end
|
141
141
|
|
142
142
|
def define_enum_methods_!(property_name, enum_keys, options)
|
143
|
-
enum_keys.
|
143
|
+
enum_keys.each_key do |enum_value|
|
144
144
|
method_name = build_method_name(enum_value, property_name, options)
|
145
145
|
check_enum_method_conflicts! property_name, :"#{method_name}!"
|
146
146
|
define_method("#{method_name}!") do
|
@@ -44,7 +44,7 @@ module Neo4j::Shared
|
|
44
44
|
# Not a good long term solution
|
45
45
|
if changed_attributes.frozen?
|
46
46
|
attributes_changed_by_setter = ActiveSupport::HashWithIndifferentAccess.new(changed_attributes)
|
47
|
-
hash_to_clear.
|
47
|
+
hash_to_clear.each_key { |k| attributes_changed_by_setter.delete(k) }
|
48
48
|
@attributes_changed_by_setter = attributes_changed_by_setter
|
49
49
|
else
|
50
50
|
hash_to_clear.each_key { |k| changed_attributes.delete(k) }
|
data/lib/neo4j/version.rb
CHANGED
@@ -29,7 +29,7 @@ class Neo4j::Generators::ModelGenerator < Rails::Generators::NamedBase #:nodoc:
|
|
29
29
|
options[:timestamps]
|
30
30
|
end
|
31
31
|
|
32
|
-
# rubocop:disable
|
32
|
+
# rubocop:disable Naming/PredicateName
|
33
33
|
def has_many?
|
34
34
|
options[:has_many]
|
35
35
|
end
|
@@ -56,7 +56,7 @@ class Neo4j::Generators::ModelGenerator < Rails::Generators::NamedBase #:nodoc:
|
|
56
56
|
end
|
57
57
|
txt
|
58
58
|
end
|
59
|
-
# rubocop:enable
|
59
|
+
# rubocop:enable Naming/PredicateName
|
60
60
|
|
61
61
|
def indices?
|
62
62
|
options[:indices]
|
data/neo4j.gemspec
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
lib = File.expand_path('
|
1
|
+
lib = File.expand_path('lib', __dir__)
|
2
2
|
$LOAD_PATH.unshift lib unless $LOAD_PATH.include?(lib)
|
3
3
|
|
4
4
|
require 'neo4j/version'
|
@@ -35,8 +35,9 @@ DESCRIPTION
|
|
35
35
|
|
36
36
|
s.add_dependency('activemodel', '>= 4.0')
|
37
37
|
s.add_dependency('activesupport', '>= 4.0')
|
38
|
+
s.add_dependency('i18n', '!= 1.3.0') # version 1.3.0 introduced a bug with `symbolize_key`
|
38
39
|
s.add_dependency('neo4j-community', '~> 2.0') if RUBY_PLATFORM =~ /java/
|
39
|
-
s.add_dependency('neo4j-core', '>=
|
40
|
+
s.add_dependency('neo4j-core', '>= 9.0.0')
|
40
41
|
s.add_dependency('orm_adapter', '~> 0.5.0')
|
41
42
|
s.add_development_dependency('guard')
|
42
43
|
s.add_development_dependency('guard-rspec')
|
@@ -46,6 +47,6 @@ DESCRIPTION
|
|
46
47
|
s.add_development_dependency('pry')
|
47
48
|
s.add_development_dependency('railties', '>= 4.0')
|
48
49
|
s.add_development_dependency('rake')
|
49
|
-
s.add_development_dependency('rubocop', '~> 0.
|
50
|
+
s.add_development_dependency('rubocop', '~> 0.56.0')
|
50
51
|
s.add_development_dependency('yard')
|
51
52
|
end
|
metadata
CHANGED
@@ -1,212 +1,234 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: neo4j
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 9.
|
4
|
+
version: 9.4.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Andreas Ronge, Brian Underwood, Chris Grigg
|
8
|
-
autorequire:
|
8
|
+
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2018-
|
11
|
+
date: 2018-12-20 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
|
-
name: activemodel
|
15
14
|
requirement: !ruby/object:Gem::Requirement
|
16
15
|
requirements:
|
17
16
|
- - ">="
|
18
17
|
- !ruby/object:Gem::Version
|
19
18
|
version: '4.0'
|
20
|
-
|
19
|
+
name: activemodel
|
21
20
|
prerelease: false
|
21
|
+
type: :runtime
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
24
|
- - ">="
|
25
25
|
- !ruby/object:Gem::Version
|
26
26
|
version: '4.0'
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
|
-
name: activesupport
|
29
28
|
requirement: !ruby/object:Gem::Requirement
|
30
29
|
requirements:
|
31
30
|
- - ">="
|
32
31
|
- !ruby/object:Gem::Version
|
33
32
|
version: '4.0'
|
34
|
-
|
33
|
+
name: activesupport
|
35
34
|
prerelease: false
|
35
|
+
type: :runtime
|
36
36
|
version_requirements: !ruby/object:Gem::Requirement
|
37
37
|
requirements:
|
38
38
|
- - ">="
|
39
39
|
- !ruby/object:Gem::Version
|
40
40
|
version: '4.0'
|
41
41
|
- !ruby/object:Gem::Dependency
|
42
|
-
name: neo4j-core
|
43
42
|
requirement: !ruby/object:Gem::Requirement
|
44
43
|
requirements:
|
45
|
-
- - "
|
44
|
+
- - "!="
|
46
45
|
- !ruby/object:Gem::Version
|
47
|
-
version:
|
48
|
-
|
49
|
-
|
50
|
-
version: 9.0.0
|
46
|
+
version: 1.3.0
|
47
|
+
name: i18n
|
48
|
+
prerelease: false
|
51
49
|
type: :runtime
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - "!="
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: 1.3.0
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
requirement: !ruby/object:Gem::Requirement
|
57
|
+
requirements:
|
58
|
+
- - "~>"
|
59
|
+
- !ruby/object:Gem::Version
|
60
|
+
version: '2.0'
|
61
|
+
name: neo4j-community
|
52
62
|
prerelease: false
|
63
|
+
type: :runtime
|
53
64
|
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - "~>"
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: '2.0'
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
requirement: !ruby/object:Gem::Requirement
|
54
71
|
requirements:
|
55
72
|
- - ">="
|
56
73
|
- !ruby/object:Gem::Version
|
57
|
-
version:
|
58
|
-
|
74
|
+
version: 9.0.0
|
75
|
+
name: neo4j-core
|
76
|
+
prerelease: false
|
77
|
+
type: :runtime
|
78
|
+
version_requirements: !ruby/object:Gem::Requirement
|
79
|
+
requirements:
|
80
|
+
- - ">="
|
59
81
|
- !ruby/object:Gem::Version
|
60
82
|
version: 9.0.0
|
61
83
|
- !ruby/object:Gem::Dependency
|
62
|
-
name: orm_adapter
|
63
84
|
requirement: !ruby/object:Gem::Requirement
|
64
85
|
requirements:
|
65
86
|
- - "~>"
|
66
87
|
- !ruby/object:Gem::Version
|
67
88
|
version: 0.5.0
|
68
|
-
|
89
|
+
name: orm_adapter
|
69
90
|
prerelease: false
|
91
|
+
type: :runtime
|
70
92
|
version_requirements: !ruby/object:Gem::Requirement
|
71
93
|
requirements:
|
72
94
|
- - "~>"
|
73
95
|
- !ruby/object:Gem::Version
|
74
96
|
version: 0.5.0
|
75
97
|
- !ruby/object:Gem::Dependency
|
76
|
-
name: guard
|
77
98
|
requirement: !ruby/object:Gem::Requirement
|
78
99
|
requirements:
|
79
100
|
- - ">="
|
80
101
|
- !ruby/object:Gem::Version
|
81
102
|
version: '0'
|
82
|
-
|
103
|
+
name: guard
|
83
104
|
prerelease: false
|
105
|
+
type: :development
|
84
106
|
version_requirements: !ruby/object:Gem::Requirement
|
85
107
|
requirements:
|
86
108
|
- - ">="
|
87
109
|
- !ruby/object:Gem::Version
|
88
110
|
version: '0'
|
89
111
|
- !ruby/object:Gem::Dependency
|
90
|
-
name: guard-rspec
|
91
112
|
requirement: !ruby/object:Gem::Requirement
|
92
113
|
requirements:
|
93
114
|
- - ">="
|
94
115
|
- !ruby/object:Gem::Version
|
95
116
|
version: '0'
|
96
|
-
|
117
|
+
name: guard-rspec
|
97
118
|
prerelease: false
|
119
|
+
type: :development
|
98
120
|
version_requirements: !ruby/object:Gem::Requirement
|
99
121
|
requirements:
|
100
122
|
- - ">="
|
101
123
|
- !ruby/object:Gem::Version
|
102
124
|
version: '0'
|
103
125
|
- !ruby/object:Gem::Dependency
|
104
|
-
name: guard-rubocop
|
105
126
|
requirement: !ruby/object:Gem::Requirement
|
106
127
|
requirements:
|
107
128
|
- - ">="
|
108
129
|
- !ruby/object:Gem::Version
|
109
130
|
version: '0'
|
110
|
-
|
131
|
+
name: guard-rubocop
|
111
132
|
prerelease: false
|
133
|
+
type: :development
|
112
134
|
version_requirements: !ruby/object:Gem::Requirement
|
113
135
|
requirements:
|
114
136
|
- - ">="
|
115
137
|
- !ruby/object:Gem::Version
|
116
138
|
version: '0'
|
117
139
|
- !ruby/object:Gem::Dependency
|
118
|
-
name: neo4j-rake_tasks
|
119
140
|
requirement: !ruby/object:Gem::Requirement
|
120
141
|
requirements:
|
121
142
|
- - ">="
|
122
143
|
- !ruby/object:Gem::Version
|
123
144
|
version: 0.3.0
|
124
|
-
|
145
|
+
name: neo4j-rake_tasks
|
125
146
|
prerelease: false
|
147
|
+
type: :development
|
126
148
|
version_requirements: !ruby/object:Gem::Requirement
|
127
149
|
requirements:
|
128
150
|
- - ">="
|
129
151
|
- !ruby/object:Gem::Version
|
130
152
|
version: 0.3.0
|
131
153
|
- !ruby/object:Gem::Dependency
|
132
|
-
name: os
|
133
154
|
requirement: !ruby/object:Gem::Requirement
|
134
155
|
requirements:
|
135
156
|
- - ">="
|
136
157
|
- !ruby/object:Gem::Version
|
137
158
|
version: '0'
|
138
|
-
|
159
|
+
name: os
|
139
160
|
prerelease: false
|
161
|
+
type: :development
|
140
162
|
version_requirements: !ruby/object:Gem::Requirement
|
141
163
|
requirements:
|
142
164
|
- - ">="
|
143
165
|
- !ruby/object:Gem::Version
|
144
166
|
version: '0'
|
145
167
|
- !ruby/object:Gem::Dependency
|
146
|
-
name: pry
|
147
168
|
requirement: !ruby/object:Gem::Requirement
|
148
169
|
requirements:
|
149
170
|
- - ">="
|
150
171
|
- !ruby/object:Gem::Version
|
151
172
|
version: '0'
|
152
|
-
|
173
|
+
name: pry
|
153
174
|
prerelease: false
|
175
|
+
type: :development
|
154
176
|
version_requirements: !ruby/object:Gem::Requirement
|
155
177
|
requirements:
|
156
178
|
- - ">="
|
157
179
|
- !ruby/object:Gem::Version
|
158
180
|
version: '0'
|
159
181
|
- !ruby/object:Gem::Dependency
|
160
|
-
name: railties
|
161
182
|
requirement: !ruby/object:Gem::Requirement
|
162
183
|
requirements:
|
163
184
|
- - ">="
|
164
185
|
- !ruby/object:Gem::Version
|
165
186
|
version: '4.0'
|
166
|
-
|
187
|
+
name: railties
|
167
188
|
prerelease: false
|
189
|
+
type: :development
|
168
190
|
version_requirements: !ruby/object:Gem::Requirement
|
169
191
|
requirements:
|
170
192
|
- - ">="
|
171
193
|
- !ruby/object:Gem::Version
|
172
194
|
version: '4.0'
|
173
195
|
- !ruby/object:Gem::Dependency
|
174
|
-
name: rake
|
175
196
|
requirement: !ruby/object:Gem::Requirement
|
176
197
|
requirements:
|
177
198
|
- - ">="
|
178
199
|
- !ruby/object:Gem::Version
|
179
200
|
version: '0'
|
180
|
-
|
201
|
+
name: rake
|
181
202
|
prerelease: false
|
203
|
+
type: :development
|
182
204
|
version_requirements: !ruby/object:Gem::Requirement
|
183
205
|
requirements:
|
184
206
|
- - ">="
|
185
207
|
- !ruby/object:Gem::Version
|
186
208
|
version: '0'
|
187
209
|
- !ruby/object:Gem::Dependency
|
188
|
-
name: rubocop
|
189
210
|
requirement: !ruby/object:Gem::Requirement
|
190
211
|
requirements:
|
191
212
|
- - "~>"
|
192
213
|
- !ruby/object:Gem::Version
|
193
|
-
version: 0.
|
194
|
-
|
214
|
+
version: 0.56.0
|
215
|
+
name: rubocop
|
195
216
|
prerelease: false
|
217
|
+
type: :development
|
196
218
|
version_requirements: !ruby/object:Gem::Requirement
|
197
219
|
requirements:
|
198
220
|
- - "~>"
|
199
221
|
- !ruby/object:Gem::Version
|
200
|
-
version: 0.
|
222
|
+
version: 0.56.0
|
201
223
|
- !ruby/object:Gem::Dependency
|
202
|
-
name: yard
|
203
224
|
requirement: !ruby/object:Gem::Requirement
|
204
225
|
requirements:
|
205
226
|
- - ">="
|
206
227
|
- !ruby/object:Gem::Version
|
207
228
|
version: '0'
|
208
|
-
|
229
|
+
name: yard
|
209
230
|
prerelease: false
|
231
|
+
type: :development
|
210
232
|
version_requirements: !ruby/object:Gem::Requirement
|
211
233
|
requirements:
|
212
234
|
- - ">="
|
@@ -214,7 +236,7 @@ dependencies:
|
|
214
236
|
version: '0'
|
215
237
|
description: 'A Neo4j OGM (Object-Graph-Mapper) for Ruby heavily inspired by ActiveRecord.
|
216
238
|
|
217
|
-
'
|
239
|
+
'
|
218
240
|
email: andreas.ronge@gmail.com, public@brian-underwood.codes, chris@subvertallmedia.com
|
219
241
|
executables:
|
220
242
|
- neo4j-jars
|
@@ -283,7 +305,7 @@ files:
|
|
283
305
|
- lib/neo4j/active_rel/validations.rb
|
284
306
|
- lib/neo4j/class_arguments.rb
|
285
307
|
- lib/neo4j/config.rb
|
286
|
-
- lib/neo4j/core/
|
308
|
+
- lib/neo4j/core/query_ext.rb
|
287
309
|
- lib/neo4j/errors.rb
|
288
310
|
- lib/neo4j/migration.rb
|
289
311
|
- lib/neo4j/migrations.rb
|
@@ -350,7 +372,7 @@ metadata:
|
|
350
372
|
changelog_uri: https://github.com/neo4jrb/neo4j/blob/master/CHANGELOG.md
|
351
373
|
source_code_uri: https://github.com/neo4jrb/neo4j/
|
352
374
|
bug_tracker_uri: https://github.com/neo4jrb/neo4j/issues
|
353
|
-
post_install_message:
|
375
|
+
post_install_message:
|
354
376
|
rdoc_options:
|
355
377
|
- "--quiet"
|
356
378
|
- "--title"
|
@@ -365,7 +387,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
365
387
|
requirements:
|
366
388
|
- - ">="
|
367
389
|
- !ruby/object:Gem::Version
|
368
|
-
version:
|
390
|
+
version: 1.9.3
|
369
391
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
370
392
|
requirements:
|
371
393
|
- - ">="
|
@@ -373,8 +395,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
373
395
|
version: '0'
|
374
396
|
requirements: []
|
375
397
|
rubyforge_project: neo4j
|
376
|
-
rubygems_version: 2.6
|
377
|
-
signing_key:
|
398
|
+
rubygems_version: 2.7.6
|
399
|
+
signing_key:
|
378
400
|
specification_version: 4
|
379
401
|
summary: A graph database for Ruby
|
380
402
|
test_files: []
|
data/lib/neo4j/core/query.rb
DELETED
@@ -1,22 +0,0 @@
|
|
1
|
-
module Neo4j::Core
|
2
|
-
class Query
|
3
|
-
# Creates a Neo4j::ActiveNode::Query::QueryProxy object that builds off of a Core::Query object.
|
4
|
-
#
|
5
|
-
# @param [Class] model An ActiveNode model to be used as the start of a new QueryuProxy chain
|
6
|
-
# @param [Symbol] var The variable to be used to refer to the object from within the new QueryProxy
|
7
|
-
# @param [Boolean] optional Indicate whether the new QueryProxy will use MATCH or OPTIONAL MATCH.
|
8
|
-
# @return [Neo4j::ActiveNode::Query::QueryProxy] A QueryProxy object.
|
9
|
-
def proxy_as(model, var, optional = false)
|
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, node: var, optional: optional, starting_query: self, chain_level: @proxy_chain_level)
|
12
|
-
end
|
13
|
-
|
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.
|
15
|
-
def proxy_as_optional(model, var)
|
16
|
-
proxy_as(model, var, true)
|
17
|
-
end
|
18
|
-
|
19
|
-
# For instances where you turn a QueryProxy into a Query and then back to a QueryProxy with `#proxy_as`
|
20
|
-
attr_accessor :proxy_chain_level
|
21
|
-
end
|
22
|
-
end
|