-
Notifications
You must be signed in to change notification settings - Fork 921
/
tasks.rb
107 lines (91 loc) · 3.98 KB
/
tasks.rb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
namespace :sunspot do
desc "Drop and then reindex all solr models that are located in your application's models directory."
# This task depends on the standard Rails file naming \
# conventions, in that the file name matches the defined class name. \
# By default the indexing system works in batches of 50 records, you can \
# set your own value for this by using the batch_size argument. You can \
# also optionally define a list of models separated by a plus sign '+'
#
# $ rake sunspot:reindex # reindex all models
# $ rake sunspot:reindex[1000] # reindex in batches of 1000
# $ rake sunspot:reindex[false] # reindex without batching
# $ rake sunspot:reindex[,Post] # reindex only the Post model
# $ rake sunspot:reindex[1000,Post] # reindex only the Post model in
# # batchs of 1000
# $ rake sunspot:reindex[,Post+Author] # reindex Post and Author model
task :reindex, [:batch_size, :models, :silence] => [:environment] do |t, args|
# Retry once or gracefully fail for a 5xx error so we don't break reindexing
with_session(Sunspot::SessionProxy::Retry5xxSessionProxy.new(Sunspot.session)) do
# Set up general options for reindexing
reindex_options = { :batch_commit => false }
case args[:batch_size]
when 'false'
reindex_options[:batch_size] = nil
when /^\d+$/
reindex_options[:batch_size] = args[:batch_size].to_i if args[:batch_size].to_i > 0
end
# Load all the application's models. Models which invoke 'searchable' will register themselves
# in Sunspot.searchable.
Rails.application.eager_load!
if args[:models].present?
# Choose a specific subset of models, if requested
model_names = args[:models].split(/[+ ]/)
sunspot_models = model_names.map{ |m| m.constantize }
else
# By default, reindex all searchable models
sunspot_models = Sunspot.searchable
end
# Set up progress_bar to, ah, report progress unless the user has chosen to silence output
begin
require 'progress_bar'
total_documents = sunspot_models.map { | m | m.count }.sum
reindex_options[:progress_bar] = ProgressBar.new(total_documents)
rescue LoadError => e
$stdout.puts "Skipping progress bar: for progress reporting, add gem 'progress_bar' to your Gemfile"
rescue ProgressBar::ArgumentError => e
$stdout.puts "You have no data in the database. Reindexing does nothing here."
rescue Exception => e
$stderr.puts "Error using progress bar: #{e.message}"
end unless args[:silence]
# Finally, invoke the class-level solr_reindex on each model
sunspot_models.each do |model|
model.solr_reindex(reindex_options)
end
end
end
# Swaps sunspot sessions for the duration of the block
# Ensures the session is returned to normal in case this task is called from within the rails app
# and not just a one-off from the command line
def with_session(new_session)
original_session = Sunspot.session
Sunspot.session = new_session
yield
ensure
Sunspot.session = original_session
end
def sunspot_solr_in_load_path?
# http://www.rubular.com/r/rJGDh7eOSc
$:.any? { |path| path.to_s =~ %r{sunspot_solr(-[^/]+)?/lib$} }
end
unless sunspot_solr_in_load_path?
namespace :solr do
task :moved_to_sunspot_solr do
abort %(
Note: This task has been moved to the sunspot_solr gem. To install, start and
stop a local Solr instance, please add sunspot_solr to your Gemfile:
group :development do
gem 'sunspot_solr'
end
)
end
desc 'Start the Solr instance'
task :start => :moved_to_sunspot_solr
desc 'Run the Solr instance in the foreground'
task :run => :moved_to_sunspot_solr
desc 'Stop the Solr instance'
task :stop => :moved_to_sunspot_solr
# for backwards compatibility
task :reindex => :"sunspot:reindex"
end
end
end