neo4j 2.0.0.alpha.5-java → 2.0.0.alpha.6-java

Sign up to get free protection for your applications and to get access to all the features.
Files changed (97) hide show
  1. data/CHANGELOG +12 -0
  2. data/Gemfile +0 -4
  3. data/README.rdoc +106 -62
  4. data/lib/neo4j.rb +7 -33
  5. data/lib/neo4j/performance.rb +43 -0
  6. data/lib/neo4j/rails/accept_id.rb +19 -18
  7. data/lib/neo4j/rails/attributes.rb +366 -120
  8. data/lib/neo4j/rails/finders.rb +41 -15
  9. data/lib/neo4j/rails/has_n.rb +203 -0
  10. data/lib/neo4j/rails/identity.rb +25 -0
  11. data/lib/neo4j/rails/model.rb +65 -242
  12. data/lib/neo4j/rails/nested_attributes.rb +108 -0
  13. data/lib/neo4j/rails/node_persistance.rb +56 -0
  14. data/lib/neo4j/rails/observer.rb +0 -2
  15. data/lib/neo4j/rails/persistence.rb +32 -154
  16. data/lib/neo4j/rails/rack_middleware.rb +26 -2
  17. data/lib/neo4j/rails/rails.rb +9 -6
  18. data/lib/neo4j/rails/railtie.rb +1 -2
  19. data/lib/neo4j/rails/relationship.rb +18 -125
  20. data/lib/neo4j/rails/relationship_persistence.rb +107 -0
  21. data/lib/neo4j/rails/relationships/node_dsl.rb +72 -44
  22. data/lib/neo4j/rails/relationships/relationships.rb +187 -59
  23. data/lib/neo4j/rails/relationships/rels_dsl.rb +18 -17
  24. data/lib/neo4j/rails/relationships/storage.rb +19 -17
  25. data/lib/neo4j/rails/timestamps.rb +53 -51
  26. data/lib/neo4j/rails/transaction.rb +9 -1
  27. data/lib/neo4j/rails/validations/uniqueness.rb +1 -1
  28. data/lib/neo4j/rails/versioning/versioning.rb +2 -2
  29. data/lib/neo4j/version.rb +1 -1
  30. data/lib/orm_adapter/adapters/neo4j.rb +47 -46
  31. data/neo4j.gemspec +1 -1
  32. metadata +10 -69
  33. data/lib/neo4j/algo/algo.rb +0 -294
  34. data/lib/neo4j/batch/batch.rb +0 -4
  35. data/lib/neo4j/batch/indexer.rb +0 -109
  36. data/lib/neo4j/batch/inserter.rb +0 -179
  37. data/lib/neo4j/batch/rule_inserter.rb +0 -24
  38. data/lib/neo4j/batch/rule_node.rb +0 -72
  39. data/lib/neo4j/config.rb +0 -177
  40. data/lib/neo4j/core_ext/class/inheritable_attributes.rb +0 -12
  41. data/lib/neo4j/core_ext/class/rewrite_inheritable_attributes.rb +0 -170
  42. data/lib/neo4j/database.rb +0 -158
  43. data/lib/neo4j/equal.rb +0 -21
  44. data/lib/neo4j/event_handler.rb +0 -263
  45. data/lib/neo4j/has_list/class_methods.rb +0 -11
  46. data/lib/neo4j/has_list/has_list.rb +0 -3
  47. data/lib/neo4j/has_list/mapping.rb +0 -133
  48. data/lib/neo4j/has_n/class_methods.rb +0 -119
  49. data/lib/neo4j/has_n/decl_relationship_dsl.rb +0 -246
  50. data/lib/neo4j/has_n/has_n.rb +0 -3
  51. data/lib/neo4j/has_n/mapping.rb +0 -98
  52. data/lib/neo4j/identity_map.rb +0 -140
  53. data/lib/neo4j/index/class_methods.rb +0 -108
  54. data/lib/neo4j/index/index.rb +0 -39
  55. data/lib/neo4j/index/indexer.rb +0 -341
  56. data/lib/neo4j/index/indexer_registry.rb +0 -68
  57. data/lib/neo4j/index/lucene_query.rb +0 -256
  58. data/lib/neo4j/load.rb +0 -25
  59. data/lib/neo4j/migrations/class_methods.rb +0 -110
  60. data/lib/neo4j/migrations/extensions.rb +0 -58
  61. data/lib/neo4j/migrations/lazy_node_mixin.rb +0 -41
  62. data/lib/neo4j/migrations/migration.rb +0 -112
  63. data/lib/neo4j/migrations/migrations.rb +0 -6
  64. data/lib/neo4j/migrations/node_mixin.rb +0 -80
  65. data/lib/neo4j/migrations/ref_node_wrapper.rb +0 -32
  66. data/lib/neo4j/model.rb +0 -4
  67. data/lib/neo4j/neo4j.rb +0 -216
  68. data/lib/neo4j/node.rb +0 -270
  69. data/lib/neo4j/node_mixin/class_methods.rb +0 -51
  70. data/lib/neo4j/node_mixin/node_mixin.rb +0 -141
  71. data/lib/neo4j/paginated.rb +0 -23
  72. data/lib/neo4j/property/class_methods.rb +0 -79
  73. data/lib/neo4j/property/property.rb +0 -111
  74. data/lib/neo4j/rails/mapping/property.rb +0 -183
  75. data/lib/neo4j/rails/rel_persistence.rb +0 -237
  76. data/lib/neo4j/relationship.rb +0 -239
  77. data/lib/neo4j/relationship_mixin/class_methods.rb +0 -36
  78. data/lib/neo4j/relationship_mixin/relationship_mixin.rb +0 -142
  79. data/lib/neo4j/relationship_set.rb +0 -58
  80. data/lib/neo4j/rels/rels.rb +0 -110
  81. data/lib/neo4j/rels/traverser.rb +0 -102
  82. data/lib/neo4j/rule/class_methods.rb +0 -201
  83. data/lib/neo4j/rule/event_listener.rb +0 -66
  84. data/lib/neo4j/rule/functions/count.rb +0 -43
  85. data/lib/neo4j/rule/functions/function.rb +0 -74
  86. data/lib/neo4j/rule/functions/functions.rb +0 -3
  87. data/lib/neo4j/rule/functions/sum.rb +0 -29
  88. data/lib/neo4j/rule/rule.rb +0 -150
  89. data/lib/neo4j/rule/rule_node.rb +0 -217
  90. data/lib/neo4j/to_java.rb +0 -31
  91. data/lib/neo4j/transaction.rb +0 -73
  92. data/lib/neo4j/traversal/filter_predicate.rb +0 -25
  93. data/lib/neo4j/traversal/prune_evaluator.rb +0 -14
  94. data/lib/neo4j/traversal/rel_expander.rb +0 -31
  95. data/lib/neo4j/traversal/traversal.rb +0 -141
  96. data/lib/neo4j/traversal/traverser.rb +0 -284
  97. data/lib/neo4j/type_converters/type_converters.rb +0 -288
