thinking-sphinx 1.3.4 → 1.3.6

Sign up to get free protection for your applications and to get access to all the features.
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: