thinking-sphinx 1.3.4 → 1.3.6

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.
Files changed (55) hide show
  1. data/README.textile +15 -4
  2. data/VERSION +1 -0
  3. data/features/alternate_primary_key.feature +1 -1
  4. data/features/attribute_updates.feature +11 -5
  5. data/features/deleting_instances.feature +3 -0
  6. data/features/searching_by_index.feature +40 -0
  7. data/features/step_definitions/alpha_steps.rb +5 -1
  8. data/features/step_definitions/beta_steps.rb +1 -1
  9. data/features/step_definitions/common_steps.rb +12 -1
  10. data/features/step_definitions/sphinx_steps.rb +8 -4
  11. data/features/support/db/fixtures/tags.rb +1 -1
  12. data/features/support/env.rb +3 -0
  13. data/features/support/models/alpha.rb +11 -0
  14. data/lib/cucumber/thinking_sphinx/internal_world.rb +7 -6
  15. data/lib/thinking_sphinx.rb +40 -31
  16. data/lib/thinking_sphinx/active_record.rb +164 -195
  17. data/lib/thinking_sphinx/active_record/attribute_updates.rb +9 -6
  18. data/lib/thinking_sphinx/configuration.rb +1 -1
  19. data/lib/thinking_sphinx/deltas/default_delta.rb +14 -20
  20. data/lib/thinking_sphinx/index.rb +76 -19
  21. data/lib/thinking_sphinx/index/builder.rb +2 -2
  22. data/lib/thinking_sphinx/search.rb +7 -0
  23. data/lib/thinking_sphinx/search_methods.rb +22 -4
  24. data/lib/thinking_sphinx/source.rb +6 -6
  25. data/lib/thinking_sphinx/source/sql.rb +4 -2
  26. data/spec/{lib/thinking_sphinx → thinking_sphinx}/active_record/delta_spec.rb +4 -6
  27. data/spec/{lib/thinking_sphinx → thinking_sphinx}/active_record/has_many_association_spec.rb +0 -0
  28. data/spec/{lib/thinking_sphinx → thinking_sphinx}/active_record/scopes_spec.rb +0 -0
  29. data/spec/{lib/thinking_sphinx → thinking_sphinx}/active_record_spec.rb +254 -94
  30. data/spec/{lib/thinking_sphinx → thinking_sphinx}/association_spec.rb +0 -0
  31. data/spec/{lib/thinking_sphinx → thinking_sphinx}/attribute_spec.rb +0 -0
  32. data/spec/{lib/thinking_sphinx → thinking_sphinx}/configuration_spec.rb +2 -2
  33. data/spec/{lib/thinking_sphinx → thinking_sphinx}/core/array_spec.rb +0 -0
  34. data/spec/{lib/thinking_sphinx → thinking_sphinx}/core/string_spec.rb +0 -0
  35. data/spec/{lib/thinking_sphinx → thinking_sphinx}/excerpter_spec.rb +0 -0
  36. data/spec/{lib/thinking_sphinx → thinking_sphinx}/facet_search_spec.rb +0 -0
  37. data/spec/{lib/thinking_sphinx → thinking_sphinx}/facet_spec.rb +0 -0
  38. data/spec/{lib/thinking_sphinx → thinking_sphinx}/field_spec.rb +0 -0
  39. data/spec/{lib/thinking_sphinx → thinking_sphinx}/index/builder_spec.rb +10 -0
  40. data/spec/{lib/thinking_sphinx → thinking_sphinx}/index/faux_column_spec.rb +0 -0
  41. data/spec/thinking_sphinx/index_spec.rb +177 -0
  42. data/spec/{lib/thinking_sphinx → thinking_sphinx}/rails_additions_spec.rb +0 -0
  43. data/spec/{lib/thinking_sphinx → thinking_sphinx}/search_methods_spec.rb +0 -0
  44. data/spec/{lib/thinking_sphinx → thinking_sphinx}/search_spec.rb +33 -0
  45. data/spec/{lib/thinking_sphinx → thinking_sphinx}/source_spec.rb +0 -0
  46. data/spec/{lib/thinking_sphinx_spec.rb → thinking_sphinx_spec.rb} +62 -50
  47. data/tasks/distribution.rb +3 -3
  48. metadata +27 -31
  49. data/VERSION.yml +0 -5
  50. data/features/support/db/active_record.rb +0 -40
  51. data/features/support/db/database.yml +0 -5
  52. data/features/support/db/mysql.rb +0 -3
  53. data/features/support/db/postgresql.rb +0 -3
  54. data/features/support/post_database.rb +0 -43
  55. data/spec/lib/thinking_sphinx/index_spec.rb +0 -45
