honkster-acts_as_solr 0.2.5 → 0.3.4
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/Rakefile +8 -4
- data/VERSION.yml +4 -0
- data/config/solr_environment.rb +19 -4
- data/lib/acts_as_solr/acts_methods.rb +86 -13
- data/lib/acts_as_solr/class_methods.rb +1 -1
- data/lib/acts_as_solr/instance_methods.rb +0 -1
- data/lib/acts_as_solr/parser_methods.rb +6 -1
- data/lib/acts_as_solr/tasks/solr.rake +4 -1
- data/test/fixtures/books.yml +1 -1
- data/test/fixtures/electronics.yml +14 -14
- data/test/functional/acts_as_solr_test.rb +8 -8
- data/test/functional/multi_solr_search_test.rb +14 -8
- data/test/models/electronic.rb +8 -4
- data/test/test_helper.rb +3 -0
- data/test/unit/instance_methods_shoulda.rb +1 -1
- data/test/unit/parser_instance.rb +2 -2
- data/test/unit/parser_methods_shoulda.rb +12 -0
- data/test/unit/solr_instance.rb +5 -0
- data/test/unit/test_helper.rb +5 -3
- metadata +5 -5
- data/VERSION +0 -1
data/Rakefile
CHANGED
@@ -3,7 +3,7 @@ require 'rake'
|
|
3
3
|
require 'rake/testtask'
|
4
4
|
require 'rake/rdoctask'
|
5
5
|
|
6
|
-
Dir["#{File.dirname(__FILE__)}/lib/tasks/**/*.rake"].sort.each { |ext| load ext }
|
6
|
+
Dir["#{File.dirname(__FILE__)}/lib/acts_as_solr/tasks/**/*.rake"].sort.each { |ext| load ext }
|
7
7
|
|
8
8
|
desc "Default Task"
|
9
9
|
task :default => [:test]
|
@@ -13,7 +13,9 @@ task :test => "test:unit"
|
|
13
13
|
|
14
14
|
namespace :test do
|
15
15
|
task :setup do
|
16
|
+
RAILS_ROOT = File.expand_path("#{File.dirname(__FILE__)}/test") unless defined? RAILS_ROOT
|
16
17
|
ENV['RAILS_ENV'] = "test"
|
18
|
+
ENV["ACTS_AS_SOLR_TEST"] = "true"
|
17
19
|
require File.expand_path("#{File.dirname(__FILE__)}/config/solr_environment")
|
18
20
|
puts "Using " + DB
|
19
21
|
%x(mysql -u#{MYSQL_USER} < #{File.dirname(__FILE__) + "/test/fixtures/db_definitions/mysql.sql"}) if DB == 'mysql'
|
@@ -56,12 +58,14 @@ begin
|
|
56
58
|
require 'jeweler'
|
57
59
|
Jeweler::Tasks.new do |s|
|
58
60
|
s.name = "acts_as_solr"
|
59
|
-
s.
|
61
|
+
#s.name = "honkster-acts_as_solr"
|
62
|
+
s.summary = "This plugin adds full text search capabilities and many other nifty features from Apache�s Solr to any Rails model. I'm currently rearranging the test suite to include a real unit test suite, and adding a few features I need myself."
|
60
63
|
s.email = "meyer@paperplanes.de"
|
61
64
|
s.homepage = "http://github.com/mattmatt/acts_as_solr"
|
62
|
-
s.description = "This plugin adds full text search capabilities and many other nifty features from Apache�s Solr to any Rails model. I'm currently rearranging the test suite to include a real unit test suite, and adding a few features I need myself."
|
65
|
+
s.description = "This plugin adds full text search capabilities and many other nifty features from Apache�s Solr to any Rails model. I'm currently rearranging the test suite to include a real unit test suite, and adding a few features I need myself."
|
63
66
|
s.authors = ["Mathias Meyer"]
|
64
|
-
s.files = FileList["[A-Z]*", "{bin,generators,config,lib,solr
|
67
|
+
s.files = FileList["[A-Z]*", "{bin,generators,config,lib,solr}/**/*"] +
|
68
|
+
FileList["test/**/*"].reject {|f| f.include?("test/log")}.reject {|f| f.include?("test/tmp")}
|
65
69
|
end
|
66
70
|
rescue LoadError
|
67
71
|
puts "Jeweler, or one of its dependencies, is not available. Install it with: sudo gem install technicalpickles-jeweler -s http://gems.github.com"
|
data/VERSION.yml
ADDED
data/config/solr_environment.rb
CHANGED
@@ -1,17 +1,32 @@
|
|
1
1
|
ENV['RAILS_ENV'] = (ENV['RAILS_ENV'] || 'development').dup
|
2
2
|
# RAILS_ROOT isn't defined yet, so figure it out.
|
3
3
|
require "uri"
|
4
|
+
require "fileutils"
|
4
5
|
dir = File.dirname(__FILE__)
|
5
6
|
SOLR_PATH = File.expand_path("#{dir}/../solr") unless defined? SOLR_PATH
|
6
7
|
|
7
|
-
|
8
|
-
|
9
|
-
|
8
|
+
RAILS_ROOT = File.expand_path("#{File.dirname(__FILE__)}/../test") unless defined? RAILS_ROOT
|
9
|
+
unless defined? SOLR_LOGS_PATH
|
10
|
+
SOLR_LOGS_PATH = ENV["SOLR_LOGS_PATH"] || "#{RAILS_ROOT}/log"
|
11
|
+
end
|
12
|
+
unless defined? SOLR_PIDS_PATH
|
13
|
+
SOLR_PIDS_PATH = ENV["SOLR_PIDS_PATH"] || "#{RAILS_ROOT}/tmp/pids"
|
14
|
+
end
|
15
|
+
unless defined? SOLR_DATA_PATH
|
16
|
+
SOLR_DATA_PATH = ENV["SOLR_DATA_PATH"] || "#{RAILS_ROOT}/solr/#{ENV['RAILS_ENV']}"
|
17
|
+
end
|
10
18
|
|
11
19
|
unless defined? SOLR_PORT
|
12
20
|
config = YAML::load_file(RAILS_ROOT+'/config/solr.yml')
|
13
|
-
|
21
|
+
raise("No solr environment defined for RAILS_ENV the #{ENV['RAILS_ENV'].inspect}") unless config[ENV['RAILS_ENV']]
|
14
22
|
SOLR_PORT = ENV['PORT'] || URI.parse(config[ENV['RAILS_ENV']]['url']).port
|
15
23
|
end
|
16
24
|
|
17
25
|
SOLR_JVM_OPTIONS = config[ENV['RAILS_ENV']]['jvm_options'] unless defined? SOLR_JVM_OPTIONS
|
26
|
+
|
27
|
+
if ENV["ACTS_AS_SOLR_TEST"]
|
28
|
+
require "activerecord"
|
29
|
+
DB = (ENV['DB'] ? ENV['DB'] : 'sqlite') unless defined?(DB)
|
30
|
+
MYSQL_USER = (ENV['MYSQL_USER'].nil? ? 'root' : ENV['MYSQL_USER']) unless defined? MYSQL_USER
|
31
|
+
require File.join(File.dirname(File.expand_path(__FILE__)), '..', 'test', 'db', 'connections', DB, 'connection.rb')
|
32
|
+
end
|
@@ -158,17 +158,92 @@ module ActsAsSolr #:nodoc:
|
|
158
158
|
# acts_as_solr :auto_commit => false
|
159
159
|
# end
|
160
160
|
#
|
161
|
-
def acts_as_solr(options={}, solr_options={})
|
162
|
-
|
161
|
+
def acts_as_solr(options={}, solr_options={}, &deferred_solr_configuration)
|
162
|
+
|
163
163
|
extend ClassMethods
|
164
164
|
include InstanceMethods
|
165
165
|
include CommonMethods
|
166
166
|
include ParserMethods
|
167
|
+
|
168
|
+
define_solr_configuration_methods
|
169
|
+
|
170
|
+
after_save :solr_save
|
171
|
+
after_destroy :solr_destroy
|
172
|
+
|
173
|
+
if deferred_solr_configuration
|
174
|
+
self.deferred_solr_configuration = deferred_solr_configuration
|
175
|
+
else
|
176
|
+
process_acts_as_solr(options, solr_options)
|
177
|
+
end
|
178
|
+
end
|
179
|
+
|
180
|
+
def process_acts_as_solr(options, solr_options)
|
181
|
+
process_solr_options(options, solr_options)
|
182
|
+
end
|
183
|
+
|
184
|
+
def define_solr_configuration_methods
|
185
|
+
# I'd like to use cattr_accessor, but it does not support lazy loaders and delegation to the class in the instance methods.
|
186
|
+
# TODO: Reconcile with cattr_accessor, or a more appropriate method.
|
187
|
+
class_eval(<<-EOS, __FILE__, __LINE__)
|
188
|
+
@@configuration = nil unless defined?(@@configuration)
|
189
|
+
@@solr_configuration = nil unless defined?(@@solr_configuration)
|
190
|
+
@@deferred_solr_configuration = nil unless defined?(@@deferred_solr_configuration)
|
167
191
|
|
168
|
-
|
169
|
-
|
170
|
-
|
171
|
-
|
192
|
+
def self.configuration
|
193
|
+
return @@configuration if @@configuration
|
194
|
+
process_deferred_solr_configuration
|
195
|
+
@@configuration
|
196
|
+
end
|
197
|
+
def configuration
|
198
|
+
self.class.configuration
|
199
|
+
end
|
200
|
+
def self.configuration=(value)
|
201
|
+
@@configuration = value
|
202
|
+
end
|
203
|
+
def configuration=(value)
|
204
|
+
self.class.configuration = value
|
205
|
+
end
|
206
|
+
|
207
|
+
def self.solr_configuration
|
208
|
+
return @@solr_configuration if @@solr_configuration
|
209
|
+
process_deferred_solr_configuration
|
210
|
+
@@solr_configuration
|
211
|
+
end
|
212
|
+
def solr_configuration
|
213
|
+
self.class.solr_configuration
|
214
|
+
end
|
215
|
+
def self.solr_configuration=(value)
|
216
|
+
@@solr_configuration = value
|
217
|
+
end
|
218
|
+
def solr_configuration=(value)
|
219
|
+
self.class.solr_configuration = value
|
220
|
+
end
|
221
|
+
|
222
|
+
def self.deferred_solr_configuration
|
223
|
+
return @@deferred_solr_configuration if @@deferred_solr_configuration
|
224
|
+
@@deferred_solr_configuration
|
225
|
+
end
|
226
|
+
def deferred_solr_configuration
|
227
|
+
self.class.deferred_solr_configuration
|
228
|
+
end
|
229
|
+
def self.deferred_solr_configuration=(value)
|
230
|
+
@@deferred_solr_configuration = value
|
231
|
+
end
|
232
|
+
def deferred_solr_configuration=(value)
|
233
|
+
self.class.deferred_solr_configuration = value
|
234
|
+
end
|
235
|
+
EOS
|
236
|
+
end
|
237
|
+
|
238
|
+
def process_deferred_solr_configuration
|
239
|
+
return unless deferred_solr_configuration
|
240
|
+
options, solr_options = deferred_solr_configuration.call
|
241
|
+
self.deferred_solr_configuration = nil
|
242
|
+
self.process_solr_options(options, solr_options)
|
243
|
+
end
|
244
|
+
|
245
|
+
def process_solr_options(options={}, solr_options={})
|
246
|
+
self.configuration = {
|
172
247
|
:fields => nil,
|
173
248
|
:additional_fields => nil,
|
174
249
|
:exclude_fields => [],
|
@@ -178,22 +253,19 @@ module ActsAsSolr #:nodoc:
|
|
178
253
|
:boost => nil,
|
179
254
|
:if => "true",
|
180
255
|
:offline => false
|
181
|
-
}
|
256
|
+
}
|
182
257
|
self.solr_configuration = {
|
183
258
|
:type_field => "type_s",
|
184
259
|
:primary_key_field => "pk_i",
|
185
260
|
:default_boost => 1.0
|
186
261
|
}
|
187
|
-
|
262
|
+
|
188
263
|
configuration.update(options) if options.is_a?(Hash)
|
189
264
|
solr_configuration.update(solr_options) if solr_options.is_a?(Hash)
|
190
265
|
Deprecation.validate_index(configuration)
|
191
|
-
|
266
|
+
|
192
267
|
configuration[:solr_fields] = {}
|
193
268
|
configuration[:solr_includes] = {}
|
194
|
-
|
195
|
-
after_save :solr_save
|
196
|
-
after_destroy :solr_destroy
|
197
269
|
|
198
270
|
if configuration[:fields].respond_to?(:each)
|
199
271
|
process_fields(configuration[:fields])
|
@@ -206,8 +278,9 @@ module ActsAsSolr #:nodoc:
|
|
206
278
|
process_includes(configuration[:include])
|
207
279
|
end
|
208
280
|
end
|
209
|
-
|
281
|
+
|
210
282
|
private
|
283
|
+
|
211
284
|
def get_field_value(field)
|
212
285
|
field_name, options = determine_field_name_and_options(field)
|
213
286
|
configuration[:solr_fields][field_name] = options
|
@@ -168,7 +168,7 @@ module ActsAsSolr #:nodoc:
|
|
168
168
|
result << k[0].constantize.find_by_id(k[1])
|
169
169
|
end
|
170
170
|
elsif options[:results_format] == :ids
|
171
|
-
data.hits.each{|doc| result << {"id" => doc.
|
171
|
+
data.hits.each{|doc| result << {"id" => doc["id"].to_s}}
|
172
172
|
end
|
173
173
|
result
|
174
174
|
end
|
@@ -72,7 +72,8 @@ module ActsAsSolr #:nodoc:
|
|
72
72
|
query_options[:field_list] = [field_list, 'score']
|
73
73
|
query = "(#{query.gsub(/ *: */,"_t:")}) #{models}"
|
74
74
|
order = options[:order].split(/\s*,\s*/).collect{|e| e.gsub(/\s+/,'_t ').gsub(/\bscore_t\b/, 'score') }.join(',') if options[:order]
|
75
|
-
query_options[:query] = replace_types([query])[0] # TODO adjust replace_types to work with String or Array
|
75
|
+
query_options[:query] = replace_types([query])[0] # TODO adjust replace_types to work with String or Array
|
76
|
+
query_options[:query] = quote_values_with_spaces(query_options[:query])
|
76
77
|
|
77
78
|
if options[:order]
|
78
79
|
# TODO: set the sort parameter instead of the old ;order. style.
|
@@ -166,6 +167,10 @@ module ActsAsSolr #:nodoc:
|
|
166
167
|
end
|
167
168
|
strings
|
168
169
|
end
|
170
|
+
|
171
|
+
def quote_values_with_spaces(string)
|
172
|
+
string.gsub(/:([^\s\)]*)\s([^\s\)]*)\)/, ':"\1 \2")')
|
173
|
+
end
|
169
174
|
|
170
175
|
# Adds the score to each one of the instances found
|
171
176
|
def add_scores(results, solr_data)
|
@@ -3,6 +3,9 @@ namespace :solr do
|
|
3
3
|
desc 'Starts Solr. Options accepted: RAILS_ENV=your_env, PORT=XX. Defaults to development if none.'
|
4
4
|
task :start do
|
5
5
|
require File.expand_path("#{File.dirname(__FILE__)}/../../../config/solr_environment")
|
6
|
+
FileUtils.mkdir_p(SOLR_LOGS_PATH)
|
7
|
+
FileUtils.mkdir_p(SOLR_DATA_PATH)
|
8
|
+
FileUtils.mkdir_p(SOLR_PIDS_PATH)
|
6
9
|
begin
|
7
10
|
n = Net::HTTP.new('127.0.0.1', SOLR_PORT)
|
8
11
|
n.request_head('/').value
|
@@ -47,7 +50,7 @@ namespace :solr do
|
|
47
50
|
require File.expand_path("#{File.dirname(__FILE__)}/../../../config/solr_environment")
|
48
51
|
raise "In production mode. I'm not going to delete the index, sorry." if ENV['RAILS_ENV'] == "production"
|
49
52
|
if File.exists?("#{SOLR_DATA_PATH}")
|
50
|
-
Dir["#{SOLR_DATA_PATH}/index/*"].each{|f| File.unlink(f)}
|
53
|
+
Dir["#{SOLR_DATA_PATH}/index/*"].each{|f| File.unlink(f) if File.exists?(f)}
|
51
54
|
Dir.rmdir("#{SOLR_DATA_PATH}/index")
|
52
55
|
puts "Index files removed under " + ENV['RAILS_ENV'] + " environment"
|
53
56
|
end
|
data/test/fixtures/books.yml
CHANGED
@@ -5,9 +5,9 @@ ipod_video:
|
|
5
5
|
features: iTunes, Podcasts, Audiobooks
|
6
6
|
category: Electronics
|
7
7
|
price: 599.00
|
8
|
-
created_at: <%=
|
9
|
-
updated_at: <%=
|
10
|
-
|
8
|
+
created_at: <%= (Time.now - 1.year).utc %>
|
9
|
+
updated_at: <%= (Time.now - 1.month).utc %>
|
10
|
+
|
11
11
|
dell_monitor:
|
12
12
|
id: 2
|
13
13
|
name: Dell Widescreen UltraSharp 3007WFP
|
@@ -15,9 +15,9 @@ dell_monitor:
|
|
15
15
|
features: 30" TFT active matrix LCD, 2560 x 1600, .25mm dot pitch, 700:1 contrast
|
16
16
|
category: Electronics
|
17
17
|
price: 750.00
|
18
|
-
created_at: <%=
|
19
|
-
updated_at: <%=
|
20
|
-
|
18
|
+
created_at: <%= (Time.now - 1.year).utc %>
|
19
|
+
updated_at: <%= (Time.now - 1.month).utc %>
|
20
|
+
|
21
21
|
samsung_hd:
|
22
22
|
id: 3
|
23
23
|
name: Samsung SpinPoint P120 SP2514N - hard drive - 250 GB of Memory Storage - ATA-133
|
@@ -25,9 +25,9 @@ samsung_hd:
|
|
25
25
|
features: 7200RPM, 8MB cache, IDE Ultra ATA-133
|
26
26
|
category: Hard Drive
|
27
27
|
price: 319.00
|
28
|
-
created_at: <%=
|
29
|
-
updated_at: <%=
|
30
|
-
|
28
|
+
created_at: <%= (Time.now - 2.years).utc %>
|
29
|
+
updated_at: <%= (Time.now - 2.months).utc %>
|
30
|
+
|
31
31
|
corsair_ram:
|
32
32
|
id: 4
|
33
33
|
name: CORSAIR XMS 2GB (2 x 1GB) 184-Pin DDR SDRAM Unbuffered DDR 400 (PC 3200) Dual Channel Kit System Memory - Retail
|
@@ -35,9 +35,9 @@ corsair_ram:
|
|
35
35
|
features: CAS latency 2, 2-3-3-6 timing, 2.75v, unbuffered, heat-spreader
|
36
36
|
category: Memory
|
37
37
|
price: 155.00
|
38
|
-
created_at: <%=
|
39
|
-
updated_at: <%=
|
40
|
-
|
38
|
+
created_at: <%= (Time.now - 6.years).utc %>
|
39
|
+
updated_at: <%= (Time.now - 3.months).utc %>
|
40
|
+
|
41
41
|
a_data_ram:
|
42
42
|
id: 5
|
43
43
|
name: A-DATA V-Series 1GB 184-Pin DDR SDRAM Unbuffered DDR 400 (PC 3200) System Memory - OEM
|
@@ -45,5 +45,5 @@ a_data_ram:
|
|
45
45
|
features: CAS latency 3, 2.7v
|
46
46
|
category: Memory
|
47
47
|
price: 65.79
|
48
|
-
created_at: <%=
|
49
|
-
updated_at: <%=
|
48
|
+
created_at: <%= (Time.now - 9.years).utc %>
|
49
|
+
updated_at: <%= (Time.now - 4.months).utc %>
|
@@ -312,11 +312,11 @@ class ActsAsSolrTest < Test::Unit::TestCase
|
|
312
312
|
def test_find_by_solr_with_score
|
313
313
|
books = Book.find_by_solr 'ruby^10 OR splinter', :scores => true
|
314
314
|
assert_equal 2, books.total
|
315
|
-
|
316
|
-
|
315
|
+
assert (books.max_score >= 0.3 && books.max_score <= 0.6)
|
316
|
+
|
317
317
|
books.records.each { |book| assert_not_nil book.solr_score }
|
318
|
-
|
319
|
-
|
318
|
+
assert (books.docs.first.solr_score >= 0.3 && books.docs.first.solr_score <= 0.6)
|
319
|
+
assert (books.docs.last.solr_score >= 0.1 && books.docs.last.solr_score <= 0.2)
|
320
320
|
end
|
321
321
|
|
322
322
|
# Making sure nothing breaks when html entities are inside
|
@@ -386,11 +386,11 @@ class ActsAsSolrTest < Test::Unit::TestCase
|
|
386
386
|
def test_find_by_solr_order_by_score
|
387
387
|
books = Book.find_by_solr 'ruby^10 OR splinter', {:scores => true, :order => 'score asc' }
|
388
388
|
assert (books.docs.collect(&:solr_score).compact.size == books.docs.size), "Each book should have a score"
|
389
|
-
|
390
|
-
|
389
|
+
assert (books.docs.last.solr_score >= 0.3 && books.docs.last.solr_score <= 0.6)
|
390
|
+
|
391
391
|
books = Book.find_by_solr 'ruby^10 OR splinter', {:scores => true, :order => 'score desc' }
|
392
|
-
|
393
|
-
|
392
|
+
assert (books.docs.first.solr_score >= 0.3 && books.docs.first.solr_score <= 0.6)
|
393
|
+
assert (books.docs.last.solr_score >= 0.1 && books.docs.last.solr_score <= 0.2)
|
394
394
|
end
|
395
395
|
|
396
396
|
# Search based on fields with the :date format
|
@@ -8,8 +8,9 @@ class ActsAsSolrTest < Test::Unit::TestCase
|
|
8
8
|
def test_multi_solr_search_return_objects
|
9
9
|
records = Book.multi_solr_search "Napoleon OR Tom", :models => [Movie], :results_format => :objects
|
10
10
|
assert_equal 2, records.total
|
11
|
-
|
12
|
-
|
11
|
+
classes = records.docs.map {|d| d.class}
|
12
|
+
assert classes.include?(Book)
|
13
|
+
assert classes.include?(Movie)
|
13
14
|
end
|
14
15
|
|
15
16
|
# Testing the multi_solr_search with the returning results being ids
|
@@ -22,11 +23,16 @@ class ActsAsSolrTest < Test::Unit::TestCase
|
|
22
23
|
|
23
24
|
# Testing the multi_solr_search with multiple models
|
24
25
|
def test_multi_solr_search_multiple_models
|
26
|
+
# TODO: Generalize me
|
27
|
+
ActsAsSolr::Post.execute(Solr::Request::Delete.new(:query => 'type_s:Author AND NOT id:"Author:1" AND NOT id:"Author:2"'))
|
28
|
+
ActsAsSolr::Post.execute(Solr::Request::Delete.new(:query => 'type_s:Book AND NOT id:"Book:1" AND NOT id:"Book:2"'))
|
29
|
+
ActsAsSolr::Post.execute(Solr::Request::Commit.new)
|
30
|
+
|
25
31
|
records = Book.multi_solr_search "Napoleon OR Tom OR Thriller", :models => [Movie, Category], :results_format => :ids
|
26
|
-
assert_equal
|
27
|
-
|
28
|
-
|
29
|
-
|
32
|
+
assert_equal 3, records.total
|
33
|
+
assert records.docs.include?({"id" => "Category:1"})
|
34
|
+
assert records.docs.include?({"id" =>"Book:1"})
|
35
|
+
assert records.docs.include?({"id" => "Movie:1"})
|
30
36
|
end
|
31
37
|
|
32
38
|
# Testing empty result set format
|
@@ -45,7 +51,7 @@ class ActsAsSolrTest < Test::Unit::TestCase
|
|
45
51
|
|
46
52
|
def test_search_with_score_should_set_score
|
47
53
|
records = Book.multi_solr_search "Napoleon OR Tom", :models => [Movie], :results_format => :objects, :scores => true
|
48
|
-
|
49
|
-
|
54
|
+
assert records.docs.first.solr_score.is_a?(Float)
|
55
|
+
assert records.docs.last.solr_score.is_a?(Float)
|
50
56
|
end
|
51
57
|
end
|
data/test/models/electronic.rb
CHANGED
@@ -8,10 +8,14 @@
|
|
8
8
|
# - created_on
|
9
9
|
|
10
10
|
class Electronic < ActiveRecord::Base
|
11
|
-
acts_as_solr
|
12
|
-
|
13
|
-
|
14
|
-
|
11
|
+
acts_as_solr do
|
12
|
+
{
|
13
|
+
:facets => [:category, :manufacturer],
|
14
|
+
:fields => [:name, :manufacturer, :features, :category, {:created_at => :date}, {:updated_at => :date}, {:price => {:type => :range_float, :boost => 10.0}}],
|
15
|
+
:boost => 5.0,
|
16
|
+
:exclude_fields => [:features]
|
17
|
+
}
|
18
|
+
end
|
15
19
|
|
16
20
|
# The following example would also convert the :price field type to :range_float
|
17
21
|
#
|
data/test/test_helper.rb
CHANGED
@@ -10,12 +10,15 @@ end
|
|
10
10
|
|
11
11
|
RAILS_ROOT = File.dirname(__FILE__) unless defined? RAILS_ROOT
|
12
12
|
RAILS_ENV = 'test' unless defined? RAILS_ENV
|
13
|
+
ENV["RAILS_ENV"] = "test"
|
14
|
+
ENV["ACTS_AS_SOLR_TEST"] = "true"
|
13
15
|
|
14
16
|
require File.expand_path(File.dirname(__FILE__) + '/../lib/acts_as_solr')
|
15
17
|
require File.expand_path(File.dirname(__FILE__) + '/../config/solr_environment.rb')
|
16
18
|
|
17
19
|
# Load Models
|
18
20
|
models_dir = File.join(File.dirname( __FILE__ ), 'models')
|
21
|
+
require "#{models_dir}/book.rb"
|
19
22
|
Dir[ models_dir + '/*.rb'].each { |m| require m }
|
20
23
|
|
21
24
|
if defined?(ActiveSupport::TestCase)
|
@@ -13,7 +13,7 @@ class InstanceMethodsTest < Test::Unit::TestCase
|
|
13
13
|
setup do
|
14
14
|
@instance.configuration = {:if => true}
|
15
15
|
end
|
16
|
-
|
16
|
+
|
17
17
|
should "return true if the specified proc returns true " do
|
18
18
|
@instance.configuration[:offline] = proc {|record| true}
|
19
19
|
assert @instance.indexing_disabled?
|
@@ -2,7 +2,7 @@ class ActsAsSolr::ParserInstance
|
|
2
2
|
include ActsAsSolr::ParserMethods
|
3
3
|
include ActsAsSolr::CommonMethods
|
4
4
|
attr_accessor :configuration, :solr_configuration
|
5
|
-
|
5
|
+
|
6
6
|
def table_name
|
7
7
|
"documents"
|
8
8
|
end
|
@@ -15,5 +15,5 @@ class ActsAsSolr::ParserInstance
|
|
15
15
|
[]
|
16
16
|
end
|
17
17
|
|
18
|
-
public :parse_results, :reorder, :parse_query, :add_scores, :replace_types
|
18
|
+
public :parse_results, :reorder, :parse_query, :add_scores, :replace_types, :quote_values_with_spaces
|
19
19
|
end
|
@@ -245,6 +245,18 @@ class ParserMethodsTest < Test::Unit::TestCase
|
|
245
245
|
end
|
246
246
|
end
|
247
247
|
end
|
248
|
+
|
249
|
+
context "When quoting strings" do
|
250
|
+
|
251
|
+
should "quote values that have spaces" do
|
252
|
+
assert_equal '(some_facet:"One Fish") AND (other_t:"Two Fish")', @parser.quote_values_with_spaces("(some_facet:One Fish) AND (other_t:Two Fish)")
|
253
|
+
end
|
254
|
+
|
255
|
+
should "not quote values that do not have spaces" do
|
256
|
+
assert_equal '(age_i:21) OR (some_facet:foo)', @parser.quote_values_with_spaces("(age_i:21) OR (some_facet:foo)")
|
257
|
+
end
|
258
|
+
|
259
|
+
end
|
248
260
|
|
249
261
|
context "When adding scores" do
|
250
262
|
setup do
|
data/test/unit/solr_instance.rb
CHANGED
@@ -2,6 +2,11 @@ class SolrInstance
|
|
2
2
|
include ActsAsSolr::InstanceMethods
|
3
3
|
attr_accessor :configuration, :solr_configuration, :name
|
4
4
|
|
5
|
+
class << self
|
6
|
+
include ActsAsSolr::ActsMethods
|
7
|
+
include ActsAsSolr::ClassMethods
|
8
|
+
end
|
9
|
+
|
5
10
|
def initialize(name = "Chunky bacon!")
|
6
11
|
@name = name
|
7
12
|
end
|
data/test/unit/test_helper.rb
CHANGED
@@ -1,13 +1,15 @@
|
|
1
|
-
|
1
|
+
dir = File.dirname(__FILE__)
|
2
|
+
$:.unshift(File.join(File.expand_path(dir), "..", "..", "lib"))
|
2
3
|
|
3
4
|
require 'rubygems'
|
4
5
|
require 'test/unit'
|
5
6
|
require 'acts_as_solr'
|
7
|
+
require 'activesupport'
|
6
8
|
require 'mocha'
|
7
9
|
require 'active_support'
|
8
10
|
require 'logger'
|
9
|
-
require
|
10
|
-
require
|
11
|
+
require File.expand_path("#{dir}/solr_instance")
|
12
|
+
require File.expand_path("#{dir}/parser_instance")
|
11
13
|
require 'erb'
|
12
14
|
require 'ostruct'
|
13
15
|
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: honkster-acts_as_solr
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.3.4
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Mathias Meyer
|
@@ -9,11 +9,11 @@ autorequire:
|
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
11
|
|
12
|
-
date: 2009-
|
12
|
+
date: 2009-06-02 00:00:00 -07:00
|
13
13
|
default_executable:
|
14
14
|
dependencies: []
|
15
15
|
|
16
|
-
description: "This plugin adds full text search capabilities and many other nifty features from Apache\
|
16
|
+
description: "This plugin adds full text search capabilities and many other nifty features from Apache\xEF\xBF\xBDs Solr to any Rails model. I'm currently rearranging the test suite to include a real unit test suite, and adding a few features I need myself."
|
17
17
|
email: meyer@paperplanes.de
|
18
18
|
executables: []
|
19
19
|
|
@@ -30,7 +30,7 @@ files:
|
|
30
30
|
- README.rdoc
|
31
31
|
- Rakefile
|
32
32
|
- TESTING_THE_PLUGIN
|
33
|
-
- VERSION
|
33
|
+
- VERSION.yml
|
34
34
|
- config/solr.yml
|
35
35
|
- config/solr_environment.rb
|
36
36
|
- lib/acts_as_solr.rb
|
@@ -204,7 +204,7 @@ rubyforge_project:
|
|
204
204
|
rubygems_version: 1.2.0
|
205
205
|
signing_key:
|
206
206
|
specification_version: 3
|
207
|
-
summary: "This plugin adds full text search capabilities and many other nifty features from Apache\
|
207
|
+
summary: "This plugin adds full text search capabilities and many other nifty features from Apache\xEF\xBF\xBDs Solr to any Rails model. I'm currently rearranging the test suite to include a real unit test suite, and adding a few features I need myself."
|
208
208
|
test_files:
|
209
209
|
- test/db/connections/mysql/connection.rb
|
210
210
|
- test/db/connections/sqlite/connection.rb
|
data/VERSION
DELETED
@@ -1 +0,0 @@
|
|
1
|
-
0.2.5
|