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

Sign up to get free protection for your applications and to get access to all the features.
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,60 +0,0 @@
1
- # This is a mixin that is used to extend the java object org.neo4j.graphdb.Relationship
2
- #
3
- module Neo4j::JavaRelationshipMixin
4
-
5
- # Deletes this relationship.
6
- #
7
- def del
8
- Neo4j.event_handler.relationship_deleted(wrapper)
9
- type = getType().name()
10
-
11
- delete
12
-
13
- if end_node.class.respond_to?(:indexer)
14
- end_node.class.indexer.on_relationship_deleted(end_node, type)
15
- elsif end_node.wrapper?
16
- end_node.wrapper_class.indexer.on_relationship_deleted(end_node.wrapper, type)
17
- end
18
- end
19
-
20
- # Returns the end node of this relationship
21
- def end_node
22
- id = getEndNode.getId
23
- Neo4j.load_node(id)
24
- end
25
-
26
- # Returns the start node of this relationship
27
- def start_node
28
- id = getStartNode.getId
29
- Neo4j.load_node(id)
30
- end
31
-
32
- # A convenience operation that, given a node that is attached to this relationship, returns the other node.
33
- # For example if node is a start node, the end node will be returned, and vice versa.
34
- # This is a very convenient operation when you're manually traversing the node space by invoking one of the #rels operations on node.
35
- #
36
- # This operation will throw a runtime exception if node is neither this relationship's start node nor its end node.
37
- #
38
- # ==== Example
39
- # For example, to get the node "at the other end" of a relationship, use the following:
40
- # Node endNode = node.rel(:some_rel_type).other_node(node)
41
- #
42
- def other_node(node)
43
- neo_node = node
44
- neo_node = node._java_node if node.respond_to?(:_java_node)
45
- id = getOtherNode(neo_node).getId
46
- Neo4j.load_node(id)
47
- end
48
-
49
-
50
- # Returns the neo relationship type that this relationship is used in.
51
- # (see java API org.neo4j.graphdb.Relationship#getType and org.neo4j.graphdb.RelationshipType)
52
- #
53
- # ==== Returns
54
- # the relationship type (of type Symbol)
55
- #
56
- def relationship_type
57
- get_type.name.to_sym
58
- end
59
-
60
- end
@@ -1,157 +0,0 @@
1
- module Neo4j
2
-
3
-
4
- # By including this mixing on a node class one can add migrations to it.
5
- # Adds a db_version attribute on the class including this mixin.
6
- #
7
- module MigrationMixin
8
-
9
- # Returns the current version of the database of the class including this Mixin.
10
- #
11
- def db_version
12
- Neo4j::Transaction.run {self[:db_version] || 0}
13
- end
14
-
15
-
16
- # Force one or more migrations to occur if not already done yet.
17
- # Will check the current db_version with the given 'to_version' and perform
18
- # migrations. If the 'to_version' parameter is not given then it will upgrade the
19
- # database with all migrations it can find.
20
- #
21
- # === Parameters
22
- # to_version:: the version we want to migrate to, if not given then all migrations will be run
23
- # verbose:: if it should print out information of which migration is run
24
- #
25
- def migrate!(to_version=nil, verbose = false)
26
- return if self.class.migrations.nil? || self.class.migrations.empty?
27
-
28
-
29
- # which version should we go to if to_version was not provided ?
30
- to_version ||= self.class.migrations.keys.sort.reverse[0]
31
- puts "Migration: Curr ver #{db_version} need upgrade to version #{to_version}" if verbose
32
-
33
- # do we need to migrate ?
34
- return if db_version == to_version
35
-
36
- # ok, so we are running some migrations
37
- if (db_version < to_version)
38
- upgrade( (db_version+1).upto(to_version).collect { |ver| self.class.migrations[ver] }, verbose )
39
- else
40
- downgrade( db_version.downto(to_version+1).collect { |ver| self.class.migrations[ver] }, verbose )
41
- end
42
- end
43
-
44
- # Running the up method on the given migrations.
45
- #
46
- # === Parameters
47
- # migrations:: an enumerable of Migration objects
48
- def upgrade(migrations, verbose=false)
49
- migrations.each do |m|
50
- puts "Running upgrade migration #{m.version} - #{m.name}" if verbose
51
- m.up_migrator.execute(self, m.version, &m.up_block)
52
- end
53
- end
54
-
55
- # Running the down method on the given migrations.
56
- #
57
- # === Parameters
58
- # migrations:: an enumerable of Migration objects
59
- def downgrade(migrations, verbose=false)
60
- migrations.each do |m|
61
- puts "Running downgrade migration #{m.version} - #{m.name}" if verbose
62
- m.down_migrator.execute(self, m.version-1, &m.down_block)
63
- end
64
- end
65
-
66
- def self.included(c) # :nodoc:
67
- c.extend Neo4j::MigrationMixin::ClassMethods
68
- end
69
-
70
- module ClassMethods
71
- attr_accessor :migrations, :migrate_to
72
-
73
- # Specifies a migration to be performed.
74
- #
75
- # === Example
76
- #
77
- # In the following example the up and down method will be evaluated in the context of a Person node.
78
- #
79
- # Person.migration 1, :my_first_migration do
80
- # up { ... }
81
- # down { ... }
82
- # end
83
- #
84
- # See the Neo4j::MigrationMixin::Migration which the DSL is evaluated in.
85
- #
86
- def migration(version, name, &block)
87
- @migrations ||= {}
88
- migration = Migration.new(version, name)
89
- migration.instance_eval(&block)
90
- @migrations[version] = migration
91
- end
92
-
93
- # This is used for lazy migration. It stores the version that we want to upgrade to but does not perform the migrations.
94
- # Only when the node is being loaded from the database (Neo4j::NodeMixin#init_with_node) then
95
- # it will check and see if one or more migration is needed to be performed.
96
- #
97
- def migrate!(to_version=nil)
98
- @migrate_to = to_version
99
- end
100
- end
101
-
102
- # This is the context in which the Migrations DSL are evaluated in.
103
- class Migration < Struct.new(:version, :name)
104
- attr_reader :up_block, :down_block, :up_migrator, :down_migrator
105
-
106
- # Specifies a code block which is run when the migration is upgraded.
107
- #
108
- # === Parameters
109
- # migrator:: Default Neo4j::MigrationMixin::Migrator - used to execute the block
110
- def up(migrator = Migrator, &block)
111
- @up_block = block
112
- @up_migrator = migrator
113
- end
114
-
115
- # Specifies a code block which is run when the migration is upgraded.
116
- #
117
- # === Parameters
118
- # migrator:: Default Neo4j::MigrationMixin::Migrator - used to execute the block
119
- def down(migrator = Migrator, &block)
120
- @down_block = block
121
- @down_migrator = migrator
122
- end
123
-
124
- def to_s
125
- "Migration version: #{version}, name: #{name}"
126
- end
127
- end
128
-
129
- # Responsible for running a migration
130
- class Migrator
131
- class << self
132
- # Runs given migration block. If successful it will set the property
133
- # ':db_version' on the given context.
134
- #
135
- # === Parameters
136
- # context:: the context on which the block is evaluated in
137
- # version:: optional, if given then will set the property db_version on the context
138
- def execute(context, version=nil, &block)
139
- context.instance_eval &block
140
- Neo4j::Transaction.run { context[:db_version] = version} if version
141
- end
142
- end
143
- end
144
- end
145
-
146
-
147
- # Overrides the init method so that it will check if any migration is needed.
148
- # Migration might take place when the node is loaded.
149
- #
150
- module LazyMigrationMixin
151
- def init_with_node(java_node) # :nodoc:
152
- super # call Neo4j::NodeMixin#init_with_node
153
- migrate! self.class.migrate_to # for lazy migrations
154
- end
155
- end
156
- end
157
-
@@ -1,249 +0,0 @@
1
- module Neo4j
2
-
3
-
4
- # Represents a node in the Neo4j space.
5
- #
6
- # Is a wrapper around a Java Neo4j::Node (org.neo4j.graphdb.Node)
7
- # The following methods are delegated to the Java Neo4j::Node
8
- # []=, [], property?, props, update, neo_id, rels, rel?, to_param
9
- # rel, del, list?, list, lists, print, add_rel, outgoing, incoming,
10
- # next, prev, next=, prev=, head
11
- #
12
- # Those methods are defined in included mixins
13
- # This mixin also include the class method in the
14
- #
15
- # === Included Mixins
16
- # * Neo4j::JavaPropertyMixin - instance methods for properties
17
- # * Neo4j::JavaNodeMixin - instance methods
18
- # * Neo4j::JavaListMixin - instance methods for list methods
19
- # * Neo4j::RelClassMethods - class methods for generating relationship accessors
20
- # * Neo4j::PropertyClassMethods - class methods for generating property accessors
21
- #
22
- module NodeMixin
23
- extend Forwardable
24
-
25
- def_delegators :@_java_node, :[]=, :[], :property?, :props, :update, :neo_id, :rels, :rel?, :to_param,
26
- :rel, :del, :list?, :list, :lists, :print, :print_sub, :add_rel, :outgoing, :incoming,
27
- :add_list_item_methods, :next, :prev, :next=, :prev=, :head # used for has_list, defined in Neo4j::JavaListMixin
28
-
29
-
30
- # --------------------------------------------------------------------------
31
- # Initialization methods
32
- #
33
-
34
-
35
- # Initialize the the neo node for this instance.
36
- # Will create a new transaction if one is not already running.
37
- #
38
- # Does
39
- # * sets the neo4j property '_classname' to self.class.to_s
40
- # * creates a neo4j node java object (in @_java_node)
41
- # * calls init_node if that is defined in the current class.
42
- #
43
- # If you want to provide your own initialize method you should instead implement the
44
- # method init_node method.
45
- #
46
- # === Example
47
- #
48
- # class MyNode
49
- # include Neo4j::NodeMixin
50
- #
51
- # def init_node(name, age)
52
- # self[:name] = name
53
- # self[:age] = age
54
- # end
55
- # end
56
- #
57
- # node = MyNode('jimmy', 23)
58
- # # or also possible
59
- # node = MyNode :name => 'jimmy', :age => 12
60
- #
61
- # The init_node is only called when the node is created in the database.
62
- # The initialize method is used both for to purposes:
63
- # loading an already existing node from the Neo4j database and creating a new node in the database.
64
- #
65
- def initialize(*args)
66
- # was a neo java node provided ?
67
- if args.length == 1 && args[0].kind_of?(org.neo4j.graphdb.Node)
68
- # yes, it was loaded from the database
69
- init_with_node(args[0])
70
- elsif self.respond_to?(:init_node)
71
- # does the class provide an initialization method ?
72
- init_without_node({})
73
- init_node(*args)
74
- else
75
- # no, but maybe it had a hash of properties to initialize it with, create node
76
- init_without_node(args[0] || {})
77
- end
78
- # was a block given in order to initialize the neo4j node ?
79
- yield self if block_given?
80
- # must call super with no arguments so that chaining of the initialize method works
81
- super()
82
- end
83
-
84
-
85
- # Inits this node with the specified java neo node
86
- #
87
- def init_with_node(java_node) # :nodoc:
88
- @_java_node = java_node
89
- java_node._wrapper=self
90
- end
91
-
92
- # Returns the org.neo4j.graphdb.Node wrapped object
93
- def _java_node
94
- @_java_node
95
- end
96
-
97
- # Creates a new node and initialize with given properties.
98
- #
99
- def init_without_node(props) # :nodoc:
100
- props[:_classname] = self.class.to_s
101
- @_java_node = Neo4j.create_node props
102
- update_index if props && !props.empty?
103
- @_java_node._wrapper = self
104
- Neo4j.event_handler.node_created(self)
105
- end
106
-
107
-
108
- # Since we sometimes don't know if we have a java node or a wrapped Ruby node we need this so that we
109
- # always can call this method
110
- def wrapper # :nodoc:
111
- self
112
- end
113
-
114
-
115
- # --------------------------------------------------------------------------
116
- # Property methods
117
- #
118
-
119
-
120
- # Creates a struct class containing all properties of this class.
121
- # This value object can be used from Ruby on Rails RESTful routing.
122
- #
123
- # ==== Example
124
- #
125
- # h = Person.value_object.new
126
- # h.name # => nil
127
- # h.name='kalle'
128
- # h[:name] # => 'kalle'
129
- #
130
- # ==== Returns
131
- # a value object struct
132
- #
133
- def value_object
134
- vo = self.class.value_object.new
135
- vo._update(props)
136
- vo
137
- end
138
-
139
-
140
- # --------------------------------------------------------------------------
141
- # Equal and hash methods
142
- #
143
-
144
- def equal?(o)
145
- eql?(o)
146
- end
147
-
148
- def eql?(o)
149
- o.kind_of?(NodeMixin) && o._java_node == @_java_node
150
- end
151
-
152
- def ==(o)
153
- eql?(o)
154
- end
155
-
156
- def hash
157
- @_java_node.hashCode
158
- end
159
-
160
-
161
- # --------------------------------------------------------------------------
162
- # Update and Delete methods
163
- #
164
-
165
-
166
- # Specifies which relationships should be ignored when trying to cascade delete a node.
167
- # If a node does not have any relationships (except those specified here to ignore) it will be cascade deleted
168
- #
169
- def ignore_incoming_cascade_delete?(relationship) # :nodoc:
170
- # ignore relationship with property _cascade_delete_incoming
171
- relationship.property?(:_cascade_delete_incoming)
172
- end
173
-
174
- # Updates the index for this node.
175
- # This method will be automatically called when needed
176
- # (a property changed or a relationship was created/deleted)
177
- #
178
- def update_index # :nodoc:
179
- self.class.indexer.index(self)
180
- end
181
-
182
- # --------------------------------------------------------------------------
183
- # Relationship methods
184
- #
185
-
186
- # Returns a Neo4j::Relationships::NodeTraverser object for traversing nodes from and to this node.
187
- # The Neo4j::Relationships::NodeTraverser is an Enumerable that returns Neo4j::NodeMixin objects.
188
- #
189
- # ==== Example
190
- #
191
- # person_node.traverse.outgoing(:friends).each { ... }
192
- # person_node.traverse.outgoing(:friends).raw.each { }
193
- #
194
- # The raw false parameter means that the ruby wrapper object will not be loaded, instead the raw Java Neo4j object will be used,
195
- # it might improve the performance.
196
- #
197
- def traverse(*args)
198
- if args.empty?
199
- Neo4j::Relationships::NodeTraverser.new(self)
200
- else
201
- @_java_node.traverse(*args)
202
- end
203
-
204
- end
205
-
206
-
207
- # --------------------------------------------------------------------------
208
- # Private methods
209
- #
210
-
211
- def _to_java_direction(dir) # :nodoc:
212
- case dir
213
- when :outgoing
214
- org.neo4j.graphdb.Direction::OUTGOING
215
- when :incoming
216
- org.neo4j.graphdb.Direction::INCOMING
217
- when :both
218
- org.neo4j.graphdb.Direction::BOTH
219
- else
220
- raise "Unknown parameter: '#{dir}', only accept :outgoing, :incoming or :both"
221
- end
222
- end
223
-
224
-
225
- # --------------------------------------------------------------------------
226
- # Hooks
227
- #
228
-
229
-
230
- # Adds class methods from
231
- #
232
- # * Neo4j::RelClassMethods
233
- # * Neo4j::PropertyClassMethods
234
- #
235
- def self.included(c) # :nodoc:
236
- c.instance_eval do
237
- # these constants are used in the Neo4j::RelClassMethods and Neo4j::PropertyClassMethods
238
- # they are defined here since they should only be defined once -
239
- # all subclasses share the same index, declared properties and index_updaters
240
- const_set(:ROOT_CLASS, self)
241
- const_set(:DECL_RELATIONSHIPS, {})
242
- const_set(:PROPERTIES_INFO, {})
243
- end unless c.const_defined?(:DECL_RELATIONSHIPS)
244
-
245
- c.extend Neo4j::RelClassMethods
246
- c.extend Neo4j::PropertyClassMethods
247
- end
248
- end
249
- end