@@ -3,8 +3,8 @@ require 'spec/spec_helper'
3
3
  describe ThinkingSphinx::Configuration do
4
4
  describe "environment class method" do
5
5
  before :each do
6
- ThinkingSphinx::Configuration.send(:class_variable_set, :@@environment, nil)
7
-
6
+ Thread.current[:thinking_sphinx_environment] = nil
7
+
8
8
  ENV["RAILS_ENV"] = nil
9
9
  end
10
10
 
@@ -466,4 +466,14 @@ describe ThinkingSphinx::Index::Builder do
466
466
  @index.local_options[:index_exact_words].should be_true
467
467
  end
468
468
  end
469
+
470
+ context 'with an explicit name' do
471
+ it "should set the index's name using the provided value" do
472
+ index = ThinkingSphinx::Index::Builder.generate(Person, 'custom') do
473
+ indexes first_name
474
+ end
475
+
476
+ index.name.should == 'custom'
477
+ end
478
+ end
469
479
  end
@@ -0,0 +1,177 @@
1
+ require 'spec/spec_helper'
2
+
3
+ describe ThinkingSphinx::Index do
4
+ describe "prefix_fields method" do
5
+ before :each do
6
+ @index = ThinkingSphinx::Index.new(Person)
7
+
8
+ @field_a = stub('field', :prefixes => true)
9
+ @field_b = stub('field', :prefixes => false)
10
+ @field_c = stub('field', :prefixes => true)
11
+
12
+ @index.stub!(:fields => [@field_a, @field_b, @field_c])
13
+ end
14
+
15
+ it "should return fields that are flagged as prefixed" do
16
+ @index.prefix_fields.should include(@field_a)
17
+ @index.prefix_fields.should include(@field_c)
18
+ end
19
+
20
+ it "should not return fields that aren't flagged as prefixed" do
21
+ @index.prefix_fields.should_not include(@field_b)
22
+ end
23
+ end
24
+
25
+ describe "infix_fields method" do
26
+ before :each do
27
+ @index = ThinkingSphinx::Index.new(Person)
28
+
29
+ @field_a = stub('field', :infixes => true)
30
+ @field_b = stub('field', :infixes => false)
31
+ @field_c = stub('field', :infixes => true)
32
+
33
+ @index.stub!(:fields => [@field_a, @field_b, @field_c])
34
+ end
35
+
36
+ it "should return fields that are flagged as infixed" do
37
+ @index.infix_fields.should include(@field_a)
38
+ @index.infix_fields.should include(@field_c)
39
+ end
40
+
41
+ it "should not return fields that aren't flagged as infixed" do
42
+ @index.infix_fields.should_not include(@field_b)
43
+ end
44
+ end
45
+
46
+ describe '.name_for' do
47
+ it "should return the model's name downcased" do
48
+ ThinkingSphinx::Index.name_for(Alpha).should == 'alpha'
49
+ end
50
+
51
+ it "should separate words by underscores" do
52
+ ThinkingSphinx::Index.name_for(ActiveRecord).should == 'active_record'
53
+ end
54
+
55
+ it "should separate namespaces by underscores" do
56
+ ThinkingSphinx::Index.name_for(ActiveRecord::Base).
57
+ should == 'active_record_base'
58
+ end
59
+ end
60
+
61
+ describe '#name' do
62
+ it "should return the downcased name of the index's model" do
63
+ ThinkingSphinx::Index.new(Alpha).name.should == 'alpha'
64
+ end
65
+
66
+ it "should return a custom name if one is set" do
67
+ index = ThinkingSphinx::Index.new(Alpha)
68
+ index.name = 'custom'
69
+ index.name.should == 'custom'
70
+ end
71
+ end
72
+
73
+ describe '#core_name' do
74
+ it "should take the index's name and append _core" do
75
+ ThinkingSphinx::Index.new(Alpha).core_name.should == 'alpha_core'
76
+ end
77
+ end
78
+
79
+ describe '#delta_name' do
80
+ it "should take the index's name and append _delta" do
81
+ ThinkingSphinx::Index.new(Alpha).delta_name.should == 'alpha_delta'
82
+ end
83
+ end
84
+
85
+ describe '#all_names' do
86
+ it "should return the core index name by default" do
87
+ ThinkingSphinx::Index.new(Alpha).all_names.should == ['alpha_core']
88
+ end
89
+
90
+ it "should return both core and delta names if deltas are enabled" do
91
+ index = ThinkingSphinx::Index.new(Alpha)
92
+ index.delta_object = stub('delta')
93
+
94
+ index.all_names.should == ['alpha_core', 'alpha_delta']
95
+ end
96
+
97
+ it "should respect custom names" do
98
+ index = ThinkingSphinx::Index.new(Alpha)
99
+ index.name = 'custom'
100
+
101
+ index.all_names.should == ['custom_core']
102
+ end
103
+
104
+ it "should respect custom names when deltas are enabled" do
105
+ index = ThinkingSphinx::Index.new(Alpha)
106
+ index.name = 'custom'
107
+ index.delta_object = stub('delta')
108
+
109
+ index.all_names.should == ['custom_core', 'custom_delta']
110
+ end
111
+ end
112
+
113
+ describe '#to_riddle' do
114
+ it "should return two Riddle indexes if deltas are disabled" do
115
+ index = ThinkingSphinx::Index.new(Alpha)
116
+
117
+ index.to_riddle(0).length.should == 2
118
+ end
119
+
120
+ it "should return three Riddle indexes if deltas are enabled" do
121
+ index = ThinkingSphinx::Index.new(Beta)
122
+ index.delta_object = stub('delta')
123
+
124
+ index.to_riddle(0).length.should == 3
125
+ end
126
+
127
+ it "should include a distributed index" do
128
+ index = ThinkingSphinx::Index.new(Alpha)
129
+
130
+ index.to_riddle(0).last.
131
+ should be_a(Riddle::Configuration::DistributedIndex)
132
+ end
133
+
134
+ context 'core index' do
135
+ before :each do
136
+ @index = ThinkingSphinx::Index.new(Alpha).to_riddle(0).first
137
+ end
138
+
139
+ it "should use the core name" do
140
+ @index.name.should == 'alpha_core'
141
+ end
142
+ end
143
+
144
+ context 'delta index' do
145
+ before :each do
146
+ index = ThinkingSphinx::Index.new(Beta)
147
+ index.delta_object = stub('delta')
148
+ @index = index.to_riddle(0)[1]
149
+ end
150
+
151
+ it "should use the delta name" do
152
+ @index.name.should == 'beta_delta'
153
+ end
154
+ end
155
+
156
+ context 'distributed index' do
157
+ it "should use the index's name" do
158
+ index = ThinkingSphinx::Index.new(Alpha)
159
+
160
+ index.to_riddle(0).last.name.should == 'alpha'
161
+ end
162
+
163
+ it "should add the core index" do
164
+ index = ThinkingSphinx::Index.new(Alpha)
165
+
166
+ index.to_riddle(0).last.local_indexes.should include('alpha_core')
167
+ end
168
+
169
+ it "should add the delta index if there is one" do
170
+ index = ThinkingSphinx::Index.new(Beta)
171
+ index.delta_object = stub('delta')
172
+
173
+ index.to_riddle(0).last.local_indexes.should include('beta_delta')
174
+ end
175
+ end
176
+ end
177
+ end
@@ -302,6 +302,23 @@ describe ThinkingSphinx::Search do
302
302
  @client.match_mode.should == :extended2
