thinking-sphinx 1.3.7 → 1.3.8

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.
@@ -156,3 +156,4 @@ Since I first released this library, there's been quite a few people who have su
156
156
  * Chris Roos
157
157
  * Andrew Assarattanakul
158
158
  * Jonas von Andrian
159
+ * Dimitri Krassovski
data/VERSION CHANGED
@@ -1 +1 @@
1
- 1.3.7
1
+ 1.3.8
@@ -33,3 +33,10 @@ Feature: Sphinx Scopes
33
33
  And I am searching on people
34
34
  When I use the ids_only scope
35
35
  Then I should have an array of integers
36
+
37
+ Scenario: Counts with scopes
38
+ Given Sphinx is running
39
+ And I am searching on people
40
+ When I use the with_first_name scope set to "Andrew"
41
+ And I am retrieving the scoped result count
42
+ Then I should get a value of 7
@@ -9,3 +9,7 @@ end
9
9
  When /^I use the ([\w]+) scope set to (\d+)$/ do |scope, int|
10
10
  @results = results.send(scope.to_sym, int.to_i)
11
11
  end
12
+
13
+ When /^I am retrieving the scoped result count$/ do
14
+ @results = results.search_count
15
+ end
@@ -16,7 +16,6 @@ require 'cucumber/thinking_sphinx/internal_world'
16
16
  world = Cucumber::ThinkingSphinx::InternalWorld.new
17
17
  world.configure_database
18
18
 
19
- SphinxVersion = ENV['VERSION'] || '0.9.8'
20
- require "thinking_sphinx/#{SphinxVersion}"
19
+ require "thinking_sphinx"
21
20
 
22
21
  world.setup
@@ -2,7 +2,9 @@ require 'active_record'
2
2
  require 'after_commit'
3
3
  require 'yaml'
4
4
  require 'cgi'
5
+ require 'riddle'
5
6
 
7
+ require 'thinking_sphinx/auto_version'
6
8
  require 'thinking_sphinx/core/array'
7
9
  require 'thinking_sphinx/core/string'
8
10
  require 'thinking_sphinx/property'
@@ -221,3 +223,5 @@ module ThinkingSphinx
221
223
 
222
224
  extend ThinkingSphinx::SearchMethods::ClassMethods
223
225
  end
226
+
227
+ ThinkingSphinx::AutoVersion.detect
@@ -177,6 +177,12 @@ module ThinkingSphinx
177
177
  subclasses.each { |klass| klass.add_sphinx_index(index) }
178
178
  end
179
179
 
180
+ def has_sphinx_indexes?
181
+ sphinx_indexes &&
182
+ sphinx_index_blocks &&
183
+ (sphinx_indexes.length > 0 || sphinx_index_blocks.length > 0)
184
+ end
185
+
180
186
  def indexed_by_sphinx?
181
187
  sphinx_indexes && sphinx_indexes.length > 0
182
188
  end
@@ -0,0 +1,22 @@
1
+ module ThinkingSphinx
2
+ class AutoVersion
3
+ def self.detect
4
+ version = ThinkingSphinx::Configuration.instance.controller.sphinx_version
5
+ case version
6
+ when '0.9.8', '0.9.9'
7
+ require "riddle/#{version}"
8
+ else
9
+ STDERR.puts %Q{
10
+ Sphinx cannot be found on your system. You may need to configure the following
11
+ settings in your config/sphinx.yml file:
12
+ * bin_path
13
+ * searchd_binary_name
14
+ * indexer_binary_name
15
+
16
+ For more information, read the documentation:
17
+ http://freelancing-god.github.com/ts/en/advanced_config.html
18
+ }
19
+ end
20
+ end
21
+ end
22
+ end
@@ -64,14 +64,12 @@ module ThinkingSphinx
64
64
 
65
65
  CustomOptions = %w( disable_range )
66
66
 
67
- attr_accessor :config_file, :searchd_log_file, :query_log_file,
68
- :pid_file, :searchd_file_path, :address, :port, :allow_star,
69
- :database_yml_file, :app_root, :bin_path, :model_directories,
70
- :delayed_job_priority, :searchd_binary_name, :indexer_binary_name
67
+ attr_accessor :searchd_file_path, :allow_star, :database_yml_file,
68
+ :app_root, :model_directories, :delayed_job_priority
71
69
 
