sunspot_rails 0.10.9 → 0.11.0
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/History.txt +15 -0
- data/README.rdoc +44 -30
- data/Rakefile +9 -1
- data/TODO +15 -0
- data/VERSION.yml +2 -2
- data/dev_tasks/gemspec.rake +10 -3
- data/generators/sunspot/sunspot_generator.rb +9 -0
- data/generators/sunspot/templates/sunspot.yml +18 -0
- data/lib/sunspot/rails.rb +9 -0
- data/lib/sunspot/rails/adapters.rb +27 -2
- data/lib/sunspot/rails/configuration.rb +140 -6
- data/lib/sunspot/rails/request_lifecycle.rb +5 -1
- data/lib/sunspot/rails/searchable.rb +15 -11
- data/lib/sunspot/rails/server.rb +229 -0
- data/lib/sunspot/rails/session_proxy.rb +62 -0
- data/lib/sunspot/rails/tasks.rb +17 -35
- data/lib/sunspot/rails/util.rb +20 -0
- data/lib/sunspot/spec/extension.rb +45 -0
- data/rails/init.rb +1 -4
- data/spec/configuration_spec.rb +70 -21
- data/spec/mock_app/app/models/author.rb +8 -0
- data/spec/mock_app/app/models/post_with_auto.rb +1 -1
- data/spec/mock_app/config/database.yml +1 -1
- data/spec/mock_app/config/environment.rb +2 -1
- data/spec/mock_app/config/sunspot.yml +5 -0
- data/spec/mock_app/db/schema.rb +20 -0
- data/spec/mock_app/db/test.db +1 -0
- data/spec/model_lifecycle_spec.rb +17 -2
- data/spec/model_spec.rb +38 -2
- data/spec/request_lifecycle_spec.rb +23 -1
- data/spec/schema.rb +6 -0
- data/spec/server_spec.rb +124 -0
- data/spec/session_spec.rb +24 -0
- data/spec/spec_helper.rb +23 -4
- data/spec/sunspot_mocking_spec.rb +22 -0
- data/spec/util_spec.rb +15 -0
- metadata +36 -15
data/History.txt
ADDED
@@ -0,0 +1,15 @@
|
|
1
|
+
== 0.10.7
|
2
|
+
* Added Sunspot::Rails::Server class to start/stop/run/bootstrap the solr server
|
3
|
+
* Added log_level key to sunspot.yml, see java docs for valid values (http://java.sun.com/j2se/1.5.0/docs/api/java/util/logging/Level.html)
|
4
|
+
* Added log_file key to sunspot.yml. This defaults to RAILS_ROOT/log/solr_<environment>.log.
|
5
|
+
* Added support for localsolr in sunspot_rails. You can add custom extension.jar files to your Rails.root/solr/lib directory
|
6
|
+
* Added an option to not reindex an object when certain columns have changed.
|
7
|
+
|
8
|
+
== 0.10.6
|
9
|
+
* Added script/generate sunspot support to generate the required sunspot.yml
|
10
|
+
file [Brandon Keepers]
|
11
|
+
|
12
|
+
== 0.10.5
|
13
|
+
* Added a auto_commit_after_request option to sunspot.yml. Sunspot will not
|
14
|
+
automatically commit any changes in solr if you set this value to false.
|
15
|
+
Strongly encouraged for production environment.
|
data/README.rdoc
CHANGED
@@ -8,7 +8,7 @@ provides the following features:
|
|
8
8
|
* Extend ActiveRecord for easy index configuration, search, and indexing
|
9
9
|
* Automatically index ActiveRecord objects when they are saved, and remove them
|
10
10
|
from the index when they are destroyed (can be disabled)
|
11
|
-
* Automatically commit Solr changes at the end of each request
|
11
|
+
* Automatically commit Solr changes at the end of each request (can be disabled)
|
12
12
|
* Provide utility methods to find and fix orphaned documents and rebuild the
|
13
13
|
Solr index for a given class
|
14
14
|
* Provide rake tasks for starting and stopping the development Solr instance,
|
@@ -18,41 +18,24 @@ Sunspot::Rails has been tested with Rails versions 2.1, 2.2, and 2.3
|
|
18
18
|
|
19
19
|
== Installation
|
20
20
|
|
21
|
-
|
21
|
+
For recent versions of Rails, In your project's <code>config/environment.rb</code>, add the following gem dependencies:
|
22
22
|
|
23
|
-
|
23
|
+
config.gem 'sunspot', :lib => 'sunspot'
|
24
|
+
config.gem 'sunspot_rails', :lib => 'sunspot/rails'
|
25
|
+
|
26
|
+
Install the gems with:
|
24
27
|
|
25
|
-
|
28
|
+
rake gems:install
|
26
29
|
|
27
|
-
|
28
|
-
config.gem 'outoftime-sunspot_rails', :lib => 'sunspot/rails'
|
29
|
-
|
30
|
-
If you are using an older version of Rails that doesn't support plugins-as-gems,
|
31
|
-
use:
|
30
|
+
If you are using an older version of Rails that doesn't support plugins-as-gems, install the gems manually and install the plugin:
|
32
31
|
|
32
|
+
sudo gem install sunspot sunspot_rails --source=http://gems.github.com
|
33
|
+
|
33
34
|
script/plugin install git://github.com/outoftime/sunspot_rails.git
|
35
|
+
|
36
|
+
Generate the file <code>config/sunspot.yml</code>:
|
34
37
|
|
35
|
-
|
36
|
-
|
37
|
-
common: &common
|
38
|
-
solr:
|
39
|
-
hostname: localhost
|
40
|
-
port: 8983
|
41
|
-
|
42
|
-
production:
|
43
|
-
<<: *common
|
44
|
-
solr:
|
45
|
-
path: /solr/myindex
|
46
|
-
|
47
|
-
development:
|
48
|
-
<<: *common
|
49
|
-
solr:
|
50
|
-
port: 8982
|
51
|
-
|
52
|
-
test:
|
53
|
-
<<: *common
|
54
|
-
solr:
|
55
|
-
port: 8981
|
38
|
+
script/generate sunspot
|
56
39
|
|
57
40
|
Rails doesn't automatically load rake tasks from plugins installed as gems
|
58
41
|
(https://rails.lighthouseapp.com/projects/8994/tickets/59). If you installed
|
@@ -220,6 +203,35 @@ remove those documents from the index, use +clean_index_orphans+. Note that
|
|
220
203
|
neither of these operations should be needed if Sunspot and Sunspot::Rails are
|
221
204
|
used as intended.
|
222
205
|
|
206
|
+
|
207
|
+
== Testing Solr integration using RSpec
|
208
|
+
|
209
|
+
To disable the sunspot-solr integration for your active record models, add the
|
210
|
+
following line to your spec_helper.rb
|
211
|
+
|
212
|
+
require 'sunspot/spec/extension'
|
213
|
+
|
214
|
+
This will disable all automatic after_save/after_destroy solr-requests generated
|
215
|
+
via the #searchable method. This will not disable/mock explicit calls in your code.
|
216
|
+
|
217
|
+
If you want to test the sunspot-solr integration with active record, you can
|
218
|
+
reenable the after_save/after_destroy hooks by adding 'integrate_sunspot' in your
|
219
|
+
examples.
|
220
|
+
|
221
|
+
describe Searches do
|
222
|
+
integrate_sunspot
|
223
|
+
|
224
|
+
before(:each) do
|
225
|
+
@movie = Factory.create :movie
|
226
|
+
end
|
227
|
+
|
228
|
+
it "should find a movie" do
|
229
|
+
Movie.search { keywords @movie.title }.first.should == @movie
|
230
|
+
end
|
231
|
+
end
|
232
|
+
|
233
|
+
|
234
|
+
|
223
235
|
== Further Reading
|
224
236
|
|
225
237
|
Reading the {Sunspot documentation}[http://outoftime.github.com/sunspot/docs] is
|
@@ -240,6 +252,8 @@ http://outoftime.lighthouseapp.com/projects/20339-sunspot
|
|
240
252
|
- Peer Allan (peer.allan@gmail.com)
|
241
253
|
- Michael Moen (michael@underpantsgnome.com)
|
242
254
|
- Benjamin Krause (bk@benjaminkrause.com)
|
255
|
+
- Adam Salter (adam@codebright.net)
|
256
|
+
- Brandon Keepers (brandon@opensoul.org)
|
243
257
|
|
244
258
|
== License
|
245
259
|
|
data/Rakefile
CHANGED
@@ -4,13 +4,21 @@ require 'rake/rdoctask'
|
|
4
4
|
|
5
5
|
task :default => :spec
|
6
6
|
|
7
|
+
if File.exist?(sunspot_lib = File.expand_path(File.join(File.dirname(__FILE__), '..', 'sunspot', 'lib')))
|
8
|
+
STDERR.puts("Using sunspot lib at #{sunspot_lib}")
|
9
|
+
$: << sunspot_lib
|
10
|
+
end
|
11
|
+
|
7
12
|
desc 'Run all specs'
|
8
13
|
Spec::Rake::SpecTask.new(:spec) do |t|
|
9
|
-
t.spec_files = FileList['spec
|
14
|
+
t.spec_files = FileList['spec/*_spec.rb']
|
10
15
|
t.spec_opts << '--color'
|
11
16
|
end
|
12
17
|
|
13
18
|
task :environment do
|
19
|
+
if ENV['SUNSPOT_LIB']
|
20
|
+
$: << ENV['SUNSPOT_LIB']
|
21
|
+
end
|
14
22
|
ENV['RAILS_ROOT'] ||= File.join(File.dirname(__FILE__), 'spec', 'mock_app')
|
15
23
|
ENV['RAILS_ENV'] ||= 'test'
|
16
24
|
require File.expand_path(File.join(ENV['RAILS_ROOT'], 'config', 'environment.rb'))
|
data/TODO
ADDED
@@ -0,0 +1,15 @@
|
|
1
|
+
== 0.11
|
2
|
+
* Update sunspot.yml
|
3
|
+
* add log_level support
|
4
|
+
* add solr_home support
|
5
|
+
* add bootstrap method to setup a new solr instance
|
6
|
+
|
7
|
+
== 0.12
|
8
|
+
* add a method to disable sunspot updates for certain values, e.g.
|
9
|
+
if you just touch a record, sunspot shouldn't index the
|
10
|
+
|
11
|
+
=======
|
12
|
+
* Fix final status output for reindex
|
13
|
+
* Add batch-per-request option
|
14
|
+
* Optionally yield from reindex
|
15
|
+
* Access to all searchable classes
|
data/VERSION.yml
CHANGED
data/dev_tasks/gemspec.rake
CHANGED
@@ -1,5 +1,5 @@
|
|
1
1
|
begin
|
2
|
-
gem 'jeweler', '~> 1.0'
|
2
|
+
gem 'technicalpickles-jeweler', '~> 1.0'
|
3
3
|
require 'jeweler'
|
4
4
|
Jeweler::Tasks.new do |s|
|
5
5
|
s.name = 'sunspot_rails'
|
@@ -18,6 +18,7 @@ TEXT
|
|
18
18
|
s.rubyforge_project = 'sunspot'
|
19
19
|
s.files = FileList['[A-Z]*',
|
20
20
|
'{lib,tasks,dev_tasks}/**/*',
|
21
|
+
'generators/**/*',
|
21
22
|
'install.rb',
|
22
23
|
'MIT-LICENSE',
|
23
24
|
'rails/*',
|
@@ -25,7 +26,7 @@ TEXT
|
|
25
26
|
'spec/mock_app/{app,lib,db,vendor,config}/**/*',
|
26
27
|
'spec/mock_app/{tmp,log,solr}']
|
27
28
|
s.add_dependency 'escape', '>= 0.0.4'
|
28
|
-
s.add_dependency 'sunspot', '
|
29
|
+
s.add_dependency 'sunspot', '= 0.10.5'
|
29
30
|
s.add_development_dependency 'rspec', '~> 1.2'
|
30
31
|
s.add_development_dependency 'rspec-rails', '~> 1.2'
|
31
32
|
s.add_development_dependency 'ruby-debug', '~> 0.10'
|
@@ -37,6 +38,12 @@ TEXT
|
|
37
38
|
end
|
38
39
|
|
39
40
|
namespace :release do
|
41
|
+
task :tag do
|
42
|
+
version = Jeweler::VersionHelper.new(File.join(File.dirname(__FILE__), '..')).to_s
|
43
|
+
`git tag -a -m "Version #{version}" v#{version}`
|
44
|
+
`git push origin v#{version}:v#{version}`
|
45
|
+
end
|
46
|
+
|
40
47
|
desc "Release gem to RubyForge and GitHub"
|
41
|
-
task :all => [:"rubyforge:release:gem", :"gemcutter:release"]
|
48
|
+
task :all => [:gemspec, :tag, :"rubyforge:release:gem", :"gemcutter:release"]
|
42
49
|
end
|
data/lib/sunspot/rails.rb
CHANGED
@@ -1,4 +1,9 @@
|
|
1
1
|
require 'sunspot'
|
2
|
+
require 'sunspot/rails/configuration'
|
3
|
+
require 'sunspot/rails/adapters'
|
4
|
+
require 'sunspot/rails/request_lifecycle'
|
5
|
+
require 'sunspot/rails/searchable'
|
6
|
+
require 'sunspot/rails/util'
|
2
7
|
|
3
8
|
module Sunspot #:nodoc:
|
4
9
|
module Rails #:nodoc:
|
@@ -8,6 +13,10 @@ module Sunspot #:nodoc:
|
|
8
13
|
def configuration
|
9
14
|
@configuration ||= Sunspot::Rails::Configuration.new
|
10
15
|
end
|
16
|
+
|
17
|
+
def reset
|
18
|
+
@master_session = @configuration = nil
|
19
|
+
end
|
11
20
|
end
|
12
21
|
end
|
13
22
|
end
|
@@ -19,6 +19,22 @@ module Sunspot #:nodoc:
|
|
19
19
|
end
|
20
20
|
|
21
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
|
+
|
22
38
|
#
|
23
39
|
# Get one ActiveRecord instance out of the database by ID
|
24
40
|
#
|
@@ -31,7 +47,7 @@ module Sunspot #:nodoc:
|
|
31
47
|
# ActiveRecord::Base:: ActiveRecord model
|
32
48
|
#
|
33
49
|
def load(id)
|
34
|
-
@clazz.find(id.to_i)
|
50
|
+
@clazz.find(id.to_i, options_for_find)
|
35
51
|
end
|
36
52
|
|
37
53
|
#
|
@@ -46,7 +62,16 @@ module Sunspot #:nodoc:
|
|
46
62
|
# Array:: Collection of ActiveRecord models
|
47
63
|
#
|
48
64
|
def load_all(ids)
|
49
|
-
@clazz.find(ids.map { |id| id.to_i })
|
65
|
+
@clazz.find(ids.map { |id| id.to_i }, options_for_find)
|
66
|
+
end
|
67
|
+
|
68
|
+
private
|
69
|
+
|
70
|
+
def options_for_find
|
71
|
+
returning({}) do |options|
|
72
|
+
options[:include] = @include unless @include.blank?
|
73
|
+
options[:select] = @select unless @select.blank?
|
74
|
+
end
|
50
75
|
end
|
51
76
|
end
|
52
77
|
end
|
@@ -13,17 +13,28 @@ module Sunspot #:nodoc:
|
|
13
13
|
# solr:
|
14
14
|
# hostname: localhost
|
15
15
|
# port: 8983
|
16
|
-
#
|
16
|
+
# log_level: OFF
|
17
17
|
# production:
|
18
18
|
# solr:
|
19
19
|
# hostname: localhost
|
20
20
|
# port: 8983
|
21
21
|
# path: /solr/myindex
|
22
|
+
# log_level: WARNING
|
23
|
+
# solr_home: /some/path
|
24
|
+
# master_solr:
|
25
|
+
# hostname: localhost
|
26
|
+
# port: 8982
|
27
|
+
# path: /solr
|
28
|
+
# auto_commit_after_request: true
|
22
29
|
#
|
23
30
|
# Sunspot::Rails uses the configuration to set up the Solr connection, as
|
24
31
|
# well as for starting Solr with the appropriate port using the
|
25
32
|
# <code>rake sunspot:solr:start</code> task.
|
26
33
|
#
|
34
|
+
# If the <code>master_solr</code> configuration is present, Sunspot will use
|
35
|
+
# the Solr instance specified here for all write operations, and the Solr
|
36
|
+
# configured under <code>solr</code> for all read operations.
|
37
|
+
#
|
27
38
|
class Configuration
|
28
39
|
attr_writer :user_configuration
|
29
40
|
#
|
@@ -49,7 +60,7 @@ module Sunspot #:nodoc:
|
|
49
60
|
end
|
50
61
|
|
51
62
|
#
|
52
|
-
# The path to the Solr servlet (useful if you are running multicore).
|
63
|
+
# The url path to the Solr servlet (useful if you are running multicore).
|
53
64
|
# Default '/solr'.
|
54
65
|
#
|
55
66
|
# ==== Returns
|
@@ -59,29 +70,152 @@ module Sunspot #:nodoc:
|
|
59
70
|
def path
|
60
71
|
@path ||= (user_configuration_from_key('solr', 'path') || '/solr')
|
61
72
|
end
|
62
|
-
|
73
|
+
|
63
74
|
#
|
64
|
-
#
|
65
|
-
#
|
75
|
+
# The host name at which to connect to the master Solr instance. Defaults
|
76
|
+
# to the 'hostname' configuration option.
|
77
|
+
#
|
78
|
+
# ==== Returns
|
79
|
+
#
|
80
|
+
# String:: host name
|
81
|
+
#
|
82
|
+
def master_hostname
|
83
|
+
@master_hostname ||= (user_configuration_from_key('solr', 'master_hostname') || hostname)
|
84
|
+
end
|
85
|
+
|
86
|
+
#
|
87
|
+
# The port at which to connect to the master Solr instance. Defaults to
|
88
|
+
# the 'port' configuration option.
|
89
|
+
#
|
90
|
+
# ==== Returns
|
91
|
+
#
|
92
|
+
# Integer:: port
|
93
|
+
#
|
94
|
+
def master_port
|
95
|
+
@master_port ||= (user_configuration_from_key('solr', 'master_port') || port).to_i
|
96
|
+
end
|
97
|
+
|
98
|
+
#
|
99
|
+
# The path to the master Solr servlet (useful if you are running multicore).
|
100
|
+
# Defaults to the value of the 'path' configuration option.
|
101
|
+
#
|
102
|
+
# ==== Returns
|
103
|
+
#
|
104
|
+
# String:: path
|
105
|
+
#
|
106
|
+
def master_path
|
107
|
+
@master_path ||= (user_configuration_from_key('solr', 'master_path') || path)
|
108
|
+
end
|
109
|
+
|
110
|
+
#
|
111
|
+
# True if there is a master Solr instance configured, otherwise false.
|
66
112
|
#
|
67
113
|
# ==== Returns
|
68
114
|
#
|
69
115
|
# Boolean:: bool
|
70
116
|
#
|
117
|
+
def has_master?
|
118
|
+
@has_master = !!user_configuration_from_key('master_solr')
|
119
|
+
end
|
120
|
+
|
121
|
+
#
|
122
|
+
# The default log_level that should be passed to solr. You can
|
123
|
+
# change the individual log_levels in the solr admin interface.
|
124
|
+
# Default 'INFO'.
|
125
|
+
#
|
126
|
+
# ==== Returns
|
127
|
+
#
|
128
|
+
# String:: log_level
|
129
|
+
#
|
130
|
+
def log_level
|
131
|
+
@log_level ||= (user_configuration_from_key('solr', 'log_level') || 'INFO')
|
132
|
+
end
|
71
133
|
|
134
|
+
#
|
135
|
+
# Should the solr index receive a commit after each http-request.
|
136
|
+
# Default true
|
137
|
+
#
|
138
|
+
# ==== Returns
|
139
|
+
#
|
140
|
+
# Boolean: auto_commit_after_request?
|
141
|
+
#
|
72
142
|
def auto_commit_after_request?
|
73
143
|
@auto_commit_after_request ||=
|
74
144
|
user_configuration_from_key('auto_commit_after_request') != false
|
75
145
|
end
|
146
|
+
|
147
|
+
#
|
148
|
+
# As for #auto_commit_after_request? but only for deletes
|
149
|
+
# Default false
|
150
|
+
#
|
151
|
+
# ==== Returns
|
152
|
+
#
|
153
|
+
# Boolean: auto_commit_after_delete_request?
|
154
|
+
#
|
155
|
+
def auto_commit_after_delete_request?
|
156
|
+
@auto_commit_after_delete_request ||=
|
157
|
+
(user_configuration_from_key('auto_commit_after_delete_request') || false)
|
158
|
+
end
|
159
|
+
|
160
|
+
|
161
|
+
#
|
162
|
+
# The log directory for solr logfiles
|
163
|
+
#
|
164
|
+
# ==== Returns
|
165
|
+
#
|
166
|
+
# String:: log_dir
|
167
|
+
#
|
168
|
+
def log_file
|
169
|
+
@log_file ||= (user_configuration_from_key('solr', 'log_file') || default_log_file_location )
|
170
|
+
end
|
76
171
|
|
172
|
+
def data_path
|
173
|
+
@data_path ||= user_configuration_from_key('solr', 'data_path') || File.join(::Rails.root, 'solr', 'data', ::Rails.env)
|
174
|
+
end
|
175
|
+
|
176
|
+
def pid_path
|
177
|
+
@pids_path ||= user_configuration_from_key('solr', 'pid_path') || File.join(::Rails.root, 'solr', 'pids', ::Rails.env)
|
178
|
+
end
|
179
|
+
|
180
|
+
#
|
181
|
+
# The solr home directory. Sunspot::Rails expects this directory
|
182
|
+
# to contain a config, data and pids directory. See
|
183
|
+
# Sunspot::Rails::Server.bootstrap for more information.
|
184
|
+
#
|
185
|
+
# ==== Returns
|
186
|
+
#
|
187
|
+
# String:: solr_home
|
188
|
+
#
|
189
|
+
def solr_home
|
190
|
+
@solr_home ||=
|
191
|
+
if user_configuration_from_key('solr', 'solr_home')
|
192
|
+
user_configuration_from_key('solr', 'solr_home')
|
193
|
+
else
|
194
|
+
File.join(::Rails.root, 'solr')
|
195
|
+
end
|
196
|
+
end
|
197
|
+
|
77
198
|
private
|
78
199
|
|
200
|
+
#
|
201
|
+
# Logging in rails_root/log as solr_<environment>.log as a
|
202
|
+
# default.
|
203
|
+
#
|
204
|
+
# ===== Returns
|
205
|
+
#
|
206
|
+
# String:: default_log_file_location
|
207
|
+
#
|
208
|
+
def default_log_file_location
|
209
|
+
File.join(::Rails.root, 'log', "solr_" + ::Rails.env + ".log")
|
210
|
+
end
|
211
|
+
|
79
212
|
#
|
80
213
|
# return a specific key from the user configuration in config/sunspot.yml
|
81
214
|
#
|
82
215
|
# ==== Returns
|
83
216
|
#
|
84
|
-
#
|
217
|
+
# Mixed:: requested_key or nil
|
218
|
+
#
|
85
219
|
def user_configuration_from_key( *keys )
|
86
220
|
keys.inject(user_configuration) do |hash, key|
|
87
221
|
hash[key] if hash
|