neo4j 1.2.3-java → 1.2.4-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 CHANGED
@@ -1,3 +1,9 @@
1
+ == 1.2.4 / 2011-10-07
2
+ * Support for traversing with Neo4j::Node#eval_paths and setting uniqueness on traversals [#187]
3
+ * Removed unnecessary node creation on database start up (class nodes attached to reference node) (Vivek Prahlad)
4
+ * Safer multitenancy - automatically reset the reference node in thread local context after each request using rack middleware
5
+ * Bugfixes for multitenancy (Deepak N and Vivek Prahlad)
6
+
1
7
  == 1.2.3 / 2011-10-01
2
8
  * Multitenancy support by namespaced-indices & changeable reference node (Vivek Prahlad, pull 41)
3
9
  * Added a Neo4j::Rails::Model#columns which returns all defined properties [#186]
data/README.rdoc CHANGED
@@ -45,7 +45,7 @@ Example of creating a Neo4j::Node
45
45
  node.outgoing(:friends).each {|node| puts "name #{node[:name]}"}
46
46
  end
47
47
 
48
- ==== Neo4j::Mapping::NodeMixin
48
+ ==== Neo4j::NodeMixin
49
49
 
50
50
  Example of mapping a ruby class to a node and delaring properties and relationships and lucene index.
51
51
 
@@ -267,8 +267,9 @@ module Neo4j
267
267
  def delete_index_type(type=nil)
268
268
  if type
269
269
  #raise "can't clear index of type '#{type}' since it does not exist ([#{@field_types.values.join(',')}] exists)" unless index_type?(type)
270
- @indexes[type] && @indexes[type].delete
271
- @indexes[type] = nil
270
+ key = index_key(type)
271
+ @indexes[key] && @indexes[key].delete
272
+ @indexes[key] = nil
272
273
  else
273
274
  @indexes.each_value { |index| index.delete }
274
275
  @indexes.clear
@@ -293,11 +294,15 @@ module Neo4j
293
294
 
294
295
  def index_for_field(field) #:nodoc:
295
296
  type = @field_types[field]
296
- create_index_with(type)
297
+ @indexes[index_key(type)] ||= create_index_with(type)
297
298
  end
298
299
 
299
300
  def index_for_type(type) #:nodoc:
300
- create_index_with(type)
301
+ @indexes[index_key(type)] ||= create_index_with(type)
302
+ end
303
+
304
+ def index_key(type)
305
+ index_names[type] + type.to_s
301
306
  end
302
307
 
303
308
  def lucene_config(type) #:nodoc:
@@ -317,11 +322,20 @@ module Neo4j
317
322
  end
318
323
 
319
324
  def index_names
320
- @index_names ||= Hash.new do |hash,index_type|
321
- default_filename = Neo4j.index_prefix + @indexer_for.to_s.gsub('::', '_')
325
+ @index_names ||= Hash.new do |hash, index_type|
326
+ default_filename = index_prefix + @indexer_for.to_s.gsub('::', '_')
322
327
  hash.fetch(index_type) {"#{default_filename}-#{index_type}"}
323
328
  end
324
329
  end
330
+
331
+ protected
332
+ def index_prefix
333
+ return "" unless Neo4j.running?
334
+ return "" unless @indexer_for.respond_to?(:ref_node_for_class)
335
+ ref_node = @indexer_for.ref_node_for_class
336
+ ref_node_name = ref_node[:name]
337
+ ref_node_name.blank? ? "" : ref_node_name + "_"
338
+ end
325
339
  end
326
340
  end
327
341
  end
data/lib/neo4j/neo4j.rb CHANGED
@@ -150,15 +150,6 @@ module Neo4j
150
150
  Thread.current[:local_ref_node] = reference_node.nil? ? nil : reference_node._java_node
151
151
  end
152
152
 
153
- # Returns a prefix for lucene indices based on the name property of the current reference node.
154
- # This allows the index names to be prefixed by the reference node name, and hence scopes lucene indexes
155
- # to all entities under the current reference node.
156
- def index_prefix
157
- return "" if not running?
158
- ref_node_name = ref_node[:name]
159
- ref_node_name.nil? || ref_node_name.empty? ? "" : ref_node_name + "_"
160
- end
161
-
162
153
  # Returns a Management JMX Bean.
163
154
  #
