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,336 +0,0 @@
1
- module Neo4j
2
-
3
- module Rest #:nodoc: all
4
- # contains a list of rest node class resources
5
- REST_NODE_CLASSES = {}
6
-
7
- class RestException < StandardError
8
- def code;
9
- 500;
10
- end
11
- end
12
-
13
- class NotAllowed < RestException
14
- def code;
15
- 403;
16
- end
17
- end
18
-
19
- class Conflict < RestException
20
- def code;
21
- 409;
22
- end
23
- end
24
-
25
- def self.base_uri
26
- host = Sinatra::Application.host
27
- port = Sinatra::Application.port
28
- "http://#{host}:#{port}"
29
- end
30
-
31
- def self.load_class(clazz)
32
- clazz.split("::").inject(Kernel) do |container, name|
33
- container.const_get(name.to_s)
34
- end
35
- rescue NameError
36
- raise Sinatra::NotFound
37
- end
38
-
39
-
40
- # Extracts query parameters from a URL; e.g. if <code>/resource?foo=bar</code> was requested,
41
- # <code>{'foo' => 'bar'}</code> is returned.
42
- def self.query_from_params(params)
43
- query = nil
44
- unless (params.nil?)
45
- query = params.clone
46
- query.delete('neo_id')
47
- query.delete('class')
48
- query.delete('prop')
49
- query.delete('rel')
50
- end
51
- query
52
- end
53
-
54
- # -------------------------------------------------------------------------
55
- # /neo
56
- # -------------------------------------------------------------------------
57
-
58
- Sinatra::Application.post("/neo") do
59
- body = request.body.read
60
- Object.class_eval body
61
- 200
62
- end
63
-
64
-
65
- Sinatra::Application.get("/neo") do
66
- if request.accept.include?("text/html")
67
- html = "<html><body><h2>Neo4j.rb v #{Neo4j::VERSION} is alive !</h2><p/><h3>Defined REST classes</h3>"
68
- REST_NODE_CLASSES.keys.each {|clazz| html << "Class '" + clazz + "' <br/>"}
69
- html << "</body></html>"
70
- html
71
- else
72
- content_type :json
73
- # make it look like it was a node - todo maybe it should be a real Neo4j::Node ...
74
- properties = {:classes => REST_NODE_CLASSES.keys, :ref_node => Neo4j.ref_node._uri}
75
- {:properties => properties}.to_json
76
- end
77
- end
78
-
79
-
80
- # -------------------------------------------------------------------------
81
- # /rels/<id>
82
- # -------------------------------------------------------------------------
83
-
84
- Sinatra::Application.get("/rels/:id") do
85
- content_type :json
86
- begin
87
- Neo4j::Transaction.run do
88
- rel = Neo4j.load_rel(params[:id].to_i)
89
- return 404, "Can't find relationship with id #{params[:id]}" if rel.nil?
90
- # include hyperlink to end_node if that has an _uri method
91
- end_node_hash = {:uri => rel.end_node._uri}
92
-
93
- # include hyperlink to start_node if that has an _uri method
94
- start_node_hash = {:uri => rel.start_node._uri}
95
-
96
- {:properties => rel.props, :start_node => start_node_hash, :end_node => end_node_hash}.to_json
97
- end
98
- rescue RestException => exception
99
- return exception.code, {'error' => $!}.to_json
100
- rescue Exception => e
101
- return 500, {'error' => $!, 'backtrace' => e.backtrace}.to_json
102
- end
103
- end
104
-
105
-
106
- # -------------------------------------------------------------------------
107
- # /nodes/<classname>
108
- # -------------------------------------------------------------------------
109
-
110
- # Allows searching for nodes (provided that they are indexed). Supports the following:
111
- # <code>/nodes/classname?search=name:hello~</code>:: Lucene query string
112
- # <code>/nodes/classname?name=hello</code>:: Exact match on property
113
- # <code>/nodes/classname?sort=name,desc</code>:: Specify sorting order
114
- # <code>/nodes/classname?limit=100,20</code>:: Specify offset and number of nodes (for pagination)
115
- Sinatra::Application.get("/nodes/:class") do
116
- content_type :json
117
- clazz = Neo4j::Rest.load_class(params[:class])
118
- return 404, "Can't find class '#{classname}'" if clazz.nil?
119
-
120
- begin
121
- Neo4j::Transaction.run do
122
- resources = clazz.find(Neo4j::Rest.query_from_params(params)) # uses overridden find method -- see below
123
- resources.map{|res| res.props}.to_json
124
- end
125
- rescue RestException => exception
126
- return exception.code, {'error' => $!}.to_json
127
- rescue Exception => e
128
- return 500, {'error' => $!, 'backtrace' => e.backtrace}.to_json
129
- end
130
- end
131
-
132
- Sinatra::Application.post("/nodes/:class") do
133
- content_type :json
134
-
135
- clazz = Neo4j::Rest.load_class(params[:class])
136
- return 404, "Can't find class '#{classname}'" if clazz.nil?
137
-
138
- begin
139
- uri = Neo4j::Transaction.run do
140
- node = clazz.new
141
- data = JSON.parse(request.body.read)
142
- properties = data['properties']
143
- node.update(properties, Neo4j::Rest.query_from_params(params))
144
- node._uri
145
- end
146
- redirect "#{uri}", 201 # created
147
- rescue RestException => exception
148
- return exception.code, {'error' => $!}.to_json
149
- rescue Exception => e
150
- return 500, {'error' => $!, 'backtrace' => e.backtrace}.to_json
151
- end
152
- end
153
-
154
-
155
- # -------------------------------------------------------------------------
156
- # /nodes/<classname>/<id>
157
- # -------------------------------------------------------------------------
158
-
159
- Sinatra::Application.get("/nodes/:class/:id") do
160
- content_type :json
161
-
162
- begin
163
- Neo4j::Transaction.run do
164
- node = Neo4j.load_node(params[:id])
165
- return 404, "Can't find node with id #{params[:id]}" if node.nil?
166
- node.read(Neo4j::Rest.query_from_params(params))
167
- relationships = node.rels.outgoing.inject({}) do |hash, v|
168
- type = v.relationship_type.to_s
169
- hash[type] ||= []
170
- hash[type] << "#{Neo4j::Rest.base_uri}/rels/#{v.neo_id}"
171
- hash
172
- end
173
- {:rels => relationships, :properties => node.props}.to_json
174
- end
175
- rescue RestException => exception
176
- return exception.code, {'error' => $!}.to_json
177
- rescue Exception => e
178
- return 500, {'error' => $!, 'backtrace' => e.backtrace}.to_json
179
- end
180
- end
181
-
182
- Sinatra::Application.put("/nodes/:class/:id") do
183
- content_type :json
184
- begin
185
- Neo4j::Transaction.run do
186
- body = request.body.read
187
- data = JSON.parse(body)
188
- properties = data['properties'] || {}
189
- node = Neo4j.load_node(params[:id])
190
- node.update(properties, Neo4j::Rest.query_from_params(params).merge({:strict => true}))
191
- node.props.to_json
192
- end
193
- rescue RestException => exception
194
- return exception.code, {'error' => $!}.to_json
195
- rescue Exception => e
196
- return 500, {'error' => $!, 'backtrace' => e.backtrace}.to_json
197
- end
198
- end
199
-
200
- Sinatra::Application.delete("/nodes/:class/:id") do
201
- content_type :json
202
- begin
203
- Neo4j::Transaction.run do
204
- node = Neo4j.load_node(params[:id])
205
- return 404, "Can't find node with id #{params[:id]}" if node.nil?
206
- node.del(Neo4j::Rest.query_from_params(params))
207
- ""
208
- end
209
- rescue RestException => exception
210
- return exception.code, {'error' => $!}.to_json
211
- rescue Exception => e
212
- return 500, {'error' => $!, 'backtrace' => e.backtrace}.to_json
213
- end
214
- end
215
-
216
-
217
- # -------------------------------------------------------------------------
218
- # /nodes/<classname>/<id>/<property>
219
- # -------------------------------------------------------------------------
220
-
221
- Sinatra::Application.get("/nodes/:class/:id/traverse") do
222
- content_type :json
223
- begin
224
- Neo4j::Transaction.run do
225
- node = Neo4j.load_node(params[:id])
226
- return 404, {'error' => "Can't find node with id #{params[:id]}"}.to_json if node.nil?
227
-
228
- relationship = params['relationship']
229
- depth = case params['depth']
230
- when nil then
231
- 1
232
- when 'all' then
233
- :all
234
- else
235
- params['depth'].to_i
236
- end
237
- return 400, {'error' => "invalid depth parameter - must be an integer"}.to_json if depth == 0
238
-
239
- uris = node.traverse.outgoing(relationship.to_sym).depth(depth).collect{|node| node._uri}
240
- {'uri_list' => uris}.to_json
241
- end
242
- rescue RestException => exception
243
- return exception.code, {'error' => $!}.to_json
244
- rescue Exception => e
245
- return 500, {'error' => $!, 'backtrace' => e.backtrace}.to_json
246
- end
247
- end
248
-
249
-
250
- Sinatra::Application.get("/nodes/:class/:id/:prop") do
251
- content_type :json
252
-
253
- begin
254
- Neo4j::Transaction.run do
255
- node = Neo4j.load_node(params[:id])
256
- return 404, "Can't find node with id #{params[:id]}" if node.nil?
257
- prop = params[:prop].to_sym
258
- # check if prop is a relationship defined by has_n or has_one
259
- if node.class.decl_relationships.keys.include?(prop)
260
- # instead of returning properties return the relationship properties
261
- rels = node.send(prop) || []
262
- # is it a has_n or has_one relationship ?
263
- # if it is a has_n then return an array of properties of that relationship (can be a large json struct)
264
- (rels.respond_to?(:props) ? rels.props : rels.map{|rel| rel.props}).to_json
265
- else
266
- {prop => node[prop]}.to_json
267
- end
268
- end
269
- rescue RestException => exception
270
- return exception.code, {'error' => $!}.to_json
271
- rescue Exception => e
272
- return 500, {'error' => $!, 'backtrace' => e.backtrace}.to_json
273
- end
274
- end
275
-
276
-
277
- Sinatra::Application.put("/nodes/:class/:id/:prop") do
278
- content_type :json
279
- begin
280
- Neo4j::Transaction.run do
281
- node = Neo4j.load_node(params[:id])
282
- property = params[:prop]
283
- body = request.body.read
284
- data = JSON.parse(body)
285
- value = data[property]
286
- return 409, "Can't set property #{property} with JSON data '#{body}'" if value.nil?
287
- node[property] = value
288
- 200
289
- end
290
- rescue RestException => exception
291
- return exception.code, {'error' => $!}.to_json
292
- rescue Exception => e
293
- return 500, {'error' => $!, 'backtrace' => e.backtrace}.to_json
294
- end
295
- end
296
-
297
- URL_REGEXP = Regexp.new '((http[s]?|ftp):\/)?\/?([^:\/\s]+)((\/\w+)*\/)([\w\-\.]+\/[\w\-\.]+)$' #:nodoc:
298
-
299
- Sinatra::Application.post("/nodes/:class/:id/:rel") do
300
- content_type :json
301
- begin
302
- new_id = Neo4j::Transaction.run do
303
- node = Neo4j.load_node(params[:id])
304
- return 404, "Can't find node with id #{params[:id]}" if node.nil?
305
- rel = params[:rel]
306
-
307
- body = request.body.read
308
- data = JSON.parse(body)
309
- uri = data['uri']
310
- match = URL_REGEXP.match(uri)
311
- return 400, "Bad node uri '#{uri}'" if match.nil?
312
- to_clazz, to_node_id = match[6].split('/')
313
-
314
- other_node = Neo4j.load_node(to_node_id.to_i)
315
- return 400, "Unknown other node with id '#{to_node_id}'" if other_node.nil?
316
-
317
- if to_clazz != other_node.class.to_s
318
- return 400, "Wrong type id '#{to_node_id}' expected '#{to_clazz}' got '#{other_node.class.to_s}'"
319
- end
320
-
321
- rel_obj = node.add_rel(rel, other_node)
322
-
323
- return 400, "Can't create relationship to #{to_clazz}" if rel_obj.nil?
324
-
325
- rel_obj.neo_id
326
- end
327
- redirect "/rels/#{new_id}", 201 # created
328
- rescue RestException => exception
329
- return exception.code, {'error' => $!}.to_json
330
- rescue Exception => e
331
- return 500, {'error' => $!, 'backtrace' => e.backtrace}.to_json
332
- end
333
- end
334
- end
335
-
336
- end
@@ -1,193 +0,0 @@
1
- module Neo4j
2
-
3
- org.neo4j.kernel.impl.core.NodeProxy.class_eval do
4
- # See Neo4j::RestMixin#read
5
- def read
6
- end
7
- end
8
-
9
- # Creates a number of resources for the class using this mixin.
10
- #
11
- # The following resources are created:
12
- #
13
- # <b>add new class</b>:: <code>POST /neo</code> post ruby code of a neo4j node class
14
- # <b>node classes</b>:: <code>GET /neo</code> - returns hyperlinks to /nodes/classname
15
- # <b>search nodes</b>:: <code>GET /nodes/classname?name=p</code>
16
- # <b>view all nodes</b>:: <code>GET /nodes/classname</code>
17
- # <b>update property</b>:: <code>PUT nodes/classname/id/property_name</code>
18
- # <b>view property</b>:: <code>GET nodes/classname/id/property_name</code>
19
- # <b>delete node</b>:: <code>DELETE nodes/classname/node_id</code>
20
- # <b>update properties</b>:: <code>PUT nodes/classname/node_id</code>
21
- # <b>view node</b>:: <code>GET /nodes/classname/id</code>
22
- # <b>create node</b>:: <code>POST /nodes/classname</code>
23
- # <b>view relationship</b>:: <code>GET /rels/id</code>
24
- # <b>list rels</b>:: <code>GET /nodes/classname/id/relationship-type</code>
25
- # <b>add relationship</b>:: <code>POST /nodes/classname/id/relationship-type</code>
26
- # <b>traversal</b>:: <code>GET nodes/classname/id/traverse?relationship=relationship-type&depth=depth</code>
27
- #
28
- # Also provides lucene queries
29
- # <b>Lucene query string</b>:: <code>/nodes/classname?search=name:hello~</code>
30
- # <b>Exact match on property</b>:: <code>/nodes/classname?name=hello</code>
31
- # <b>Specify sorting order</b>:: <code>/nodes/classname?sort=name,desc</code>
32
- # <b>Pagination (offset,num)</b>:: <code>/nodes/classname?limit=100,20</code>#
33
- #
34
- # When create a new node by posting to <code>/nodes/classname</code> a 201 will be return with the 'Location' header set to the
35
- # URI of the newly created node.
36
- #
37
- # The JSON representation of a node looks like this
38
- #
39
- # {"rels" : {"type1":"http://0.0.0.0:4567/rels/0","type2":"http://0.0.0.0:4567/rels/1"},
40
- # "properties" : {"_neo_id":1,"_classname":"MyNode"}}
41
- #
42
- module RestMixin
43
-
44
- def _uri
45
- "#{Neo4j::Rest.base_uri}#{_uri_rel}"
46
- end
47
-
48
- def _uri_rel
49
- clazz = self.class.root_class.to_s #.gsub(/::/, '-') TODO urlencoding
50
- "/nodes/#{clazz}/#{neo_id}"
51
- end
52
-
53
- # Called by the REST API if this node is accessed directly by ID. Any query parameters
54
- # in the request are passed in a hash. For example if <code>GET /nodes/MyClass/1?foo=bar</code>
55
- # is requested, <code>MyClass#accessed</code> is called with <code>{'foo' => 'bar'}</code>.
56
- # By default this method does nothing, but model classes may override it to achieve specific
57
- # behaviour.
58
- def read(options={})
59
- end
60
-
61
- # Called by the REST API if this node is deleted. Any query parameters in the request are passed
62
- # in a hash.
63
- def del(options={})
64
- super()
65
- end
66
-
67
-
68
- def self.included(c)
69
- c.extend ClassMethods
70
- uri_rel = c._uri_rel
71
- # just for debugging and logging purpose so we know which classes uses this mixin, TODO - probablly not needed
72
- Neo4j::Rest::REST_NODE_CLASSES[uri_rel] = c
73
- end
74
-
75
-
76
- module ClassMethods
77
-
78
- # todo remove
79
- def _uri_rel # :nodoc:
80
- clazz = root_class.to_s #.gsub(/::/, '-') TODO urlencoding
81
- "/nodes/#{clazz}"
82
- end
83
-
84
-
85
- # Overrides 'find' so that we can simply pass a query parameters object to it, and
86
- # search resources accordingly.
87
- def find(query=nil, &block)
88
- return super(query, &block) if query.nil? || query.kind_of?(String)
89
-
90
- query = symbolize_keys(query)
91
-
92
- if query[:search]
93
- # Use Lucene
94
- results = super(query[:search])
95
- results = [*apply_lucene_sort(query[:sort], results)] rescue [*super(query[:search])]
96
-
97
- else
98
- # Use traverser
99
- results = apply_ruby_sort(query[:sort], apply_traverser_conditions(query))
100
- end
101
-
102
- apply_limits(query[:limit], results)
103
- end
104
-
105
- # :nodoc:
106
- def symbolize_keys(hash)
107
- # Borrowed from ActiveSupport
108
- hash.inject({}) do |options, (key, value)|
109
- options[(key.to_sym rescue key) || key] = value
110
- options
111
- end
112
- end
113
-
114
- protected
115
-
116
- # Searches for nodes matching conditions by using a traverser.
117
- def apply_traverser_conditions(query)
118
- query = query.reject{|key, value| [:sort, :limit, :classname].include? key }
119
-
120
- index_node = Neo4j::IndexNode.instance
121
- raise 'Index node is nil. Make sure you have called Neo4j.load_reindexer' if index_node.nil?
122
- traverser = index_node.traverse.outgoing(root_class)
123
-
124
- traverser.filter do |position|
125
- node = position.current_node
126
- position.depth == 1 and
127
- query.inject(true) do |meets_condition, (key, value)|
128
- meets_condition && (node.send(key) == value)
129
- end
130
- end
131
- end
132
-
133
- # Sorts a list of results according to a string of comma-separated fieldnames (optionally
134
- # with 'asc' or 'desc' thrown in). For use in cases where we don't go via Lucene.
135
- def apply_ruby_sort(sort_string, results)
136
- if sort_string
137
- sort_fields = sort_string.to_s.split(/,/)
138
- [*results].sort do |x,y|
139
- catch(:item_order) do
140
- sort_fields.each_index do |index|
141
- field = sort_fields[index]
142
- unless %w(asc desc).include?(field)
143
- item_order = if sort_fields[index + 1] == 'desc'
144
- (y.send(field) || '') <=> (x.send(field) || '')
145
- else
146
- (x.send(field) || '') <=> (y.send(field) || '')
147
- end
148
- throw :item_order, item_order unless item_order == 0
149
- end
150
- end
151
- 0
152
- end
153
- end
154
- else
155
- [*results]
156
- end
157
- end
158
-
159
- # Applies Lucene sort instructions to a Neo4j::SearchResult object.
160
- def apply_lucene_sort(sort_string, results)
161
- return results if sort_string.nil?
162
- last_field = nil
163
-
164
- sort_string.to_s.split(/,/).each do |field|
165
- if %w(asc desc).include? field
166
- results = results.sort_by(field == 'asc' ? Lucene::Asc[last_field] : Lucene::Desc[last_field])
167
- last_field = nil
168
- else
169
- results = results.sort_by(Lucene::Asc[last_field]) unless last_field.nil?
170
- last_field = field
171
- end
172
- end
173
- results.sort_by(Lucene::Asc[last_field]) unless last_field.nil?
174
- results
175
- end
176
-
177
- # Return only the requested subset of results for pagination
178
- # (TODO: can this be done more efficiently within Lucene?)
179
- def apply_limits(limit_string, results)
180
- if limit_string
181
- limit = limit_string.to_s.split(/,/).map{|i| i.to_i}
182
- limit.unshift(0) if limit.size == 1
183
-
184
- (limit[0]...(limit[0]+limit[1])).map{|n| results[n] }
185
- else
186
- results
187
- end
188
- end
189
-
190
- end
191
- end
192
-
193
- end
@@ -1,50 +0,0 @@
1
- module Neo4j
2
-
3
- module Rest
4
- # todo move inside namepace Rest
5
-
6
- class RestServer #:nodoc:
7
- class << self
8
- attr_accessor :thread
9
-
10
- def on_neo_started(neo_instance)
11
- start
12
- end
13
-
14
- def on_neo_stopped(neo_instance)
15
- stop
16
- end
17
-
18
-
19
- def start
20
- puts "RESTful already started" if @thread
21
- return if @thread
22
-
23
- @thread = Thread.new do
24
- puts "Start Restful server at port #{Neo4j::Config[:rest_port]}"
25
- Sinatra::Application.run! :port => Neo4j::Config[:rest_port]
26
- end
27
- end
28
-
29
- def stop
30
- if @thread
31
- # TODO must be a nicer way to do this - to shutdown sinatra
32
- @thread.kill
33
- @thread = nil
34
- end
35
- end
36
- end
37
- end
38
-
39
-
40
- def self.load_rest #:nodoc:
41
- Neo4j::Config.defaults[:rest_port] = 9123
42
- Neo4j.event_handler.add(RestServer)
43
- end
44
-
45
- load_rest
46
-
47
- end
48
-
49
-
50
- end