thinking-sphinx 1.3.8 → 1.3.9
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/README.textile +1 -0
- data/VERSION +1 -1
- data/lib/thinking_sphinx/active_record.rb +27 -0
- data/lib/thinking_sphinx/active_record/attribute_updates.rb +1 -1
- data/lib/thinking_sphinx/active_record/delta.rb +0 -26
- data/lib/thinking_sphinx/index.rb +2 -1
- data/lib/thinking_sphinx/search.rb +17 -4
- data/lib/thinking_sphinx/tasks.rb +12 -24
- data/spec/thinking_sphinx/active_record/scopes_spec.rb +15 -0
- data/spec/thinking_sphinx/index_spec.rb +9 -3
- data/spec/thinking_sphinx/search_spec.rb +8 -0
- data/spec/thinking_sphinx_spec.rb +4 -0
- metadata +2 -2
data/README.textile
CHANGED
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
1.3.
|
1
|
+
1.3.9
|
@@ -242,6 +242,33 @@ module ThinkingSphinx
|
|
242
242
|
index eldest_indexed_ancestor
|
243
243
|
end
|
244
244
|
|
245
|
+
# Temporarily disable delta indexing inside a block, then perform a single
|
246
|
+
# rebuild of index at the end.
|
247
|
+
#
|
248
|
+
# Useful when performing updates to batches of models to prevent
|
249
|
+
# the delta index being rebuilt after each individual update.
|
250
|
+
#
|
251
|
+
# In the following example, the delta index will only be rebuilt once,
|
252
|
+
# not 10 times.
|
253
|
+
#
|
254
|
+
# SomeModel.suspended_delta do
|
255
|
+
# 10.times do
|
256
|
+
# SomeModel.create( ... )
|
257
|
+
# end
|
258
|
+
# end
|
259
|
+
#
|
260
|
+
def suspended_delta(reindex_after = true, &block)
|
261
|
+
define_indexes
|
262
|
+
original_setting = ThinkingSphinx.deltas_enabled?
|
263
|
+
ThinkingSphinx.deltas_enabled = false
|
264
|
+
begin
|
265
|
+
yield
|
266
|
+
ensure
|
267
|
+
ThinkingSphinx.deltas_enabled = original_setting
|
268
|
+
self.index_delta if reindex_after
|
269
|
+
end
|
270
|
+
end
|
271
|
+
|
245
272
|
private
|
246
273
|
|
247
274
|
def local_sphinx_indexes
|
@@ -37,7 +37,7 @@ module ThinkingSphinx
|
|
37
37
|
|
38
38
|
def attribute_values_for_index(index)
|
39
39
|
updatable_attributes(index).inject({}) { |hash, attrib|
|
40
|
-
if attrib.type == :datetime
|
40
|
+
if attrib.type == :datetime && attrib.live_value(self)
|
41
41
|
hash[attrib.unique_name.to_s] = attrib.live_value(self).to_time.to_i
|
42
42
|
else
|
43
43
|
hash[attrib.unique_name.to_s] = attrib.live_value self
|
@@ -12,32 +12,6 @@ module ThinkingSphinx
|
|
12
12
|
def self.included(base)
|
13
13
|
base.class_eval do
|
14
14
|
class << self
|
15
|
-
# Temporarily disable delta indexing inside a block, then perform a single
|
16
|
-
# rebuild of index at the end.
|
17
|
-
#
|
18
|
-
# Useful when performing updates to batches of models to prevent
|
19
|
-
# the delta index being rebuilt after each individual update.
|
20
|
-
#
|
21
|
-
# In the following example, the delta index will only be rebuilt once,
|
22
|
-
# not 10 times.
|
23
|
-
#
|
24
|
-
# SomeModel.suspended_delta do
|
25
|
-
# 10.times do
|
26
|
-
# SomeModel.create( ... )
|
27
|
-
# end
|
28
|
-
# end
|
29
|
-
#
|
30
|
-
def suspended_delta(reindex_after = true, &block)
|
31
|
-
original_setting = ThinkingSphinx.deltas_enabled?
|
32
|
-
ThinkingSphinx.deltas_enabled = false
|
33
|
-
begin
|
34
|
-
yield
|
35
|
-
ensure
|
36
|
-
ThinkingSphinx.deltas_enabled = original_setting
|
37
|
-
self.index_delta if reindex_after
|
38
|
-
end
|
39
|
-
end
|
40
|
-
|
41
15
|
# Build the delta index for the related model. This won't be called
|
42
16
|
# if running in the test environment.
|
43
17
|
#
|
@@ -138,7 +138,8 @@ module ThinkingSphinx
|
|
138
138
|
|
139
139
|
def set_configuration_options_for_indexes(index)
|
140
140
|
config.index_options.each do |key, value|
|
141
|
-
|
141
|
+
method = "#{key}=".to_sym
|
142
|
+
index.send(method, value) if index.respond_to?(method)
|
142
143
|
end
|
143
144
|
|
144
145
|
options.each do |key, value|
|
@@ -93,8 +93,7 @@ module ThinkingSphinx
|
|
93
93
|
add_scope(method, *args, &block)
|
94
94
|
return self
|
95
95
|
elsif method == :search_count
|
96
|
-
|
97
|
-
return self.total_entries
|
96
|
+
return scoped_count
|
98
97
|
elsif method.to_s[/^each_with_.*/].nil? && !@array.respond_to?(method)
|
99
98
|
super
|
100
99
|
elsif !SafeMethods.include?(method.to_s)
|
@@ -151,7 +150,9 @@ module ThinkingSphinx
|
|
151
150
|
# @return [Integer]
|
152
151
|
#
|
153
152
|
def per_page
|
154
|
-
@options[:limit]
|
153
|
+
@options[:limit] ||= @options[:per_page]
|
154
|
+
@options[:limit] ||= 20
|
155
|
+
@options[:limit].to_i
|
155
156
|
end
|
156
157
|
|
157
158
|
# The total number of pages available if the results are paginated.
|
@@ -179,11 +180,12 @@ module ThinkingSphinx
|
|
179
180
|
end
|
180
181
|
|
181
182
|
# The current page's offset, based on the number of records per page.
|
183
|
+
# Or explicit :offset if given.
|
182
184
|
#
|
183
185
|
# @return [Integer]
|
184
186
|
#
|
185
187
|
def offset
|
186
|
-
(current_page - 1) * per_page
|
188
|
+
@options[:offset] || ((current_page - 1) * per_page)
|
187
189
|
end
|
188
190
|
|
189
191
|
def indexes
|
@@ -729,5 +731,16 @@ MSG
|
|
729
731
|
end
|
730
732
|
end
|
731
733
|
end
|
734
|
+
|
735
|
+
def scoped_count
|
736
|
+
return self.total_entries if @options[:ids_only]
|
737
|
+
|
738
|
+
@options[:ids_only] = true
|
739
|
+
results_count = self.total_entries
|
740
|
+
@options[:ids_only] = false
|
741
|
+
@populated = false
|
742
|
+
|
743
|
+
results_count
|
744
|
+
end
|
732
745
|
end
|
733
746
|
end
|
@@ -29,10 +29,8 @@ namespace :thinking_sphinx do
|
|
29
29
|
raise RuntimeError, "searchd is already running." if sphinx_running?
|
30
30
|
|
31
31
|
Dir["#{config.searchd_file_path}/*.spl"].each { |file| File.delete(file) }
|
32
|
-
|
33
|
-
system! "#{config.bin_path}#{config.searchd_binary_name} --pidfile --config \"#{config.config_file}\""
|
34
32
|
|
35
|
-
|
33
|
+
config.controller.start
|
36
34
|
|
37
35
|
if sphinx_running?
|
38
36
|
puts "Started successfully (pid #{sphinx_pid})."
|
@@ -48,7 +46,7 @@ namespace :thinking_sphinx do
|
|
48
46
|
else
|
49
47
|
config = ThinkingSphinx::Configuration.instance
|
50
48
|
pid = sphinx_pid
|
51
|
-
|
49
|
+
config.controller.stop
|
52
50
|
puts "Stopped search daemon (pid #{pid})."
|
53
51
|
end
|
54
52
|
end
|
@@ -72,10 +70,14 @@ namespace :thinking_sphinx do
|
|
72
70
|
end
|
73
71
|
|
74
72
|
FileUtils.mkdir_p config.searchd_file_path
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
73
|
+
puts config.controller.index
|
74
|
+
end
|
75
|
+
|
76
|
+
desc "Reindex Sphinx without regenerating the configuration file"
|
77
|
+
task :reindex => :app_env do
|
78
|
+
config = ThinkingSphinx::Configuration.instance
|
79
|
+
FileUtils.mkdir_p config.searchd_file_path
|
80
|
+
puts config.controller.index
|
79
81
|
end
|
80
82
|
|
81
83
|
desc "Stop Sphinx (if it's running), rebuild the indexes, and start Sphinx"
|
@@ -98,6 +100,8 @@ namespace :ts do
|
|
98
100
|
desc "Index data for Sphinx using Thinking Sphinx's settings"
|
99
101
|
task :in => "thinking_sphinx:index"
|
100
102
|
task :index => "thinking_sphinx:index"
|
103
|
+
desc "Reindex Sphinx without regenerating the configuration file"
|
104
|
+
task :reindex => "thinking_sphinx:reindex"
|
101
105
|
desc "Restart Sphinx"
|
102
106
|
task :restart => "thinking_sphinx:restart"
|
103
107
|
desc "Generate the Sphinx configuration file using Thinking Sphinx's settings"
|
@@ -115,19 +119,3 @@ end
|
|
115
119
|
def sphinx_running?
|
116
120
|
ThinkingSphinx.sphinx_running?
|
117
121
|
end
|
118
|
-
|
119
|
-
# a fail-fast, hopefully helpful version of system
|
120
|
-
def system!(cmd)
|
121
|
-
unless system(cmd)
|
122
|
-
raise <<-SYSTEM_CALL_FAILED
|
123
|
-
The following command failed:
|
124
|
-
#{cmd}
|
125
|
-
|
126
|
-
This could be caused by a PATH issue in the environment of cron/passenger/etc. Your current PATH:
|
127
|
-
#{ENV['PATH']}
|
128
|
-
You can set the path to your indexer and searchd binaries using the bin_path property in config/sphinx.yml:
|
129
|
-
production:
|
130
|
-
bin_path: '/usr/local/bin'
|
131
|
-
SYSTEM_CALL_FAILED
|
132
|
-
end
|
133
|
-
end
|
@@ -146,6 +146,7 @@ describe ThinkingSphinx::ActiveRecord::Scopes do
|
|
146
146
|
@config.stub!(:client => @client)
|
147
147
|
@client.stub!(:query => {:matches => [], :total_found => 43})
|
148
148
|
Alpha.sphinx_scope(:by_name) { |name| {:conditions => {:name => name}} }
|
149
|
+
Alpha.sphinx_scope(:ids_only) { {:ids_only => true} }
|
149
150
|
end
|
150
151
|
|
151
152
|
it "should return the total number of results" do
|
@@ -157,6 +158,20 @@ describe ThinkingSphinx::ActiveRecord::Scopes do
|
|
157
158
|
|
158
159
|
Alpha.by_name('foo').search_count
|
159
160
|
end
|
161
|
+
|
162
|
+
it "should not leave the :ids_only option set and the results populated if it was not set before" do
|
163
|
+
stored_scope = Alpha.by_name('foo')
|
164
|
+
stored_scope.search_count
|
165
|
+
stored_scope.options[:ids_only].should be_false
|
166
|
+
stored_scope.populated?.should be_false
|
167
|
+
end
|
168
|
+
|
169
|
+
it "should leave the :ids_only option set and the results populated if it was set before" do
|
170
|
+
stored_scope = Alpha.by_name('foo').ids_only
|
171
|
+
stored_scope.search_count
|
172
|
+
stored_scope.options[:ids_only].should be_true
|
173
|
+
stored_scope.populated?.should be_true
|
174
|
+
end
|
160
175
|
end
|
161
176
|
|
162
177
|
end
|
@@ -132,12 +132,18 @@ describe ThinkingSphinx::Index do
|
|
132
132
|
end
|
133
133
|
|
134
134
|
context 'core index' do
|
135
|
-
|
135
|
+
it "should use the core name" do
|
136
136
|
@index = ThinkingSphinx::Index.new(Alpha).to_riddle(0).first
|
137
|
+
@index.name.should == 'alpha_core'
|
137
138
|
end
|
138
139
|
|
139
|
-
it "should
|
140
|
-
|
140
|
+
it "should not try to set disable_range on the index" do
|
141
|
+
ThinkingSphinx::Configuration.instance.
|
142
|
+
index_options[:disable_range] = true
|
143
|
+
|
144
|
+
lambda {
|
145
|
+
@index = ThinkingSphinx::Index.new(Alpha).to_riddle(0).first
|
146
|
+
}.should_not raise_error(NoMethodError)
|
141
147
|
end
|
142
148
|
end
|
143
149
|
|
@@ -833,6 +833,10 @@ describe ThinkingSphinx::Search do
|
|
833
833
|
:per_page => 30, :limit => 40
|
834
834
|
).per_page.should == 40
|
835
835
|
end
|
836
|
+
|
837
|
+
it "should allow for string arguments" do
|
838
|
+
ThinkingSphinx::Search.new(:per_page => '10').per_page.should == 10
|
839
|
+
end
|
836
840
|
end
|
837
841
|
|
838
842
|
describe '#total_pages' do
|
@@ -903,6 +907,10 @@ describe ThinkingSphinx::Search do
|
|
903
907
|
it "should increase by the per_page value for each page in" do
|
904
908
|
ThinkingSphinx::Search.new(:per_page => 25, :page => 2).offset.should == 25
|
905
909
|
end
|
910
|
+
|
911
|
+
it "should prioritise explicit :offset over calculated if given" do
|
912
|
+
ThinkingSphinx::Search.new(:offset => 5).offset.should == 5
|
913
|
+
end
|
906
914
|
end
|
907
915
|
|
908
916
|
describe '#indexes' do
|
@@ -7,8 +7,12 @@ describe ThinkingSphinx do
|
|
7
7
|
end
|
8
8
|
|
9
9
|
it "should remember changes to the Context instance" do
|
10
|
+
models = ThinkingSphinx.context.indexed_models
|
11
|
+
|
10
12
|
ThinkingSphinx.context.indexed_models.replace([:model])
|
11
13
|
ThinkingSphinx.context.indexed_models.should == [:model]
|
14
|
+
|
15
|
+
ThinkingSphinx.context.indexed_models.replace(models)
|
12
16
|
end
|
13
17
|
end
|
14
18
|
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: thinking-sphinx
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.3.
|
4
|
+
version: 1.3.9
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Pat Allan
|
@@ -9,7 +9,7 @@ autorequire:
|
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
11
|
|
12
|
-
date: 2009-12-
|
12
|
+
date: 2009-12-09 00:00:00 +11:00
|
13
13
|
default_executable:
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|