164
155
  # Notice that this information is also provided by the jconsole Java tool, check http://wiki.neo4j.org/content/Monitoring_and_Deployment
data/lib/neo4j/node.rb CHANGED
@@ -113,7 +113,93 @@ module Neo4j
113
113
  # :method: _java_node
114
114
  # Returns the java node/relationship object representing this object unless it is already the java object.
115
115
  # This method is defined in the org.neo4j.kernel.impl.core.NodeProxy which is return by Neo4j::Node.new
116
-
116
+
117
+
118
+ ##
119
+ # :method: expand
120
+ # See Neo4j::Traversal#expand
121
+
122
+ ##
123
+ # :method: outgoing
124
+ # See Neo4j::Traversal#outgoing
125
+
126
+
127
+ ##
128
+ # :method: incoming
129
+ # See Neo4j::Traversal#incoming
130
+
131
+ ##
132
+ # :method: both
133
+ # See Neo4j::Traversal#both
134
+
135
+ ##
136
+ # :method: eval_paths
137
+ # See Neo4j::Traversal#eval_paths
138
+
139
+ ##
140
+ # :method: unique
141
+ # See Neo4j::Traversal#unique
142
+
143
+ ##
144
+ # :method: node
145
+ # See Neo4j::Rels#node or Neo4j::Rels
146
+
147
+ ##
148
+ # :method: _node
149
+ # See Neo4j::Rels#_node or Neo4j::Rels
150
+
151
+ ##
152
+ # :method: rels
153
+ # See Neo4j::Rels#rels or Neo4j::Rels
154
+
155
+ ##
156
+ # :method: _rels
157
+ # See Neo4j::Rels#_rels or Neo4j::Rels
158
+
159
+ ##
160
+ # :method: rel
161
+ # See Neo4j::Rels#rel
162
+
163
+ ##
164
+ # :method: _rel
165
+ # See Neo4j::Rels#_rel
166
+
167
+ ##
168
+ # :method: rel?
169
+ # See Neo4j::Rels#rel?
170
+
171
+ ##
172
+ # :method: props
173
+ # See Neo4j::Property#props
174
+
175
+ ##
176
+ # :method: neo_id
177
+ # See Neo4j::Property#neo_id
178
+
179
+ ##
180
+ # :method: attributes
181
+ # See Neo4j::Property#attributes
182
+
183
+ ##
184
+ # :method: property?
185
+ # See Neo4j::Property#property?
186
+
187
+ ##
188
+ # :method: update
189
+ # See Neo4j::Property#update
190
+
191
+ ##
192
+ # :method: []
193
+ # See Neo4j::Property#[]
194
+
195
+ ##
196
+ # :method: []=
197
+ # See Neo4j::Property#[]=
198
+
199
+ ##
200
+ # :method: []=
201
+ # See Neo4j::Property#[]=
202
+
117
203
  class << self
118
204
 
119
205
  # Returns a new neo4j Node.
@@ -15,7 +15,7 @@ require 'neo4j/node_mixin/class_methods'
15
15
  module Neo4j
16
16
  # This Mixin is used to wrap Neo4j Java Nodes in Ruby objects.
17
17
  #
18
- # It includes a number of mixins and forwards some methods to the raw Java node which in term includes a number of mixins, see below.
18
+ # It includes a number of mixins and forwards some methods to the raw Java node (Neo4j::Node) which includes the mixins below:
19
19
  #
20
20
  # === Instance Methods
21
21
  #
@@ -73,7 +73,7 @@ module Neo4j
73
73
  when :all, :first
74
74
  kind = args.shift
75
75
  send(kind, *args)
76
- when "0", 0
76
+ when "0", 0, nil
77
77
  nil
78
78
  else
79
79
  if ((args.first.is_a?(Integer) || args.first.is_a?(String)) && args.first.to_i > 0)
@@ -189,13 +189,17 @@ module Neo4j
189
189
  def find_with_ids(*args)
190
190
  result = load(*args.map { |p| p.to_i })
191
191
  if result.is_a?(Array)
192
- result = result.select { |r| r.is_a? self }
192
+ result = result.select { |r| findable?(r)}
193
193
  else
194
- result = nil unless result.is_a? self
194
+ result = nil unless findable?(result)
195
195
  end
196
196
  result
197
197
  end
198
198
 
