neo4j 3.0.0.alpha.9 → 3.0.0.alpha.10
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG +3 -0
- data/Gemfile +2 -1
- data/lib/neo4j.rb +21 -4
- data/lib/neo4j/active_node.rb +5 -35
- data/lib/neo4j/active_node/callbacks.rb +1 -34
- data/lib/neo4j/active_node/has_n/association.rb +35 -16
- data/lib/neo4j/active_node/id_property.rb +1 -1
- data/lib/neo4j/active_node/initialize.rb +2 -2
- data/lib/neo4j/active_node/labels.rb +3 -3
- data/lib/neo4j/active_node/node_wrapper.rb +50 -0
- data/lib/neo4j/active_node/persistence.rb +2 -205
- data/lib/neo4j/active_node/property.rb +1 -194
- data/lib/neo4j/active_node/rels.rb +2 -2
- data/lib/neo4j/active_node/validations.rb +9 -41
- data/lib/neo4j/active_rel.rb +34 -0
- data/lib/neo4j/active_rel/callbacks.rb +13 -0
- data/lib/neo4j/active_rel/initialize.rb +30 -0
- data/lib/neo4j/active_rel/persistence.rb +80 -0
- data/lib/neo4j/active_rel/property.rb +64 -0
- data/lib/neo4j/active_rel/query.rb +66 -0
- data/lib/neo4j/active_rel/rel_wrapper.rb +18 -0
- data/lib/neo4j/active_rel/related_node.rb +42 -0
- data/lib/neo4j/active_rel/validations.rb +9 -0
- data/lib/neo4j/shared.rb +34 -0
- data/lib/neo4j/shared/callbacks.rb +40 -0
- data/lib/neo4j/{active_node → shared}/identity.rb +6 -2
- data/lib/neo4j/shared/persistence.rb +214 -0
- data/lib/neo4j/shared/property.rb +220 -0
- data/lib/neo4j/shared/validations.rb +48 -0
- data/lib/neo4j/version.rb +1 -1
- data/lib/neo4j/wrapper.rb +2 -50
- metadata +18 -5
- data/lib/neo4j/active_node/has_n/nodes.rb +0 -90
- data/lib/neo4j/active_node/quick_query.rb +0 -254
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: f3ed632e184847cf87dace2146181d1fbde5bc7c
|
4
|
+
data.tar.gz: 3c4314c17410475fad46f4b5eed730186e800458
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: f8732369f9890161646404ccbdc2f3aca3d6facc4119c775a5dac45ae0b130997039dfc0a6134f7004801969c333b2dd3d191de1adcd5603e4bd2c88904830b4
|
7
|
+
data.tar.gz: edfdf0fc367e93e5d72e4255aec79216f80834aab3d40bbc9f5447762883412521b273980c0d15ff7bbc6d90a4969248a2bea632fe03d9a034cc9d6278ee9066
|
data/CHANGELOG
CHANGED
data/Gemfile
CHANGED
data/lib/neo4j.rb
CHANGED
@@ -17,9 +17,28 @@ require 'active_support/core_ext/class/attribute.rb'
|
|
17
17
|
require 'active_attr'
|
18
18
|
require 'neo4j/config'
|
19
19
|
require 'neo4j/wrapper'
|
20
|
+
require 'neo4j/active_rel/rel_wrapper'
|
21
|
+
require 'neo4j/active_node/node_wrapper'
|
20
22
|
require 'neo4j/type_converters'
|
21
|
-
require
|
22
|
-
|
23
|
+
require 'neo4j/paginated'
|
24
|
+
|
25
|
+
require 'neo4j/shared/callbacks'
|
26
|
+
require 'neo4j/shared/property'
|
27
|
+
require 'neo4j/shared/persistence'
|
28
|
+
require 'neo4j/shared/validations'
|
29
|
+
require 'neo4j/shared/identity'
|
30
|
+
require 'neo4j/shared'
|
31
|
+
|
32
|
+
require 'neo4j/active_rel/callbacks'
|
33
|
+
require 'neo4j/active_rel/initialize'
|
34
|
+
require 'neo4j/active_rel/property'
|
35
|
+
require 'neo4j/active_rel/persistence'
|
36
|
+
require 'neo4j/active_rel/validations'
|
37
|
+
require 'neo4j/active_rel/query'
|
38
|
+
require 'neo4j/active_rel/related_node'
|
39
|
+
require 'neo4j/active_rel'
|
40
|
+
|
41
|
+
require 'neo4j/active_node/labels'
|
23
42
|
require 'neo4j/active_node/id_property'
|
24
43
|
require 'neo4j/active_node/callbacks'
|
25
44
|
require 'neo4j/active_node/initialize'
|
@@ -29,11 +48,9 @@ require 'neo4j/active_node/validations'
|
|
29
48
|
require 'neo4j/active_node/rels'
|
30
49
|
require 'neo4j/active_node/has_n'
|
31
50
|
require 'neo4j/active_node/has_n/association'
|
32
|
-
require 'neo4j/active_node/has_n/nodes'
|
33
51
|
require 'neo4j/active_node/query/query_proxy'
|
34
52
|
require 'neo4j/active_node/query'
|
35
53
|
require 'neo4j/active_node/serialized_properties'
|
36
|
-
require 'neo4j/paginated'
|
37
54
|
require 'neo4j/active_node'
|
38
55
|
|
39
56
|
require 'neo4j/active_node/orm_adapter'
|
data/lib/neo4j/active_node.rb
CHANGED
@@ -23,55 +23,25 @@ module Neo4j
|
|
23
23
|
#
|
24
24
|
module ActiveNode
|
25
25
|
extend ActiveSupport::Concern
|
26
|
-
extend ActiveModel::Naming
|
27
|
-
|
28
|
-
include ActiveModel::Conversion
|
29
|
-
include ActiveModel::Serializers::Xml
|
30
|
-
include ActiveModel::Serializers::JSON
|
31
26
|
|
27
|
+
include Neo4j::Shared
|
32
28
|
include Neo4j::ActiveNode::Initialize
|
33
|
-
include Neo4j::ActiveNode::Identity
|
34
29
|
include Neo4j::ActiveNode::IdProperty
|
35
|
-
include Neo4j::ActiveNode::Persistence
|
36
30
|
include Neo4j::ActiveNode::SerializedProperties
|
37
31
|
include Neo4j::ActiveNode::Property
|
38
|
-
include Neo4j::ActiveNode::
|
39
|
-
include Neo4j::ActiveNode::Labels
|
32
|
+
include Neo4j::ActiveNode::Persistence
|
40
33
|
include Neo4j::ActiveNode::Validations
|
41
34
|
include Neo4j::ActiveNode::Callbacks
|
35
|
+
include Neo4j::ActiveNode::Query
|
36
|
+
include Neo4j::ActiveNode::Labels
|
42
37
|
include Neo4j::ActiveNode::Rels
|
43
38
|
include Neo4j::ActiveNode::HasN
|
44
39
|
|
45
|
-
def wrapper
|
46
|
-
self
|
47
|
-
end
|
48
|
-
|
49
40
|
def neo4j_obj
|
50
|
-
|
51
|
-
end
|
52
|
-
|
53
|
-
module ClassMethods
|
54
|
-
def neo4j_session_name (name)
|
55
|
-
@neo4j_session_name = name
|
56
|
-
end
|
57
|
-
|
58
|
-
def neo4j_session
|
59
|
-
if @neo4j_session_name
|
60
|
-
Neo4j::Session.named(@neo4j_session_name) || raise("#{self.name} is configured to use a neo4j session named #{@neo4j_session_name}, but no such session is registered with Neo4j::Session")
|
61
|
-
else
|
62
|
-
Neo4j::Session.current
|
63
|
-
end
|
64
|
-
end
|
41
|
+
_persisted_obj || raise("Tried to access native neo4j object on a non persisted object")
|
65
42
|
end
|
66
43
|
|
67
44
|
included do
|
68
|
-
self.include_root_in_json = true
|
69
|
-
|
70
|
-
|
71
|
-
def self.i18n_scope
|
72
|
-
:neo4j
|
73
|
-
end
|
74
|
-
|
75
45
|
def self.inherited(other)
|
76
46
|
inherited_indexes(other) if self.respond_to?(:indexed_properties)
|
77
47
|
attributes.each_pair do |k,v|
|
@@ -2,40 +2,7 @@ module Neo4j
|
|
2
2
|
module ActiveNode
|
3
3
|
module Callbacks #:nodoc:
|
4
4
|
extend ActiveSupport::Concern
|
5
|
-
|
6
|
-
module ClassMethods
|
7
|
-
include ActiveModel::Callbacks
|
8
|
-
end
|
9
|
-
|
10
|
-
included do
|
11
|
-
include ActiveModel::Validations::Callbacks
|
12
|
-
|
13
|
-
define_model_callbacks :initialize, :find, :only => :after
|
14
|
-
define_model_callbacks :save, :create, :update, :destroy
|
15
|
-
end
|
16
|
-
|
17
|
-
def destroy #:nodoc:
|
18
|
-
run_callbacks(:destroy) { super }
|
19
|
-
end
|
20
|
-
|
21
|
-
def touch(*) #:nodoc:
|
22
|
-
run_callbacks(:touch) { super }
|
23
|
-
end
|
24
|
-
|
25
|
-
private
|
26
|
-
|
27
|
-
def create_or_update #:nodoc:
|
28
|
-
run_callbacks(:save) { super }
|
29
|
-
end
|
30
|
-
|
31
|
-
def create_model #:nodoc:
|
32
|
-
run_callbacks(:create) { super }
|
33
|
-
end
|
34
|
-
|
35
|
-
def update_model(*) #:nodoc:
|
36
|
-
run_callbacks(:update) { super }
|
37
|
-
end
|
5
|
+
include Neo4j::Shared::Callbacks
|
38
6
|
end
|
39
|
-
|
40
7
|
end
|
41
8
|
end
|
@@ -7,26 +7,16 @@ module Neo4j
|
|
7
7
|
attr_reader :type, :name, :relationship, :direction
|
8
8
|
|
9
9
|
def initialize(type, direction, name, options = {})
|
10
|
-
|
11
|
-
raise ArgumentError, "Invalid direction: #{direction.inspect}" if not [:out, :in, :both].include?(direction.to_sym)
|
10
|
+
check_valid_type_and_dir(type, direction)
|
12
11
|
@type = type.to_sym
|
13
12
|
@name = name
|
14
13
|
@direction = direction.to_sym
|
15
|
-
raise ArgumentError, "Cannot specify both :type and :origin (#{base_declaration})" if options[:type] && options[:origin]
|
16
|
-
|
17
14
|
@target_class_name_from_name = name.to_s.classify
|
18
|
-
|
19
|
-
@callbacks = {before: options[:before], after: options[:after]}
|
20
|
-
@relationship_type = options[:type] && options[:type].to_sym
|
21
|
-
@origin = options[:origin] && options[:origin].to_sym
|
15
|
+
set_vars_from_options(options)
|
22
16
|
end
|
23
17
|
|
24
18
|
def target_class_option(options)
|
25
|
-
|
26
|
-
@target_class_name_from_name
|
27
|
-
elsif options[:model_class]
|
28
|
-
options[:model_class]
|
29
|
-
end
|
19
|
+
options[:model_class].nil? ? @target_class_name_from_name : options[:model_class]
|
30
20
|
end
|
31
21
|
|
32
22
|
# Return cypher partial query string for the relationship part of a MATCH (arrow / relationship definition)
|
@@ -35,7 +25,6 @@ module Neo4j
|
|
35
25
|
|
36
26
|
relationship_type = relationship_type(create)
|
37
27
|
relationship_name_cypher = ":`#{relationship_type}`" if relationship_type
|
38
|
-
|
39
28
|
properties_string = get_properties_string(properties)
|
40
29
|
relationship_cypher = get_relationship_cypher(var, relationship_name_cypher, properties_string)
|
41
30
|
get_direction(relationship_cypher, create)
|
@@ -63,9 +52,12 @@ module Neo4j
|
|
63
52
|
end
|
64
53
|
|
65
54
|
def relationship_type(create = false)
|
66
|
-
|
55
|
+
case
|
56
|
+
when @relationship_class
|
57
|
+
@relationship_class._type
|
58
|
+
when @relationship_type
|
67
59
|
@relationship_type
|
68
|
-
|
60
|
+
when @origin
|
69
61
|
origin_type
|
70
62
|
else
|
71
63
|
(create || exceptional_target_class?) && "##{@name}"
|
@@ -91,7 +83,9 @@ module Neo4j
|
|
91
83
|
end
|
92
84
|
|
93
85
|
def get_properties_string(properties)
|
86
|
+
properties[Neo4j::Config.class_name_property] = @relationship_class.name if @relationship_class
|
94
87
|
p = properties.map do |key, value|
|
88
|
+
next if key == :_classname
|
95
89
|
"#{key}: #{value.inspect}"
|
96
90
|
end.join(', ')
|
97
91
|
p.size == 0 ? '' : " {#{p}}"
|
@@ -101,6 +95,21 @@ module Neo4j
|
|
101
95
|
target_class.associations[@origin].relationship_type
|
102
96
|
end
|
103
97
|
|
98
|
+
def relationship_class
|
99
|
+
@relationship_class
|
100
|
+
end
|
101
|
+
|
102
|
+
private
|
103
|
+
|
104
|
+
def set_vars_from_options(options)
|
105
|
+
validate_option_combinations(options)
|
106
|
+
@target_class_option = target_class_option(options)
|
107
|
+
@callbacks = {before: options[:before], after: options[:after]}
|
108
|
+
@origin = options[:origin] && options[:origin].to_sym
|
109
|
+
@relationship_class = options[:rel_class]
|
110
|
+
@relationship_type = options[:type] && options[:type].to_sym
|
111
|
+
end
|
112
|
+
|
104
113
|
# Return basic details about association as declared in the model
|
105
114
|
# @example
|
106
115
|
# has_many :in, :bands
|
@@ -108,6 +117,16 @@ module Neo4j
|
|
108
117
|
"#{type} #{direction.inspect}, #{name.inspect}"
|
109
118
|
end
|
110
119
|
|
120
|
+
def check_valid_type_and_dir(type, direction)
|
121
|
+
raise ArgumentError, "Invalid association type: #{type.inspect}" if not [:has_many, :has_one].include?(type.to_sym)
|
122
|
+
raise ArgumentError, "Invalid direction: #{direction.inspect}" if not [:out, :in, :both].include?(direction.to_sym)
|
123
|
+
end
|
124
|
+
|
125
|
+
def validate_option_combinations(options)
|
126
|
+
raise ArgumentError, "Cannot specify both :type and :origin (#{base_declaration})" if options[:type] && options[:origin]
|
127
|
+
raise ArgumentError, "Cannot specify both :type and :rel_class (#{base_declaration})" if options[:type] && options[:rel_class]
|
128
|
+
raise ArgumentError, "Cannot specify both :origin and :rel_class (#{base_declaration}" if options[:origin] && options[:rel_class]
|
129
|
+
end
|
111
130
|
|
112
131
|
# Determine if model class as derived from the association name would be different than the one specified via the model_class key
|
113
132
|
# @example
|
@@ -2,13 +2,13 @@ module Neo4j::ActiveNode::Initialize
|
|
2
2
|
extend ActiveSupport::Concern
|
3
3
|
include Neo4j::TypeConverters
|
4
4
|
|
5
|
-
attr_reader :
|
5
|
+
attr_reader :_persisted_obj
|
6
6
|
|
7
7
|
# called when loading the node from the database
|
8
8
|
# @param [Neo4j::Node] persisted_node the node this class wraps
|
9
9
|
# @param [Hash] properties of the persisted node.
|
10
10
|
def init_on_load(persisted_node, properties)
|
11
|
-
@
|
11
|
+
@_persisted_obj = persisted_node
|
12
12
|
changed_attributes && changed_attributes.clear
|
13
13
|
@attributes = attributes.merge(properties.stringify_keys)
|
14
14
|
self.default_properties=properties
|
@@ -13,20 +13,20 @@ module Neo4j
|
|
13
13
|
# @return the labels
|
14
14
|
# @see Neo4j-core
|
15
15
|
def labels
|
16
|
-
@
|
16
|
+
@_persisted_obj.labels
|
17
17
|
end
|
18
18
|
|
19
19
|
# adds one or more labels
|
20
20
|
# @see Neo4j-core
|
21
21
|
def add_label(*label)
|
22
|
-
@
|
22
|
+
@_persisted_obj.add_label(*label)
|
23
23
|
end
|
24
24
|
|
25
25
|
# Removes one or more labels
|
26
26
|
# Be careful, don't remove the label representing the Ruby class.
|
27
27
|
# @see Neo4j-core
|
28
28
|
def remove_label(*label)
|
29
|
-
@
|
29
|
+
@_persisted_obj.remove_label(*label)
|
30
30
|
end
|
31
31
|
|
32
32
|
def self.included(klass)
|
@@ -0,0 +1,50 @@
|
|
1
|
+
class Neo4j::Node
|
2
|
+
module Wrapper
|
3
|
+
|
4
|
+
# this is a plugin in the neo4j-core so that the Ruby wrapper will be wrapped around the Neo4j::Node objects
|
5
|
+
def wrapper
|
6
|
+
most_concrete_class = sorted_wrapper_classes
|
7
|
+
wrapped_node = most_concrete_class.new
|
8
|
+
wrapped_node.init_on_load(self, self.props)
|
9
|
+
wrapped_node
|
10
|
+
end
|
11
|
+
|
12
|
+
def checked_labels_set
|
13
|
+
@@_checked_labels_set ||= Set.new
|
14
|
+
end
|
15
|
+
|
16
|
+
def check_label(label_name)
|
17
|
+
unless checked_labels_set.include?(label_name)
|
18
|
+
load_class_from_label(label_name)
|
19
|
+
# do this only once
|
20
|
+
checked_labels_set.add(label_name)
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
def sorted_wrapper_classes
|
25
|
+
if self.props.is_a?(Hash) && self.props.has_key?(Neo4j::Config.class_name_property)
|
26
|
+
self.props[Neo4j::Config.class_name_property].constantize
|
27
|
+
else
|
28
|
+
wrappers = _class_wrappers
|
29
|
+
return self if wrappers.nil?
|
30
|
+
wrapper_classes = wrappers.map{|w| Neo4j::ActiveNode::Labels._wrapped_labels[w]}
|
31
|
+
wrapper_classes.sort.first
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
def load_class_from_label(label_name)
|
36
|
+
begin
|
37
|
+
label_name.to_s.split("::").inject(Kernel) {|container, name| container.const_get(name.to_s) }
|
38
|
+
rescue NameError
|
39
|
+
nil
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
def _class_wrappers
|
44
|
+
labels.find_all do |label_name|
|
45
|
+
check_label(label_name)
|
46
|
+
Neo4j::ActiveNode::Labels._wrapped_labels[label_name].class == Class
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
@@ -1,32 +1,13 @@
|
|
1
1
|
module Neo4j::ActiveNode
|
2
2
|
module Persistence
|
3
|
-
class RecordInvalidError < RuntimeError
|
4
|
-
attr_reader :record
|
5
|
-
|
6
|
-
def initialize(record)
|
7
|
-
@record = record
|
8
|
-
super(@record.errors.full_messages.join(", "))
|
9
|
-
end
|
10
|
-
end
|
11
|
-
|
12
3
|
extend ActiveSupport::Concern
|
13
|
-
include Neo4j::
|
14
|
-
|
15
|
-
# Saves the model.
|
16
|
-
#
|
17
|
-
# If the model is new a record gets created in the database, otherwise the existing record gets updated.
|
18
|
-
# If perform_validation is true validations run.
|
19
|
-
# If any of them fail the action is cancelled and save returns false. If the flag is false validations are bypassed altogether. See ActiveRecord::Validations for more information.
|
20
|
-
# There’s a series of callbacks associated with save. If any of the before_* callbacks return false the action is cancelled and save returns false.
|
21
|
-
def save(*)
|
22
|
-
update_magic_properties
|
23
|
-
create_or_update
|
24
|
-
end
|
4
|
+
include Neo4j::Shared::Persistence
|
25
5
|
|
26
6
|
# Creates a model with values matching those of the instance attributes and returns its id.
|
27
7
|
# @private
|
28
8
|
# @return true
|
29
9
|
def create_model(*)
|
10
|
+
create_magic_properties
|
30
11
|
set_timestamps
|
31
12
|
create_magic_properties
|
32
13
|
properties = convert_properties_to :db, props
|
@@ -37,97 +18,6 @@ module Neo4j::ActiveNode
|
|
37
18
|
true
|
38
19
|
end
|
39
20
|
|
40
|
-
# Persist the object to the database. Validations and Callbacks are included
|
41
|
-
# by default but validation can be disabled by passing :validate => false
|
42
|
-
# to #save! Creates a new transaction.
|
43
|
-
#
|
44
|
-
# @raise a RecordInvalidError if there is a problem during save.
|
45
|
-
# @param (see Neo4j::Rails::Validations#save)
|
46
|
-
# @return nil
|
47
|
-
# @see #save
|
48
|
-
# @see Neo4j::Rails::Validations Neo4j::Rails::Validations - for the :validate parameter
|
49
|
-
# @see Neo4j::Rails::Callbacks Neo4j::Rails::Callbacks - for callbacks
|
50
|
-
def save!(*args)
|
51
|
-
unless save(*args)
|
52
|
-
raise RecordInvalidError.new(self)
|
53
|
-
end
|
54
|
-
end
|
55
|
-
|
56
|
-
# Convenience method to set attribute and #save at the same time
|
57
|
-
# @param [Symbol, String] attribute of the attribute to update
|
58
|
-
# @param [Object] value to set
|
59
|
-
def update_attribute(attribute, value)
|
60
|
-
send("#{attribute}=", value)
|
61
|
-
self.save
|
62
|
-
end
|
63
|
-
|
64
|
-
# Convenience method to set attribute and #save! at the same time
|
65
|
-
# @param [Symbol, String] attribute of the attribute to update
|
66
|
-
# @param [Object] value to set
|
67
|
-
def update_attribute!(attribute, value)
|
68
|
-
send("#{attribute}=", value)
|
69
|
-
self.save!
|
70
|
-
end
|
71
|
-
|
72
|
-
# Convenience method to set multiple attributes and #save at the same time
|
73
|
-
# @param [Hash] attributes of names and values of attributes to set
|
74
|
-
def update_attributes(attributes)
|
75
|
-
assign_attributes(attributes)
|
76
|
-
self.save
|
77
|
-
end
|
78
|
-
|
79
|
-
def create_or_update
|
80
|
-
# since the same model can be created or updated twice from a relationship we have to have this guard
|
81
|
-
@_create_or_updating = true
|
82
|
-
result = persisted? ? update_model : create_model
|
83
|
-
unless result != false
|
84
|
-
Neo4j::Transaction.current.fail if Neo4j::Transaction.current
|
85
|
-
false
|
86
|
-
else
|
87
|
-
true
|
88
|
-
end
|
89
|
-
rescue => e
|
90
|
-
Neo4j::Transaction.current.fail if Neo4j::Transaction.current
|
91
|
-
raise e
|
92
|
-
ensure
|
93
|
-
@_create_or_updating = nil
|
94
|
-
end
|
95
|
-
|
96
|
-
def exist?
|
97
|
-
_persisted_node && _persisted_node.exist?
|
98
|
-
end
|
99
|
-
|
100
|
-
# Returns +true+ if the object was destroyed.
|
101
|
-
def destroyed?
|
102
|
-
@_deleted || (!new_record? && !exist?)
|
103
|
-
end
|
104
|
-
|
105
|
-
# Returns +true+ if the record is persisted, i.e. it’s not a new record and it was not destroyed
|
106
|
-
def persisted?
|
107
|
-
!new_record? && !destroyed?
|
108
|
-
end
|
109
|
-
|
110
|
-
# Returns +true+ if the record hasn't been saved to Neo4j yet.
|
111
|
-
def new_record?
|
112
|
-
! _persisted_node
|
113
|
-
end
|
114
|
-
|
115
|
-
alias :new? :new_record?
|
116
|
-
|
117
|
-
def destroy
|
118
|
-
_persisted_node && _persisted_node.del
|
119
|
-
@_deleted = true
|
120
|
-
end
|
121
|
-
|
122
|
-
def update_model
|
123
|
-
if changed_attributes && !changed_attributes.empty?
|
124
|
-
changed_props = attributes.select{|k,v| changed_attributes.include?(k)}
|
125
|
-
changed_props = convert_properties_to :db, changed_props
|
126
|
-
_persisted_node.update_props(changed_props)
|
127
|
-
changed_attributes.clear
|
128
|
-
end
|
129
|
-
end
|
130
|
-
|
131
21
|
def _create_node(*args)
|
132
22
|
session = self.class.neo4j_session
|
133
23
|
props = self.class.default_property_values(self)
|
@@ -137,75 +27,6 @@ module Neo4j::ActiveNode
|
|
137
27
|
session.create_node(props, labels)
|
138
28
|
end
|
139
29
|
|
140
|
-
# @return [Hash] all defined and none nil properties
|
141
|
-
def props
|
142
|
-
attributes.reject{|k,v| v.nil?}.symbolize_keys
|
143
|
-
end
|
144
|
-
|
145
|
-
# @return true if the attributes hash has been frozen
|
146
|
-
def frozen?
|
147
|
-
freeze_if_deleted
|
148
|
-
@attributes.frozen?
|
149
|
-
end
|
150
|
-
|
151
|
-
def freeze
|
152
|
-
@attributes.freeze
|
153
|
-
self
|
154
|
-
end
|
155
|
-
|
156
|
-
def freeze_if_deleted
|
157
|
-
unless new_record?
|
158
|
-
# TODO - Neo4j::IdentityMap.remove_node_by_id(neo_id)
|
159
|
-
unless self.class.load_entity(neo_id)
|
160
|
-
@_deleted = true
|
161
|
-
freeze
|
162
|
-
end
|
163
|
-
end
|
164
|
-
end
|
165
|
-
|
166
|
-
def reload
|
167
|
-
return self if new_record?
|
168
|
-
changed_attributes && changed_attributes.clear
|
169
|
-
unless reload_from_database
|
170
|
-
@_deleted = true
|
171
|
-
freeze
|
172
|
-
end
|
173
|
-
self
|
174
|
-
end
|
175
|
-
|
176
|
-
def reload_from_database
|
177
|
-
# TODO - Neo4j::IdentityMap.remove_node_by_id(neo_id)
|
178
|
-
if reloaded = self.class.load_entity(neo_id)
|
179
|
-
send(:attributes=, reloaded.attributes)
|
180
|
-
end
|
181
|
-
reloaded
|
182
|
-
end
|
183
|
-
|
184
|
-
# Updates this resource with all the attributes from the passed-in Hash and requests that the record be saved.
|
185
|
-
# If saving fails because the resource is invalid then false will be returned.
|
186
|
-
def update(attributes)
|
187
|
-
self.attributes = attributes
|
188
|
-
save
|
189
|
-
end
|
190
|
-
alias_method :update_attributes, :update
|
191
|
-
|
192
|
-
# Same as {#update_attributes}, but raises an exception if saving fails.
|
193
|
-
def update!(attributes)
|
194
|
-
self.attributes = attributes
|
195
|
-
save!
|
196
|
-
end
|
197
|
-
alias_method :update_attributes!, :update!
|
198
|
-
|
199
|
-
def cache_key
|
200
|
-
if self.new_record?
|
201
|
-
"#{self.class.model_name.cache_key}/new"
|
202
|
-
elsif self.respond_to?(:updated_at) && !self.updated_at.blank?
|
203
|
-
"#{self.class.model_name.cache_key}/#{neo_id}-#{self.updated_at.utc.to_s(:number)}"
|
204
|
-
else
|
205
|
-
"#{self.class.model_name.cache_key}/#{neo_id}"
|
206
|
-
end
|
207
|
-
end
|
208
|
-
|
209
30
|
module ClassMethods
|
210
31
|
# Creates a saves a new node
|
211
32
|
# @param [Hash] props the properties the new node should have
|
@@ -237,33 +58,9 @@ module Neo4j::ActiveNode
|
|
237
58
|
def load_entity(id)
|
238
59
|
Neo4j::Node.load(id)
|
239
60
|
end
|
240
|
-
|
241
61
|
end
|
242
62
|
|
243
63
|
private
|
244
64
|
|
245
|
-
def create_magic_properties
|
246
|
-
|
247
|
-
end
|
248
|
-
|
249
|
-
def update_magic_properties
|
250
|
-
self.updated_at = DateTime.now if respond_to?(:updated_at=) && changed?
|
251
|
-
end
|
252
|
-
|
253
|
-
def set_classname(props)
|
254
|
-
props[Neo4j::Config.class_name_property] = self.class.name if self.class.cached_class?
|
255
|
-
end
|
256
|
-
|
257
|
-
def assign_attributes(attributes)
|
258
|
-
attributes.each do |attribute, value|
|
259
|
-
send("#{attribute}=", value)
|
260
|
-
end
|
261
|
-
end
|
262
|
-
|
263
|
-
def set_timestamps
|
264
|
-
self.created_at = DateTime.now if respond_to?(:created_at=)
|
265
|
-
self.updated_at = self.created_at if respond_to?(:updated_at=)
|
266
|
-
end
|
267
65
|
end
|
268
|
-
|
269
66
|
end
|