72
70
  attr_accessor :source_options, :index_options
73
71
 
74
- attr_reader :environment, :configuration
72
+ attr_reader :environment, :configuration, :controller
75
73
 
76
74
  # Load in the configuration settings - this will look for config/sphinx.yml
77
75
  # and parse it according to the current environment.
@@ -101,11 +99,12 @@ module ThinkingSphinx
101
99
  @configuration.searchd.log = "#{self.app_root}/log/searchd.log"
102
100
  @configuration.searchd.query_log = "#{self.app_root}/log/searchd.query.log"
103
101
 
102
+ @controller = Riddle::Controller.new @configuration,
103
+ "#{self.app_root}/config/#{environment}.sphinx.conf"
104
+
104
105
  self.database_yml_file = "#{self.app_root}/config/database.yml"
105
- self.config_file = "#{self.app_root}/config/#{environment}.sphinx.conf"
106
106
  self.searchd_file_path = "#{self.app_root}/db/sphinx/#{environment}"
107
107
  self.allow_star = false
108
- self.bin_path = ""
109
108
  self.model_directories = ["#{app_root}/app/models/"] +
110
109
  Dir.glob("#{app_root}/vendor/plugins/*/app/models/")
111
110
  self.delayed_job_priority = 0
@@ -115,9 +114,6 @@ module ThinkingSphinx
115
114
  :charset_type => "utf-8"
116
115
  }
117
116
 
118
- self.searchd_binary_name = "searchd"
119
- self.indexer_binary_name = "indexer"
120
-
121
117
  parse_config
122
118
 
123
119
  self
@@ -133,10 +129,6 @@ module ThinkingSphinx
133
129
  self.class.environment
134
130
  end
135
131
 
136
- def controller
137
- @controller ||= Riddle::Controller.new(@configuration, self.config_file)
138
- end
139
-
140
132
  # Generate the config file for Sphinx by using all the settings defined and
141
133
  # looping through all the models with indexes to build the relevant
142
134
  # indexer and searchd configuration, and sources and indexes details.
@@ -197,6 +189,38 @@ module ThinkingSphinx
197
189
  @configuration.searchd.query_log = file
198
190
  end
199
191
 
192
+ def config_file
193
+ @controller.path
194
+ end
195
+
196
+ def config_file=(file)
197
+ @controller.path = file
198
+ end
199
+
200
+ def bin_path
201
+ @controller.bin_path
202
+ end
203
+
204
+ def bin_path=(path)
205
+ @controller.bin_path = path
206
+ end
207
+
208
+ def searchd_binary_name
209
+ @controller.searchd_binary_name
210
+ end
211
+
212
+ def searchd_binary_name=(name)
213
+ @controller.searchd_binary_name = name
214
+ end
215
+
216
+ def indexer_binary_name
217
+ @controller.indexer_binary_name
218
+ end
219
+
220
+ def indexer_binary_name=(name)
221
+ @controller.indexer_binary_name = name
222
+ end
223
+
200
224
  def client
201
225
  client = Riddle::Client.new address, port
202
226
  client.max_matches = configuration.searchd.max_matches || 1000
@@ -7,6 +7,7 @@ class ThinkingSphinx::Context
7
7
 
8
8
  def prepare
9
9
  load_models
10
+ add_indexed_models if cached?
10
11
  end
11
12
 
12
13
  def define_indexes
@@ -32,15 +33,23 @@ class ThinkingSphinx::Context
32
33
 
33
34
  private
34
35
 
36
+ def cached?
37
+ defined?(Rails) &&
38
+ Rails::VERSION::STRING.to_f > 2.1 &&
39
+ Rails.configuration.cache_classes
40
+ end
41
+
42
+ def add_indexed_models
43
+ Object.subclasses_of(ActiveRecord::Base).each do |klass|
44
+ add_indexed_model klass if klass.has_sphinx_indexes?
45
+ end
46
+ end
47
+
35
48
  # Make sure all models are loaded - without reloading any that
36
49
  # ActiveRecord::Base is already aware of (otherwise we start to hit some
37
50
  # messy dependencies issues).
38
51
  #
39
52
  def load_models