199
+ def findable?(entity)
200
+ entity.is_a? self
201
+ end
202
+
199
203
  def find_with_indexer(*args)
200
204
  hits = _indexer.find(*args)
201
205
  # We need to save this so that the Rack Neo4j::Rails:LuceneConnection::Closer can close it
@@ -75,6 +75,16 @@ module Neo4j
75
75
  RUBY
76
76
  end
77
77
 
78
+ unless method_defined?("#{rel_type}=".to_sym)
79
+ class_eval <<-RUBY, __FILE__, __LINE__
80
+ def #{rel_type}=(nodes)
81
+ self.#{rel_type}_rels.destroy_all
82
+ association = self.#{rel_type}
83
+ nodes.each { |node| association << node }
84
+ end
85
+ RUBY
86
+ end
87
+
78
88
  unless method_defined?("#{rel_type}_rels".to_sym)
79
89
  class_eval <<-RUBY, __FILE__, __LINE__
80
90
  def #{rel_type}_rels
@@ -91,6 +91,68 @@ module Neo4j
91
91
  new? ? self.__id__ == other.__id__ : @_java_node == (other)
92
92
  end
93
93
 
94
+ def reachable_from_ref_node?
95
+ Neo4j::Algo.all_path(self.class.ref_node_for_class, self).outgoing(self.class).outgoing(:_all).count > 0
96
+ end
97
+
98
+ ##
99
+ # :method: outgoing
100
+ #
101
+ # Similar to Neo4j::Traversal#outgoing but returns depth one only outgoing relationship
102
+ # which may not all be persisted.
103
+ # For only traversing persisted outgoing relationship of any depth or more advanced traversals, use
104
+ # the wrapped Java node instead.
105
+ #
106
+ # ==== Examples
107
+ #
108
+ # person.outgoing(:friends) << other_person
109
+ # person.save!
110
+ #
111
+ # person.outgoing(:friends).map{|f| f.outgoing(:knows).to_a}.flatten
112
+ #
113
+ # ==== Examples
114
+ #
115
+ # Neo4j::Transaction.run do
116
+ # person._java_node.outgoing(:friends) << other_person
117
+ # end
118
+ #
119
+ # person._java_node.outgoing(:friends).outgoing(:knows).depth(4)
120
+ #
121
+ # Notice you can also declare outgoing relationships with the #has_n and #has_one class method.
122
+ #
123
+ # See Neo4j::Rails::Relationships#outgoing
124
+ # See Neo4j::Traversal#outgoing (when using it from the _java_node)
125
+
126
+
127
+ ##
128
+ # :method: incoming
129
+ #
130
+ # Returns incoming relationship of depth one which may not all be persisted.
131
+ # See #outgoing
132
+
133
+
134
+ ##
135
+ # :method: rels
136
+ #
137
+ # Returns both incoming and outgoing relationships which may not all be persisted.
138
+ # If you only want to find persisted relationships: @node._java_node.rels@
139
+ #
140
+ # See Neo4j::Rails::Relationships#rels
141
+ # See Neo4j::Rels#rels or Neo4j::Rels
142
+ #
143
+
144
+ ##
145
+ # :method: []
146
+ #
147
+ # Returns a property of this node, which may or may not have been declared with the class property method.
148
+ # Similar to Neo4j::Property#[] but can return not persisted properties as well.
149
+
150
+ ##
151
+ # :method: []=
152
+ #
153
+ # Sets any property on the node.
154
+ # Similar to Neo4j::Property#[]= but you must call the #save method to persist the property.
155
+
94
156
  ##
95
157
  # :singleton-method: property
96
158
  #
@@ -179,6 +241,11 @@ module Neo4j
179
241
  end
180
242
  end
181
243
 
244
+ # When multitenancy is used, node should be findable only from current ref node.
245
+ def findable?(entity)
246
+ entity.is_a? self and entity.reachable_from_ref_node?
247
+ end
248
+
182
249
  # Set the i18n scope to overwrite ActiveModel.
183
250
  #
184
251
  # @return [ Symbol ] :neo4j
@@ -204,9 +204,9 @@ module Neo4j
204
204
  end
205
205
 
206
206
  def _add_relationship(rel_type, node)
207
- if respond_to?("#{rel_type}=")
207
+ if respond_to?("#{rel_type}_rel")
208
208
  send("#{rel_type}=", node)