@@ -1,239 +0,0 @@
1
- # external neo4j dependencies
2
- require 'neo4j/property/property'
3
- require 'neo4j/index/index'
4
- require 'neo4j/equal'
5
- require 'neo4j/load'
6
- require 'neo4j/to_java'
7
-
8
- module Neo4j
9
-
10
-
11
- #
12
- # A relationship between two nodes in the graph. A relationship has a start node, an end node and a type.
13
- # You can attach properties to relationships with the API specified in Neo4j::JavaPropertyMixin.
14
- #
15
- # Relationship are created by invoking the << operator on the rels method on the node as follow:
16
- # node.outgoing(:friends) << other_node << yet_another_node
17
- #
18
- # or using the Neo4j::Relationship#new method (which does the same thing):
19
- # rel = Neo4j::Relationship.new(:friends, node, other_node)
20
- #
21
- # The fact that the relationship API gives meaning to start and end nodes implicitly means that all relationships have a direction.
22
- # In the example above, rel would be directed from node to otherNode.
23
- # A relationship's start node and end node and their relation to outgoing and incoming are defined so that the assertions in the following code are true:
24
- #
25
- # a = Neo4j::Node.new
26
- # b = Neo4j::Node.new
27
- # rel = Neo4j::Relationship.new(:some_type, a, b)
28
- # # Now we have: (a) --- REL_TYPE ---> (b)
29
- #
30
- # rel.start_node # => a
31
- # rel.end_node # => b
32
- #
33
- # Furthermore, Neo4j guarantees that a relationship is never "hanging freely,"
34
- # i.e. start_node, end_node and other_node are guaranteed to always return valid, non-null nodes.
35
- #
36
- # === Wrapping
37
- #
38
- # Notice that the Neo4j::Relationship.new does not create a Ruby object. Instead, it returns a Java
39
- # org.neo4j.graphdb.Relationship object which has been modified to feel more rubyish (like Neo4j::Node).
40
- #
41
- # === See also
42
- # * Neo4j::RelationshipMixin if you want to wrap a relationship with your own Ruby class.
43
- # * http://api.neo4j.org/1.4/org/neo4j/graphdb/Relationship.html
44
- #
45
- # === Included Mixins
46
- # * Neo4j::Property
47
- # * Neo4j::Equal
48
- #
49
- # (Those mixin are actually not included in the Neo4j::Relationship but instead directly included in the java class org.neo4j.kernel.impl.core.RelationshipProxy)
50
- #
51
- class Relationship
52
- extend Neo4j::Index::ClassMethods
53
-
54
- self.rel_indexer self
55
-
56
- class << self
57
- include Neo4j::Load
58
- include Neo4j::ToJava
59
-
60
-
61
- ##
62
- # :method: start_node
63
- #
64
- # Returns the start node of this relationship
65
-
66
-
67
- ##
68
- # :method: end_node
69
- #
70
- # Returns the end node of this relationship
71
-
72
- ##
73
- # :method: other_node
74
- #
75
- # A convenience operation that, given a node that is attached to this relationship, returns the other node.
76
- # For example if node is a start node, the end node will be returned, and vice versa.
77
- # This is a very convenient operation when you're manually traversing the node space by invoking one of the #rels
78
- # method on a node. For example, to get the node "at the other end" of a relationship, use the following:
79
- #
80
- # end_node = node.rels.first.other_node(node)
81
- #
82
- # This operation will throw a runtime exception if node is neither this relationship's start node nor its end node.
83
- #
84
- # === Parameters
85
- #
86
- # node :: the node that we don't want to return
87
-
88
-
89
- ##
90
- # :method: del
91
- #
92
- # Deletes this relationship. Invoking any methods on this relationship after delete() has returned is invalid and will lead t
93
-
94
- # :method rel_type
95
- #
96
- # Returns the type of this relationship.
97
- # A relationship's type is an immutable attribute that is specified at Relationship creation.
98
- # The relationship type is othen used when traversing nodes, example finding all the
99
- # outgoing nodes of relationship type :friends
100
- #
101
- # node.outgoing(:friends)
102
-
103
- # Returns a org.neo4j.graphdb.Relationship java object (!)
104
- # Will trigger a event that the relationship was created.
105
- #
106
- # === Parameters
107
- # type :: the type of relationship
108
- # from_node :: the start node of this relationship
109
- # end_node :: the end node of this relationship
110
- # props :: optional properties for the created relationship
111
- #
112
- # === Returns
113
- # org.neo4j.graphdb.Relationship java object
114
- #
115
- # === Examples
116
- #
117
- # Neo4j::Relationship.new :friend, node1, node2, :since => '2001-01-02', :status => 'okey'
118
- #
119
- def new(type, start_node, end_node, props=nil)
120
- java_type = type_to_java(type)
121
- rel = start_node._java_node.create_relationship_to(end_node._java_node, java_type)
122
- props.each_pair {|k,v| rel[k] = v} if props
123
- rel
124
- end
125
-
126
- # create is the same as new
127
- alias_method :create, :new
128
-
129
- # Loads a relationship or wrapped relationship given a native java relationship or an id.
130
- # If there is a Ruby wrapper for the node then it will create a Ruby object that will
131
- # wrap the java node (see Neo4j::RelationshipMixin).
132
- #
133
- # If the relationship does not exist it will return nil
134
- #
135
- def load(rel_id, db = Neo4j.started_db)
136
- rel = _load(rel_id, db)
137
- return nil if rel.nil?
138
- rel.wrapper
139
- end
140
-
141
- # Same as load but does not return the node as a wrapped Ruby object.
142
- #
143
- def _load(rel_id, db = Neo4j.started_db)
144
- return nil if rel_id.nil?
145
- rel = db.graph.get_relationship_by_id(rel_id.to_i)
146
- rel.hasProperty('_classname') # since we want a IllegalStateException which is otherwise not triggered
147
- rel
148
- rescue java.lang.IllegalStateException
149
- nil # the node has been deleted
150
- rescue org.neo4j.graphdb.NotFoundException
151
- nil
152
- end
153
-
154
- def extend_java_class(java_clazz) #:nodoc:
155
- java_clazz.class_eval do
156
- include Neo4j::Property
157
- include Neo4j::Equal
158
-
159
- alias_method :_end_node, :getEndNode
160
- alias_method :_start_node, :getStartNode
161
- alias_method :_other_node, :getOtherNode
162
-
163
-
164
- # Deletes the relationship between the start and end node
165
- #
166
- # May raise an exception if delete was unsuccessful.
167
- #
168
- # ==== Returns
169
- # nil
170
- #
171
- def del
172
- delete
173
- end
174
-
175
- def end_node # :nodoc:
176
- getEndNode.wrapper
177
- end
178
-
179
- def start_node # :nodoc:
180
- getStartNode.wrapper
181
- end
182
-
183
- def other_node(node) # :nodoc:
184
- getOtherNode(node._java_node).wrapper
185
- end
186
-
187
-
188
- # same as _java_rel
189
- # Used so that we have same method for both relationship and nodes
190
- def wrapped_entity
191
- self
192
- end
193
-
194
- def _java_rel
195
- self
196
- end
197
-
198
-
199
- # Returns true if the relationship exists
200
- def exist?
201
- Neo4j::Relationship.exist?(self)
202
- end
203
-
204
- # Loads the Ruby wrapper for this node
205
- # If there is no _classname property for this node then it will simply return itself.
206
- # Same as Neo4j::Node.load_wrapper(node)
207
- def wrapper
208
- self.class.wrapper(self)
209
- end
210
-
211
-
212
- # Returns the relationship name
213
- #
214
- # ==== Example
215
- # a = Neo4j::Node.new
216
- # a.outgoing(:friends) << Neo4j::Node.new
217
- # a.rels.first.rel_type # => 'friends'
218
- #
219
- def rel_type
220
- getType().name()
221
- end
222
-
223
- def class
224
- Neo4j::Relationship
225
- end
226
-
227
- end
228
-
229
- end
230
-
231
- Neo4j::Relationship.extend_java_class(org.neo4j.kernel.impl.core.RelationshipProxy)
232
-
233
- end
234
-
235
- end
236
-
237
- end
238
-
239
-
@@ -1,36 +0,0 @@
1
- module Neo4j
2
- module RelationshipMixin
3
- module ClassMethods
4
- def load_wrapper(rel)
5
- wrapped_rel = self.orig_new
6
- wrapped_rel.init_on_load(rel)
7
- wrapped_rel
8
- end
9
-
10
-
11
- # Creates a relationship between given nodes.
12
- #
13
- # You can use two callback method to initialize the relationship
14
- # init_on_load:: this method is called when the relationship is loaded from the database
15
- # init_on_create:: called when the relationship is created, will be provided with the same argument as the new method
16
- #
17
- # ==== Parameters (when creating a new relationship in db)
18
- # type:: the key and value to be set
19
- # from_node:: create relationship from this node
20
- # to_node:: create relationship to this node
21
- # props:: optional hash of properties to initialize the create relationship with
22
- #
23
- def new(*args)
24
- type, from_node, to_node = args
25
- rel = Neo4j::Relationship.create(type, from_node, to_node)
26
- wrapped_rel = super()
27
- Neo4j::IdentityMap.add(rel, wrapped_rel)
28
- wrapped_rel.init_on_load(rel)
29
- wrapped_rel.init_on_create(*args)
30
- wrapped_rel
31
- end
32
-
33
- alias_method :create, :new
34
- end
35
- end
36
- end
@@ -1,142 +0,0 @@
1
- # external neo4j dependencies
2
- require 'neo4j/index/index'
3
- require 'neo4j/property/property'
4
-
5
- # internal dependencies
6
- require 'neo4j/relationship_mixin/class_methods'
7
-
8
-
9
- module Neo4j
10
-
11
- # Use this mixin to wrap Neo4j Relationship Java object.
12
- # This mixin is similar to Neo4j::NodeMixin which wraps Neo4j::Node Java objects.
13
- #
14
- # ==== Instance Methods, Mixins
15
- # * Neo4j::Index :: relationships can also be indexed just like nodes
16
- # *
17
- # ==== Class Methods, Mixins
18
- # * Neo4j::Index::ClassMethods :: for declaration for keeping lucene index and neo4j property in sync
19
- # * Neo4j::Property::ClassMethods :: for declaration of convenience accessors of property
20
- #
21
- module RelationshipMixin
22
- extend Forwardable
23
- include Neo4j::Index
24
-
25
- def_delegators :@_java_rel, :[]=, :[], :property?, :props, :attributes, :update, :neo_id, :id, :to_param, :getId,
26
- :equal?, :eql?, :==, :delete, :getStartNode, :getEndNode, :getOtherNode, :exist?
27
-
28
-
29
-
30
- # --------------------------------------------------------------------------
31
- # Initialization methods
32
- #
33
-
34
-
35
- # Init this node with the specified java neo4j relationship.
36
- #
37
- def init_on_load(java_rel) # :nodoc:
38
- @_java_rel = java_rel
39
- end
40
-
41
-
42
- # Creates a new node and initialize with given properties.
43
- #
44
- def init_on_create(*args) # :nodoc:
45
- type, from_node, to_node, props = args
46
- self[:_classname] = self.class.to_s
47
- if props.respond_to?(:each_pair)
48
- props.each_pair { |k, v| respond_to?("#{k}=") ? self.send("#{k}=", v) : @_java_rel[k] = v }
49
- end
50
- end
51
-
52
-
53
- # --------------------------------------------------------------------------
54
- # Instance Methods
55
- #
56
-
57
- # Returns the org.neo4j.graphdb.Relationship wrapped object
58
- def _java_rel
59
- @_java_rel
60
- end
61
-
62
- def _java_entity
63
- @_java_rel
64
- end
65
-
66
- # Returns the end node of this relationship
67
- def end_node
68
- id = getEndNode.getId
69
- Neo4j::Node.load(id)
70
- end
71
-
72
- # Returns the start node of this relationship
73
- def start_node
74
- id = getStartNode.getId
75
- Neo4j::Node.load(id)
76
- end
77
-
78
- # Deletes this relationship
79
- def del
80
- delete
81
- end
82
-
83
- def exist?
84
- Neo4j::Relationship.exist?(self)
85
- end
86
-
87
- # A convenience operation that, given a node that is attached to this relationship, returns the other node.
88
- # For example if node is a start node, the end node will be returned, and vice versa.
89
- # This is a very convenient operation when you're manually traversing the node space by invoking one of the #rels operations on node.
90
- #
91
- # This operation will throw a runtime exception if node is neither this relationship's start node nor its end node.
92
- #
93
- # ==== Example
94
- # For example, to get the node "at the other end" of a relationship, use the following:
95
- # Node endNode = node.rel(:some_rel_type).other_node(node)
96
- #
97
- def other_node(node)
98
- neo_node = node.respond_to?(:_java_node)? node._java_node : node
99
- id = getOtherNode(neo_node).getId
100
- Neo4j::Node.load(id)
101
- end
102
-
103
-
104
- # Returns the neo relationship type that this relationship is used in.
105
- # (see java API org.neo4j.graphdb.Relationship#getType and org.neo4j.graphdb.RelationshipType)
106
- #
107
- # ==== Returns
108
- # the relationship type (of type Symbol)
109
- #
110
- def relationship_type
111
- @_java_rel.getType.name.to_sym
112
- end
113
-
114
- # --------------------------------------------------------------------------
115
- # Class Methods
116
- #
117
-
118
- class << self
119
- def included(c) # :nodoc:
120
- c.instance_eval do
121
- class << self
122
- alias_method :orig_new, :new
123
- end
124
- end
125
-
126
- c.class_inheritable_accessor :_decl_props
127
- c._decl_props ||= {}
128
-
129
- c.extend ClassMethods
130
- c.extend Neo4j::Property::ClassMethods
131
- c.extend Neo4j::Index::ClassMethods
132
-
133
- def c.inherited(subclass)
134
- subclass.rel_indexer self
135
- super
136
- end
137
-
138
- c.rel_indexer c
139
- end
140
- end
141
- end
142
- end
@@ -1,58 +0,0 @@
1
- module Neo4j
2
- # == Represents a set of relationships.
3
- # See Neo4j::EventHandler
4
- class RelationshipSet
5
- def initialize(size=0)
6
- @relationship_type_set = java.util.HashSet.new(size)
7
- @relationship_set = java.util.HashSet.new(size)
8
- @relationship_map = java.util.HashMap.new(size)
9
- end
10
-
11
- # Adds a relationship to the set
12
- def add(rel)
13
- @relationship_type_set.add(RelationshipSetEntry.new(rel.getEndNode().getId(),rel.rel_type))
14
- relationships(rel.getEndNode().getId()) << rel
15
- @relationship_set.add(rel.getId)
16
- end
17
-
18
- # Returns a collection of relationships where the node with the specified end node id is the end node.
19
- def relationships(end_node_id)
20
- @relationship_map.get(end_node_id) || add_list(end_node_id)
21
- end
22
-
23
- # Returns true if the specified relationship is in the set
24
- def contains_rel?(rel)
25
- @relationship_set.contains(rel.getId)
26
- end
27
-
28
- # Returns true if a relationship with the specified end_node_id and relationship_type is present in the set.
29
- def contains?(end_node_id,relationship_type)
30
- @relationship_type_set.contains(RelationshipSetEntry.new(end_node_id,relationship_type))
31
- end
32
-
33
- protected
34
- def add_list(node_id)
35
- @relationship_map.put(node_id,[])
36
- @relationship_map.get(node_id)
37
- end
38
- end
39
-
40
- class RelationshipSetEntry
41
- attr_accessor :nodeid, :relationship_type
42
- def initialize(nodeid,relationship_type)
43
- @nodeid,@relationship_type = nodeid.to_s, relationship_type.to_s
44
- end
45
-
46
- def ==(o)
47
- eql?(o)
48
- end
49
-
50
- def eql?(other)
51
- @nodeid == other.nodeid && @relationship_type == other.relationship_type
52
- end
53
-
54
- def hash
55
- 3 * @nodeid.hash + @relationship_type.hash
56
- end
57
- end
58
- end