activegraph 10.0.0.pre.beta.8 → 10.0.1
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.md +25 -4
- data/README.md +21 -17
- data/activegraph.gemspec +1 -1
- data/lib/active_graph/class_arguments.rb +1 -1
- data/lib/active_graph/core.rb +5 -6
- data/lib/active_graph/core/entity.rb +11 -0
- data/lib/active_graph/core/node.rb +3 -11
- data/lib/active_graph/node/has_n.rb +1 -1
- data/lib/active_graph/node/has_n/association.rb +1 -1
- data/lib/active_graph/node/initialize.rb +1 -1
- data/lib/active_graph/node/labels.rb +3 -3
- data/lib/active_graph/node/node_wrapper.rb +1 -1
- data/lib/active_graph/node/persistence.rb +3 -3
- data/lib/active_graph/node/query/query_proxy.rb +1 -1
- data/lib/active_graph/node/query/query_proxy_eager_loading.rb +1 -1
- data/lib/active_graph/node/query/query_proxy_methods.rb +1 -1
- data/lib/active_graph/node/query/query_proxy_methods_of_mass_updating.rb +8 -19
- data/lib/active_graph/railtie.rb +17 -16
- data/lib/active_graph/relationship.rb +1 -1
- data/lib/active_graph/relationship/initialize.rb +3 -3
- data/lib/active_graph/relationship/persistence.rb +5 -5
- data/lib/active_graph/relationship/persistence/query_factory.rb +1 -1
- data/lib/active_graph/relationship/property.rb +1 -4
- data/lib/active_graph/relationship/query.rb +2 -2
- data/lib/active_graph/relationship/rel_wrapper.rb +5 -5
- data/lib/active_graph/relationship/types.rb +6 -8
- data/lib/active_graph/shared/attributes.rb +1 -1
- data/lib/active_graph/shared/callbacks.rb +1 -1
- data/lib/active_graph/shared/declared_properties.rb +2 -2
- data/lib/active_graph/shared/identity.rb +1 -1
- data/lib/active_graph/shared/mass_assignment.rb +1 -2
- data/lib/active_graph/shared/persistence.rb +8 -8
- data/lib/active_graph/shared/property.rb +1 -1
- data/lib/active_graph/shared/query_factory.rb +1 -1
- data/lib/active_graph/shared/type_converters.rb +27 -0
- data/lib/active_graph/undeclared_properties.rb +1 -1
- data/lib/active_graph/version.rb +1 -1
- data/lib/rails/generators/active_graph/model/templates/migration.erb +2 -0
- metadata +12 -12
- data/lib/active_graph/core/relationship.rb +0 -13
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: e434fda5c1ab2cf1ad9d3d859cec6fc31d7b076fefcf3ead00dd5890849436a1
|
4
|
+
data.tar.gz: 1d0827473f9f6c0e6000fd0da3175f6721c1e11d146734b58d9a3c216502b973
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: d260e538a8121c313d08a51893a773ba2e7e6d7c6f0cf9e1a99f2f28da656c5192779e408f02cb7c8f399e9dbe427ed67ff6df5cf2f406a727ebb2259549c113
|
7
|
+
data.tar.gz: 40b4a2bbdc71d888447f9b2c057cdb3d0c5b5f75f783e6a61fa04defc8916908e7dc3aee2f09c8261bd9e851c67c270b1eef920fff1039cdaa68d4a023291dff
|
data/CHANGELOG.md
CHANGED
@@ -3,11 +3,32 @@ 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
|
-
## [10.0.
|
6
|
+
## [10.0.1] 2020-07-26
|
7
7
|
|
8
|
-
|
9
|
-
|
10
|
-
-
|
8
|
+
## Fixed
|
9
|
+
|
10
|
+
- fixed incorrect id comparison, which could result in lost relationships (https://github.com/neo4jrb/activegraph/issues/1611)
|
11
|
+
- brought back BigDecimalConverter
|
12
|
+
- fixed rails template (Thanks @ekampp)
|
13
|
+
|
14
|
+
## [10.0.0] 2020-07-06
|
15
|
+
|
16
|
+
- neo4j 4.0 support (default database only)
|
17
|
+
- dropped support for neo4j 3.3 or earlier
|
18
|
+
- full bolt support
|
19
|
+
- full causal cluster support
|
20
|
+
- removal of http support
|
21
|
+
- removal of embedded support (neo4j embedded is still supported via bolt)
|
22
|
+
- support for a neo4j ruby driver with an api of the official drivers
|
23
|
+
- discontinuation of the ``neo4j-core`` gem. Its functionality is replaced partially by ``neo4j-ruby-driver`` and
|
24
|
+
partially by ``activegraph``
|
25
|
+
- higher naming consistency with ``activerecord`` and the official ``neo4j-java-driver``
|
26
|
+
- configuration more consistent with ``activerecord``
|
27
|
+
- changed transaction API
|
28
|
+
- support for sessions with bookmarks and read and write transaction
|
29
|
+
- enforcing has one constraint on relationships
|
30
|
+
- better handling of has_many (no deletion and recreation)
|
31
|
+
- executing association callbacks on relationship deletion
|
11
32
|
|
12
33
|
## [9.6.1] 2019-12-18
|
13
34
|
|
data/README.md
CHANGED
@@ -11,7 +11,7 @@
|
|
11
11
|
|
12
12
|
### Documentation
|
13
13
|
|
14
|
-
All new documentation will be done via our [readthedocs](http://neo4jrb.readthedocs.org) site, though some old documentation has yet to be moved from our [wiki](https://github.com/neo4jrb/neo4j/wiki)
|
14
|
+
All new documentation will be done via our [readthedocs](http://neo4jrb.readthedocs.org) site, though some old documentation has yet to be moved from our [wiki](https://github.com/neo4jrb/neo4j/wiki)
|
15
15
|
|
16
16
|
### Contact Us
|
17
17
|
|
@@ -45,27 +45,31 @@ Neo4j.rb v4.1.0 was released in January of 2015. Its changes are outlined [here]
|
|
45
45
|
|
46
46
|
## Neo4j version support
|
47
47
|
|
48
|
-
| **Neo4j Version** | v2.x | v3.x | >= v4.x | >= 7.0.3 |
|
49
|
-
|
50
|
-
| 1.9.x | Yes | No | No | No |
|
51
|
-
| 2.0.x | No | Yes | No | No |
|
52
|
-
| 2.1.x | No | Yes | Yes * | Yes |
|
53
|
-
| 2.2.x | No | No | Yes | Yes |
|
54
|
-
| 2.3.x | No | No | Yes | Yes |
|
55
|
-
|
|
48
|
+
| **Neo4j Version** | v2.x | v3.x | >= v4.x | >= 7.0.3 | activegraph 10.0 |
|
49
|
+
|-------------------|------|-------|---------|----------|------------------|
|
50
|
+
| 1.9.x | Yes | No | No | No | No |
|
51
|
+
| 2.0.x | No | Yes | No | No | No |
|
52
|
+
| 2.1.x | No | Yes | Yes * | Yes | No |
|
53
|
+
| 2.2.x | No | No | Yes | Yes | No |
|
54
|
+
| 2.3.x | No | No | Yes | Yes | No |
|
55
|
+
| 3.0, 3.1, 3.3 | No | No | No | Yes | No |
|
56
|
+
| 3.4, 3.5 | No | No | No | Yes | Yes |
|
57
|
+
| 4.0 | No | No | No | No | Yes |
|
58
|
+
| 4.1 | No | No | No | No | No |
|
56
59
|
|
57
60
|
`*` Neo4j.rb >= 4.x doesn't support Neo4j versions before 2.1.5. To use 2.1.x you should upgrade to a version >= 2.1.5
|
58
61
|
|
59
62
|
## Neo4j feature support
|
60
63
|
|
61
|
-
| **Neo4j Feature** | v2.x | v3.x | >= v4.x | >= 8.x |
|
62
|
-
|
63
|
-
| Bolt Protocol | No | No | No | Yes |
|
64
|
-
| Auth | No | No | Yes | Yes |
|
65
|
-
| Remote Cypher | Yes | Yes | Yes | Yes |
|
66
|
-
| Transactions | Yes | Yes | Yes | Yes |
|
67
|
-
| High Availability | No | Yes | Yes | Yes |
|
68
|
-
|
|
64
|
+
| **Neo4j Feature** | v2.x | v3.x | >= v4.x | >= 8.x | activegraph 10.0 |
|
65
|
+
|----------------------------|--------|------|---------|--------|------------------|
|
66
|
+
| Bolt Protocol | No | No | No | Yes | Yes |
|
67
|
+
| Auth | No | No | Yes | Yes | Yes |
|
68
|
+
| Remote Cypher | Yes | Yes | Yes | Yes | No |
|
69
|
+
| Transactions | Yes | Yes | Yes | Yes | Yes |
|
70
|
+
| High Availability | No | Yes | Yes | Yes | Yes |
|
71
|
+
| Causal Cluster | No | No | No | No | Yes |
|
72
|
+
| Embedded JVM support | Yes | Yes | Yes | Yes | via bolt only |
|
69
73
|
|
70
74
|
## Documentation
|
71
75
|
|
data/activegraph.gemspec
CHANGED
@@ -38,7 +38,7 @@ DESCRIPTION
|
|
38
38
|
s.add_development_dependency('guard-rspec')
|
39
39
|
s.add_development_dependency('guard-rubocop')
|
40
40
|
s.add_development_dependency('neo4j-rake_tasks', '>= 0.3.0')
|
41
|
-
s.add_development_dependency("neo4j-#{ENV['driver'] == 'java' ? 'java' : 'ruby'}-driver", '
|
41
|
+
s.add_development_dependency("neo4j-#{ENV['driver'] == 'java' ? 'java' : 'ruby'}-driver", '~> 1.7.0')
|
42
42
|
s.add_development_dependency('os')
|
43
43
|
s.add_development_dependency('pry')
|
44
44
|
s.add_development_dependency('railties', '>= 4.0')
|
@@ -1,7 +1,7 @@
|
|
1
1
|
module ActiveGraph
|
2
2
|
module ClassArguments
|
3
3
|
class << self
|
4
|
-
INVALID_CLASS_ARGUMENT_ERROR = 'option must
|
4
|
+
INVALID_CLASS_ARGUMENT_ERROR = 'option must be String, Symbol, false, nil, or an Array of Symbols/Strings'
|
5
5
|
|
6
6
|
def valid_argument?(class_argument)
|
7
7
|
[NilClass, String, Symbol, FalseClass].include?(class_argument.class) ||
|
data/lib/active_graph/core.rb
CHANGED
@@ -1,15 +1,14 @@
|
|
1
|
-
require 'active_graph/transaction'
|
2
1
|
require 'active_graph/core/instrumentable'
|
2
|
+
require 'active_graph/core/entity'
|
3
|
+
require 'active_graph/core/node'
|
3
4
|
require 'active_graph/core/query'
|
4
5
|
require 'active_graph/core/record'
|
5
|
-
|
6
|
-
require 'neo4j_ruby_driver'
|
7
6
|
require 'active_graph/core/wrappable'
|
8
|
-
require 'active_graph/
|
9
|
-
require '
|
7
|
+
require 'active_graph/transaction'
|
8
|
+
require 'neo4j_ruby_driver'
|
10
9
|
|
11
10
|
Neo4j::Driver::Types::Entity.include ActiveGraph::Core::Wrappable
|
11
|
+
Neo4j::Driver::Types::Entity.prepend ActiveGraph::Core::Entity
|
12
12
|
Neo4j::Driver::Types::Node.prepend ActiveGraph::Core::Node
|
13
|
-
Neo4j::Driver::Types::Relationship.include ActiveGraph::Core::Relationship
|
14
13
|
Neo4j::Driver::StatementResult.prepend ActiveGraph::Core::Result
|
15
14
|
Neo4j::Driver::Record.prepend ActiveGraph::Core::Record
|
@@ -1,23 +1,15 @@
|
|
1
|
-
|
1
|
+
# frozen_string_literal: true
|
2
2
|
|
3
3
|
module ActiveGraph
|
4
4
|
module Core
|
5
5
|
module Node
|
6
|
-
def
|
7
|
-
|
8
|
-
def neo_id; id; end
|
9
|
-
|
10
|
-
def ==(other)
|
11
|
-
other.is_a?(Node) && neo_id == other.neo_id
|
6
|
+
def neo_id
|
7
|
+
id
|
12
8
|
end
|
13
9
|
|
14
10
|
def labels
|
15
11
|
@labels ||= super
|
16
12
|
end
|
17
|
-
|
18
|
-
def properties
|
19
|
-
@properties ||= super
|
20
|
-
end
|
21
13
|
end
|
22
14
|
end
|
23
15
|
end
|
@@ -402,7 +402,7 @@ module ActiveGraph::Node
|
|
402
402
|
#
|
403
403
|
# This would define the methods: ``#vehicle``, ``#vehicle=``, and ``.vehicle``.
|
404
404
|
#
|
405
|
-
# See :ref:`#has_many <
|
405
|
+
# See :ref:`#has_many <ActiveGraph/Node/HasN/ClassMethods#has_many>` for anything
|
406
406
|
# not specified here
|
407
407
|
#
|
408
408
|
def has_one(direction, name, options = {}) # rubocop:disable Naming/PredicateName
|
@@ -21,7 +21,7 @@ module ActiveGraph
|
|
21
21
|
class RecordNotFound < ActiveGraph::RecordNotFound; end
|
22
22
|
|
23
23
|
# @return the labels
|
24
|
-
# @see
|
24
|
+
# @see ActiveGraph::Core
|
25
25
|
def labels
|
26
26
|
@_persisted_obj.labels
|
27
27
|
end
|
@@ -32,7 +32,7 @@ module ActiveGraph
|
|
32
32
|
# end
|
33
33
|
|
34
34
|
# adds one or more labels
|
35
|
-
# @see
|
35
|
+
# @see ActiveGraph::Core
|
36
36
|
def add_labels(*labels)
|
37
37
|
labels.inject(query_as(:n)) do |query, label|
|
38
38
|
query.set("n:`#{label}`")
|
@@ -43,7 +43,7 @@ module ActiveGraph
|
|
43
43
|
|
44
44
|
# Removes one or more labels
|
45
45
|
# Be careful, don't remove the label representing the Ruby class.
|
46
|
-
# @see
|
46
|
+
# @see ActiveGraph::Core
|
47
47
|
def remove_labels(*labels)
|
48
48
|
labels.inject(query_as(:n)) do |query, label|
|
49
49
|
query.remove("n:`#{label}`")
|
@@ -6,7 +6,7 @@ wrapping_proc = proc do |node|
|
|
6
6
|
next node if not found_class
|
7
7
|
|
8
8
|
found_class.new.tap do |wrapped_node|
|
9
|
-
wrapped_node.init_on_load(node, node.
|
9
|
+
wrapped_node.init_on_load(node, node.properties)
|
10
10
|
end
|
11
11
|
end
|
12
12
|
Neo4j::Driver::Types::Node.wrapper_callback(wrapping_proc)
|
@@ -30,8 +30,8 @@ module ActiveGraph::Node
|
|
30
30
|
end
|
31
31
|
|
32
32
|
# Increments concurrently a numeric attribute by a centain amount
|
33
|
-
# @param [Symbol, String] name of the attribute to increment
|
34
|
-
# @param [Integer, Float] amount to increment
|
33
|
+
# @param [Symbol, String] attribute name of the attribute to increment
|
34
|
+
# @param [Integer, Float] by amount to increment
|
35
35
|
def concurrent_increment!(attribute, by = 1)
|
36
36
|
increment_by_query! query_as(:n), attribute, by
|
37
37
|
end
|
@@ -55,7 +55,7 @@ module ActiveGraph::Node
|
|
55
55
|
# @return true
|
56
56
|
def create_model
|
57
57
|
node = _create_node(props_for_create)
|
58
|
-
init_on_load(node, node.
|
58
|
+
init_on_load(node, node.properties)
|
59
59
|
@deferred_nodes = nil
|
60
60
|
true
|
61
61
|
end
|
@@ -16,7 +16,7 @@ module ActiveGraph
|
|
16
16
|
attr_reader :source_object, :association, :model, :starting_query
|
17
17
|
|
18
18
|
# QueryProxy is Node's Cypher DSL. While the name might imply that it creates queries in a general sense,
|
19
|
-
# it is actually referring to <tt>ActiveGraph::Core::Query</tt>, which is a pure Ruby Cypher DSL provided by the <tt>
|
19
|
+
# it is actually referring to <tt>ActiveGraph::Core::Query</tt>, which is a pure Ruby Cypher DSL provided by the <tt>activegraph</tt> gem.
|
20
20
|
# QueryProxy provides ActiveRecord-like methods for common patterns. When it's not handling CRUD for relationships and queries, it
|
21
21
|
# provides Node's association chaining (`student.lessons.teachers.where(age: 30).hobbies`) and enjoys long walks on the
|
22
22
|
# beach.
|
@@ -62,7 +62,7 @@ module ActiveGraph
|
|
62
62
|
if rel.is_a?(ActiveGraph::Relationship)
|
63
63
|
rel.instance_variable_set(direction == :in ? '@from_node' : '@to_node', node)
|
64
64
|
end
|
65
|
-
@_cache[direction == :out ? rel.
|
65
|
+
@_cache[direction == :out ? rel.start_node_id : rel.end_node_id]
|
66
66
|
.association_proxy(element.name).add_to_cache(node, rel)
|
67
67
|
end
|
68
68
|
|
@@ -82,7 +82,7 @@ module ActiveGraph
|
|
82
82
|
|
83
83
|
alias blank? empty?
|
84
84
|
|
85
|
-
# @param [ActiveGraph::Node, ActiveGraph::Node, String] other An instance of a Neo4j.rb model, a
|
85
|
+
# @param [ActiveGraph::Node, ActiveGraph::Node, String] other An instance of a Neo4j.rb model, a core node, or a string uuid
|
86
86
|
# @param [String, Symbol] target An identifier of a link in the Cypher chain
|
87
87
|
# @return [Boolean]
|
88
88
|
def include?(other, target = nil)
|
@@ -49,31 +49,20 @@ module ActiveGraph
|
|
49
49
|
# Deletes the relationships between all nodes for the last step in the QueryProxy chain and replaces them with relationships to the given nodes.
|
50
50
|
# Executed in the database, callbacks will not be run.
|
51
51
|
def replace_with(node_or_nodes)
|
52
|
-
|
52
|
+
node_or_nodes = Array(node_or_nodes).map { |arg| arg.is_a?(ActiveGraph::Node) ? arg : @model.find(arg) }
|
53
53
|
original_ids = self.pluck(:id)
|
54
|
-
|
55
|
-
|
56
|
-
new_nodes | node_hash.values
|
54
|
+
delete_rels_for_nodes(original_ids, node_or_nodes.collect(&:id))
|
55
|
+
add_rels(node_or_nodes, original_ids)
|
57
56
|
end
|
58
57
|
|
59
|
-
def
|
60
|
-
|
61
|
-
if
|
62
|
-
hash[arg.to_i] = @model.find(arg)
|
63
|
-
else
|
64
|
-
key = arg.persisted? ? arg.id : "tmp_#{inx}"
|
65
|
-
hash[key] = arg
|
66
|
-
end
|
67
|
-
end
|
68
|
-
end
|
69
|
-
|
70
|
-
def add_rels(node_hash, original_ids)
|
71
|
-
(node_hash.keys - original_ids).map do |id|
|
72
|
-
node_hash[id] if _create_relation_or_defer(node_hash[id])
|
58
|
+
def add_rels(node_or_nodes, original_ids)
|
59
|
+
node_or_nodes.map do |obj|
|
60
|
+
obj if original_ids.include?(obj.id) || _create_relation_or_defer(obj)
|
73
61
|
end.compact
|
74
62
|
end
|
75
63
|
|
76
|
-
def delete_rels_for_nodes(
|
64
|
+
def delete_rels_for_nodes(original_ids, new_ids)
|
65
|
+
ids = original_ids.select { |id| !new_ids.include?(id) }
|
77
66
|
return unless ids.present?
|
78
67
|
if association.dependent
|
79
68
|
start_object.public_send("dependent_#{association.dependent}_callback", association, ids)
|
data/lib/active_graph/railtie.rb
CHANGED
@@ -2,12 +2,13 @@ require 'active_support/notifications'
|
|
2
2
|
require 'rails/railtie'
|
3
3
|
# Need the action_dispatch railtie to have action_dispatch.rescue_responses initialized correctly
|
4
4
|
require 'action_dispatch/railtie'
|
5
|
+
require 'active_graph'
|
5
6
|
|
6
7
|
module ActiveGraph
|
7
8
|
class Railtie < ::Rails::Railtie
|
8
9
|
def empty_config
|
9
10
|
ActiveSupport::OrderedOptions.new.tap do |cfg|
|
10
|
-
cfg.driver = ActiveSupport::OrderedOptions.new
|
11
|
+
cfg.driver = ActiveSupport::OrderedOptions.new
|
11
12
|
end
|
12
13
|
end
|
13
14
|
|
@@ -58,29 +59,29 @@ module ActiveGraph
|
|
58
59
|
end
|
59
60
|
end
|
60
61
|
|
61
|
-
def setup!(
|
62
|
-
|
63
|
-
|
62
|
+
def setup!(config = empty_config)
|
63
|
+
config = final_driver_config!(config)
|
64
|
+
scheme = config.delete(:scheme) || 'bolt'
|
65
|
+
host = config.delete(:host) || 'localhost'
|
66
|
+
port = config.delete(:port) || 7687
|
67
|
+
url = config.delete(:url) || URI::Generic.build( scheme: scheme, host: host, port: port ).to_s
|
68
|
+
username = config.delete(:username)
|
69
|
+
password = config.delete(:password)
|
70
|
+
auth_token = config.delete(:auth_token)
|
64
71
|
auth_token ||= username ? Neo4j::Driver::AuthTokens.basic(username, password) : Neo4j::Driver::AuthTokens.none
|
65
72
|
register_neo4j_cypher_logging
|
66
73
|
|
67
|
-
|
74
|
+
method = url.is_a?(Enumerable) ? :routing_driver : :driver
|
75
|
+
Neo4j::Driver::GraphDatabase.send(method, url, auth_token, config)
|
68
76
|
end
|
69
77
|
|
70
|
-
def final_driver_config!(
|
71
|
-
|
72
|
-
end
|
73
|
-
|
74
|
-
def default_driver_path_or_url
|
75
|
-
ENV['NEO4J_URL'] || ENV['NEO4J_PATH'] || 'bolt://localhost:7474'
|
78
|
+
def final_driver_config!(config)
|
79
|
+
{ url: ENV['NEO4J_URL'] }.compact.merge(config[:driver]).merge(yaml_config_data)
|
76
80
|
end
|
77
81
|
|
78
82
|
def yaml_config_data
|
79
|
-
@yaml_config_data ||=
|
80
|
-
|
81
|
-
else
|
82
|
-
{}
|
83
|
-
end
|
83
|
+
@yaml_config_data ||=
|
84
|
+
yaml_path ? YAML.load(ERB.new(yaml_path.read).result)[Rails.env].transform_keys!(&:to_sym) : {}
|
84
85
|
end
|
85
86
|
|
86
87
|
def yaml_path
|
@@ -4,7 +4,7 @@ module ActiveGraph
|
|
4
4
|
module Relationship
|
5
5
|
extend ActiveSupport::Concern
|
6
6
|
|
7
|
-
MARSHAL_INSTANCE_VARIABLES = [:@attributes, :@
|
7
|
+
MARSHAL_INSTANCE_VARIABLES = [:@attributes, :@type, :@_persisted_obj]
|
8
8
|
|
9
9
|
include ActiveGraph::Shared
|
10
10
|
include ActiveGraph::Relationship::Initialize
|
@@ -9,10 +9,10 @@ module ActiveGraph::Relationship
|
|
9
9
|
# @param [ActiveGraph::Relationship] to_node_id The neo_id of the ending node of this rel
|
10
10
|
# @param [String] type the relationship type
|
11
11
|
def init_on_load(persisted_rel, from_node_id, to_node_id, type)
|
12
|
-
@
|
12
|
+
@type = type
|
13
13
|
@_persisted_obj = persisted_rel
|
14
14
|
changed_attributes_clear!
|
15
|
-
@attributes = convert_and_assign_attributes(persisted_rel.
|
15
|
+
@attributes = convert_and_assign_attributes(persisted_rel.properties)
|
16
16
|
load_nodes(from_node_id, to_node_id)
|
17
17
|
end
|
18
18
|
|
@@ -21,7 +21,7 @@ module ActiveGraph::Relationship
|
|
21
21
|
init_on_load(unwrapped_reloaded,
|
22
22
|
unwrapped_reloaded.start_node_id,
|
23
23
|
unwrapped_reloaded.end_node_id,
|
24
|
-
unwrapped_reloaded.
|
24
|
+
unwrapped_reloaded.type)
|
25
25
|
self
|
26
26
|
end
|
27
27
|
end
|
@@ -37,8 +37,8 @@ module ActiveGraph::Relationship
|
|
37
37
|
end
|
38
38
|
|
39
39
|
# Increments concurrently a numeric attribute by a centain amount
|
40
|
-
# @param [Symbol, String] name of the attribute to increment
|
41
|
-
# @param [Integer, Float] amount to increment
|
40
|
+
# @param [Symbol, String] attribute name of the attribute to increment
|
41
|
+
# @param [Integer, Float] by amount to increment
|
42
42
|
def concurrent_increment!(attribute, by = 1)
|
43
43
|
increment_by_query! query_as(:r), attribute, by, :r
|
44
44
|
end
|
@@ -47,8 +47,8 @@ module ActiveGraph::Relationship
|
|
47
47
|
validate_node_classes!
|
48
48
|
delete_has_one_rel
|
49
49
|
rel = _create_rel
|
50
|
-
return self unless rel.respond_to?(:
|
51
|
-
init_on_load(rel, from_node, to_node, @
|
50
|
+
return self unless rel.respond_to?(:properties)
|
51
|
+
init_on_load(rel, from_node, to_node, @type)
|
52
52
|
true
|
53
53
|
end
|
54
54
|
|
@@ -65,7 +65,7 @@ module ActiveGraph::Relationship
|
|
65
65
|
|
66
66
|
module ClassMethods
|
67
67
|
# Creates a new relationship between objects
|
68
|
-
# @param [Hash]
|
68
|
+
# @param [Hash] args the properties the new relationship should have
|
69
69
|
def create(*args)
|
70
70
|
new(*args).tap(&:save)
|
71
71
|
end
|
@@ -85,7 +85,7 @@ module ActiveGraph::Relationship::Persistence
|
|
85
85
|
def wrap!(node, res, key)
|
86
86
|
return if node.persisted? || !res.keys.include?(key)
|
87
87
|
unwrapped = res[key]
|
88
|
-
node.init_on_load(unwrapped, unwrapped.
|
88
|
+
node.init_on_load(unwrapped, unwrapped.properties)
|
89
89
|
end
|
90
90
|
|
91
91
|
def node_symbols
|
@@ -17,16 +17,13 @@ module ActiveGraph::Relationship
|
|
17
17
|
alias end_node to_node
|
18
18
|
|
19
19
|
%w(start_node end_node).each do |direction|
|
20
|
-
define_method("#{direction}
|
20
|
+
define_method("#{direction}_id") { send(direction).neo_id if direction }
|
21
21
|
end
|
22
|
-
alias from_node_neo_id start_node_neo_id
|
23
|
-
alias to_node_neo_id end_node_neo_id
|
24
22
|
|
25
23
|
# @return [String] a string representing the relationship type that will be created
|
26
24
|
def type
|
27
25
|
self.class.type
|
28
26
|
end
|
29
|
-
alias rel_type type
|
30
27
|
|
31
28
|
def initialize(attributes = nil)
|
32
29
|
super(attributes)
|
@@ -51,12 +51,12 @@ module ActiveGraph::Relationship
|
|
51
51
|
|
52
52
|
def where_query
|
53
53
|
deprecation_warning!
|
54
|
-
ActiveGraph::Base.new_query.match("#{cypher_string(:outbound)}-[r1:`#{
|
54
|
+
ActiveGraph::Base.new_query.match("#{cypher_string(:outbound)}-[r1:`#{type}`]->#{cypher_string(:inbound)}")
|
55
55
|
end
|
56
56
|
|
57
57
|
def all_query
|
58
58
|
deprecation_warning!
|
59
|
-
ActiveGraph::Base.new_query.match("#{cypher_string}-[r1:`#{
|
59
|
+
ActiveGraph::Base.new_query.match("#{cypher_string}-[r1:`#{type}`]->#{cypher_string(:inbound)}")
|
60
60
|
end
|
61
61
|
|
62
62
|
def cypher_string(dir = :outbound)
|
@@ -1,4 +1,4 @@
|
|
1
|
-
|
1
|
+
# frozen_string_literal: true
|
2
2
|
|
3
3
|
wrapping_proc = proc do |relationship|
|
4
4
|
ActiveGraph::RelWrapping.wrapper(relationship)
|
@@ -9,9 +9,9 @@ module ActiveGraph
|
|
9
9
|
module RelWrapping
|
10
10
|
class << self
|
11
11
|
def wrapper(rel)
|
12
|
-
rel.
|
12
|
+
rel.properties.symbolize_keys!
|
13
13
|
begin
|
14
|
-
most_concrete_class = class_from_type(rel.
|
14
|
+
most_concrete_class = class_from_type(rel.type).constantize
|
15
15
|
return rel unless most_concrete_class < ActiveGraph::Relationship
|
16
16
|
most_concrete_class.new
|
17
17
|
rescue NameError => e
|
@@ -23,8 +23,8 @@ module ActiveGraph
|
|
23
23
|
end
|
24
24
|
end
|
25
25
|
|
26
|
-
def class_from_type(
|
27
|
-
ActiveGraph::Relationship::Types::WRAPPED_CLASSES[
|
26
|
+
def class_from_type(type)
|
27
|
+
ActiveGraph::Relationship::Types::WRAPPED_CLASSES[type] || ActiveGraph::Relationship::Types::WRAPPED_CLASSES[type] = type.to_s.downcase.camelize
|
28
28
|
end
|
29
29
|
end
|
30
30
|
end
|
@@ -14,7 +14,7 @@ module ActiveGraph
|
|
14
14
|
# and Lesson is 'EnrolledIn'." After all, that is a big part of why we have models, right? To make our lives easier?
|
15
15
|
#
|
16
16
|
# A model is added to WRAPPED_CLASSES when it is initalized AND when the `type` class method is called within a model. This means that
|
17
|
-
# it's possible a model will be added twice: once with the
|
17
|
+
# it's possible a model will be added twice: once with the type version of the model name, again with the custom type. deal_with_it.gif.
|
18
18
|
WRAPPED_CLASSES = {}
|
19
19
|
|
20
20
|
included do
|
@@ -34,16 +34,14 @@ module ActiveGraph
|
|
34
34
|
# @param [Boolean] auto Should the given_type be changed in compliance with the gem's rel decorator setting?
|
35
35
|
def type(given_type = nil, auto = false)
|
36
36
|
case
|
37
|
-
when !given_type &&
|
38
|
-
@
|
37
|
+
when !given_type && type?
|
38
|
+
@type
|
39
39
|
when given_type
|
40
40
|
assign_type!(given_type, auto)
|
41
41
|
else
|
42
42
|
assign_type!(namespaced_model_name, true)
|
43
43
|
end
|
44
44
|
end
|
45
|
-
alias rel_type type
|
46
|
-
alias _type type # should be deprecated
|
47
45
|
|
48
46
|
def namespaced_model_name
|
49
47
|
case ActiveGraph::Config[:module_handling]
|
@@ -65,14 +63,14 @@ module ActiveGraph
|
|
65
63
|
_wrapped_classes[type.to_sym] = self.name
|
66
64
|
end
|
67
65
|
|
68
|
-
def
|
69
|
-
!!@
|
66
|
+
def type?
|
67
|
+
!!@type
|
70
68
|
end
|
71
69
|
|
72
70
|
private
|
73
71
|
|
74
72
|
def assign_type!(given_type, auto)
|
75
|
-
@
|
73
|
+
@type = (auto ? decorated_rel_type(given_type) : given_type).tap do |type|
|
76
74
|
add_wrapped_class(type)
|
77
75
|
end
|
78
76
|
end
|
@@ -189,7 +189,7 @@ module ActiveGraph::Shared
|
|
189
189
|
|
190
190
|
# Assign a set of attribute definitions, used when subclassing models
|
191
191
|
#
|
192
|
-
# @param [Array<ActiveGraph::Shared::DeclaredProperties>] The Array of
|
192
|
+
# @param [Array<ActiveGraph::Shared::DeclaredProperties>] attributes The Array of
|
193
193
|
# AttributeDefinition instances
|
194
194
|
def attributes=(attributes)
|
195
195
|
@attributes = attributes
|
@@ -9,7 +9,7 @@ module ActiveGraph
|
|
9
9
|
|
10
10
|
included do
|
11
11
|
include ActiveModel::Validations::Callbacks
|
12
|
-
# after_find is triggered by the `find` method defined in lib/
|
12
|
+
# after_find is triggered by the `find` method defined in lib/active_graph/node/id_property.rb
|
13
13
|
define_model_callbacks :initialize, :find, only: :after
|
14
14
|
define_model_callbacks :create_commit, :update_commit, :destroy_commit, only: :after
|
15
15
|
define_model_callbacks :save, :create, :update, :destroy, :touch
|
@@ -75,7 +75,7 @@ module ActiveGraph::Shared
|
|
75
75
|
end.freeze
|
76
76
|
end
|
77
77
|
|
78
|
-
# During object wrapping, a props hash is built with string keys but
|
78
|
+
# During object wrapping, a props hash is built with string keys but ActiveGraph::Core provides symbols.
|
79
79
|
# Rather than a `to_s` or `symbolize_keys` during every load, we build a map of symbol-to-string
|
80
80
|
# to speed up the process. This increases memory used by the gem but reduces object allocation and GC, so it is faster
|
81
81
|
# in practice.
|
@@ -174,7 +174,7 @@ module ActiveGraph::Shared
|
|
174
174
|
(value.is_a?(Array) && supports_array?(key)) || !EXCLUDED_TYPES.include?(value.class)
|
175
175
|
end
|
176
176
|
|
177
|
-
# @param [Symbol] key An undeclared property value found in the _persisted_obj.
|
177
|
+
# @param [Symbol] key An undeclared property value found in the _persisted_obj.properties hash.
|
178
178
|
# Typically, this is a node's id property, which will not be registered as other properties are.
|
179
179
|
# In the future, this should probably be reworked a bit. This class should either not know or care
|
180
180
|
# about the id property or it should be in charge of it. In the meantime, this improves
|
@@ -19,9 +19,8 @@ module ActiveGraph::Shared
|
|
19
19
|
# person.first_name #=> "Chris"
|
20
20
|
# person.last_name #=> "Griego"
|
21
21
|
#
|
22
|
-
# @param [Hash{#to_s => Object}, #each]
|
22
|
+
# @param [Hash{#to_s => Object}, #each] new_attributes Attributes used to
|
23
23
|
# populate the model
|
24
|
-
# @param [Hash, #[]] options Options that affect mass assignment
|
25
24
|
def assign_attributes(new_attributes = nil)
|
26
25
|
return unless new_attributes.present?
|
27
26
|
new_attributes.each do |name, value|
|
@@ -13,7 +13,7 @@ module ActiveGraph::Shared
|
|
13
13
|
return if skip_update?
|
14
14
|
props = props_for_update
|
15
15
|
neo4j_query(query_as(:n).set(n: props))
|
16
|
-
_persisted_obj.
|
16
|
+
_persisted_obj.properties.merge!(props)
|
17
17
|
changed_attributes_clear!
|
18
18
|
end
|
19
19
|
|
@@ -46,8 +46,8 @@ module ActiveGraph::Shared
|
|
46
46
|
end
|
47
47
|
|
48
48
|
# Increments a numeric attribute by a centain amount
|
49
|
-
# @param [Symbol, String] name of the attribute to increment
|
50
|
-
# @param [Integer, Float] amount to increment
|
49
|
+
# @param [Symbol, String] attribute name of the attribute to increment
|
50
|
+
# @param [Integer, Float] by amount to increment
|
51
51
|
def increment(attribute, by = 1)
|
52
52
|
self[attribute] ||= 0
|
53
53
|
self[attribute] += by
|
@@ -55,15 +55,15 @@ module ActiveGraph::Shared
|
|
55
55
|
end
|
56
56
|
|
57
57
|
# Convenience method to increment numeric attribute and #save at the same time
|
58
|
-
# @param [Symbol, String] name of the attribute to increment
|
59
|
-
# @param [Integer, Float] amount to increment
|
58
|
+
# @param [Symbol, String] attribute name of the attribute to increment
|
59
|
+
# @param [Integer, Float] by amount to increment
|
60
60
|
def increment!(attribute, by = 1)
|
61
61
|
increment(attribute, by).update_attribute(attribute, self[attribute])
|
62
62
|
end
|
63
63
|
|
64
64
|
# Increments concurrently a numeric attribute by a centain amount
|
65
|
-
# @param [Symbol, String] name of the attribute to increment
|
66
|
-
# @param [Integer, Float] amount to increment
|
65
|
+
# @param [Symbol, String] _attribute name of the attribute to increment
|
66
|
+
# @param [Integer, Float] _by amount to increment
|
67
67
|
def concurrent_increment!(_attribute, _by = 1)
|
68
68
|
fail 'not_implemented'
|
69
69
|
end
|
@@ -197,7 +197,7 @@ module ActiveGraph::Shared
|
|
197
197
|
db_values = props_for_db(hash)
|
198
198
|
neo4j_query(query_as(:n).set(n: db_values))
|
199
199
|
db_values.each_pair { |k, v| self.public_send(:"#{k}=", v) }
|
200
|
-
_persisted_obj.
|
200
|
+
_persisted_obj.properties.merge!(db_values)
|
201
201
|
changed_attributes_selective_clear!(db_values)
|
202
202
|
true
|
203
203
|
end
|
@@ -132,7 +132,7 @@ module ActiveGraph::Shared
|
|
132
132
|
# Defines a property on the class
|
133
133
|
#
|
134
134
|
# See active_attr gem for allowed options, e.g which type
|
135
|
-
# Notice, in
|
135
|
+
# Notice, in ActiveGraph you don't have to declare properties before using them, see the ActiveGraph::Coree api.
|
136
136
|
#
|
137
137
|
# @example Without type
|
138
138
|
# class Person
|
@@ -69,6 +69,33 @@ module ActiveGraph::Shared
|
|
69
69
|
end
|
70
70
|
end
|
71
71
|
|
72
|
+
class BigDecimalConverter < BaseConverter
|
73
|
+
class << self
|
74
|
+
def convert_type
|
75
|
+
BigDecimal
|
76
|
+
end
|
77
|
+
|
78
|
+
def db_type
|
79
|
+
String
|
80
|
+
end
|
81
|
+
|
82
|
+
def to_db(value)
|
83
|
+
case value
|
84
|
+
when Rational
|
85
|
+
value.to_f.to_d
|
86
|
+
when respond_to?(:to_d)
|
87
|
+
value.to_d
|
88
|
+
else
|
89
|
+
BigDecimal(value.to_s)
|
90
|
+
end.to_s
|
91
|
+
end
|
92
|
+
|
93
|
+
def to_ruby(value)
|
94
|
+
value.to_d
|
95
|
+
end
|
96
|
+
end
|
97
|
+
end
|
98
|
+
|
72
99
|
class StringConverter < BaseConverter
|
73
100
|
class << self
|
74
101
|
def convert_type
|
@@ -16,7 +16,7 @@ module ActiveGraph
|
|
16
16
|
alias [] read_attribute
|
17
17
|
|
18
18
|
def read_undeclared_property(name)
|
19
|
-
_persisted_obj ? _persisted_obj.
|
19
|
+
_persisted_obj ? _persisted_obj.properties[name] : (undeclared_properties && undeclared_properties[name])
|
20
20
|
end
|
21
21
|
|
22
22
|
def write_attribute(name, value)
|
data/lib/active_graph/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: activegraph
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 10.0.
|
4
|
+
version: 10.0.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Andreas Ronge, Brian Underwood, Chris Grigg, Heinrich Klobuczek
|
8
|
-
autorequire:
|
8
|
+
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2020-
|
11
|
+
date: 2020-07-27 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activemodel
|
@@ -126,16 +126,16 @@ dependencies:
|
|
126
126
|
name: neo4j-ruby-driver
|
127
127
|
requirement: !ruby/object:Gem::Requirement
|
128
128
|
requirements:
|
129
|
-
- - "
|
129
|
+
- - "~>"
|
130
130
|
- !ruby/object:Gem::Version
|
131
|
-
version:
|
131
|
+
version: 1.7.0
|
132
132
|
type: :development
|
133
133
|
prerelease: false
|
134
134
|
version_requirements: !ruby/object:Gem::Requirement
|
135
135
|
requirements:
|
136
|
-
- - "
|
136
|
+
- - "~>"
|
137
137
|
- !ruby/object:Gem::Version
|
138
|
-
version:
|
138
|
+
version: 1.7.0
|
139
139
|
- !ruby/object:Gem::Dependency
|
140
140
|
name: os
|
141
141
|
requirement: !ruby/object:Gem::Requirement
|
@@ -262,6 +262,7 @@ files:
|
|
262
262
|
- lib/active_graph/core.rb
|
263
263
|
- lib/active_graph/core/connection_failed_error.rb
|
264
264
|
- lib/active_graph/core/cypher_error.rb
|
265
|
+
- lib/active_graph/core/entity.rb
|
265
266
|
- lib/active_graph/core/instrumentable.rb
|
266
267
|
- lib/active_graph/core/label.rb
|
267
268
|
- lib/active_graph/core/logging.rb
|
@@ -273,7 +274,6 @@ files:
|
|
273
274
|
- lib/active_graph/core/query_ext.rb
|
274
275
|
- lib/active_graph/core/query_find_in_batches.rb
|
275
276
|
- lib/active_graph/core/record.rb
|
276
|
-
- lib/active_graph/core/relationship.rb
|
277
277
|
- lib/active_graph/core/result.rb
|
278
278
|
- lib/active_graph/core/schema.rb
|
279
279
|
- lib/active_graph/core/schema_errors.rb
|
@@ -394,7 +394,7 @@ metadata:
|
|
394
394
|
changelog_uri: https://github.com/neo4jrb/activegraph/blob/master/CHANGELOG.md
|
395
395
|
source_code_uri: https://github.com/neo4jrb/activegraph/
|
396
396
|
bug_tracker_uri: https://github.com/neo4jrb/activegraph/issues
|
397
|
-
post_install_message:
|
397
|
+
post_install_message:
|
398
398
|
rdoc_options:
|
399
399
|
- "--quiet"
|
400
400
|
- "--title"
|
@@ -412,12 +412,12 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
412
412
|
version: '2.5'
|
413
413
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
414
414
|
requirements:
|
415
|
-
- - "
|
415
|
+
- - ">="
|
416
416
|
- !ruby/object:Gem::Version
|
417
|
-
version:
|
417
|
+
version: '0'
|
418
418
|
requirements: []
|
419
419
|
rubygems_version: 3.1.2
|
420
|
-
signing_key:
|
420
|
+
signing_key:
|
421
421
|
specification_version: 4
|
422
422
|
summary: A graph database for Ruby
|
423
423
|
test_files: []
|
@@ -1,13 +0,0 @@
|
|
1
|
-
require 'active_graph/core/wrappable'
|
2
|
-
|
3
|
-
module ActiveGraph
|
4
|
-
module Core
|
5
|
-
module Relationship
|
6
|
-
def props; properties; end
|
7
|
-
def neo_id; id; end
|
8
|
-
def start_node_neo_id; start_node_id; end
|
9
|
-
def end_node_neo_id; end_node_id; end
|
10
|
-
def rel_type; type; end
|
11
|
-
end
|
12
|
-
end
|
13
|
-
end
|