209
- elsif respond_to?("#{rel_type}")
209
+ elsif respond_to?("#{rel_type}_rels")
210
210
  has_n = send("#{rel_type}")
211
211
  has_n << node
212
212
  else
@@ -216,9 +216,9 @@ module Neo4j
216
216
 
217
217
  def _find_node(rel_type, id)
218
218
  return nil if id.nil?
219
- if respond_to?("#{rel_type}=")
219
+ if respond_to?("#{rel_type}_rel")
220
220
  send("#{rel_type}")
221
- elsif respond_to?("#{rel_type}")
221
+ elsif respond_to?("#{rel_type}_rels")
222
222
  has_n = send("#{rel_type}")
223
223
  has_n.find { |n| n.id == id }
224
224
  else
@@ -235,7 +235,7 @@ module Neo4j
235
235
  begin
236
236
  # Check if we want to destroy not found nodes (e.g. {..., :_destroy => '1' } ?
237
237
  destroy = allow_destroy && attr[:_destroy] && attr[:_destroy] != '0'
238
- found = _find_node(rel_type, attr[:id]) || Neo4j::Node.load(attr[:id])
238
+ found = _find_node(rel_type, attr[:id]) || Model.find(attr[:id])
239
239
  if destroy
240
240
  found.destroy if found
241
241
  else
@@ -1,6 +1,8 @@
1
1
  module Neo4j
2
2
  module Rails
3
- class LuceneConnectionCloser #:nodoc:
3
+ # close lucene connections
4
+ # reset the Neo4j.threadlocal_ref_node (Multitenancy)
5
+ class RackMiddleware #:nodoc:
4
6
  def initialize(app)
5
7
  @app = app
6
8
  end
@@ -9,6 +11,7 @@ module Neo4j
9
11
  @app.call(env)
10
12
  ensure
11
13
  Neo4j::Rails::Model.close_lucene_connections
14
+ Neo4j.threadlocal_ref_node = Neo4j.default_ref_node
12
15
  end
13
16
  end
14
17
  end
@@ -20,6 +20,6 @@ require 'neo4j/rails/relationships/node_dsl'
20
20
  require 'neo4j/rails/relationships/rels_dsl'
21
21
  require 'neo4j/rails/relationships/relationships'
22
22
  require 'neo4j/rails/model'
23
- require 'neo4j/rails/lucene_connection_closer'
23
+ require 'neo4j/rails/rack_middleware'
24
24
  require 'neo4j/rails/rel_persistence'
25
25
  require 'neo4j/rails/relationship'
@@ -3,7 +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::LuceneConnectionCloser
6
+ app.config.middleware.use Neo4j::Rails::RackMiddleware
7
7
  end
8
8
 
9
9
  # Add ActiveModel translations to the I18n load_path
@@ -48,9 +48,7 @@ module Neo4j
48
48
  end
49
49
 
50
50
  def on_neo4j_started(db)
51
- if Neo4j::Config[:enable_rules]
52
- Rule.on_neo4j_started
53
- else
51
+ if not Neo4j::Config[:enable_rules]
54
52
  db.event_handler.remove(self)
55
53
  end
56
54
  end
@@ -90,10 +90,6 @@ module Neo4j
90
90
  @rule_nodes && @rule_nodes.values.find { |rn| rn.rule_node?(node) }
91
91
  end
92
92
 
93
- def on_neo4j_started
94
- @rule_nodes.each_value { |rule_node| rule_node.on_neo4j_started } if @rule_nodes
95
- end
96
-
97
93
  def inherit(parent_class, subclass)
98
94
  # copy all the rules
99
95
  if rule_node = rule_node_for(parent_class)
@@ -15,6 +15,7 @@ module Neo4j
15
15
  @clazz = clazz
16
16
  @rules = []
17
17
  @rule_node_key = ("rule_" + clazz.to_s).to_sym
18
+ @ref_node_key = ("rule_ref_for_" + clazz.to_s).to_sym
18
19
  end
19
20
 
20
21
  def to_s
@@ -59,19 +60,14 @@ module Neo4j
59
60
  ref_node.rel?(@clazz.to_s) && ref_node._rel(:outgoing, @clazz.to_s)._end_node
60
61
  end
61
62
 
