neo4j 1.0.0.beta.9 → 1.0.0.beta.10

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (67) hide show
  1. data/README.rdoc +5 -1971
  2. data/lib/neo4j/mapping/class_methods/relationship.rb +2 -2
  3. data/lib/neo4j/mapping/decl_relationship_dsl.rb +6 -1
  4. data/lib/neo4j/mapping/has_n.rb +17 -1
  5. data/lib/neo4j/node_traverser.rb +14 -1
  6. data/lib/neo4j/rails/model.rb +127 -31
  7. data/lib/neo4j/rails/tx_methods.rb +11 -0
  8. data/lib/neo4j/rails/value.rb +44 -1
  9. data/lib/neo4j/version.rb +1 -1
  10. data/lib/neo4j.rb +1 -0
  11. metadata +4 -59
  12. data/lib/neo4j.old/batch_inserter.rb +0 -144
  13. data/lib/neo4j.old/config.rb +0 -138
  14. data/lib/neo4j.old/event_handler.rb +0 -73
  15. data/lib/neo4j.old/extensions/activemodel.rb +0 -158
  16. data/lib/neo4j.old/extensions/aggregate/aggregate_enum.rb +0 -40
  17. data/lib/neo4j.old/extensions/aggregate/ext/node_mixin.rb +0 -69
  18. data/lib/neo4j.old/extensions/aggregate/node_aggregate.rb +0 -8
  19. data/lib/neo4j.old/extensions/aggregate/node_aggregate_mixin.rb +0 -331
  20. data/lib/neo4j.old/extensions/aggregate/node_aggregator.rb +0 -216
  21. data/lib/neo4j.old/extensions/aggregate/node_group.rb +0 -43
  22. data/lib/neo4j.old/extensions/aggregate/prop_group.rb +0 -30
  23. data/lib/neo4j.old/extensions/aggregate/property_enum.rb +0 -24
  24. data/lib/neo4j.old/extensions/aggregate/props_aggregate.rb +0 -8
  25. data/lib/neo4j.old/extensions/aggregate/props_aggregate_mixin.rb +0 -31
  26. data/lib/neo4j.old/extensions/aggregate/props_aggregator.rb +0 -80
  27. data/lib/neo4j.old/extensions/aggregate.rb +0 -12
  28. data/lib/neo4j.old/extensions/find_path.rb +0 -117
  29. data/lib/neo4j.old/extensions/graph_algo/all_simple_paths.rb +0 -133
  30. data/lib/neo4j.old/extensions/graph_algo/neo4j-graph-algo-0.3.jar +0 -0
  31. data/lib/neo4j.old/extensions/graph_algo.rb +0 -1
  32. data/lib/neo4j.old/extensions/reindexer.rb +0 -104
  33. data/lib/neo4j.old/extensions/rest/rest.rb +0 -336
  34. data/lib/neo4j.old/extensions/rest/rest_mixin.rb +0 -193
  35. data/lib/neo4j.old/extensions/rest/server.rb +0 -50
  36. data/lib/neo4j.old/extensions/rest/stubs.rb +0 -141
  37. data/lib/neo4j.old/extensions/rest.rb +0 -21
  38. data/lib/neo4j.old/extensions/rest_master.rb +0 -34
  39. data/lib/neo4j.old/extensions/rest_slave.rb +0 -31
  40. data/lib/neo4j.old/extensions/tx_tracker.rb +0 -392
  41. data/lib/neo4j.old/indexer.rb +0 -187
  42. data/lib/neo4j.old/jars/geronimo-jta_1.1_spec-1.1.1.jar +0 -0
  43. data/lib/neo4j.old/jars/neo4j-kernel-1.0.jar +0 -0
  44. data/lib/neo4j.old/jars.rb +0 -6
  45. data/lib/neo4j.old/mixins/java_list_mixin.rb +0 -139
  46. data/lib/neo4j.old/mixins/java_node_mixin.rb +0 -205
  47. data/lib/neo4j.old/mixins/java_property_mixin.rb +0 -169
  48. data/lib/neo4j.old/mixins/java_relationship_mixin.rb +0 -60
  49. data/lib/neo4j.old/mixins/migration_mixin.rb +0 -157
  50. data/lib/neo4j.old/mixins/node_mixin.rb +0 -249
  51. data/lib/neo4j.old/mixins/property_class_methods.rb +0 -265
  52. data/lib/neo4j.old/mixins/rel_class_methods.rb +0 -167
  53. data/lib/neo4j.old/mixins/relationship_mixin.rb +0 -103
  54. data/lib/neo4j.old/neo.rb +0 -247
  55. data/lib/neo4j.old/node.rb +0 -49
  56. data/lib/neo4j.old/reference_node.rb +0 -15
  57. data/lib/neo4j.old/relationship.rb +0 -85
  58. data/lib/neo4j.old/relationships/decl_relationship_dsl.rb +0 -164
  59. data/lib/neo4j.old/relationships/has_list.rb +0 -101
  60. data/lib/neo4j.old/relationships/has_n.rb +0 -129
  61. data/lib/neo4j.old/relationships/node_traverser.rb +0 -138
  62. data/lib/neo4j.old/relationships/relationship_dsl.rb +0 -149
  63. data/lib/neo4j.old/relationships/traversal_position.rb +0 -50
  64. data/lib/neo4j.old/relationships/wrappers.rb +0 -51
  65. data/lib/neo4j.old/search_result.rb +0 -72
  66. data/lib/neo4j.old/transaction.rb +0 -254
  67. data/lib/neo4j.old/version.rb +0 -3
