gojee-sunspot-rails 2.0.3 → 2.0.4

Sign up to get free protection for your applications and to get access to all the features.
Files changed (67) hide show
  1. data/.gitignore +7 -0
  2. data/.rspec +1 -0
  3. data/History.txt +74 -0
  4. data/LICENSE +18 -0
  5. data/MIT-LICENSE +20 -0
  6. data/README.rdoc +265 -0
  7. data/Rakefile +17 -0
  8. data/TODO +8 -0
  9. data/dev_tasks/rdoc.rake +24 -0
  10. data/dev_tasks/release.rake +4 -0
  11. data/dev_tasks/spec.rake +107 -0
  12. data/dev_tasks/todo.rake +4 -0
  13. data/gemfiles/rails-2.3.14 +12 -0
  14. data/gemfiles/rails-3.0.11 +12 -0
  15. data/gemfiles/rails-3.1.3 +12 -0
  16. data/gemfiles/rails-3.2.1 +12 -0
  17. data/generators/sunspot/sunspot_generator.rb +9 -0
  18. data/generators/sunspot/templates/sunspot.yml +20 -0
  19. data/install.rb +1 -0
  20. data/lib/generators/sunspot_rails/install/install_generator.rb +13 -0
  21. data/lib/generators/sunspot_rails/install/templates/config/sunspot.yml +19 -0
  22. data/lib/generators/sunspot_rails.rb +9 -0
  23. data/lib/sunspot/rails/adapters.rb +83 -0
  24. data/lib/sunspot/rails/configuration.rb +376 -0
  25. data/lib/sunspot/rails/init.rb +5 -0
  26. data/lib/sunspot/rails/log_subscriber.rb +33 -0
  27. data/lib/sunspot/rails/railtie.rb +36 -0
  28. data/lib/sunspot/rails/railties/controller_runtime.rb +36 -0
  29. data/lib/sunspot/rails/request_lifecycle.rb +36 -0
  30. data/lib/sunspot/rails/searchable.rb +491 -0
  31. data/lib/sunspot/rails/server.rb +114 -0
  32. data/lib/sunspot/rails/solr_instrumentation.rb +19 -0
  33. data/lib/sunspot/rails/solr_logging.rb +62 -0
  34. data/lib/sunspot/rails/spec_helper.rb +26 -0
  35. data/lib/sunspot/rails/stub_session_proxy.rb +142 -0
  36. data/lib/sunspot/rails/tasks.rb +84 -0
  37. data/lib/sunspot/rails.rb +69 -0
  38. data/lib/sunspot_rails.rb +12 -0
  39. data/spec/configuration_spec.rb +209 -0
  40. data/spec/model_lifecycle_spec.rb +63 -0
  41. data/spec/model_spec.rb +601 -0
  42. data/spec/rails_template/app/controllers/application_controller.rb +10 -0
  43. data/spec/rails_template/app/controllers/posts_controller.rb +6 -0
  44. data/spec/rails_template/app/models/author.rb +8 -0
  45. data/spec/rails_template/app/models/blog.rb +12 -0
  46. data/spec/rails_template/app/models/location.rb +2 -0
  47. data/spec/rails_template/app/models/photo_post.rb +2 -0
  48. data/spec/rails_template/app/models/post.rb +11 -0
  49. data/spec/rails_template/app/models/post_with_auto.rb +10 -0
  50. data/spec/rails_template/app/models/post_with_default_scope.rb +11 -0
  51. data/spec/rails_template/config/boot.rb +127 -0
  52. data/spec/rails_template/config/preinitializer.rb +22 -0
  53. data/spec/rails_template/config/routes.rb +9 -0
  54. data/spec/rails_template/config/sunspot.yml +24 -0
  55. data/spec/rails_template/db/schema.rb +27 -0
  56. data/spec/request_lifecycle_spec.rb +61 -0
  57. data/spec/schema.rb +27 -0
  58. data/spec/searchable_spec.rb +12 -0
  59. data/spec/server_spec.rb +33 -0
  60. data/spec/session_spec.rb +57 -0
  61. data/spec/shared_examples/indexed_after_save.rb +8 -0
  62. data/spec/shared_examples/not_indexed_after_save.rb +8 -0
  63. data/spec/spec_helper.rb +48 -0
  64. data/spec/stub_session_proxy_spec.rb +122 -0
  65. data/sunspot_rails.gemspec +43 -0
  66. data/tmp/.gitkeep +0 -0
  67. metadata +97 -5