62
- def on_neo4j_started
63
- # initialize the rule node when neo4j starts
64
- Thread.current[@rule_node_key] = find_node || create_node
65
- end
66
-
67
63
  def rule_node
68
64
  clear_rule_node if ref_node_changed?
69
65
  Thread.current[@rule_node_key] ||= find_node || create_node
70
66
  end
71
67
 
72
68
  def ref_node_changed?
73
- if ref_node != Thread.current[:rule_cached_ref_node]
74
- Thread.current[:rule_cached_ref_node] = ref_node
69
+ if ref_node != Thread.current[@ref_node_key]
70
+ Thread.current[@ref_node_key] = ref_node
75
71
  true
76
72
  else
77
73
  false
@@ -4,6 +4,11 @@ require 'neo4j/traversal/rel_expander'
4
4
  require 'neo4j/traversal/traverser'
5
5
 
6
6
  module Neo4j
7
+
8
+ # Contains methods that are mixin for Neo4j::Node
9
+ # They all return Neo4j::Traversal::Traverser
10
+ # See the {Neo4j.rb Guide: Traversing Relationships and Nodes}[http://neo4j.rubyforge.org/guides/traverser.html]
11
+ #
7
12
  module Traversal
8
13
  include ToJava
9
14
 
@@ -16,6 +21,8 @@ module Neo4j
16
21
  #
17
22
  # The above traverse all relationships with a property of age > 5
18
23
  #
24
+ # See http://neo4j.rubyforge.org/guides/traverser.html
25
+ #
19
26
  def expand(&expander)
20
27
  Traverser.new(self).expander(&expander)
21
28
  end
@@ -49,7 +56,9 @@ module Neo4j
49
56
  # # Find all my friends and work colleges
50
57
  # me.outgoing(:friends).outgoing(:work).each {...}
51
58
  #
52
- # Of course all the methods <tt>outgoing</tt>, <tt>incoming</tt>, <tt>both</tt>, <tt>depth</tt>, <tt>include_start_node</tt>, <tt>filter</tt>, and <tt>prune</tt> can be combined.
59
+ # Of course all the methods <tt>outgoing</tt>, <tt>incoming</tt>, <tt>both</tt>, <tt>depth</tt>, <tt>include_start_node</tt>, <tt>filter</tt>, and <tt>prune</tt>, <tt>eval_paths</tt>, <tt>unique</tt> can be combined.
60
+ #
61
+ # See the {Neo4j.rb Guides}[http://neo4j.rubyforge.org/guides/traverser.html]
53
62
  #
54
63
  def outgoing(type)
55
64
  if type
@@ -62,7 +71,7 @@ module Neo4j
62
71
 
63
72
  # Returns the incoming nodes of given type(s).
64
73
  #
65
- # See #outgoing
74
+ # See #outgoing and http://neo4j.rubyforge.org/guides/traverser.html
66
75
  #
67
76
  def incoming(type)
68
77
  if type
@@ -76,7 +85,7 @@ module Neo4j
76
85
  #
77
86
  # If a type is not given then it will return all types of relationships.
78
87
  #
79
- # See #outgoing
88
+ # See #outgoing and http://neo4j.rubyforge.org/guides/traverser.html
80
89
  #
81
90
  def both(type=nil)
82
91
  if type
@@ -86,5 +95,44 @@ module Neo4j
86
95
  end
87
96
  end
88
97
 