40
- return if defined?(Rails) &&
41
- Rails::VERSION::STRING.to_f > 2.1 &&
42
- Rails.configuration.cache_classes
43
-
44
53
  ThinkingSphinx::Configuration.instance.model_directories.each do |base|
45
54
  Dir["#{base}**/*.rb"].each do |file|
46
55
  model_name = file.gsub(/^#{base}([\w_\/\\]+)\.rb/, '\1')
@@ -92,6 +92,9 @@ module ThinkingSphinx
92
92
  if is_scope?(method)
93
93
  add_scope(method, *args, &block)
94
94
  return self
95
+ elsif method == :search_count
96
+ @options[:ids_only] = true
97
+ return self.total_entries
95
98
  elsif method.to_s[/^each_with_.*/].nil? && !@array.respond_to?(method)
96
99
  super
97
100
  elsif !SafeMethods.include?(method.to_s)
@@ -2,7 +2,7 @@ Dir[File.join(File.dirname(__FILE__), '../vendor/*/lib')].each do |path|
2
2
  $LOAD_PATH.unshift path
3
3
  end
4
4
 
5
- require 'thinking_sphinx/0.9.8'
5
+ require 'thinking_sphinx'
6
6
  require 'action_controller/dispatcher'
7
7
 
8
8
  ActionController::Dispatcher.to_prepare :thinking_sphinx do
@@ -137,4 +137,26 @@ describe ThinkingSphinx::ActiveRecord::Scopes do
137
137
  search.with_betas.options[:classes].should == [Alpha, Beta]
138
138
  end
139
139
  end
140
+
141
+ describe '.search_count_with_scope' do
142
+ before :each do
143
+ @config = ThinkingSphinx::Configuration.instance
144
+ @client = Riddle::Client.new
145
+
146
+ @config.stub!(:client => @client)
147
+ @client.stub!(:query => {:matches => [], :total_found => 43})
148
+ Alpha.sphinx_scope(:by_name) { |name| {:conditions => {:name => name}} }
149
+ end
150
+
151
+ it "should return the total number of results" do
152
+ Alpha.by_name('foo').search_count.should == 43
153
+ end
154
+
155
+ it "should not make any calls to the database" do
156
+ Alpha.should_not_receive(:find)
157
+
158
+ Alpha.by_name('foo').search_count
159
+ end
160
+ end
161
+
140
162
  end
@@ -16,6 +16,9 @@ describe ThinkingSphinx::ActiveRecord do
16
16
  Alpha.sphinx_indexes.replace @existing_alpha_indexes
17
17
  Beta.sphinx_indexes.replace @existing_beta_indexes
18
18
 
19
+ Alpha.send :defined_indexes=, true
20
+ Beta.send :defined_indexes=, true
21
+
19
22
  Alpha.sphinx_index_blocks.clear
20
23
  Beta.sphinx_index_blocks.clear
21
24
  end
@@ -585,4 +588,27 @@ describe ThinkingSphinx::ActiveRecord do
585
588
  Parent.sphinx_offset.should == 1
586
589
  end
587
590
  end
591
+
592
+ describe '.has_sphinx_indexes?' do
593
+ it "should return true if there are sphinx indexes defined" do
594
+ Alpha.sphinx_indexes.replace [stub('index')]
595
+ Alpha.sphinx_index_blocks.replace []
596
+
597
+ Alpha.should have_sphinx_indexes
598
+ end
599
+
600
+ it "should return true if there are sphinx index blocks defined" do
601
+ Alpha.sphinx_indexes.replace []
602
+ Alpha.sphinx_index_blocks.replace [stub('lambda')]
603
+
604
+ Alpha.should have_sphinx_indexes
605
+ end
606
+
607
+ it "should return false if there are no sphinx indexes or blocks" do
608
+ Alpha.sphinx_indexes.clear
609
+ Alpha.sphinx_index_blocks.clear
610
+
611
+ Alpha.should_not have_sphinx_indexes
612
+ end
613
+ end
588
614
  end
@@ -0,0 +1,39 @@
1
+ require 'spec/spec_helper'
2
+
3
+ describe ThinkingSphinx::AutoVersion do
4
+ describe '.detect' do
5
+ before :each do
6
+ @controller = ThinkingSphinx::Configuration.instance.controller
7
+ end
8
+
9
+ it "should require 0.9.8 if that is the detected version" do
10
+ ThinkingSphinx::AutoVersion.should_receive(:require).
11
+ with('riddle/0.9.8')
12
+
13
+ @controller.stub!(:sphinx_version => '0.9.8')
14
+ ThinkingSphinx::AutoVersion.detect
15
+ end
16
+
17
+ it "should require 0.9.9 if that is the detected version" do
18
+ ThinkingSphinx::AutoVersion.should_receive(:require).
19
+ with('riddle/0.9.9')
20
+
21
+ @controller.stub!(:sphinx_version => '0.9.9')
22
+ ThinkingSphinx::AutoVersion.detect
23
+ end
24
+
25
+ it "should output a warning if the detected version is something else" do
26
+ STDERR.should_receive(:puts)
27
+
28
+ @controller.stub!(:sphinx_version => '0.9.7')
29
+ ThinkingSphinx::AutoVersion.detect
30
+ end
31
+
32
+ it "should output a warning if the version cannot be determined" do
33
+ STDERR.should_receive(:puts)
34
+
35
+ @controller.stub!(:sphinx_version => nil)
36
+ ThinkingSphinx::AutoVersion.detect
37
+ end
38
+ end
39
+ end
@@ -28,7 +28,7 @@ Jeweler::Tasks.new do |gem|
28
28
  ]