@@ -0,0 +1,19 @@
1
+ production:
2
+ solr:
3
+ hostname: localhost
4
+ port: 8983
5
+ log_level: WARNING
6
+ # read_timeout: 2
7
+ # open_timeout: 0.5
8
+
9
+ development:
10
+ solr:
11
+ hostname: localhost
12
+ port: 8982
13
+ log_level: INFO
14
+
15
+ test:
16
+ solr:
17
+ hostname: localhost
18
+ port: 8981
19
+ log_level: WARNING
@@ -0,0 +1,9 @@
1
+ module SunspotRails
2
+ module Generators
3
+ class Base < Rails::Generators::NamedBase
4
+ def self.source_root
5
+ @_sunspot_rails_source_root ||= File.expand_path(File.join(File.dirname(__FILE__), 'sunspot_rails', generator_name, 'templates'))
6
+ end
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,83 @@
1
+ module Sunspot #:nodoc:
2
+ module Rails #:nodoc:
3
+ #
4
+ # This module provides Sunspot Adapter implementations for ActiveRecord
5
+ # models.
6
+ #
7
+ module Adapters
8
+ class ActiveRecordInstanceAdapter < Sunspot::Adapters::InstanceAdapter
9
+ #
10
+ # Return the primary key for the adapted instance
11
+ #
12
+ # ==== Returns
13
+ #
14
+ # Integer:: Database ID of model
15
+ #
16
+ def id
17
+ @instance.id
18
+ end
19
+ end
20
+
21
+ class ActiveRecordDataAccessor < Sunspot::Adapters::DataAccessor
22
+ # options for the find
23
+ attr_accessor :include, :select
24
+
25
+ #
26
+ # Set the fields to select from the database. This will be passed
27
+ # to ActiveRecord.
28
+ #
29
+ # ==== Parameters
30
+ #
31
+ # value<Mixed>:: String of comma-separated columns or array of columns
32
+ #
33
+ def select=(value)
34
+ value = value.join(', ') if value.respond_to?(:join)
35
+ @select = value
36
+ end
37
+
38
+ #
39
+ # Get one ActiveRecord instance out of the database by ID
40
+ #
41
+ # ==== Parameters
42
+ #
43
+ # id<String>:: Database ID of model to retreive
44
+ #
45
+ # ==== Returns
46
+ #
47
+ # ActiveRecord::Base:: ActiveRecord model
48
+ #
49
+ def load(id)
50
+ @clazz.first(options_for_find.merge(
51
+ :conditions => { @clazz.primary_key => id}
52
+ ))
53
+ end
54
+
55
+ #
56
+ # Get a collection of ActiveRecord instances out of the database by ID
57
+ #
58
+ # ==== Parameters
59
+ #
60
+ # ids<Array>:: Database IDs of models to retrieve
61
+ #
62
+ # ==== Returns
63
+ #
64
+ # Array:: Collection of ActiveRecord models
65
+ #
66
+ def load_all(ids)
67
+ @clazz.all(options_for_find.merge(
68
+ :conditions => { @clazz.primary_key => ids.map { |id| id }}
69
+ ))
70
+ end
71
+
72
+ private
73
+
74
+ def options_for_find
75
+ options = {}
76
+ options[:include] = @include unless @include.blank?
77
+ options[:select] = @select unless @select.blank?
78
+ options
79
+ end
80
+ end
81
+ end
82
+ end
83
+ end
@@ -0,0 +1,376 @@
1
+ require 'erb'
2
+
3
+ module Sunspot #:nodoc:
4
+ module Rails #:nodoc:
5
+ #
6
+ # Sunspot::Rails is configured via the config/sunspot.yml file, which
7
+ # contains properties keyed by environment name. A sample sunspot.yml file
8
+ # would look like:
9
+ #
10
+ # development:
11
+ # solr:
12
+ # hostname: localhost
13
+ # port: 8982
14
+ # min_memory: 512M
15
+ # max_memory: 1G
16
+ # solr_jar: /some/path/solr15/start.jar
17
+ # bind_address: 0.0.0.0
18
+ # disabled: false
19
+ # test:
20
+ # solr:
21
+ # hostname: localhost
22
+ # port: 8983
23
+ # log_level: OFF
24
+ # open_timeout: 0.5
25
+ # read_timeout: 2
26
+ # production:
27
+ # solr:
28
+ # hostname: localhost
29
+ # port: 8983
30
+ # path: /solr/myindex
31
+ # log_level: WARNING
32
+ # solr_home: /some/path
33
+ # open_timeout: 0.5
34
+ # read_timeout: 2
35
+ # master_solr:
36
+ # hostname: localhost
37
+ # port: 8982
38
+ # path: /solr
39
+ # auto_commit_after_request: true
40
+ #
41
+ # Sunspot::Rails uses the configuration to set up the Solr connection, as
42
+ # well as for starting Solr with the appropriate port using the
43
+ # <code>rake sunspot:solr:start</code> task.
44
+ #
45
+ # If the <code>master_solr</code> configuration is present, Sunspot will use
46
+ # the Solr instance specified here for all write operations, and the Solr
47
+ # configured under <code>solr</code> for all read operations.
48
+ #
49
+ class Configuration
50
+ attr_writer :user_configuration
51
+ #
52
+ # The host name at which to connect to Solr. Default 'localhost'.
53
+ #
54
+ # ==== Returns
55
+ #
56
+ # String:: host name
57
+ #
58
+ def hostname
59
+ unless defined?(@hostname)
60
+ @hostname = solr_url.host if solr_url
61
+ @hostname ||= user_configuration_from_key('solr', 'hostname')
62
+ @hostname ||= default_hostname
63
+ end
64
+ @hostname
65
+ end
66
+
67
+ #
68
+ # The port at which to connect to Solr.
69
+ # Defaults to 8981 in test, 8982 in development and 8983 in production.
70
+ #
71
+ # ==== Returns
72
+ #
73
+ # Integer:: port
74
+ #
75
+ def port
76
+ unless defined?(@port)
77
+ @port = solr_url.port if solr_url
78
+ @port ||= user_configuration_from_key('solr', 'port')
79
+ @port ||= default_port
80
+ @port = @port.to_i
81
+ end
82
+ @port
83
+ end
84
+
85
+ #
86
+ # The url path to the Solr servlet (useful if you are running multicore).
87
+ # Default '/solr'.
88
+ #
89
+ # ==== Returns
90
+ #
91
+ # String:: path
92
+ #
93
+ def path
94
+ unless defined?(@path)
95
+ @path = solr_url.path if solr_url
96
+ @path ||= user_configuration_from_key('solr', 'path')
97
+ @path ||= default_path
98
+ end
99
+ @path
100
+ end
101
+
102
+ #
103
+ # The host name at which to connect to the master Solr instance. Defaults
104
+ # to the 'hostname' configuration option.
105
+ #
106
+ # ==== Returns
107
+ #
108
+ # String:: host name
109
+ #
110
+ def master_hostname
111
+ @master_hostname ||= (user_configuration_from_key('master_solr', 'hostname') || hostname)
112
+ end
113
+
114
+ #
115
+ # The port at which to connect to the master Solr instance. Defaults to
116
+ # the 'port' configuration option.
117
+ #
118
+ # ==== Returns
119
+ #
120
+ # Integer:: port
121
+ #
122
+ def master_port
123
+ @master_port ||= (user_configuration_from_key('master_solr', 'port') || port).to_i
124
+ end
125
+
126
+ #
127
+ # The path to the master Solr servlet (useful if you are running multicore).
128
+ # Defaults to the value of the 'path' configuration option.
129
+ #
130
+ # ==== Returns
131
+ #
132
+ # String:: path
133
+ #
134
+ def master_path
135
+ @master_path ||= (user_configuration_from_key('master_solr', 'path') || path)
136
+ end
137
+
138
+ #
139
+ # True if there is a master Solr instance configured, otherwise false.
140
+ #
141
+ # ==== Returns
142
+ #
143
+ # Boolean:: bool
144
+ #
145
+ def has_master?
146
+ @has_master = !!user_configuration_from_key('master_solr')
147
+ end
148
+
149
+ #
150
+ # The default log_level that should be passed to solr. You can
151
+ # change the individual log_levels in the solr admin interface.
152
+ # Default 'INFO'.
153
+ #
154
+ # ==== Returns
155
+ #
156
+ # String:: log_level
157
+ #
158
+ def log_level
159
+ @log_level ||= (user_configuration_from_key('solr', 'log_level') || 'INFO')
160
+ end
161
+
162
+ #
163
+ # Should the solr index receive a commit after each http-request.
164
+ # Default true
165
+ #
166
+ # ==== Returns
167
+ #
168
+ # Boolean: auto_commit_after_request?
169
+ #
170
+ def auto_commit_after_request?
171
+ @auto_commit_after_request ||=
172
+ user_configuration_from_key('auto_commit_after_request') != false
173
+ end
174
+
175
+ #
176
+ # As for #auto_commit_after_request? but only for deletes
177
+ # Default false
178
+ #
179
+ # ==== Returns
180
+ #
181
+ # Boolean: auto_commit_after_delete_request?
182
+ #
183
+ def auto_commit_after_delete_request?
184
+ @auto_commit_after_delete_request ||=
185
+ (user_configuration_from_key('auto_commit_after_delete_request') || false)
186
+ end
187
+
188
+
189
+ #
190
+ # The log directory for solr logfiles
191
+ #
192
+ # ==== Returns
193
+ #
194
+ # String:: log_dir
195
+ #
196
+ def log_file
197
+ @log_file ||= (user_configuration_from_key('solr', 'log_file') || default_log_file_location )
198
+ end
199
+
200
+ def data_path
201
+ @data_path ||= user_configuration_from_key('solr', 'data_path') || File.join(::Rails.root, 'solr', 'data', ::Rails.env)
202
+ end
203
+
204
+ def pid_dir
205
+ @pid_dir ||= user_configuration_from_key('solr', 'pid_dir') || File.join(::Rails.root, 'solr', 'pids', ::Rails.env)
206
+ end
207
+
208
+
209
+ #
210
+ # The solr home directory. Sunspot::Rails expects this directory
211
+ # to contain a config, data and pids directory. See
212
+ # Sunspot::Rails::Server.bootstrap for more information.
213
+ #
214
+ # ==== Returns
215
+ #
216
+ # String:: solr_home
217
+ #
218
+ def solr_home
219
+ @solr_home ||=
220
+ if user_configuration_from_key('solr', 'solr_home')
221
+ user_configuration_from_key('solr', 'solr_home')
222
+ else
223
+ File.join(::Rails.root, 'solr')
224
+ end
225
+ end
226
+
227
+ #
228
+ # Solr start jar
229
+ #
230
+ def solr_jar
231
+ @solr_jar ||= user_configuration_from_key('solr', 'solr_jar')
232
+ end
233
+
234
+ #
235
+ # Minimum java heap size for Solr instance
236
+ #
237
+ def min_memory
238
+ @min_memory ||= user_configuration_from_key('solr', 'min_memory')
239
+ end
240
+
241
+ #
242
+ # Maximum java heap size for Solr instance
243
+ #
244
+ def max_memory
245
+ @max_memory ||= user_configuration_from_key('solr', 'max_memory')
246
+ end
247
+
248
+ #
249
+ # Interface on which to run Solr
250
+ #
251
+ def bind_address
252
+ @bind_address ||= user_configuration_from_key('solr', 'bind_address')
253
+ end
254
+
255
+ def multicore
256
+ @multicore ||= !!user_configuration_from_key('solr', 'multicore')
257
+ end
258
+
259
+ def read_timeout
260
+ @read_timeout ||= user_configuration_from_key('solr', 'read_timeout')
261
+ end
262
+
263
+ def open_timeout
264
+ @open_timeout ||= user_configuration_from_key('solr', 'open_timeout')
265
+ end
266
+
267
+ #
268
+ # Whether or not to disable Solr.
269
+ # Defaults to false.
270
+ #
271
+ def disabled?
272
+ @disabled ||= (user_configuration_from_key('disabled') || false)
273
+ end
274
+
275
+ private
276
+
277
+ #
278
+ # Logging in rails_root/log as solr_<environment>.log as a
279
+ # default.
280
+ #
281
+ # ===== Returns
282
+ #
283
+ # String:: default_log_file_location
284
+ #
285
+ def default_log_file_location
286
+ File.join(::Rails.root, 'log', "solr_" + ::Rails.env + ".log")
287
+ end
288
+
289
+ #
290
+ # return a specific key from the user configuration in config/sunspot.yml
291
+ #
292
+ # ==== Returns
293
+ #
294
+ # Mixed:: requested_key or nil
295
+ #
296
+ def user_configuration_from_key( *keys )
297
+ keys.inject(user_configuration) do |hash, key|
298
+ hash[key] if hash
299
+ end
300
+ end
301
+
302
+ #
303
+ # Memoized hash of configuration options for the current Rails environment
304
+ # as specified in config/sunspot.yml
305
+ #
306
+ # ==== Returns
307
+ #
308
+ # Hash:: configuration options for current environment
309
+ #
310
+ def user_configuration
311
+ @user_configuration ||=
312
+ begin
313
+ path = File.join(::Rails.root, 'config', 'sunspot.yml')
314
+ if File.exist?(path)
315
+ File.open(path) do |file|
316
+ processed = ERB.new(file.read).result
317
+ YAML.load(processed)[::Rails.env]
318
+ end
319
+ else
320
+ {}
321
+ end
322
+ end
323
+ end
324
+
325
+ protected
326
+
327
+ #
328
+ # When a specific hostname, port and path aren't provided in the
329
+ # sunspot.yml file, look for a key named 'url', then check the
330
+ # environment, then fall back to a sensible localhost default.
331
+ #
332
+
333
+ def solr_url
334
+ if ENV['SOLR_URL'] || ENV['WEBSOLR_URL']
335
+ URI.parse(ENV['SOLR_URL'] || ENV['WEBSOLR_URL'])
336
+ end
337
+ end
338
+
339
+ def default_hostname
340
+ 'localhost'
341
+ end
342
+
343
+ def default_port
344
+ { 'test' => 8981,
345
+ 'development' => 8982,
346
+ 'production' => 8983
347
+ }[::Rails.env] || 8983
348
+ end
349
+
350
+ def default_path
351
+ '/solr'
352
+ end
353
+
354
+ end
355
+
356
+ class ExtendedConfiguration < Sunspot::Rails::Configuration
357
+ def initialize( configuration_hash )
358
+ @supplied_configuration = configuration_hash
359
+ end
360
+ protected
361
+ def solr_url
362
+ unless @cached_solr_url
363
+ @cached_solr_url = super
364
+ @cached_solr_url.path = @supplied_configuration["path"] if @cached_solr_url # fold in the path constructed from the multicore session
365
+ end
366
+ @cached_solr_url
367
+ end
368
+
369
+ private
370
+ def user_configuration
371
+ @user_configuration ||= @supplied_configuration || super
372
+ end
373
+
374
+ end
375
+ end
376
+ end
@@ -0,0 +1,5 @@
1
+ Sunspot.session = Sunspot::Rails.build_session
2
+ Sunspot::Adapters::InstanceAdapter.register(Sunspot::Rails::Adapters::ActiveRecordInstanceAdapter, ActiveRecord::Base)
3
+ Sunspot::Adapters::DataAccessor.register(Sunspot::Rails::Adapters::ActiveRecordDataAccessor, ActiveRecord::Base)
4
+ ActiveRecord::Base.module_eval { include(Sunspot::Rails::Searchable) }
5
+ ActionController::Base.module_eval { include(Sunspot::Rails::RequestLifecycle) }
@@ -0,0 +1,33 @@
1
+ module Sunspot
2
+ module Rails
3
+ class LogSubscriber < ActiveSupport::LogSubscriber
4
+ def self.runtime=(value)
5
+ Thread.current["sorl_runtime"] = value
6
+ end
7
+
8
+ def self.runtime
9
+ Thread.current["sorl_runtime"] ||= 0
10
+ end
11
+
12
+ def self.reset_runtime
13
+ rt, self.runtime = runtime, 0
14
+ rt
15
+ end
16
+
17
+ def request(event)
18
+ self.class.runtime += event.duration
19
+ return unless logger.debug?
20
+
21
+ name = '%s (%.1fms)' % ["SOLR Request", event.duration]
22
+
23
+ # produces: path=/select parameters={fq: ["type:Tag"], q: rossi, fl: * score, qf: tag_name_text, defType: dismax, start: 0, rows: 20}
24
+ parameters = event.payload[:parameters].map { |k, v| "#{k}: #{color(v, BOLD, true)}" }.join(', ')
25
+ request = "path=#{event.payload[:path]} parameters={#{parameters}}"
26
+
27
+ debug " #{color(name, GREEN, true)} [ #{request} ]"
28
+ end
29
+ end
30
+ end
31
+ end
32
+
33
+ Sunspot::Rails::LogSubscriber.attach_to :rsolr
@@ -0,0 +1,36 @@
1
+ module Sunspot
2
+ module Rails
3
+ class Railtie < ::Rails::Railtie
4
+ initializer 'sunspot_rails.init' do
5
+ Sunspot.session = Sunspot::Rails.build_session
6
+ ActiveSupport.on_load(:active_record) do
7
+ Sunspot::Adapters::InstanceAdapter.register(Sunspot::Rails::Adapters::ActiveRecordInstanceAdapter, ActiveRecord::Base)
8
+ Sunspot::Adapters::DataAccessor.register(Sunspot::Rails::Adapters::ActiveRecordDataAccessor, ActiveRecord::Base)
9
+ include(Sunspot::Rails::Searchable)
10
+ end
11
+ ActiveSupport.on_load(:action_controller) do
12
+ include(Sunspot::Rails::RequestLifecycle)
13
+ end
14
+ require 'sunspot/rails/log_subscriber'
15
+ RSolr::Connection.module_eval{ include Sunspot::Rails::SolrInstrumentation }
16
+ end
17
+
18
+ # Expose database runtime to controller for logging.
19
+ initializer "sunspot_rails.log_runtime" do |app|
20
+ require "sunspot/rails/railties/controller_runtime"
21
+ ActiveSupport.on_load(:action_controller) do
22
+ include Sunspot::Rails::Railties::ControllerRuntime
23
+ end
24
+ end
25
+
26
+ rake_tasks do
27
+ load 'sunspot/rails/tasks.rb'
28
+ end
29
+
30
+ generators do
31
+ load "generators/sunspot_rails.rb"
32
+ end
33
+
34
+ end
35
+ end
36
+ end
@@ -0,0 +1,36 @@
1
+ module Sunspot
2
+ module Rails
3
+ module Railties
4
+ module ControllerRuntime
5
+ extend ActiveSupport::Concern
6
+
7
+ protected
8
+
9
+ attr_internal :solr_runtime
10
+
11
+ def cleanup_view_runtime
12
+ # TODO only if solr is connected? if not call to super
13
+
14
+ solr_rt_before_render = Sunspot::Rails::LogSubscriber.reset_runtime
15
+ runtime = super
16
+ solr_rt_after_render = Sunspot::Rails::LogSubscriber.reset_runtime
17
+ self.solr_runtime = solr_rt_before_render + solr_rt_after_render
18
+ runtime - solr_rt_after_render
19
+ end
20
+
21
+ def append_info_to_payload(payload)
22
+ super
23
+ payload[:solr_runtime] = solr_runtime
24
+ end
25
+
26
+ module ClassMethods
27
+ def log_process_action(payload)
28
+ messages, solr_runtime = super, payload[:solr_runtime]
29
+ messages << ("Solr: %.1fms" % solr_runtime.to_f) if solr_runtime
30
+ messages
31
+ end
32
+ end
33
+ end
34
+ end
35
+ end
36
+ end
@@ -0,0 +1,36 @@
1
+ module Sunspot #:nodoc:
2
+ module Rails #:nodoc:
3
+ #
4
+ # This module adds an after_filter to ActionController::Base that commits
5
+ # the Sunspot session if any documents have been added, changed, or removed
6
+ # in the course of the request.
7
+ #
8
+ module RequestLifecycle
9
+ class <<self
10
+ def included(base) #:nodoc:
11
+ subclasses = base.subclasses.map do |subclass|
12
+ begin
13
+ subclass.constantize
14
+ rescue NameError
15
+ end
16
+ end.compact
17
+ loaded_controllers = [base].concat(subclasses)
18
+ # Depending on how Sunspot::Rails is loaded, there may already be
19
+ # controllers loaded into memory that subclass this controller. In
20
+ # this case, since after_filter uses the inheritable_attribute
21
+ # structure, the already-loaded subclasses don't get the filters. So,
22
+ # the below ensures that all loaded controllers have the filter.
23
+ loaded_controllers.each do |controller|
24
+ controller.after_filter do
25
+ if Sunspot::Rails.configuration.auto_commit_after_request?
26
+ Sunspot.commit_if_dirty
27
+ elsif Sunspot::Rails.configuration.auto_commit_after_delete_request?
28
+ Sunspot.commit_if_delete_dirty
29
+ end
30
+ end
31
+ end
32
+ end
33
+ end
34
+ end
35
+ end
36
+ end