98
+
99
+ # Traverse using a block. The block is expected to return one of the following values:
100
+ # * <tt>:exclude_and_continue</tt>
101
+ # * <tt>:exclude_and_prune</tt>
102
+ # * <tt>:include_and_continue</tt>
103
+ # * <tt>:include_and_prune</tt>
104
+ # This value decides if it should continue to traverse and if it should include the node in the traversal result.
105
+ # The block will receive a path argument.
106
+ #
107
+ # ==== Example
108
+ #
109
+ # @pet0.eval_paths {|path| path.end_node == @principal1 ? :include_and_prune : :exclude_and_continue }.unique(:node_path).depth(:all)
110
+ #
111
+ # ==== See also
112
+ #
113
+ # * How to use - http://neo4j.rubyforge.org/guides/traverser.html
114
+ # * the path parameter - http://api.neo4j.org/1.4/org/neo4j/graphdb/Path.html
115
+ # * the #unique method - if paths should be visit more the once, etc...
116
+ #
117
+ def eval_paths(&eval_block)
118
+ Traverser.new(self).eval_paths(&eval_block)
119
+ end
120
+
121
+ # Sets uniqueness of nodes or relationships to visit during a traversals.
122
+ #
123
+ # Allowed values
124
+ # * <tt>:node_global</tt> A node cannot be traversed more than once (default)
125
+ # * <tt>:node_path</tt> For each returned node there 's a unique path from the start node to it.
126
+ # * <tt>:node_recent</tt> This is like :node_global, but only guarantees uniqueness among the most recent visited nodes, with a configurable count.
127
+ # * <tt>:none</tt> No restriction (the user will have to manage it).
128
+ # * <tt>:rel_global</tt> A relationship cannot be traversed more than once, whereas nodes can.
129
+ # * <tt>:rel_path</tt> :: No restriction (the user will have to manage it).
130
+ # * <tt>:rel_recent</tt> Same as for :node_recent, but for relationships.
131
+ #
132
+ # See example in #eval_paths
133
+ # See http://api.neo4j.org/1.4/org/neo4j/kernel/Uniqueness.html and http://neo4j.rubyforge.org/guides/traverser.html
134
+ def unique(u)
135
+ Traverser.new(self).unique(u)
136
+ end
89
137
  end
90
138
  end
@@ -2,6 +2,32 @@ module Neo4j
2
2
 
3
3
  module Traversal
4
4
 
5
+ class Evaluator #:nodoc:
6
+ include org.neo4j.graphdb.traversal.Evaluator
7
+ def initialize(&eval_block)
8
+ @eval_block = eval_block
9
+ end
10
+
11
+ # Implements the Java Interface:
12
+ # evaluate(Path path)
13
+ # Evaluates a Path and returns an Evaluation containing information about whether or not to include it in the traversal result, i.e return it from the Traverser.
14
+ def evaluate(path)
15
+ ret = @eval_block.call(path)
16
+ case ret
17
+ when :exclude_and_continue then
18
+ org.neo4j.graphdb.traversal.Evaluation::EXCLUDE_AND_CONTINUE
19
+ when :exclude_and_prune then
20
+ org.neo4j.graphdb.traversal.Evaluation::EXCLUDE_AND_PRUNE
21
+ when :include_and_continue then
22
+ org.neo4j.graphdb.traversal.Evaluation::INCLUDE_AND_CONTINUE
23
+ when :include_and_prune then
24
+ org.neo4j.graphdb.traversal.Evaluation::INCLUDE_AND_PRUNE
25
+ else
26
+ raise "Got #{ret}, only accept :exclude_and_continue,:exclude_and_prune,:include_and_continue and :include_and_prune"
27
+ end
28
+ end
29
+ end
30
+
5
31
  class Traverser
6
32
  include Enumerable
7
33
  include ToJava
@@ -20,6 +46,39 @@ module Neo4j
20
46
  end
21
47
  end
22
48
 
49
+ def eval_paths(&eval_path_block)
50
+ @td = @td.evaluator(Evaluator.new(&eval_path_block))
51
+ self
52
+ end
53
+
54
+ def unique(u = :node_global)
55
+ case u
56
+ when :node_global then
57
+ # A node cannot be traversed more than once.
58
+ @td = @td.uniqueness(org.neo4j.kernel.Uniqueness::NODE_GLOBAL)
59
+ when :node_path then
60
+ # For each returned node there 's a unique path from the start node to it.
61
+ @td = @td.uniqueness(org.neo4j.kernel.Uniqueness::NODE_PATH)
62
+ when :node_recent then
63
+ # This is like NODE_GLOBAL, but only guarantees uniqueness among the most recent visited nodes, with a configurable count.
64
+ @td = @td.uniqueness(org.neo4j.kernel.Uniqueness::NODE_RECENT)
65
+ when :none then
66
+ # No restriction (the user will have to manage it).
67
+ @td = @td.uniqueness(org.neo4j.kernel.Uniqueness::NONE)
68
+ when :rel_global then
69
+ # A relationship cannot be traversed more than once, whereas nodes can.
70
+ @td = @td.uniqueness(org.neo4j.kernel.Uniqueness::RELATIONSHIP_GLOBAL)
71
+ when :rel_path then
72
+ # No restriction (the user will have to manage it).
73
+ @td = @td.uniqueness(org.neo4j.kernel.Uniqueness::RELATIONSHIP_PATH)
74
+ when :rel_recent then
75
+ # Same as for NODE_RECENT, but for relationships.
76
+ @td = @td.uniqueness(org.neo4j.kernel.Uniqueness::RELATIONSHIP_RECENT)
77
+ else
78
+ raise "Got option for unique '#{u}' allowed: :node_global, :node_path, :node_recent, :none, :rel_global, :rel_path, :rel_recent"
79
+ end
80
+ self
81
+ end
23
82
 
