activegraph 10.0.0.pre.alpha.9 → 10.0.0.pre.alpha.10
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/lib/neo4j.rb +2 -0
- data/lib/neo4j/active_base.rb +7 -7
- data/lib/neo4j/active_node/has_n.rb +2 -2
- data/lib/neo4j/active_node/property.rb +1 -1
- data/lib/neo4j/active_node/query/query_proxy.rb +6 -6
- data/lib/neo4j/active_rel/query.rb +5 -5
- data/lib/neo4j/attribute_set.rb +32 -0
- data/lib/neo4j/core/label.rb +8 -8
- data/lib/neo4j/core/query.rb +3 -3
- data/lib/neo4j/core/query_builder.rb +3 -3
- data/lib/neo4j/lazy_attribute_hash.rb +38 -0
- data/lib/neo4j/migrations/schema.rb +11 -11
- data/lib/neo4j/railtie.rb +7 -7
- data/lib/neo4j/shared.rb +3 -3
- data/lib/neo4j/shared/attributes.rb +5 -4
- data/lib/neo4j/shared/initialize.rb +3 -2
- data/lib/neo4j/shared/property.rb +9 -1
- data/lib/neo4j/shared/type_converters.rb +56 -116
- data/lib/neo4j/shared/typecasted_attributes.rb +5 -4
- data/lib/neo4j/transaction.rb +1 -1
- data/lib/neo4j/version.rb +1 -1
- metadata +5 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 39751bab802f72daa73a5fb59b5d356a26616b0547931021cdcc14130690ac3c
|
4
|
+
data.tar.gz: 347bbbd3f9e60fdff9dce58147e86ea8f959803a8e18b2788703964847cf285f
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 78fc78517a28af803822c2b5113ecd1db26cd03490e1f342d52c14af8bb15d740a3e4ea69fd7209a36eba7d69bb402cade0a374ba3c45c7da9d04b3b68b2e008
|
7
|
+
data.tar.gz: 38ade859a5ab61994676589a28484bea97da74d66d35cf0f8b3b6331eab28903bfd812e0162b7250b4f14a568d70db3b52e09c3fbf93a109a77a22f970b9b4a3
|
data/lib/neo4j.rb
CHANGED
@@ -14,6 +14,8 @@ require 'active_support/core_ext/class/subclasses.rb'
|
|
14
14
|
require 'active_support/core_ext/module/attribute_accessors'
|
15
15
|
require 'json'
|
16
16
|
|
17
|
+
require 'neo4j/lazy_attribute_hash'
|
18
|
+
require 'neo4j/attribute_set'
|
17
19
|
require 'neo4j/errors'
|
18
20
|
require 'neo4j/config'
|
19
21
|
require 'neo4j/wrapper'
|
data/lib/neo4j/active_base.rb
CHANGED
@@ -9,17 +9,17 @@ module Neo4j
|
|
9
9
|
class << self
|
10
10
|
# private?
|
11
11
|
def current_driver
|
12
|
-
(@driver ||=
|
13
|
-
fail 'No
|
12
|
+
(@driver ||= establish_driver).tap do |driver|
|
13
|
+
fail 'No driver defined!' if driver.nil?
|
14
14
|
end
|
15
15
|
end
|
16
16
|
|
17
|
-
def
|
18
|
-
@
|
17
|
+
def on_establish_driver(&block)
|
18
|
+
@establish_driver_block = block
|
19
19
|
end
|
20
20
|
|
21
|
-
def
|
22
|
-
@
|
21
|
+
def establish_driver
|
22
|
+
@establish_driver_block.call if @establish_driver_block
|
23
23
|
end
|
24
24
|
|
25
25
|
def new_driver(url, options = {})
|
@@ -55,7 +55,7 @@ module Neo4j
|
|
55
55
|
|
56
56
|
def new_query(options = {})
|
57
57
|
validate_model_schema!
|
58
|
-
Neo4j::Core::Query.new({
|
58
|
+
Neo4j::Core::Query.new({driver: current_driver}.merge(options))
|
59
59
|
end
|
60
60
|
|
61
61
|
def magic_query(*args)
|
@@ -545,7 +545,7 @@ module Neo4j::ActiveNode
|
|
545
545
|
query_proxy = previous_query_proxy || default_association_query_proxy
|
546
546
|
Neo4j::ActiveNode::Query::QueryProxy.new(association_target_class(name),
|
547
547
|
associations[name],
|
548
|
-
{
|
548
|
+
{driver: neo4j_driver,
|
549
549
|
query_proxy: query_proxy,
|
550
550
|
context: "#{query_proxy.context || self.name}##{name}",
|
551
551
|
optional: query_proxy.optional?,
|
@@ -578,7 +578,7 @@ module Neo4j::ActiveNode
|
|
578
578
|
|
579
579
|
def default_association_query_proxy
|
580
580
|
Neo4j::ActiveNode::Query::QueryProxy.new("::#{self.name}".constantize, nil,
|
581
|
-
|
581
|
+
driver: neo4j_driver, query_proxy: nil, context: self.name.to_s)
|
582
582
|
end
|
583
583
|
|
584
584
|
def build_association(macro, direction, name, options)
|
@@ -5,7 +5,7 @@ module Neo4j::ActiveNode
|
|
5
5
|
|
6
6
|
def initialize(attributes = nil)
|
7
7
|
super(attributes)
|
8
|
-
@attributes ||=
|
8
|
+
@attributes ||= Neo4j::AttributeSet.new(self.class.attributes_nil_hash, self.class.attributes.keys)
|
9
9
|
end
|
10
10
|
|
11
11
|
module ClassMethods
|
@@ -33,7 +33,7 @@ module Neo4j
|
|
33
33
|
# @option options [String, Symbol] :rel_var Same as above but pertaining to a relationship identifier
|
34
34
|
# @option options [Range, Integer, Symbol, Hash] :rel_length A Range, a Integer, a Hash or a Symbol to indicate the variable-length/fixed-length
|
35
35
|
# qualifier of the relationship. See http://neo4jrb.readthedocs.org/en/latest/Querying.html#variable-length-relationships.
|
36
|
-
# @option options [Neo4j::
|
36
|
+
# @option options [Neo4j::Driver] :driver The driver to be used for this query
|
37
37
|
# @option options [Neo4j::ActiveNode] :source_object The node instance at the start of the QueryProxy chain
|
38
38
|
# @option options [QueryProxy] :query_proxy An existing QueryProxy chain upon which this new object should be built
|
39
39
|
#
|
@@ -317,9 +317,9 @@ module Neo4j
|
|
317
317
|
"result_#{(association || model).try(:name)}#{index}".downcase.tr(':', '').to_sym
|
318
318
|
end
|
319
319
|
|
320
|
-
def
|
321
|
-
(@
|
322
|
-
fail 'No
|
320
|
+
def _driver
|
321
|
+
(@driver || (@model && @model.neo4j_driver)).tap do |driver|
|
322
|
+
fail 'No driver found!' if driver.nil?
|
323
323
|
end
|
324
324
|
end
|
325
325
|
|
@@ -357,9 +357,9 @@ module Neo4j
|
|
357
357
|
private
|
358
358
|
|
359
359
|
def instance_vars_from_options!(options)
|
360
|
-
@node_var, @
|
360
|
+
@node_var, @driver, @source_object, @starting_query, @optional,
|
361
361
|
@start_object, @query_proxy, @chain_level, @association_labels,
|
362
|
-
@rel_length = options.values_at(:node, :
|
362
|
+
@rel_length = options.values_at(:node, :driver, :source_object, :starting_query, :optional,
|
363
363
|
:start_object, :query_proxy, :chain_level, :association_labels, :rel_length)
|
364
364
|
end
|
365
365
|
|
@@ -7,15 +7,15 @@ module Neo4j::ActiveRel
|
|
7
7
|
module ClassMethods
|
8
8
|
# Returns the object with the specified neo4j id.
|
9
9
|
# @param [String,Integer] id of node to find
|
10
|
-
# @param [Neo4j::
|
11
|
-
def find(id,
|
10
|
+
# @param [Neo4j::Driver] driver optional
|
11
|
+
def find(id, driver = self.neo4j_driver)
|
12
12
|
fail "Unknown argument #{id.class} in find method (expected String or Integer)" if !(id.is_a?(String) || id.is_a?(Integer))
|
13
|
-
find_by_id(id,
|
13
|
+
find_by_id(id, driver)
|
14
14
|
end
|
15
15
|
|
16
16
|
# Loads the relationship using its neo_id.
|
17
|
-
def find_by_id(key,
|
18
|
-
options =
|
17
|
+
def find_by_id(key, driver = nil)
|
18
|
+
options = driver ? {driver: driver} : {}
|
19
19
|
query ||= Neo4j::ActiveBase.new_query(options)
|
20
20
|
result = query.match('()-[r]-()').where('ID(r)' => key.to_i).limit(1).return(:r).first
|
21
21
|
fail RecordNotFound.new("Couldn't find #{name} with 'id'=#{key.inspect}", name, key) if result.blank?
|
@@ -0,0 +1,32 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'active_model/attribute_set'
|
4
|
+
|
5
|
+
module Neo4j
|
6
|
+
class AttributeSet < ActiveModel::AttributeSet
|
7
|
+
def initialize(attr_hash, attr_list)
|
8
|
+
hashmap = Neo4j::LazyAttributeHash.new(attr_hash, attr_list)
|
9
|
+
super(hashmap)
|
10
|
+
end
|
11
|
+
|
12
|
+
def method_missing(name, *args, **kwargs, &block)
|
13
|
+
if defined?(name)
|
14
|
+
attributes.send(:materialize).send(name, *args, **kwargs, &block)
|
15
|
+
else
|
16
|
+
super
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
def respond_to_missing?(method, *)
|
21
|
+
attributes.send(:materialize).respond_to?(method) || super
|
22
|
+
end
|
23
|
+
|
24
|
+
def keys
|
25
|
+
attributes.send(:materialize).keys
|
26
|
+
end
|
27
|
+
|
28
|
+
def ==(other)
|
29
|
+
other.is_a?(Neo4j::AttributeSet) ? super : to_hash == other
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
data/lib/neo4j/core/label.rb
CHANGED
@@ -21,8 +21,8 @@ module Neo4j
|
|
21
21
|
# Creates a neo4j constraint on a property
|
22
22
|
# See http://docs.neo4j.org/chunked/stable/query-constraints.html
|
23
23
|
# @example
|
24
|
-
# label = Neo4j::Label.create(:person,
|
25
|
-
# label.create_constraint(:name, {type: :unique},
|
24
|
+
# label = Neo4j::Label.create(:person, driver)
|
25
|
+
# label.create_constraint(:name, {type: :unique}, driver)
|
26
26
|
#
|
27
27
|
def create_constraint(property, constraints)
|
28
28
|
cypher = case constraints[:type]
|
@@ -41,9 +41,9 @@ module Neo4j
|
|
41
41
|
# Drops a neo4j constraint on a property
|
42
42
|
# See http://docs.neo4j.org/chunked/stable/query-constraints.html
|
43
43
|
# @example
|
44
|
-
# label = Neo4j::Label.create(:person,
|
45
|
-
# label.create_constraint(:name, {type: :unique},
|
46
|
-
# label.drop_constraint(:name, {type: :unique},
|
44
|
+
# label = Neo4j::Label.create(:person, driver)
|
45
|
+
# label.create_constraint(:name, {type: :unique}, driver)
|
46
|
+
# label.drop_constraint(:name, {type: :unique}, driver)
|
47
47
|
#
|
48
48
|
def drop_constraint(property, constraint)
|
49
49
|
cypher = case constraint[:type]
|
@@ -97,8 +97,8 @@ module Neo4j
|
|
97
97
|
|
98
98
|
private
|
99
99
|
|
100
|
-
# Store schema threads on the
|
101
|
-
# threads on a
|
100
|
+
# Store schema threads on the driver so that we can easily wait for all
|
101
|
+
# threads on a driver regardless of label
|
102
102
|
def schema_threads
|
103
103
|
self.class.schema_threads
|
104
104
|
end
|
@@ -134,7 +134,7 @@ module Neo4j
|
|
134
134
|
|
135
135
|
def wait_for_schema_changes
|
136
136
|
schema_threads.map(&:join)
|
137
|
-
set_schema_threads(
|
137
|
+
set_schema_threads(driver, [])
|
138
138
|
end
|
139
139
|
|
140
140
|
def schema_threads
|
data/lib/neo4j/core/query.rb
CHANGED
@@ -68,7 +68,7 @@ module Neo4j
|
|
68
68
|
end
|
69
69
|
|
70
70
|
def initialize(options = {})
|
71
|
-
@
|
71
|
+
@driver = options[:driver]
|
72
72
|
|
73
73
|
@options = options
|
74
74
|
@clauses = []
|
@@ -374,7 +374,7 @@ module Neo4j
|
|
374
374
|
end
|
375
375
|
|
376
376
|
def &(other)
|
377
|
-
self.class.new(
|
377
|
+
self.class.new(driver: @driver).tap do |new_query|
|
378
378
|
new_query.options = options.merge(other.options)
|
379
379
|
new_query.clauses = clauses + other.clauses
|
380
380
|
end.params(other._params)
|
@@ -396,7 +396,7 @@ module Neo4j
|
|
396
396
|
|
397
397
|
protected
|
398
398
|
|
399
|
-
attr_accessor :
|
399
|
+
attr_accessor :driver, :options, :_params
|
400
400
|
|
401
401
|
def add_clauses(clauses)
|
402
402
|
@clauses += clauses
|
@@ -23,9 +23,9 @@ module Neo4j
|
|
23
23
|
end
|
24
24
|
|
25
25
|
def query
|
26
|
-
# `nil`
|
27
|
-
# we phase out `Query` objects containing
|
28
|
-
Neo4j::Core::Query.new(
|
26
|
+
# `nil` drivers are just a workaround until
|
27
|
+
# we phase out `Query` objects containing drivers
|
28
|
+
Neo4j::Core::Query.new(driver: nil)
|
29
29
|
end
|
30
30
|
end
|
31
31
|
end
|
@@ -0,0 +1,38 @@
|
|
1
|
+
require 'active_model/attribute_set'
|
2
|
+
|
3
|
+
module Neo4j
|
4
|
+
class LazyAttributeHash < ActiveModel::LazyAttributeHash
|
5
|
+
def initialize(values, attr_list)
|
6
|
+
@types = {}
|
7
|
+
@values = {}
|
8
|
+
@additional_types = {}
|
9
|
+
@materialized = false
|
10
|
+
@delegate_hash = values
|
11
|
+
|
12
|
+
@default_attributes = process_default_attributes(attr_list)
|
13
|
+
end
|
14
|
+
|
15
|
+
private
|
16
|
+
|
17
|
+
def marshal_load(values)
|
18
|
+
initialize(values[4], values[3])
|
19
|
+
end
|
20
|
+
|
21
|
+
def process_default_attributes(attr_list)
|
22
|
+
if attr_list.is_a?(Hash)
|
23
|
+
attr_list
|
24
|
+
else
|
25
|
+
# initialize default attributes map with nil values
|
26
|
+
attr_list.each_with_object({}) do |name, map|
|
27
|
+
map[name] = nil
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
# we are using with_cast_value here because at the moment casting is being managed by
|
33
|
+
# Neo4j and not in ActiveModel
|
34
|
+
def assign_default_value(name)
|
35
|
+
delegate_hash[name] = ActiveModel::Attribute.with_cast_value(name, default_attributes[name].dup, nil)
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
@@ -2,28 +2,28 @@ module Neo4j
|
|
2
2
|
module Migrations
|
3
3
|
module Schema
|
4
4
|
class << self
|
5
|
-
def fetch_schema_data(
|
6
|
-
{constraints: fetch_constraint_descriptions(
|
7
|
-
indexes: fetch_index_descriptions(
|
5
|
+
def fetch_schema_data(driver)
|
6
|
+
{constraints: fetch_constraint_descriptions(driver).sort,
|
7
|
+
indexes: fetch_index_descriptions(driver).sort}
|
8
8
|
end
|
9
9
|
|
10
|
-
def synchronize_schema_data(
|
10
|
+
def synchronize_schema_data(driver, schema_data, remove_missing)
|
11
11
|
queries = []
|
12
|
-
queries += drop_and_create_queries(fetch_constraint_descriptions(
|
13
|
-
queries += drop_and_create_queries(fetch_index_descriptions(
|
14
|
-
|
12
|
+
queries += drop_and_create_queries(fetch_constraint_descriptions(driver), schema_data[:constraints], remove_missing)
|
13
|
+
queries += drop_and_create_queries(fetch_index_descriptions(driver), schema_data[:indexes], remove_missing)
|
14
|
+
driver.queries do
|
15
15
|
queries.each { |query| append query }
|
16
16
|
end
|
17
17
|
end
|
18
18
|
|
19
19
|
private
|
20
20
|
|
21
|
-
def fetch_constraint_descriptions(
|
22
|
-
|
21
|
+
def fetch_constraint_descriptions(driver)
|
22
|
+
driver.query('CALL db.constraints()').map(&:description)
|
23
23
|
end
|
24
24
|
|
25
|
-
def fetch_index_descriptions(
|
26
|
-
result =
|
25
|
+
def fetch_index_descriptions(driver)
|
26
|
+
result = driver.query('CALL db.indexes()')
|
27
27
|
if result.columns.include?(:description)
|
28
28
|
v3_indexes(result)
|
29
29
|
else
|
data/lib/neo4j/railtie.rb
CHANGED
@@ -7,7 +7,7 @@ require 'neo4j/core/driver'
|
|
7
7
|
module Neo4j
|
8
8
|
class Railtie < ::Rails::Railtie
|
9
9
|
def empty_config
|
10
|
-
ActiveSupport::OrderedOptions.new.tap { |cfg| cfg.
|
10
|
+
ActiveSupport::OrderedOptions.new.tap { |cfg| cfg.driver = ActiveSupport::OrderedOptions.new }
|
11
11
|
end
|
12
12
|
|
13
13
|
config.neo4j = empty_config
|
@@ -48,7 +48,7 @@ module Neo4j
|
|
48
48
|
|
49
49
|
Neo4j::Config.configuration.merge!(neo4j_config.to_h)
|
50
50
|
|
51
|
-
Neo4j::ActiveBase.
|
51
|
+
Neo4j::ActiveBase.on_establish_driver { setup! neo4j_config }
|
52
52
|
|
53
53
|
Neo4j::Config[:logger] ||= Rails.logger
|
54
54
|
|
@@ -58,18 +58,18 @@ module Neo4j
|
|
58
58
|
end
|
59
59
|
|
60
60
|
def setup!(neo4j_config = empty_config)
|
61
|
-
url, path, options =
|
61
|
+
url, path, options = final_driver_config!(neo4j_config).values_at(:url, :path, :options)
|
62
62
|
options ||= {}
|
63
63
|
register_neo4j_cypher_logging
|
64
64
|
|
65
|
-
Neo4j::ActiveBase.new_driver( url || path ||
|
65
|
+
Neo4j::ActiveBase.new_driver( url || path || default_driver_path_or_url, options)
|
66
66
|
end
|
67
67
|
|
68
|
-
def
|
69
|
-
(neo4j_config[:
|
68
|
+
def final_driver_config!(neo4j_config)
|
69
|
+
(neo4j_config[:driver].empty? ? yaml_config_data : neo4j_config[:driver]).dup
|
70
70
|
end
|
71
71
|
|
72
|
-
def
|
72
|
+
def default_driver_path_or_url
|
73
73
|
ENV['NEO4J_URL'] || ENV['NEO4J_PATH'] || 'bolt://localhost:7474'
|
74
74
|
end
|
75
75
|
|
data/lib/neo4j/shared.rb
CHANGED
@@ -10,10 +10,10 @@ module Neo4j
|
|
10
10
|
include ActiveModel::Serializers::JSON
|
11
11
|
|
12
12
|
module ClassMethods
|
13
|
-
# TODO: Deprecate
|
13
|
+
# TODO: Deprecate neo4j_driver_name(name)
|
14
14
|
|
15
15
|
# remove?
|
16
|
-
def
|
16
|
+
def neo4j_driver
|
17
17
|
Neo4j::ActiveBase.current_driver
|
18
18
|
end
|
19
19
|
|
@@ -23,7 +23,7 @@ module Neo4j
|
|
23
23
|
end
|
24
24
|
|
25
25
|
# This should be used everywhere. Should make it easy
|
26
|
-
# to support a
|
26
|
+
# to support a driver-per-model system
|
27
27
|
def neo4j_query(*args)
|
28
28
|
Neo4j::ActiveBase.query(*args)
|
29
29
|
end
|
@@ -77,14 +77,15 @@ module Neo4j::Shared
|
|
77
77
|
|
78
78
|
# Read an attribute from the attributes hash
|
79
79
|
def attribute(name)
|
80
|
-
@attributes ||= {}
|
81
|
-
@attributes
|
80
|
+
@attributes ||= Neo4j::AttributeSet.new({}, self.class.attributes.keys)
|
81
|
+
@attributes.fetch_value(name.to_s)
|
82
82
|
end
|
83
83
|
|
84
84
|
# Write an attribute to the attributes hash
|
85
85
|
def attribute=(name, value)
|
86
|
-
@attributes ||= {}
|
87
|
-
@attributes
|
86
|
+
@attributes ||= Neo4j::AttributeSet.new({}, self.class.attributes.keys)
|
87
|
+
@attributes.write_cast_value(name, value)
|
88
|
+
value
|
88
89
|
end
|
89
90
|
|
90
91
|
# Maps all attributes using the given block
|
@@ -12,16 +12,17 @@ module Neo4j::Shared
|
|
12
12
|
private
|
13
13
|
|
14
14
|
def convert_and_assign_attributes(properties)
|
15
|
-
@attributes ||=
|
15
|
+
@attributes ||= Neo4j::AttributeSet.new(self.class.attributes_nil_hash, self.class.attributes.keys)
|
16
16
|
stringify_attributes!(@attributes, properties)
|
17
17
|
self.default_properties = properties if respond_to?(:default_properties=)
|
18
18
|
self.class.declared_properties.convert_properties_to(self, :ruby, @attributes)
|
19
|
+
@attributes
|
19
20
|
end
|
20
21
|
|
21
22
|
def stringify_attributes!(attr, properties)
|
22
23
|
properties.each_pair do |k, v|
|
23
24
|
key = self.class.declared_properties.string_key(k)
|
24
|
-
attr
|
25
|
+
attr.write_cast_value(key.freeze, v)
|
25
26
|
end
|
26
27
|
end
|
27
28
|
|
@@ -11,6 +11,9 @@ module Neo4j::Shared
|
|
11
11
|
|
12
12
|
attr_reader :_persisted_obj
|
13
13
|
|
14
|
+
NEO4J_DRIVER_DATA_TYPES = [Date, Time, Hash, Neo4j::Driver::Types::Bytes, ActiveSupport::Duration, Neo4j::Driver::Types::Point,
|
15
|
+
Neo4j::Driver::Types::OffsetTime, Neo4j::Driver::Types::LocalTime, Neo4j::Driver::Types::LocalDateTime]
|
16
|
+
|
14
17
|
# TODO: Set @attribute correctly using class ActiveModel::Attribute, and after that
|
15
18
|
# remove mutations_from_database and other ActiveModel::Dirty overrided methods
|
16
19
|
def mutations_from_database
|
@@ -28,6 +31,7 @@ module Neo4j::Shared
|
|
28
31
|
end
|
29
32
|
|
30
33
|
def initialize(attributes = nil)
|
34
|
+
@attributes ||= Neo4j::AttributeSet.new({}, self.class.attributes.keys)
|
31
35
|
attributes = process_attributes(attributes)
|
32
36
|
modded_attributes = inject_defaults!(attributes)
|
33
37
|
validate_attributes!(modded_attributes)
|
@@ -212,7 +216,11 @@ module Neo4j::Shared
|
|
212
216
|
define_attribute_methods([name]) unless attribute_names.include?(name)
|
213
217
|
attributes[name.to_s] = declared_properties[name]
|
214
218
|
define_method("#{name}=") do |value|
|
215
|
-
typecast_value =
|
219
|
+
typecast_value = if NEO4J_DRIVER_DATA_TYPES.include?(_attribute_type(name))
|
220
|
+
value
|
221
|
+
else
|
222
|
+
typecast_attribute(_attribute_typecaster(name), value)
|
223
|
+
end
|
216
224
|
send("#{name}_will_change!") unless typecast_value == read_attribute(name)
|
217
225
|
super(value)
|
218
226
|
end
|
@@ -25,7 +25,14 @@ module Neo4j::Shared
|
|
25
25
|
end
|
26
26
|
|
27
27
|
class IntegerConverter < BaseConverter
|
28
|
+
NEO4J_LARGEST_INT = 9223372036854775807
|
29
|
+
NEO4J_SMALLEST_INT = -9223372036854775808
|
28
30
|
class << self
|
31
|
+
|
32
|
+
def converted?(value)
|
33
|
+
false
|
34
|
+
end
|
35
|
+
|
29
36
|
def convert_type
|
30
37
|
Integer
|
31
38
|
end
|
@@ -35,55 +42,31 @@ module Neo4j::Shared
|
|
35
42
|
end
|
36
43
|
|
37
44
|
def to_db(value)
|
38
|
-
value.to_i
|
45
|
+
val = value.to_i
|
46
|
+
val > NEO4J_LARGEST_INT || val < NEO4J_SMALLEST_INT ? val.to_s : val
|
39
47
|
end
|
40
48
|
|
41
|
-
|
42
|
-
|
43
|
-
end
|
44
|
-
|
45
|
-
class FloatConverter < BaseConverter
|
46
|
-
class << self
|
47
|
-
def convert_type
|
48
|
-
Float
|
49
|
-
end
|
50
|
-
|
51
|
-
def db_type
|
52
|
-
Float
|
53
|
-
end
|
54
|
-
|
55
|
-
def to_db(value)
|
56
|
-
value.to_f
|
49
|
+
def to_ruby(value)
|
50
|
+
value.to_i
|
57
51
|
end
|
58
|
-
alias to_ruby to_db
|
59
52
|
end
|
60
53
|
end
|
61
54
|
|
62
|
-
class
|
63
|
-
class << self
|
64
|
-
def convert_type
|
65
|
-
|
66
|
-
end
|
67
|
-
|
68
|
-
def db_type
|
69
|
-
|
70
|
-
end
|
71
|
-
|
72
|
-
def to_db(value)
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
value.to_d
|
78
|
-
else
|
79
|
-
BigDecimal(value.to_s)
|
80
|
-
end.to_s
|
81
|
-
end
|
82
|
-
|
83
|
-
def to_ruby(value)
|
84
|
-
value.to_d
|
85
|
-
end
|
86
|
-
end
|
55
|
+
class FloatConverter < BaseConverter
|
56
|
+
class << self
|
57
|
+
def convert_type
|
58
|
+
Float
|
59
|
+
end
|
60
|
+
|
61
|
+
def db_type
|
62
|
+
Float
|
63
|
+
end
|
64
|
+
|
65
|
+
def to_db(value)
|
66
|
+
value.to_f
|
67
|
+
end
|
68
|
+
alias to_ruby to_db
|
69
|
+
end
|
87
70
|
end
|
88
71
|
|
89
72
|
class StringConverter < BaseConverter
|
@@ -103,62 +86,6 @@ module Neo4j::Shared
|
|
103
86
|
end
|
104
87
|
end
|
105
88
|
|
106
|
-
class BooleanConverter < BaseConverter
|
107
|
-
FALSE_VALUES = %w(n N no No NO false False FALSE off Off OFF f F).to_set
|
108
|
-
|
109
|
-
class << self
|
110
|
-
def converted?(value)
|
111
|
-
converted_values.include?(value)
|
112
|
-
end
|
113
|
-
|
114
|
-
def converted_values
|
115
|
-
[true, false]
|
116
|
-
end
|
117
|
-
|
118
|
-
def db_type
|
119
|
-
Neo4j::Shared::Boolean
|
120
|
-
end
|
121
|
-
|
122
|
-
alias convert_type db_type
|
123
|
-
|
124
|
-
def to_db(value)
|
125
|
-
return false if FALSE_VALUES.include?(value)
|
126
|
-
case value
|
127
|
-
when TrueClass, FalseClass
|
128
|
-
value
|
129
|
-
when Numeric, /^\-?[0-9]/
|
130
|
-
!value.to_f.zero?
|
131
|
-
else
|
132
|
-
value.present?
|
133
|
-
end
|
134
|
-
end
|
135
|
-
|
136
|
-
alias to_ruby to_db
|
137
|
-
end
|
138
|
-
end
|
139
|
-
|
140
|
-
# Converts Date objects to Java long types. Must be timezone UTC.
|
141
|
-
class DateConverter < BaseConverter
|
142
|
-
class << self
|
143
|
-
def convert_type
|
144
|
-
Date
|
145
|
-
end
|
146
|
-
|
147
|
-
def db_type
|
148
|
-
Integer
|
149
|
-
end
|
150
|
-
|
151
|
-
def to_db(value)
|
152
|
-
Time.utc(value.year, value.month, value.day).to_i
|
153
|
-
end
|
154
|
-
|
155
|
-
def to_ruby(value)
|
156
|
-
value.respond_to?(:to_date) ? value.to_date : Time.at(value).utc.to_date
|
157
|
-
end
|
158
|
-
end
|
159
|
-
end
|
160
|
-
|
161
|
-
# Converts DateTime objects to and from Java long types. Must be timezone UTC.
|
162
89
|
class DateTimeConverter < BaseConverter
|
163
90
|
class << self
|
164
91
|
def convert_type
|
@@ -167,7 +94,7 @@ module Neo4j::Shared
|
|
167
94
|
|
168
95
|
def db_type
|
169
96
|
Integer
|
170
|
-
end
|
97
|
+
end
|
171
98
|
|
172
99
|
# Converts the given DateTime (UTC) value to an Integer.
|
173
100
|
# DateTime values are automatically converted to UTC.
|
@@ -198,29 +125,37 @@ module Neo4j::Shared
|
|
198
125
|
end
|
199
126
|
end
|
200
127
|
|
201
|
-
class
|
128
|
+
class BooleanConverter < BaseConverter
|
129
|
+
FALSE_VALUES = %w(n N no No NO false False FALSE off Off OFF f F).to_set
|
130
|
+
|
202
131
|
class << self
|
203
|
-
def
|
204
|
-
|
132
|
+
def converted?(value)
|
133
|
+
converted_values.include?(value)
|
134
|
+
end
|
135
|
+
|
136
|
+
def converted_values
|
137
|
+
[true, false]
|
205
138
|
end
|
206
139
|
|
207
140
|
def db_type
|
208
|
-
|
141
|
+
Neo4j::Shared::Boolean
|
209
142
|
end
|
210
143
|
|
211
|
-
|
212
|
-
|
144
|
+
alias convert_type db_type
|
145
|
+
|
213
146
|
def to_db(value)
|
214
|
-
if value
|
215
|
-
|
147
|
+
return false if FALSE_VALUES.include?(value)
|
148
|
+
case value
|
149
|
+
when TrueClass, FalseClass
|
150
|
+
value
|
151
|
+
when Numeric, /^\-?[0-9]/
|
152
|
+
!value.to_f.zero?
|
216
153
|
else
|
217
|
-
value.
|
154
|
+
value.present?
|
218
155
|
end
|
219
156
|
end
|
220
157
|
|
221
|
-
|
222
|
-
Time.at(value).utc
|
223
|
-
end
|
158
|
+
alias to_ruby to_db
|
224
159
|
end
|
225
160
|
end
|
226
161
|
|
@@ -240,7 +175,7 @@ module Neo4j::Shared
|
|
240
175
|
end
|
241
176
|
|
242
177
|
def to_ruby(value)
|
243
|
-
Psych.load(value)
|
178
|
+
value.is_a?(Hash) ? value : Psych.load(value)
|
244
179
|
end
|
245
180
|
end
|
246
181
|
end
|
@@ -327,16 +262,21 @@ module Neo4j::Shared
|
|
327
262
|
end
|
328
263
|
end
|
329
264
|
|
330
|
-
|
331
265
|
# Modifies a hash's values to be of types acceptable to Neo4j or matching what the user defined using `type` in property definitions.
|
332
266
|
# @param [Neo4j::Shared::Property] obj A node or rel that mixes in the Property module
|
333
267
|
# @param [Symbol] medium Indicates the type of conversion to perform.
|
334
268
|
# @param [Hash] properties A hash of symbol-keyed properties for conversion.
|
335
269
|
def convert_properties_to(obj, medium, properties)
|
336
270
|
direction = medium == :ruby ? :to_ruby : :to_db
|
337
|
-
properties.each_pair do |key, value|
|
271
|
+
properties.to_h.each_pair do |key, value|
|
338
272
|
next if skip_conversion?(obj, key, value)
|
339
|
-
|
273
|
+
|
274
|
+
converted_value = convert_property(key, value, direction)
|
275
|
+
if properties.is_a?(Neo4j::AttributeSet)
|
276
|
+
properties.write_cast_value(key, converted_value)
|
277
|
+
else
|
278
|
+
properties[key] = converted_value
|
279
|
+
end
|
340
280
|
end
|
341
281
|
end
|
342
282
|
|
@@ -39,15 +39,15 @@ module Neo4j::Shared
|
|
39
39
|
#
|
40
40
|
# @return [Object, nil] The attribute value before typecasting
|
41
41
|
def attribute_before_type_cast(name)
|
42
|
-
@attributes ||= {}
|
43
|
-
@attributes
|
42
|
+
@attributes ||= Neo4j::AttributeSet.new({}, self.class.attributes.keys)
|
43
|
+
@attributes.fetch_value(name.to_s)
|
44
44
|
end
|
45
45
|
|
46
46
|
private
|
47
47
|
|
48
48
|
# Reads the attribute and typecasts the result
|
49
49
|
def attribute(name)
|
50
|
-
typecast_attribute(_attribute_typecaster(name), super)
|
50
|
+
Property::NEO4J_DRIVER_DATA_TYPES.include?(_attribute_type(name)) ? super : typecast_attribute(_attribute_typecaster(name), super)
|
51
51
|
end
|
52
52
|
|
53
53
|
def typecast_attribute(typecaster, value)
|
@@ -66,7 +66,8 @@ module Neo4j::Shared
|
|
66
66
|
# @private
|
67
67
|
def _attribute_typecaster(attribute_name)
|
68
68
|
type = _attribute_type(attribute_name)
|
69
|
-
|
69
|
+
default_typecaster = self.class.attributes[attribute_name].typecaster
|
70
|
+
caster = default_typecaster || Neo4j::Shared::TypeConverters.typecaster_for(type)
|
70
71
|
caster || fail(Neo4j::UnknownTypeConverterError, "Unable to cast to type #{type}")
|
71
72
|
end
|
72
73
|
|
data/lib/neo4j/transaction.rb
CHANGED
@@ -16,7 +16,7 @@ module Neo4j
|
|
16
16
|
# Runs the given block in a new transaction.
|
17
17
|
# @param [Boolean] run_in_tx if true a new transaction will not be created, instead if will simply yield to the given block
|
18
18
|
# @@yield [Neo4j::Transaction::Instance]
|
19
|
-
def run(
|
19
|
+
def run(_driver, run_in_tx)
|
20
20
|
return yield(nil) unless run_in_tx
|
21
21
|
|
22
22
|
tx = Neo4j::Transaction.new
|
data/lib/neo4j/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.0.pre.alpha.
|
4
|
+
version: 10.0.0.pre.alpha.10
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Andreas Ronge, Brian Underwood, Chris Grigg, Heinrich Klobuczek
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2020-02-
|
11
|
+
date: 2020-02-18 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activemodel
|
@@ -304,6 +304,7 @@ files:
|
|
304
304
|
- lib/neo4j/active_rel/types.rb
|
305
305
|
- lib/neo4j/active_rel/validations.rb
|
306
306
|
- lib/neo4j/ansi.rb
|
307
|
+
- lib/neo4j/attribute_set.rb
|
307
308
|
- lib/neo4j/class_arguments.rb
|
308
309
|
- lib/neo4j/config.rb
|
309
310
|
- lib/neo4j/core.rb
|
@@ -328,6 +329,7 @@ files:
|
|
328
329
|
- lib/neo4j/core/schema_errors.rb
|
329
330
|
- lib/neo4j/core/wrappable.rb
|
330
331
|
- lib/neo4j/errors.rb
|
332
|
+
- lib/neo4j/lazy_attribute_hash.rb
|
331
333
|
- lib/neo4j/migration.rb
|
332
334
|
- lib/neo4j/migrations.rb
|
333
335
|
- lib/neo4j/migrations/base.rb
|
@@ -415,7 +417,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
415
417
|
- !ruby/object:Gem::Version
|
416
418
|
version: 1.3.1
|
417
419
|
requirements: []
|
418
|
-
rubygems_version: 3.
|
420
|
+
rubygems_version: 3.1.2
|
419
421
|
signing_key:
|
420
422
|
specification_version: 4
|
421
423
|
summary: A graph database for Ruby
|