neo4j 2.0.0.alpha.5-java → 2.0.0.alpha.6-java
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.
- data/CHANGELOG +12 -0
- data/Gemfile +0 -4
- data/README.rdoc +106 -62
- data/lib/neo4j.rb +7 -33
- data/lib/neo4j/performance.rb +43 -0
- data/lib/neo4j/rails/accept_id.rb +19 -18
- data/lib/neo4j/rails/attributes.rb +366 -120
- data/lib/neo4j/rails/finders.rb +41 -15
- data/lib/neo4j/rails/has_n.rb +203 -0
- data/lib/neo4j/rails/identity.rb +25 -0
- data/lib/neo4j/rails/model.rb +65 -242
- data/lib/neo4j/rails/nested_attributes.rb +108 -0
- data/lib/neo4j/rails/node_persistance.rb +56 -0
- data/lib/neo4j/rails/observer.rb +0 -2
- data/lib/neo4j/rails/persistence.rb +32 -154
- data/lib/neo4j/rails/rack_middleware.rb +26 -2
- data/lib/neo4j/rails/rails.rb +9 -6
- data/lib/neo4j/rails/railtie.rb +1 -2
- data/lib/neo4j/rails/relationship.rb +18 -125
- data/lib/neo4j/rails/relationship_persistence.rb +107 -0
- data/lib/neo4j/rails/relationships/node_dsl.rb +72 -44
- data/lib/neo4j/rails/relationships/relationships.rb +187 -59
- data/lib/neo4j/rails/relationships/rels_dsl.rb +18 -17
- data/lib/neo4j/rails/relationships/storage.rb +19 -17
- data/lib/neo4j/rails/timestamps.rb +53 -51
- data/lib/neo4j/rails/transaction.rb +9 -1
- data/lib/neo4j/rails/validations/uniqueness.rb +1 -1
- data/lib/neo4j/rails/versioning/versioning.rb +2 -2
- data/lib/neo4j/version.rb +1 -1
- data/lib/orm_adapter/adapters/neo4j.rb +47 -46
- data/neo4j.gemspec +1 -1
- metadata +10 -69
- data/lib/neo4j/algo/algo.rb +0 -294
- data/lib/neo4j/batch/batch.rb +0 -4
- data/lib/neo4j/batch/indexer.rb +0 -109
- data/lib/neo4j/batch/inserter.rb +0 -179
- data/lib/neo4j/batch/rule_inserter.rb +0 -24
- data/lib/neo4j/batch/rule_node.rb +0 -72
- data/lib/neo4j/config.rb +0 -177
- data/lib/neo4j/core_ext/class/inheritable_attributes.rb +0 -12
- data/lib/neo4j/core_ext/class/rewrite_inheritable_attributes.rb +0 -170
- data/lib/neo4j/database.rb +0 -158
- data/lib/neo4j/equal.rb +0 -21
- data/lib/neo4j/event_handler.rb +0 -263
- data/lib/neo4j/has_list/class_methods.rb +0 -11
- data/lib/neo4j/has_list/has_list.rb +0 -3
- data/lib/neo4j/has_list/mapping.rb +0 -133
- data/lib/neo4j/has_n/class_methods.rb +0 -119
- data/lib/neo4j/has_n/decl_relationship_dsl.rb +0 -246
- data/lib/neo4j/has_n/has_n.rb +0 -3
- data/lib/neo4j/has_n/mapping.rb +0 -98
- data/lib/neo4j/identity_map.rb +0 -140
- data/lib/neo4j/index/class_methods.rb +0 -108
- data/lib/neo4j/index/index.rb +0 -39
- data/lib/neo4j/index/indexer.rb +0 -341
- data/lib/neo4j/index/indexer_registry.rb +0 -68
- data/lib/neo4j/index/lucene_query.rb +0 -256
- data/lib/neo4j/load.rb +0 -25
- data/lib/neo4j/migrations/class_methods.rb +0 -110
- data/lib/neo4j/migrations/extensions.rb +0 -58
- data/lib/neo4j/migrations/lazy_node_mixin.rb +0 -41
- data/lib/neo4j/migrations/migration.rb +0 -112
- data/lib/neo4j/migrations/migrations.rb +0 -6
- data/lib/neo4j/migrations/node_mixin.rb +0 -80
- data/lib/neo4j/migrations/ref_node_wrapper.rb +0 -32
- data/lib/neo4j/model.rb +0 -4
- data/lib/neo4j/neo4j.rb +0 -216
- data/lib/neo4j/node.rb +0 -270
- data/lib/neo4j/node_mixin/class_methods.rb +0 -51
- data/lib/neo4j/node_mixin/node_mixin.rb +0 -141
- data/lib/neo4j/paginated.rb +0 -23
- data/lib/neo4j/property/class_methods.rb +0 -79
- data/lib/neo4j/property/property.rb +0 -111
- data/lib/neo4j/rails/mapping/property.rb +0 -183
- data/lib/neo4j/rails/rel_persistence.rb +0 -237
- data/lib/neo4j/relationship.rb +0 -239
- data/lib/neo4j/relationship_mixin/class_methods.rb +0 -36
- data/lib/neo4j/relationship_mixin/relationship_mixin.rb +0 -142
- data/lib/neo4j/relationship_set.rb +0 -58
- data/lib/neo4j/rels/rels.rb +0 -110
- data/lib/neo4j/rels/traverser.rb +0 -102
- data/lib/neo4j/rule/class_methods.rb +0 -201
- data/lib/neo4j/rule/event_listener.rb +0 -66
- data/lib/neo4j/rule/functions/count.rb +0 -43
- data/lib/neo4j/rule/functions/function.rb +0 -74
- data/lib/neo4j/rule/functions/functions.rb +0 -3
- data/lib/neo4j/rule/functions/sum.rb +0 -29
- data/lib/neo4j/rule/rule.rb +0 -150
- data/lib/neo4j/rule/rule_node.rb +0 -217
- data/lib/neo4j/to_java.rb +0 -31
- data/lib/neo4j/transaction.rb +0 -73
- data/lib/neo4j/traversal/filter_predicate.rb +0 -25
- data/lib/neo4j/traversal/prune_evaluator.rb +0 -14
- data/lib/neo4j/traversal/rel_expander.rb +0 -31
- data/lib/neo4j/traversal/traversal.rb +0 -141
- data/lib/neo4j/traversal/traverser.rb +0 -284
- data/lib/neo4j/type_converters/type_converters.rb +0 -288
data/lib/neo4j/rails/rails.rb
CHANGED
@@ -1,27 +1,30 @@
|
|
1
1
|
# rails
|
2
2
|
require 'neo4j/rails/tx_methods'
|
3
|
+
require 'neo4j/rails/identity'
|
3
4
|
require 'neo4j/rails/transaction'
|
4
5
|
require 'neo4j/rails/railtie'
|
5
6
|
require 'neo4j/rails/validations/uniqueness'
|
6
7
|
require 'neo4j/rails/validations/non_nil'
|
7
8
|
require 'neo4j/rails/validations/associated'
|
8
9
|
require 'neo4j/rails/finders'
|
9
|
-
require 'neo4j/rails/mapping/property'
|
10
10
|
require 'neo4j/rails/validations'
|
11
11
|
require 'neo4j/rails/callbacks'
|
12
12
|
require 'neo4j/rails/observer'
|
13
13
|
require 'neo4j/rails/compositions'
|
14
14
|
require 'neo4j/rails/accept_id'
|
15
15
|
require 'neo4j/rails/timestamps'
|
16
|
-
require 'neo4j/rails/serialization'
|
17
16
|
require 'neo4j/rails/attributes'
|
17
|
+
require 'neo4j/rails/nested_attributes'
|
18
|
+
require 'neo4j/rails/serialization'
|
18
19
|
require 'neo4j/rails/persistence'
|
20
|
+
require 'neo4j/rails/node_persistance'
|
21
|
+
require 'neo4j/rails/relationship_persistence'
|
19
22
|
require 'neo4j/rails/relationships/storage'
|
20
23
|
require 'neo4j/rails/relationships/node_dsl'
|
21
24
|
require 'neo4j/rails/relationships/rels_dsl'
|
22
25
|
require 'neo4j/rails/relationships/relationships'
|
23
|
-
require 'neo4j/rails/
|
26
|
+
require 'neo4j/rails/has_n'
|
24
27
|
require 'neo4j/rails/rack_middleware'
|
25
|
-
require 'neo4j/rails/
|
26
|
-
require 'neo4j/rails/
|
27
|
-
require 'neo4j/rails/
|
28
|
+
require 'neo4j/rails/versioning/versioning'
|
29
|
+
require 'neo4j/rails/model'
|
30
|
+
require 'neo4j/rails/relationship'
|
data/lib/neo4j/rails/railtie.rb
CHANGED
@@ -3,8 +3,7 @@ module Neo4j
|
|
3
3
|
config.neo4j = ActiveSupport::OrderedOptions.new
|
4
4
|
|
5
5
|
initializer "neo4j.tx" do |app|
|
6
|
-
app.config.middleware.use Neo4j::Rails::
|
7
|
-
app.config.middleware.use Neo4j::IdentityMap::Middleware
|
6
|
+
app.config.middleware.use Neo4j::Rails::Middleware
|
8
7
|
end
|
9
8
|
|
10
9
|
# Add ActiveModel translations to the I18n load_path
|
@@ -1,6 +1,5 @@
|
|
1
1
|
module Neo4j
|
2
2
|
module Rails
|
3
|
-
|
4
3
|
# Includes the Neo4j::RelationshipMixin and adds ActiveRecord/Model like behaviour.
|
5
4
|
# That means for example that you don't have to care about transactions since they will be
|
6
5
|
# automatically be created when needed.
|
@@ -12,146 +11,40 @@ module Neo4j
|
|
12
11
|
# It also implement timestamps (like active record), just add a updated_at or created_at attribute.
|
13
12
|
#
|
14
13
|
class Relationship
|
15
|
-
|
16
|
-
|
17
|
-
# The relationship type
|
18
|
-
attr_reader :type
|
19
|
-
|
20
|
-
index :_classname
|
21
|
-
|
22
|
-
# Initialize a Node with a set of properties (or empty if nothing is passed)
|
23
|
-
def initialize(*args)
|
24
|
-
@properties_before_type_cast=java.util.HashMap.new
|
25
|
-
@type = args[0].to_s
|
26
|
-
self.start_node = args[1]
|
27
|
-
self.end_node = args[2]
|
28
|
-
attributes = args[3]
|
29
|
-
reset_attributes
|
30
|
-
self.attributes = attributes if attributes.is_a?(Hash)
|
31
|
-
end
|
32
|
-
|
33
|
-
def other_node(node)
|
34
|
-
if persisted?
|
35
|
-
_java_rel.getOtherNode(node._java_node)
|
36
|
-
else
|
37
|
-
@start_node == (node._java_node || node) ? @end_node : @start_node
|
38
|
-
end
|
39
|
-
end
|
40
|
-
|
41
|
-
|
42
|
-
alias_method :get_other_node, :other_node # so it looks like the java version
|
14
|
+
extend ActiveModel::Translation
|
43
15
|
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
16
|
+
include Neo4j::RelationshipMixin
|
17
|
+
include ActiveModel::Dirty # track changes to attributes
|
18
|
+
include ActiveModel::MassAssignmentSecurity # handle attribute hash assignment
|
19
|
+
include ActiveModel::Observing # enable observers
|
20
|
+
include Neo4j::Rails::Identity
|
21
|
+
include Neo4j::Rails::Persistence # handles how to save, create and update the model
|
22
|
+
include Neo4j::Rails::RelationshipPersistence # handles how to save, create and update the model
|
23
|
+
include Neo4j::Rails::Attributes # handles how to save and retrieve attributes
|
24
|
+
include Neo4j::Rails::Serialization # enable to_xml and to_json
|
25
|
+
include Neo4j::Rails::Validations # enable validations
|
26
|
+
include Neo4j::Rails::Callbacks # enable callbacks
|
27
|
+
include Neo4j::Rails::Timestamps # handle created_at, updated_at timestamp properties
|
28
|
+
include Neo4j::Rails::Finders # ActiveRecord style find
|
29
|
+
include Neo4j::Rails::Compositions
|
30
|
+
|
31
|
+
index :_classname # since there are no rule we have to use lucene to find all instance of a class
|
52
32
|
|
53
|
-
def rel_type
|
54
|
-
persisted? ? _java_entity.rel_type : @type
|
55
|
-
end
|
56
33
|
|
57
34
|
def to_s
|
58
35
|
"id: #{self.object_id} start_node: #{start_node.id} end_node: #{end_node.id} type:#{@type}"
|
59
36
|
end
|
60
37
|
|
61
|
-
def id
|
62
|
-
_java_rel.nil? || neo_id.nil? ? nil : neo_id.to_s
|
63
|
-
end
|
64
|
-
|
65
|
-
def hash
|
66
|
-
persisted? ? _java_entity.neo_id.hash : super
|
67
|
-
end
|
68
|
-
|
69
|
-
def start_node
|
70
|
-
@start_node ||= _java_rel && _java_rel.start_node
|
71
|
-
end
|
72
|
-
|
73
|
-
def start_node=(node)
|
74
|
-
old = @start_node
|
75
|
-
@start_node = node
|
76
|
-
# TODO should raise exception if not persisted and changed
|
77
|
-
if old != @start_node
|
78
|
-
old && old.rm_outgoing_rel(type, self)
|
79
|
-
@start_node.class != Neo4j::Node && @start_node.add_outgoing_rel(type, self)
|
80
|
-
end
|
81
|
-
end
|
82
|
-
|
83
|
-
def end_node
|
84
|
-
@end_node ||= _java_rel && _java_rel.end_node
|
85
|
-
end
|
86
|
-
|
87
|
-
def end_node=(node)
|
88
|
-
old = @end_node
|
89
|
-
@end_node = node
|
90
|
-
# TODO should raise exception if not persisted and changed
|
91
|
-
if old != @end_node
|
92
|
-
old && old.rm_incoming_rel(type, self)
|
93
|
-
@end_node.class != Neo4j::Node && @end_node.add_incoming_rel(type, self)
|
94
|
-
end
|
95
|
-
end
|
96
|
-
|
97
|
-
def del
|
98
|
-
_java_rel.del
|
99
|
-
end
|
100
|
-
|
101
|
-
def reset_attributes
|
102
|
-
@properties = {}
|
103
|
-
end
|
104
|
-
|
105
|
-
def wrapper
|
106
|
-
self
|
107
|
-
end
|
108
|
-
|
109
38
|
# --------------------------------------
|
110
39
|
# Public Class Methods
|
111
40
|
# --------------------------------------
|
112
41
|
class << self
|
113
|
-
# NodeMixin overwrites the #new class method but it saves it as orig_new
|
114
|
-
# Here, we just get it back to normal
|
115
|
-
alias :new :orig_new
|
116
|
-
|
117
|
-
def entity_load(id)
|
118
|
-
Neo4j::Relationship.load(id)
|
119
|
-
end
|
120
|
-
|
121
|
-
|
122
|
-
def rule(*)
|
123
|
-
end
|
124
|
-
|
125
42
|
def _all
|
126
43
|
_indexer.find(:_classname => self)
|
127
44
|
end
|
128
|
-
|
129
|
-
def load(*ids) # TODO Copied from finders.rb
|
130
|
-
result = ids.map { |id| entity_load(id) }
|
131
|
-
if ids.length == 1
|
132
|
-
result.first
|
133
|
-
else
|
134
|
-
result
|
135
|
-
end
|
136
|
-
end
|
137
|
-
|
138
45
|
end
|
139
46
|
|
140
47
|
end
|
141
48
|
|
142
|
-
|
143
|
-
Relationship.class_eval do
|
144
|
-
extend ActiveModel::Translation
|
145
|
-
include RelPersistence # handles how to save, create and update the model
|
146
|
-
include Attributes # handles how to save and retrieve attributes
|
147
|
-
include Mapping::Property # allows some additional options on the #property class method
|
148
|
-
include Serialization # enable to_xml and to_json
|
149
|
-
include Validations # enable validations
|
150
|
-
include Callbacks # enable callbacks
|
151
|
-
include Timestamps # handle created_at, updated_at timestamp properties
|
152
|
-
include Finders # ActiveRecord style find
|
153
|
-
include Compositions
|
154
|
-
end
|
155
|
-
|
156
49
|
end
|
157
|
-
end
|
50
|
+
end
|
@@ -0,0 +1,107 @@
|
|
1
|
+
module Neo4j
|
2
|
+
module Rails
|
3
|
+
module RelationshipPersistence
|
4
|
+
extend TxMethods
|
5
|
+
|
6
|
+
# Initialize a Node with a set of properties (or empty if nothing is passed)
|
7
|
+
def initialize(*args)
|
8
|
+
return initialize_attributes(nil) if args.size < 3 # then we have been loaded
|
9
|
+
type, start_node, end_node, attributes = args
|
10
|
+
@_rel_type = type.to_sym
|
11
|
+
raise "Unknown type" unless type
|
12
|
+
raise "Unknown start_node" unless start_node
|
13
|
+
raise "Unknown end_node" unless end_node
|
14
|
+
self.start_node = start_node
|
15
|
+
self.end_node = end_node
|
16
|
+
initialize_attributes(attributes)
|
17
|
+
end
|
18
|
+
|
19
|
+
|
20
|
+
def create
|
21
|
+
# prevent calling create twice
|
22
|
+
@_start_node.add_unpersisted_outgoing_rel(rel_type, self)
|
23
|
+
@_end_node.add_unpersisted_incoming_rel(rel_type, self)
|
24
|
+
|
25
|
+
return unless _persist_node(@_start_node) && _persist_node(@_end_node)
|
26
|
+
|
27
|
+
java_rel = Neo4j::Relationship.new(rel_type, start_node, end_node)
|
28
|
+
init_on_load(java_rel)
|
29
|
+
Neo4j::IdentityMap.add(java_rel, self)
|
30
|
+
init_on_create
|
31
|
+
|
32
|
+
@_start_node.rm_unpersisted_outgoing_rel(rel_type, self)
|
33
|
+
@_end_node.rm_unpersisted_incoming_rel(rel_type, self)
|
34
|
+
true
|
35
|
+
end
|
36
|
+
|
37
|
+
def rel_type
|
38
|
+
new_record? ? @_rel_type : _java_entity.rel_type.to_sym
|
39
|
+
end
|
40
|
+
|
41
|
+
def other_node(node)
|
42
|
+
if persisted?
|
43
|
+
_java_rel._other_node(node._java_node)
|
44
|
+
else
|
45
|
+
@_start_node == (node._java_node || node) ? @_end_node : @_start_node
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
|
50
|
+
def start_node
|
51
|
+
@_start_node ||= _java_rel && _java_rel.start_node.wrapper
|
52
|
+
end
|
53
|
+
|
54
|
+
def start_node=(node)
|
55
|
+
old = @_start_node
|
56
|
+
@_start_node = node
|
57
|
+
# TODO should raise exception if not persisted and changed
|
58
|
+
if old != @_start_node
|
59
|
+
old && old.rm_outgoing_rel(rel_type, self)
|
60
|
+
@_start_node.class != Neo4j::Node && @_start_node.add_outgoing_rel(rel_type, self)
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
64
|
+
def end_node
|
65
|
+
@_end_node ||= _java_rel && _java_rel.end_node.wrapper
|
66
|
+
end
|
67
|
+
|
68
|
+
def end_node=(node)
|
69
|
+
old = @_end_node
|
70
|
+
@_end_node = node
|
71
|
+
# TODO should raise exception if not persisted and changed
|
72
|
+
if old != @_end_node
|
73
|
+
old && old.rm_incoming_rel(rel_type, self)
|
74
|
+
@_end_node.class != Neo4j::Node && @_end_node.add_incoming_rel(rel_type, self)
|
75
|
+
end
|
76
|
+
end
|
77
|
+
|
78
|
+
|
79
|
+
def _persist_node(start_or_end_node)
|
80
|
+
(start_or_end_node.new_record? || start_or_end_node.relationships_changed?) ? start_or_end_node.save : true
|
81
|
+
end
|
82
|
+
|
83
|
+
# Reload the object from the DB
|
84
|
+
def reload(options = nil)
|
85
|
+
raise "Can't reload a none persisted node" if new_record?
|
86
|
+
clear_changes
|
87
|
+
reset_attributes
|
88
|
+
unless reload_from_database
|
89
|
+
set_deleted_properties
|
90
|
+
freeze
|
91
|
+
end
|
92
|
+
self
|
93
|
+
end
|
94
|
+
|
95
|
+
|
96
|
+
def reload_from_database
|
97
|
+
Neo4j::IdentityMap.remove_rel_by_id(id) if persisted?
|
98
|
+
if reloaded = self.class.load_entity(id)
|
99
|
+
send(:attributes=, reloaded.attributes, false)
|
100
|
+
end
|
101
|
+
reloaded
|
102
|
+
end
|
103
|
+
end
|
104
|
+
|
105
|
+
end
|
106
|
+
end
|
107
|
+
|
@@ -5,7 +5,7 @@ module Neo4j
|
|
5
5
|
# Instances of this class is returned from the #outgoing, #incoming and generated accessor methods:
|
6
6
|
# has_n and has_one.
|
7
7
|
# Notice that this class includes the Ruby Enumerable mixin.
|
8
|
-
# If you want to full traversal api use the
|
8
|
+
# If you want to full traversal api use the core version of these methods (some_node._outgoing(...)).
|
9
9
|
#
|
10
10
|
class NodesDSL
|
11
11
|
include Enumerable
|
@@ -19,8 +19,7 @@ module Neo4j
|
|
19
19
|
# The new node and relationship will not be saved.
|
20
20
|
# Both the relationship class and the node class can be specified with the has_n and has_one.
|
21
21
|
#
|
22
|
-
#
|
23
|
-
#
|
22
|
+
# @example
|
24
23
|
# class Person < Neo4j::Rails::Model
|
25
24
|
# has_n(:friends).to(Person).relationship(Friend)
|
26
25
|
# has_n(:knows)
|
@@ -28,13 +27,16 @@ module Neo4j
|
|
28
27
|
#
|
29
28
|
# Person.friends.build(:name => 'kalle') # creates a Person and Friends class.
|
30
29
|
# Person.knows.build(:name => 'kalle') # creates a Neo4j::Rails::Model and Neo4j::Rails::Relationship class
|
31
|
-
#
|
32
|
-
|
30
|
+
# @param [Hash] attrs the attributes for the created node
|
31
|
+
# @return [Neo4j::Rails::Model]
|
32
|
+
def build(attrs = {})
|
33
33
|
self << (node = @storage.build(attrs))
|
34
34
|
node
|
35
35
|
end
|
36
36
|
|
37
37
|
# Same as #build except that the relationship and node are saved.
|
38
|
+
# @param (see #build)
|
39
|
+
# @return [Neo4j::Rails::Model]
|
38
40
|
def create(attrs = {})
|
39
41
|
self << (node = @storage.create(attrs))
|
40
42
|
node.save
|
@@ -42,13 +44,24 @@ module Neo4j
|
|
42
44
|
end
|
43
45
|
|
44
46
|
# Same as #create but will raise an exception if an error (like validation) occurs.
|
47
|
+
# @param (see #build)
|
48
|
+
# @return [Neo4j::Rails::Model]
|
45
49
|
def create!(attrs)
|
46
50
|
self << (node = @storage.create(attrs))
|
47
51
|
node.save!
|
48
52
|
node
|
49
53
|
end
|
50
54
|
|
51
|
-
# Adds a new node to the relationship
|
55
|
+
# Adds a new node to the relationship, no transaction is needed.
|
56
|
+
#
|
57
|
+
# @example create a relationship between two nodes
|
58
|
+
# node.friends << other
|
59
|
+
#
|
60
|
+
# @example using existing nodes
|
61
|
+
# node.friends = ['42', '32']
|
62
|
+
#
|
63
|
+
# @param [String, Neo4j::Rails::Model] other
|
64
|
+
# @return self
|
52
65
|
def <<(other)
|
53
66
|
if other.is_a?(String)
|
54
67
|
# this is typically called in an assignment operator, person.friends = ['42', '32']
|
@@ -69,20 +82,11 @@ module Neo4j
|
|
69
82
|
all.to_a
|
70
83
|
end
|
71
84
|
|
72
|
-
# Specifies the depth of the traversal
|
73
|
-
def depth(d)
|
74
|
-
adapt_to_traverser.depth(d)
|
75
|
-
end
|
76
|
-
|
77
|
-
def adapt_to_traverser # :nodoc:
|
78
|
-
Neo4j::Traversal::Traverser.new(@storage.node, @storage.rel_type, @dir)
|
79
|
-
end
|
80
|
-
|
81
85
|
# Returns the n:th item in the relationship.
|
82
86
|
# This method simply traverse all relationship and returns the n:th one.
|
83
87
|
def [](index)
|
84
88
|
i = 0
|
85
|
-
each{|x| return x if i == index; i += 1}
|
89
|
+
each { |x| return x if i == index; i += 1 }
|
86
90
|
nil # out of index
|
87
91
|
end
|
88
92
|
|
@@ -94,32 +98,33 @@ module Neo4j
|
|
94
98
|
|
95
99
|
# Find one node in the relationship.
|
96
100
|
#
|
97
|
-
#
|
101
|
+
# @example Declaration of the relationship used in the examples below
|
98
102
|
#
|
99
103
|
# class Actor < Neo4j::Rails::Model
|
100
104
|
# has_n(:acted_in)
|
101
105
|
# end
|
102
106
|
#
|
103
|
-
#
|
104
|
-
#
|
107
|
+
# @example find all child nodes
|
108
|
+
# actor.acted_in.find(:all)
|
105
109
|
#
|
106
|
-
#
|
107
|
-
#
|
110
|
+
# @example find first child node
|
111
|
+
# actor.acted_in.find(:first)
|
108
112
|
#
|
109
|
-
#
|
110
|
-
#
|
113
|
+
# @example find a child node by node
|
114
|
+
# actor.acted_in.find(some_movie)
|
111
115
|
#
|
112
|
-
#
|
113
|
-
#
|
116
|
+
# @example find a child node by id" do
|
117
|
+
# actor.acted_in.find(some_movie.id)
|
114
118
|
#
|
115
|
-
#
|
116
|
-
#
|
119
|
+
# @example find a child node by delegate to Enumerable#find
|
120
|
+
# actor.acted_in.find{|n| n.title == 'movie_1'}
|
117
121
|
#
|
122
|
+
# @return [Neo4j::Rails::Model]
|
118
123
|
def find(*args, &block)
|
119
124
|
return super(*args, &block) if block
|
120
|
-
|
125
|
+
|
121
126
|
case args.first
|
122
|
-
when :all, :first
|
127
|
+
when :all, :first
|
123
128
|
kind = args.shift
|
124
129
|
send(kind, *args)
|
125
130
|
when "0", 0
|
@@ -130,14 +135,14 @@ module Neo4j
|
|
130
135
|
else
|
131
136
|
first(*args)
|
132
137
|
end
|
133
|
-
end
|
138
|
+
end
|
134
139
|
end
|
135
140
|
|
136
141
|
# Same as #find except that it returns an Enumerator of all nodes found.
|
137
142
|
#
|
138
143
|
def all(*args)
|
139
144
|
unless args.empty?
|
140
|
-
enum = Enumerator.new(@storage, :each_node, @dir).find{|n| n == args.first}
|
145
|
+
enum = Enumerator.new(@storage, :each_node, @dir).find { |n| n == args.first }
|
141
146
|
else
|
142
147
|
enum = Enumerator.new(@storage, :each_node, @dir)
|
143
148
|
end
|
@@ -148,7 +153,7 @@ module Neo4j
|
|
148
153
|
if result = all(*args)
|
149
154
|
if result.respond_to?(:collect) #if it's enumerable, get the first result
|
150
155
|
result.first
|
151
|
-
else
|
156
|
+
else
|
152
157
|
result
|
153
158
|
end
|
154
159
|
else
|
@@ -156,36 +161,40 @@ module Neo4j
|
|
156
161
|
end
|
157
162
|
end
|
158
163
|
|
159
|
-
# Destroys all nodes (
|
160
|
-
# Notice, if you only want to destroy the relationship use the
|
164
|
+
# Destroys all nodes (!) and relationship.
|
165
|
+
# Notice, if you only want to destroy the relationship use the #rels(:friends).destroy_all method instead.
|
161
166
|
def destroy_all
|
162
|
-
each {|n| n.destroy}
|
167
|
+
each { |n| n.destroy }
|
163
168
|
end
|
164
169
|
|
170
|
+
# Deletes all nodes and relationships, similar to #destroy_all
|
165
171
|
def delete_all
|
166
|
-
each {|n| n.delete}
|
172
|
+
each { |n| n.delete }
|
167
173
|
end
|
168
174
|
|
169
|
-
|
170
|
-
|
175
|
+
# Counts all relationships
|
176
|
+
def count
|
177
|
+
@storage.count(@dir)
|
171
178
|
end
|
172
179
|
|
173
|
-
alias :length :
|
180
|
+
alias :length :count
|
174
181
|
|
175
182
|
def each
|
176
|
-
@storage.each_node(@dir) {|n| yield n} # Why passing the &block through doesn't work on JRuby 1.9?
|
183
|
+
@storage.each_node(@dir) { |n| yield n } # Why passing the &block through doesn't work on JRuby 1.9?
|
177
184
|
end
|
178
185
|
|
186
|
+
# Delete relationships to the given nodes
|
187
|
+
# @param [Neo4j::Rails::Model] nodes a list of nodes we want to delete relationships to
|
179
188
|
def delete(*nodes)
|
180
189
|
@storage.destroy_rels(@dir, *nodes)
|
181
190
|
end
|
182
191
|
|
183
192
|
def empty?
|
184
|
-
|
193
|
+
!@storage.relationships?(@dir)
|
185
194
|
end
|
186
195
|
|
187
196
|
def blank?
|
188
|
-
false unless
|
197
|
+
false unless empty?
|
189
198
|
end
|
190
199
|
|
191
200
|
def to_s
|
@@ -196,13 +205,32 @@ module Neo4j
|
|
196
205
|
@storage.persisted?
|
197
206
|
end
|
198
207
|
|
208
|
+
|
209
|
+
# These methods are using the Neo4j::Core::Traversal::Traverser which means that only persisted relationship will be seen
|
210
|
+
# but more advanced traversal can be performed.
|
211
|
+
CORE_TRAVERSAL_METHODS = [:depth, :outgoing, :incoming, :both, :expand, :depth_first, :breadth_first, :eval_paths, :unique, :expander, :prune, :filter, :include_start_node, :rels, :eval_paths]
|
212
|
+
|
213
|
+
|
199
214
|
protected
|
200
215
|
|
216
|
+
def self.define_traversal_method(method_name)
|
217
|
+
class_eval <<-RUBY, __FILE__, __LINE__
|
218
|
+
def #{method_name}(*args, &block)
|
219
|
+
if block
|
220
|
+
Neo4j::Core::Traversal::Traverser.new(@storage.node, @dir, @storage.rel_type).send(:"#{method_name}", *args, &block)
|
221
|
+
else
|
222
|
+
Neo4j::Core::Traversal::Traverser.new(@storage.node, @dir, @storage.rel_type).send(:"#{method_name}", *args)
|
223
|
+
end
|
224
|
+
end
|
225
|
+
RUBY
|
226
|
+
end
|
227
|
+
|
228
|
+
CORE_TRAVERSAL_METHODS.each { |meth| define_traversal_method(meth)}
|
201
229
|
|
202
230
|
def find_by_id(*args)
|
203
|
-
result = Enumerator.new(@storage, :each_node, @dir).find{|n| n.id.to_i == args.first.to_i}
|
231
|
+
result = Enumerator.new(@storage, :each_node, @dir).find { |n| n.id.to_i == args.first.to_i }
|
204
232
|
end
|
205
|
-
|
233
|
+
|
206
234
|
end
|
207
235
|
end
|
208
236
|
end
|