24
83
  def to_s
25
84
  "NodeTraverser [from: #{@from.neo_id} depth: #{@depth} type: #{@type} dir:#{@dir}"
data/lib/neo4j/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module Neo4j
2
- VERSION = "1.2.3"
2
+ VERSION = "1.2.4"
3
3
  end
@@ -4,50 +4,46 @@ module Neo4j
4
4
  module Rails
5
5
  class Model
6
6
  extend ::OrmAdapter::ToAdapter
7
-
7
+
8
8
  class OrmAdapter < ::OrmAdapter::Base
9
- NEO4J_REF_NODE_ID = 0
10
-
11
9
  # Do not consider these to be part of the class list
12
10
  def self.except_classes
13
11
  @@except_classes ||= []
14
12
  end
15
-
13
+
16
14
  # Gets a list of the available models for this adapter
17
15
  def self.model_classes
18
16
  ::Neo4j::Rails::Model.descendants.to_a.select{|k| !except_classes.include?(k.name)}
19
17
  end
20
-
18
+
21
19
  # get a list of column names for a given class
22
20
  def column_names
23
21
  klass._decl_props.keys
24
22
  end
25
-
23
+
26
24
  # Get an instance by id of the model
27
25
  def get!(id)
28
- get(id) || raise("Node not found")
26
+ klass.find!(wrap_key(id))
29
27
  end
30
-
28
+
31
29
  # Get an instance by id of the model
32
30
  def get(id)
33
- id = wrap_key(id)
34
- return nil if id.to_i == NEO4J_REF_NODE_ID # getting the ref_node in this way is not supported
35
- klass.load(id)
31
+ klass.find(wrap_key(id))
36
32
  end
37
-
33
+
38
34
  # Find the first instance matching conditions
39
35
  def find_first(conditions)
40
36
  klass.first(conditions)
41
37
  end
42
-
38
+
43
39
  # Find all models matching conditions
44
40
  def find_all(conditions)
45
41
  klass.all(conditions)
46
42
  end
47
-
43
+
48
44
  # Create a model using attributes
49
45
  def create!(attributes)
50
- klass.create(attributes)
46
+ klass.create!(attributes)
51
47
  end
52
48
  end
53
49
  end
metadata CHANGED
@@ -2,7 +2,7 @@
2
2
  name: neo4j
3
3
  version: !ruby/object:Gem::Version
4
4
  prerelease:
5
- version: 1.2.3
5
+ version: 1.2.4
6
6
  platform: java
7
7
  authors:
8
8
  - Andreas Ronge
@@ -10,7 +10,7 @@ autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
12
 
13
- date: 2011-10-01 00:00:00 +02:00
13
+ date: 2011-10-07 00:00:00 +02:00
14
14
  default_executable:
15
15
  dependencies:
16
16
  - !ruby/object:Gem::Dependency
@@ -121,13 +121,13 @@ files:
121
121
  - lib/neo4j/rels/traverser.rb
122
122
  - lib/neo4j/rels/rels.rb
123
123
  - lib/neo4j/rails/attributes.rb
124
+ - lib/neo4j/rails/rack_middleware.rb
124
125
  - lib/neo4j/rails/model.rb
125
126
  - lib/neo4j/rails/validations.rb
126
127
  - lib/neo4j/rails/persistence.rb
127
128
  - lib/neo4j/rails/serialization.rb
128
129
  - lib/neo4j/rails/railtie.rb
129
130
  - lib/neo4j/rails/rails.rb
130
- - lib/neo4j/rails/lucene_connection_closer.rb
131
131
  - lib/neo4j/rails/observer.rb
132
132
  - lib/neo4j/rails/transaction.rb
133
133
  - lib/neo4j/rails/timestamps.rb