303
303
  end
304
304
  end
305
+
306
+ describe 'sphinx_select' do
307
+ it "should default to *" do
308
+ ThinkingSphinx::Search.new.first
309
+
310
+ @client.select.should == "*"
311
+ end
312
+
313
+ it "should get set on the client if specified" do
314
+ ThinkingSphinx::Search.new('general',
315
+ :sphinx_select => "*, foo as bar"
316
+ ).first
317
+
318
+ @client.select.should == "*, foo as bar"
319
+ end
320
+
321
+ end
305
322
 
306
323
  describe 'pagination' do
307
324
  it "should set the limit using per_page" do
@@ -834,6 +851,14 @@ describe ThinkingSphinx::Search do
834
851
 
835
852
  ThinkingSphinx::Search.new.total_pages.should == 2
836
853
  end
854
+
855
+ it "should return 0 if there is no index and therefore no results" do
856
+ @client.stub!(:query => {
857
+ :matches => [], :total_found => nil, :total => nil
858
+ })
859
+
860
+ ThinkingSphinx::Search.new.total_pages.should == 0
861
+ end
837
862
  end
838
863
 
839
864
  describe '#next_page' do
@@ -860,6 +885,14 @@ describe ThinkingSphinx::Search do
860
885
  it "should return the total number of results, not just the amount on the page" do