29
29
 
30
30
  gem.add_dependency 'activerecord', '>= 1.15.6'
31
- gem.add_dependency 'riddle', '>= 1.0.2'
31
+ gem.add_dependency 'riddle', '>= 1.0.6'
32
32
  gem.add_dependency 'after_commit', '>= 1.0.5'
33
33
 
34
34
  gem.post_install_message = <<-MESSAGE
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.7
4
+ version: 1.3.8
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-11-29 00:00:00 +11:00
12
+ date: 2009-12-02 00:00:00 +11:00
13
13
  default_executable:
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
@@ -30,7 +30,7 @@ dependencies:
30
30
  requirements:
31
31
  - - ">="
32
32
  - !ruby/object:Gem::Version
33
- version: 1.0.2
33
+ version: 1.0.6
34
34
  version:
35
35
  - !ruby/object:Gem::Dependency
36
36
  name: after_commit
@@ -58,8 +58,6 @@ files:
58
58
  - lib/cucumber/thinking_sphinx/internal_world.rb
59
59
  - lib/cucumber/thinking_sphinx/sql_logger.rb
60
60
  - lib/thinking_sphinx.rb
61
- - lib/thinking_sphinx/0.9.8.rb
62
- - lib/thinking_sphinx/0.9.9.rb
63
61
  - lib/thinking_sphinx/active_record.rb
64
62
  - lib/thinking_sphinx/active_record/attribute_updates.rb
65
63
  - lib/thinking_sphinx/active_record/delta.rb
@@ -70,6 +68,7 @@ files:
70
68
  - lib/thinking_sphinx/adapters/postgresql_adapter.rb
71
69
  - lib/thinking_sphinx/association.rb
72
70
  - lib/thinking_sphinx/attribute.rb
71
+ - lib/thinking_sphinx/auto_version.rb
73
72
  - lib/thinking_sphinx/class_facet.rb
74
73
  - lib/thinking_sphinx/configuration.rb
75
74
  - lib/thinking_sphinx/context.rb
@@ -218,6 +217,7 @@ test_files:
218
217
  - spec/thinking_sphinx/active_record_spec.rb
219
218
  - spec/thinking_sphinx/association_spec.rb
220
219
  - spec/thinking_sphinx/attribute_spec.rb
220
+ - spec/thinking_sphinx/auto_version_spec.rb
221
221
  - spec/thinking_sphinx/configuration_spec.rb
222
222
  - spec/thinking_sphinx/context_spec.rb
223
223
  - spec/thinking_sphinx/core/array_spec.rb
@@ -1,3 +0,0 @@
1
- require 'riddle'
2
- require 'riddle/0.9.8'
3
- require 'thinking_sphinx'
@@ -1,3 +0,0 @@
1
- require 'riddle'
2
- require 'riddle/0.9.9'
3
- require 'thinking_sphinx'