activegraph 10.0.0.pre.alpha.9 → 10.0.0.pre.alpha.10
Sign up to get free protection for your applications and to get access to all the features.
- 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
|