861
886
  ThinkingSphinx::Search.new.total_entries.should == 41
862
887
  end
888
+
889
+ it "should return 0 if there is no index and therefore no results" do
890
+ @client.stub!(:query => {
891
+ :matches => [], :total_found => nil
892
+ })
893
+
894
+ ThinkingSphinx::Search.new.total_entries.should == 0
895
+ end
863
896
  end
864
897
 
865
898
  describe '#offset' do
@@ -1,76 +1,90 @@
1
1
  require 'spec/spec_helper'
2
2
 
3
3
  describe ThinkingSphinx do
4
- it "should define indexes by default" do
5
- ThinkingSphinx.define_indexes?.should be_true
4
+ describe '.define_indexes?' do
5
+ it "should define indexes by default" do
6
+ ThinkingSphinx.define_indexes?.should be_true
7
+ end
6
8
  end
7
9
 
8
- it "should disable index definition" do
9
- ThinkingSphinx.define_indexes = false
10
- ThinkingSphinx.define_indexes?.should be_false
11
- end
10
+ describe '.define_indexes=' do
11
+ it "should disable index definition" do
12
+ ThinkingSphinx.define_indexes = false
13
+ ThinkingSphinx.define_indexes?.should be_false
14
+ end
12
15
 
13
- it "should enable index definition" do
14
- ThinkingSphinx.define_indexes = false
15
- ThinkingSphinx.define_indexes?.should be_false
16
- ThinkingSphinx.define_indexes = true
17
- ThinkingSphinx.define_indexes?.should be_true
16
+ it "should enable index definition" do
17
+ ThinkingSphinx.define_indexes = false
18
+ ThinkingSphinx.define_indexes?.should be_false
19
+ ThinkingSphinx.define_indexes = true
20
+ ThinkingSphinx.define_indexes?.should be_true
21
+ end
18
22
  end
19
23
 
20
- it "should index deltas by default" do
21
- ThinkingSphinx.deltas_enabled = nil
22
- ThinkingSphinx.deltas_enabled?.should be_true
24
+ describe '.deltas_enabled?' do
25
+ it "should index deltas by default" do
26
+ ThinkingSphinx.deltas_enabled = nil
27
+ ThinkingSphinx.deltas_enabled?.should be_true
28
+ end
23
29
  end
24
30
 
25
- it "should disable delta indexing" do
26
- ThinkingSphinx.deltas_enabled = false
27
- ThinkingSphinx.deltas_enabled?.should be_false
28
- end
31
+ describe '.deltas_enabled=' do
32
+ it "should disable delta indexing" do
33
+ ThinkingSphinx.deltas_enabled = false
34
+ ThinkingSphinx.deltas_enabled?.should be_false
35
+ end
29
36
 
30
- it "should enable delta indexing" do
31
- ThinkingSphinx.deltas_enabled = false
32
- ThinkingSphinx.deltas_enabled?.should be_false
33
- ThinkingSphinx.deltas_enabled = true
34
- ThinkingSphinx.deltas_enabled?.should be_true
37
+ it "should enable delta indexing" do
38
+ ThinkingSphinx.deltas_enabled = false
39
+ ThinkingSphinx.deltas_enabled?.should be_false
40
+ ThinkingSphinx.deltas_enabled = true
41
+ ThinkingSphinx.deltas_enabled?.should be_true
42
+ end
35
43
  end
36
44
 
37
- it "should update indexes by default" do
38
- ThinkingSphinx.updates_enabled = nil
39
- ThinkingSphinx.updates_enabled?.should be_true
45
+ describe '.updates_enabled?' do
46
+ it "should update indexes by default" do
47
+ ThinkingSphinx.updates_enabled = nil
48
+ ThinkingSphinx.updates_enabled?.should be_true
49
+ end
40
50
  end