@@ -1,265 +0,0 @@
1
- module Neo4j::PropertyClassMethods
2
-
3
- #
4
- # Access to class constants.
5
- # These properties are shared by the class and its siblings.
6
- # For example that means that we can specify properties for a parent
7
- # class and the child classes will 'inherit' those properties.
8
- #
9
-
10
- def root_class # :nodoc:
11
- self::ROOT_CLASS
12
- end
13
-
14
- def properties_info # :nodoc:
15
- self::PROPERTIES_INFO
16
- end
17
-
18
-
19
- # ------------------------------------------------------------------------
20
-
21
-
22
- # Generates accessor method and sets configuration for Neo4j node properties.
23
- # The generated accessor is a simple wrapper around the #set_property and
24
- # #get_property methods.
25
- #
26
- # If a property is set to nil the property will be removed.
27
- #
28
- # ==== Configuration
29
- # By setting the :type configuration parameter to 'Object' makes
30
- # it possible to marshal any ruby object.
31
- #
32
- # If no type is provided the only the native Neo4j property types are allowed:
33
- # * TrueClass, FalseClass
34
- # * String
35
- # * Fixnum
36
- # * Float
37
- # * Boolean
38
- #
39
- # ==== Parameters
40
- # props<Array,Hash>:: a variable length arguments or a hash, see example below
41
- #
42
- # ==== Example
43
- # class Baaz; end
44
- #
45
- # class Foo
46
- # include Neo4j::NodeMixin
47
- # property :name, :city # can set several properties in one go
48
- # property :bar, :type => Object # allow serialization of any ruby object
49
- # end
50
- #
51
- # f = Foo.new
52
- # f.bar = Baaz.new
53
- #
54
- def property(*props)
55
- if props.size == 2 and props[1].kind_of?(Hash)
56
- props[1].each_pair do |key, value|
57
- pname = props[0].to_sym
58
- properties_info[pname] ||= {}
59
- properties_info[pname][key] = value
60
- end
61
- props = props[0..0]
62
- end
63
-
64
- props.each do |prop|
65
- pname = prop.to_sym
66
- properties_info[pname] ||= {}
67
- properties_info[pname][:defined] = true
68
-
69
- define_method(pname) do
70
- self[pname]
71
- end
72
-
73
- name = (pname.to_s() +"=").to_sym
74
- define_method(name) do |value|
75
- self[pname] = value
76
- end
77
- end
78
- end
79
-
80
- # Returns true if the given property name should be marshalled.
81
- # All properties that has a type will be marshalled.
82
- #
83
- # ===== Example
84
- # class Foo
85
- # include Neo4j::NodeMixin
86
- # property :name
87
- # property :since, :type => Date
88
- # end
89
- # Foo.marshal?(:since) => true
90
- # Foo.marshal?(:name) => false
91
- #
92
- # ==== Returns
93
- # true if the property will be marshalled, false otherwise
94
- #
95
- def marshal?(prop_name)
96
- return false if properties_info[prop_name.to_sym].nil?
97
- return false if properties_info[prop_name.to_sym][:type].nil?
98
- return true
99
- end
100
-
101
-
102
- # Returns true if the given property name has been defined with the class
103
- # method property or properties.
104
- #
105
- # Notice that the node may have properties that has not been declared.
106
- # It is always possible to set an undeclared property on a node.
107
- #
108
- # ==== Returns
109
- # true or false
110
- #
111
- def property?(prop_name)
112
- return false if properties_info[prop_name.to_sym].nil?
113
- properties_info[prop_name.to_sym][:defined] == true
114
- end
115
-
116
-
117
- # Creates a struct class containig all properties of this class.
118
- #
119
- # ==== Example
120
- #
121
- # h = Person.value_object.new
122
- # h.name # => nil
123
- # h.name='kalle'
124
- # h[:name] # => 'kalle'
125
- #
126
- # ==== Returns
127
- # Struct
128
- #
129
- def value_object
130
- @value_class ||= create_value_class
131
- end
132
-
133
- # Index a property or a relationship.
134
- # If the rel_prop arg contains a '.' then it will index the relationship.
135
- # For example "friends.name" will index each node with property name in the relationship friends.
136
- # For example "name" will index the name property of this NodeMixin class.
137
- #
138
- # ==== Example
139
- # class Person
140
- # include Neo4j::NodeMixin
141
- # property :name
142
- # index :name
143
- # end
144
- #
145
- def index(*rel_type_props)
146
- if rel_type_props.size == 2 and rel_type_props[1].kind_of?(Hash)
147
- rel_type_props[1].each_pair do |key, value|
148
- idx = rel_type_props[0]
149
- indexer.field_infos[idx.to_sym][key] = value
150
- end
151
- rel_type_props = rel_type_props[0..0]
152
- end
153
- rel_type_props.each do |rel_type_prop|
154
- rel_name, prop = rel_type_prop.to_s.split('.')
155
- index_property(rel_name) if prop.nil?
156
- index_relationship(rel_name, prop) unless prop.nil?
157
- end
158
- end
159
-
160
-
161
- # Remove one or more specified indexes.
162
- # Those indexes will not be updated anymore, old indexes will still exist
163
- # until the update_index method is called.
164
- #
165
- def remove_index(*keys)
166
- keys.each do |key|
167
- raise "Not implemented remove index on a relationship index" if key.to_s.include?('.')
168
- indexer.remove_index_on_property(key)
169
- end
170
- end
171
-
172
-
173
- def index_property(prop) # :nodoc:
174
- indexer.add_index_on_property(prop)
175
- end
176
-
177
-
178
- def index_relationship(rel_name, prop) # :nodoc:
179
- # find the trigger and updater classes and the rel_type of the given rel_name
180
- trigger_clazz = decl_relationships[rel_name.to_sym].to_class
181
- trigger_clazz ||= self # if not defined in a has_n
182
-
183
- updater_clazz = self
184
-
185
- dsl = decl_relationships[rel_name.to_sym]
186
- rel_type = dsl.to_type # this or the other node we index ?
187
- rel_type ||= rel_name # if not defined (in a has_n) use the same name as the rel_name
188
-
189
- if dsl.outgoing?
190
- namespace_type = dsl.namespace_type
191
- else
192
- clazz = dsl.to_class || node.class
193
- namespace_type = clazz.decl_relationships[dsl.to_type].namespace_type
194
- end
195
-
196
- # add index on the trigger class and connect it to the updater_clazz
197
- # (a trigger may cause an update of the index using the Indexer specified on the updater class)
198
- trigger_clazz.indexer.add_index_in_relationship_on_property(updater_clazz, rel_name, rel_type, prop, namespace_type.to_sym)
199
- end
200
-
201
-
202
- # Finds all nodes or relationship of this type (and ancestors of this type) having
203
- # the specified property values.
204
- # See the lucene module for more information how to do a query.
205
- #
206
- # ==== Example
207
- # MyNode.find(:name => 'foo', :company => 'bar')
208
- #
209
- # Or using a DSL query (experimental)
210
- # MyNode.find{(name == 'foo') & (company == 'bar')}
211
- #
212
- # ==== Returns
213
- # Neo4j::SearchResult
214
- #
215
- def find(query=nil, &block)
216
- self.indexer.find(query, block)
217
- end
218
-
219
-
220
- # Creates a new value object class (a Struct) representing this class.
221
- #
222
- # The struct will have the Ruby on Rails method: model_name and
223
- # new_record? so that it can be used for restful routing.
224
- #
225
- def create_value_class # :nodoc:
226
- # the name of the class we want to create
227
- name = "#{self.to_s}ValueObject".gsub("::", '_')
228
-
229
- # remove previous class if exists
230
- Neo4j.instance_eval do
231
- remove_const name
232
- end if Neo4j.const_defined?(name)
233
-
234
- # get the properties we want in the new class
235
- props = self.properties_info.keys.map{|k| ":#{k}"}.join(',')
236
- Neo4j.module_eval %Q[class #{name} < Struct.new(#{props}); end]
237
-
238
- # get reference to the new class
239
- clazz = Neo4j.const_get(name)
240
-
241
- # make it more Ruby on Rails friendly - try adding model_name method
242
- if self.respond_to?(:model_name)
243
- model = self.model_name.clone
244
- (
245
- class << clazz;
246
- self;
247
- end).instance_eval do
248
- define_method(:model_name) {model}
249
- end
250
- end
251
-
252
- # by calling the _update method we change the state of the struct
253
- # so that new_record returns false - Ruby on Rails
254
- clazz.instance_eval do
255
- define_method(:_update) do |hash|
256
- @_updated = true
257
- hash.each_pair {|key, value| self[key.to_sym] = value if members.include?(key.to_s) }
258
- end
259
- define_method(:new_record?) { ! defined?(@_updated) }
260
- end
261
-
262
- clazz
263
- end
264
-
265
- end
@@ -1,167 +0,0 @@
1
- module Neo4j::RelClassMethods
2
-
3
-
4
- # Contains information of all relationships, name, type, and multiplicity
5
- #
6
- # :api: private
7
- def decl_relationships # :nodoc:
8
- self::DECL_RELATIONSHIPS
9
- end
10
-
11
-
12
- # Specifies a relationship between two node classes.
13
- # Generates assignment and accessor methods for the given relationship
14
- #
15
- # ==== Example
16
- #
17
- # class FileNode
18
- # include Ne4j::NodeMixin
19
- # has_one(:folder)
20
- # end
21
- #
22
- # file = FileNode.new
23
- # file.folder = Neo4j::Node.new
24
- # file.folder # => the node above
25
- #
26
- # ==== Returns
27
- #
28
- # Neo4j::Relationships::DeclRelationshipDsl
29
- #
30
- def has_one(rel_type, params = {})
31
- clazz = self
32
- module_eval(%Q{def #{rel_type}=(value)
33
- dsl = #{clazz}.decl_relationships[:'#{rel_type.to_s}']
34
- r = Neo4j::Relationships::HasN.new(self, dsl)
35
- r.each {|n| n.del} # delete previous relationships, only one can exist
36
- r << value
37
- r
38
- end}, __FILE__, __LINE__)
39
-
40
- module_eval(%Q{def #{rel_type}
41
- dsl = #{clazz}.decl_relationships[:'#{rel_type.to_s}']
42
- r = Neo4j::Relationships::HasN.new(self, dsl)
43
- [*r][0]
44
- end}, __FILE__, __LINE__)
45
-
46
- module_eval(%Q{
47
- def #{rel_type}_rel
48
- dsl = #{clazz}.decl_relationships[:'#{rel_type.to_s}']
49
- r = Neo4j::Relationships::HasN.new(self, dsl).rels
50
- [*r][0]
51
- end}, __FILE__, __LINE__)
52
-
53
- decl_relationships[rel_type.to_sym] = Neo4j::Relationships::DeclRelationshipDsl.new(rel_type, params)
54
- end
55
-
56
-
57
- # Specifies a relationship between two node classes.
58
- # Generates assignment and accessor methods for the given relationship.
59
- #
60
- # ==== Example
61
- #
62
- # class FolderNode
63
- # include Ne4j::NodeMixin
64
- # has_n(:files)
65
- # end
66
- #
67
- # folder = FolderNode.new
68
- # folder.files << Neo4j::Node.new << Neo4j::Node.new
69
- # folder.files.inject {...}
70
- #
71
- # ==== Returns
72
- #
73
- # Neo4j::Relationships::DeclRelationshipDsl
74
- #
75
- def has_n(rel_type, params = {})
76
- clazz = self
77
- module_eval(%Q{
78
- def #{rel_type}(&block)
79
- dsl = #{clazz}.decl_relationships[:'#{rel_type.to_s}']
80
- Neo4j::Relationships::HasN.new(self, dsl, &block)
81
- end}, __FILE__, __LINE__)
82
-
83
- module_eval(%Q{
84
- def #{rel_type}_rels
85
- dsl = #{clazz}.decl_relationships[:'#{rel_type.to_s}']
86
- Neo4j::Relationships::HasN.new(self, dsl).rels
87
- end}, __FILE__, __LINE__)
88
-
89
- decl_relationships[rel_type.to_sym] = Neo4j::Relationships::DeclRelationshipDsl.new(rel_type, params)
90
- end
91
-
92
-
93
- # Specifies a relationship to a linked list of nodes.
94
- # Each list item class may (but not necessarily use the belongs_to_list
95
- # in order to specify which ruby class should be loaded when a list item is loaded.
96
- #
97
- # ==== Example
98
- #
99
- # class Company
100
- # include Neo4j::NodeMixin
101
- # has_list :employees
102
- # end
103
- #
104
- # company = Company.new
105
- # company.employees << employee1 << employee2
106
- #
107
- # # prints first employee2 and then employee1
108
- # company.employees.each {|employee| puts employee.name}
109
- #
110
- # ===== Size Counter
111
- # If the optional parameter :size is given then the list will contain a size counter.
112
- #
113
- # Example
114
- #
115
- # class Company
116
- # include Neo4j::NodeMixin
117
- # has_list :employees, :counter => true
118
- # end
119
- #
120
- # company = Company.new
121
- # company.employees << employee1 << employee2
122
- # company.employees.size # => 2
123
- #
124
- # ==== Deleted List Items
125
- #
126
- # The list will be updated if an item is deleted in a list.
127
- # Example:
128
- #
129
- # company = Company.new
130
- # company.employees << employee1 << employee2 << employee3
131
- # company.employees.size # => 3
132
- #
133
- # employee2.del
134
- #
135
- # [*company.employees] # => [employee1, employee3]
136
- # company.employees.size # => 2
137
- #
138
- # ===== List Items Memberships
139
- #
140
- # For deciding which lists a node belongs to see the Neo4j::NodeMixin#list method
141
- #
142
- # :api: public
143
- def has_list(rel_type, params = {})
144
- clazz = self
145
- #(self.kind_of?(Module))? self : self.class
146
- module_eval(%Q{
147
- def #{rel_type}(&block)
148
- dsl = #{clazz}.decl_relationships[:'#{rel_type.to_s}']
149
- Neo4j::Relationships::HasList.new(self, dsl, &block)
150
- end}, __FILE__, __LINE__)
151
- Neo4j.event_handler.add Neo4j::Relationships::HasList
152
- decl_relationships[rel_type.to_sym] = Neo4j::Relationships::DeclRelationshipDsl.new(rel_type, params)
153
- end
154
-
155
-
156
- # Can be used together with the has_list to specify the ruby class of a list item.
157
- #
158
- # :api: public
159
- def belongs_to_list(rel_type, params = {})
160
- decl_relationships[rel_type] = Neo4j::Relationships::DeclRelationshipDsl.new(rel_type, params)
161
- end
162
-
163
- def indexer # :nodoc:
164
- Neo4j::Indexer.instance(root_class) # create an indexer that search for nodes (and not relationships)
165
- end
166
-
167
- end
@@ -1,103 +0,0 @@
1
- module Neo4j
2
-
3
-
4
- # A module that can be mixed in like a Neo4j::NodeMixin
5
- # It wraps the Neo4j Relationship class.
6
- # It includes the Neo4j::PropertyClassMethods class methods.
7
- #
8
- module RelationshipMixin
9
- extend Forwardable
10
-
11
- attr_reader :_java_node
12
-
13
- def_delegators :@_java_node, :[]=, :[], :property?, :props, :update, :neo_id, :del, :start_node, :end_node, :other_node, :relationship_type, :wrapper
14
-
15
- # Initialize the Relationship object with specified java org.neo4j.graphdb.Relationship object
16
- # Expects at least one parameter.
17
- #
18
- # This method is used both when neo4j.rb loads relationships from the database as well as when
19
- # a relationship is first created. If you are only interested in when the relationship is created in the database
20
- # see the #init_with_args (which you may want to override and call super on).
21
- #
22
- # ==== Parameters (when loading from DB)
23
- # param1:: the internal java relationship object (org.neo4j.graphdb.Relationship)
24
- #
25
- # ==== Parameters (when creating a new relationship in db)
26
- # type:: the key and value to be set
27
- # from_node:: create relationship from this node
28
- # to:: create relationship to this node
29
- #
30
- def initialize(*args)
31
- if (args[0].kind_of?(Java::org.neo4j.graphdb.Relationship))
32
- init_with_rel(args[0])
33
- else
34
- init_with_args(*args)
35
- end
36
-
37
- # must call super with no arguments so that chaining of initialize method will work
38
- super()
39
- end
40
-
41
-
42
- # Initialize this relationship with the given arguments.
43
- # This method is only called when the relationship is created in the database
44
- # (and not when it is loaded from the database).
45
- #
46
- # ==== Parameters
47
- # type:: the key and value to be set
48
- # from_node:: create relationship from this node
49
- # to_node:: create relationship to this node
50
- def init_with_args(type, from_node, to_node)
51
- @_java_node = Neo4j.create_rel(type, from_node, to_node)
52
- @_java_node._wrapper = self
53
- @_java_node[:_classname] = self.class.to_s
54
- Neo4j.event_handler.relationship_created(self)
55
- self.class.indexer.on_relationship_created(@_wrapper, type)
56
- end
57
-
58
- # Inits this node with the specified java neo relationship
59
- #
60
- # :api: private
61
- def init_with_rel(rel)
62
- @_java_node = rel # TODO hmm, should really name _java_node to something else
63
- rel._wrapper=self
64
- rel[:_classname] = self.class.to_s unless rel.property?(:_classname)
65
- end
66
-
67
-
68
- def eql?(o)
69
- o.kind_of?(RelationshipMixin) && o.internal_r == internal_r
70
- end
71
-
72
- def ==(o)
73
- eql?(o)
74
- end
75
-
76
- def hash
77
- _java_node.hashCode
78
- end
79
-
80
- # Adds class methods from
81
- #
82
- # * Neo4j::RelClassMethods
83
- # * Neo4j::PropertyClassMethods
84
- #
85
- def self.included(c) # :nodoc:
86
- c.instance_eval do
87
- # these constants are used in the Neo4j::RelClassMethods and Neo4j::PropertyClassMethods
88
- # they are defined here since they should only be defined once -
89
- # all subclasses share the same index, declared properties and index_updaters
90
- const_set(:ROOT_CLASS, self)
91
- const_set(:PROPERTIES_INFO, {})
92
- end unless c.const_defined?(:ROOT_CLASS)
93
- c.extend Neo4j::PropertyClassMethods
94
- c.extend ClassMethods
95
- end
96
-
97
- module ClassMethods
98
- def indexer # :nodoc:
99
- Neo4j::Indexer.instance(root_class, false) # create an indexer that search for relationships (and not nodes)
100
- end
101
- end
102
- end
103
- end