41
51
 
42
- it "should disable index updating" do
43
- ThinkingSphinx.updates_enabled = false
44
- ThinkingSphinx.updates_enabled?.should be_false
45
- end
52
+ describe '.updates_enabled=' do
53
+ it "should disable index updating" do
54
+ ThinkingSphinx.updates_enabled = false
55
+ ThinkingSphinx.updates_enabled?.should be_false
56
+ end
46
57
 
47
- it "should enable index updating" do
48
- ThinkingSphinx.updates_enabled = false
49
- ThinkingSphinx.updates_enabled?.should be_false
50
- ThinkingSphinx.updates_enabled = true
51
- ThinkingSphinx.updates_enabled?.should be_true
58
+ it "should enable index updating" do
59
+ ThinkingSphinx.updates_enabled = false
60
+ ThinkingSphinx.updates_enabled?.should be_false
61
+ ThinkingSphinx.updates_enabled = true
62
+ ThinkingSphinx.updates_enabled?.should be_true
63
+ end
52
64
  end
53
65
 
54
- it "should always say Sphinx is running if flagged as being on a remote machine" do
55
- ThinkingSphinx.remote_sphinx = true
56
- ThinkingSphinx.stub!(:sphinx_running_by_pid? => false)
66
+ describe '.sphinx_running?' do
67
+ it "should always say Sphinx is running if flagged as being on a remote machine" do
68
+ ThinkingSphinx.remote_sphinx = true
69
+ ThinkingSphinx.stub!(:sphinx_running_by_pid? => false)
57
70
 
58
- ThinkingSphinx.sphinx_running?.should be_true
59
- end
71
+ ThinkingSphinx.sphinx_running?.should be_true
72
+ end
60
73
 
61
- it "should actually pay attention to Sphinx if not on a remote machine" do
62
- ThinkingSphinx.remote_sphinx = false
63
- ThinkingSphinx.stub!(:sphinx_running_by_pid? => false)
64
- ThinkingSphinx.sphinx_running?.should be_false
74
+ it "should actually pay attention to Sphinx if not on a remote machine" do
75
+ ThinkingSphinx.remote_sphinx = false
76
+ ThinkingSphinx.stub!(:sphinx_running_by_pid? => false)
77
+ ThinkingSphinx.sphinx_running?.should be_false
65
78
 
66
- ThinkingSphinx.stub!(:sphinx_running_by_pid? => true)
67
- ThinkingSphinx.sphinx_running?.should be_true
79
+ ThinkingSphinx.stub!(:sphinx_running_by_pid? => true)
80
+ ThinkingSphinx.sphinx_running?.should be_true
81
+ end
68
82
  end
69
83
 
70
84
  describe '.version' do
71
85
  it "should return the version from the stored YAML file" do
72
86
  version = Jeweler::VersionHelper.new(
73
- File.join(File.dirname(__FILE__), '../..')
87
+ File.join(File.dirname(__FILE__), '..')
74
88
  ).to_s
75
89
 
76
90
  ThinkingSphinx.version.should == version
@@ -94,9 +108,7 @@ describe ThinkingSphinx do
94
108
  :connection => @connection
95
109
  )
96
110
 
97
- ThinkingSphinx.module_eval do
98
- class_variable_set :@@use_group_by_shortcut, nil
99
- end
111
+ Thread.current[:thinking_sphinx_use_group_by_shortcut] = nil
100
112
  end
101
113
 
102
114
  it "should return true if no ONLY_FULL_GROUP_BY" do
@@ -20,7 +20,7 @@ Jeweler::Tasks.new do |gem|
20
20
  "README.textile",
21
21
  "tasks/**/*.rb",
22
22
  "tasks/**/*.rake",
23
- "VERSION.yml"
23
+ "VERSION"
24
24
  ]
25
25
  gem.test_files = FileList[
26
26
  "features/**/*",
@@ -28,8 +28,8 @@ 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.1'
32
- gem.add_dependency 'after_commit', '>= 1.0.2'
31
+ gem.add_dependency 'riddle', '>= 1.0.2'
32
+ gem.add_dependency 'after_commit', '>= 1.0.5'
33
33
 
34
34
  gem.post_install_message = <<-MESSAGE
35
35
  If you're upgrading, you should read this: