thinking-sphinx-099 1.2.12 → 1.2.13

Sign up to get free protection for your applications and to get access to all the features.
Files changed (114) hide show
  1. data/README.textile +4 -17
  2. data/VERSION.yml +2 -1
  3. data/features/alternate_primary_key.feature +27 -0
  4. data/features/attribute_transformation.feature +22 -0
  5. data/features/attribute_updates.feature +33 -0
  6. data/features/datetime_deltas.feature +66 -0
  7. data/features/delayed_delta_indexing.feature +37 -0
  8. data/features/deleting_instances.feature +64 -0
  9. data/features/direct_attributes.feature +11 -0
  10. data/features/excerpts.feature +13 -0
  11. data/features/extensible_delta_indexing.feature +9 -0
  12. data/features/facets.feature +76 -0
  13. data/features/facets_across_model.feature +29 -0
  14. data/features/handling_edits.feature +76 -0
  15. data/features/retry_stale_indexes.feature +24 -0
  16. data/features/searching_across_models.feature +20 -0
  17. data/features/searching_by_model.feature +175 -0
  18. data/features/searching_with_find_arguments.feature +56 -0
  19. data/features/sphinx_detection.feature +25 -0
  20. data/features/sphinx_scopes.feature +35 -0
  21. data/features/step_definitions/alpha_steps.rb +3 -0
  22. data/features/step_definitions/beta_steps.rb +7 -0
  23. data/features/step_definitions/common_steps.rb +174 -0
  24. data/features/step_definitions/datetime_delta_steps.rb +15 -0
  25. data/features/step_definitions/delayed_delta_indexing_steps.rb +7 -0
  26. data/features/step_definitions/extensible_delta_indexing_steps.rb +7 -0
  27. data/features/step_definitions/facet_steps.rb +92 -0
  28. data/features/step_definitions/find_arguments_steps.rb +36 -0
  29. data/features/step_definitions/gamma_steps.rb +15 -0
  30. data/features/step_definitions/scope_steps.rb +11 -0
  31. data/features/step_definitions/search_steps.rb +89 -0
  32. data/features/step_definitions/sphinx_steps.rb +31 -0
  33. data/features/sti_searching.feature +14 -0
  34. data/features/support/database.example.yml +3 -0
  35. data/features/support/database.yml +5 -0
  36. data/features/support/db/active_record.rb +40 -0
  37. data/features/support/db/database.yml +5 -0
  38. data/features/support/db/fixtures/alphas.rb +10 -0
  39. data/features/support/db/fixtures/authors.rb +1 -0
  40. data/features/support/db/fixtures/betas.rb +10 -0
  41. data/features/support/db/fixtures/boxes.rb +9 -0
  42. data/features/support/db/fixtures/categories.rb +1 -0
  43. data/features/support/db/fixtures/cats.rb +3 -0
  44. data/features/support/db/fixtures/comments.rb +24 -0
  45. data/features/support/db/fixtures/delayed_betas.rb +10 -0
  46. data/features/support/db/fixtures/developers.rb +29 -0
  47. data/features/support/db/fixtures/dogs.rb +3 -0
  48. data/features/support/db/fixtures/extensible_betas.rb +10 -0
  49. data/features/support/db/fixtures/gammas.rb +10 -0
  50. data/features/support/db/fixtures/people.rb +1001 -0
  51. data/features/support/db/fixtures/posts.rb +6 -0
  52. data/features/support/db/fixtures/robots.rb +14 -0
  53. data/features/support/db/fixtures/tags.rb +27 -0
  54. data/features/support/db/fixtures/thetas.rb +10 -0
  55. data/features/support/db/migrations/create_alphas.rb +7 -0
  56. data/features/support/db/migrations/create_animals.rb +5 -0
  57. data/features/support/db/migrations/create_authors.rb +3 -0
  58. data/features/support/db/migrations/create_authors_posts.rb +6 -0
  59. data/features/support/db/migrations/create_betas.rb +5 -0
  60. data/features/support/db/migrations/create_boxes.rb +5 -0
  61. data/features/support/db/migrations/create_categories.rb +3 -0
  62. data/features/support/db/migrations/create_comments.rb +10 -0
  63. data/features/support/db/migrations/create_delayed_betas.rb +17 -0
  64. data/features/support/db/migrations/create_developers.rb +9 -0
  65. data/features/support/db/migrations/create_extensible_betas.rb +5 -0
  66. data/features/support/db/migrations/create_gammas.rb +3 -0
  67. data/features/support/db/migrations/create_people.rb +13 -0
  68. data/features/support/db/migrations/create_posts.rb +5 -0
  69. data/features/support/db/migrations/create_robots.rb +4 -0
  70. data/features/support/db/migrations/create_taggings.rb +5 -0
  71. data/features/support/db/migrations/create_tags.rb +4 -0
  72. data/features/support/db/migrations/create_thetas.rb +5 -0
  73. data/features/support/db/mysql.rb +3 -0
  74. data/features/support/db/postgresql.rb +3 -0
  75. data/features/support/env.rb +18 -0
  76. data/features/support/lib/generic_delta_handler.rb +8 -0
  77. data/features/support/models/alpha.rb +10 -0
  78. data/features/support/models/animal.rb +5 -0
  79. data/features/support/models/author.rb +3 -0
  80. data/features/support/models/beta.rb +8 -0
  81. data/features/support/models/box.rb +8 -0
  82. data/features/support/models/cat.rb +3 -0
  83. data/features/support/models/category.rb +4 -0
  84. data/features/support/models/comment.rb +10 -0
  85. data/features/support/models/delayed_beta.rb +7 -0
  86. data/features/support/models/developer.rb +16 -0
  87. data/features/support/models/dog.rb +3 -0
  88. data/features/support/models/extensible_beta.rb +9 -0
  89. data/features/support/models/gamma.rb +5 -0
  90. data/features/support/models/person.rb +23 -0
  91. data/features/support/models/post.rb +20 -0
  92. data/features/support/models/robot.rb +12 -0
  93. data/features/support/models/tag.rb +3 -0
  94. data/features/support/models/tagging.rb +4 -0
  95. data/features/support/models/theta.rb +7 -0
  96. data/features/support/post_database.rb +43 -0
  97. data/lib/cucumber/thinking_sphinx/internal_world.rb +125 -0
  98. data/lib/cucumber/thinking_sphinx/sql_logger.rb +20 -0
  99. data/lib/thinking_sphinx.rb +4 -2
  100. data/lib/thinking_sphinx/active_record.rb +1 -2
  101. data/lib/thinking_sphinx/adapters/mysql_adapter.rb +1 -1
  102. data/lib/thinking_sphinx/adapters/postgresql_adapter.rb +18 -11
  103. data/lib/thinking_sphinx/attribute.rb +3 -4
  104. data/lib/thinking_sphinx/excerpter.rb +1 -1
  105. data/lib/thinking_sphinx/search.rb +1 -0
  106. data/lib/thinking_sphinx/source.rb +1 -1
  107. data/spec/lib/thinking_sphinx/active_record_spec.rb +0 -11
  108. data/spec/lib/thinking_sphinx/attribute_spec.rb +14 -7
  109. data/spec/lib/thinking_sphinx/deltas/job_spec.rb +32 -0
  110. data/spec/lib/thinking_sphinx/excerpter_spec.rb +8 -0
  111. data/spec/lib/thinking_sphinx/search_spec.rb +9 -0
  112. data/tasks/distribution.rb +4 -1
  113. data/tasks/testing.rb +8 -19
  114. metadata +99 -2
@@ -0,0 +1,24 @@
1
+ Feature: Manually updating Sphinx indexes to handle uncaught deletions
2
+ In order to keep indexes as up to date as possible
3
+ Thinking Sphinx
4
+ Should automatically update the indexes and retry the search if it gets a nil result
5
+
6
+ Scenario: Changing retry_stale settings
7
+ Given Sphinx is running
8
+ And I am searching on gammas
9
+ Then I should not get 0 results
10
+
11
+ When I set retry stale to false
12
+ And I set per page to 1
13
+ And I order by "sphinx_internal_id ASC"
14
+ And I destroy gamma one without callbacks
15
+ Then I should get a single result of nil
16
+
17
+ When I set retry stale to 1
18
+ Then I should get a single gamma result with a name of two
19
+
20
+ When I destroy gamma two without callbacks
21
+ Then I should get a single result of nil
22
+
23
+ When I set retry stale to true
24
+ Then I should get a single gamma result with a name of three
@@ -0,0 +1,20 @@
1
+ Feature: Searching across multiple model
2
+ In order to use Thinking Sphinx's core functionality
3
+ A developer
4
+ Should be able to search on multiple models
5
+
6
+ Scenario: Retrieving total result count
7
+ Given Sphinx is running
8
+ When I search for James
9
+ And I am retrieving the result count
10
+ Then I should get a value of 3
11
+
12
+ Scenario: Confirming existance of a document id in a given index
13
+ Given Sphinx is running
14
+ When I search for the document id of alpha one in the alpha_core index
15
+ Then it should exist
16
+
17
+ Scenario: Retrieving results from multiple models
18
+ Given Sphinx is running
19
+ When I search for ten
20
+ Then I should get 6 results
@@ -0,0 +1,175 @@
1
+ Feature: Searching on a single model
2
+ In order to use Thinking Sphinx's core functionality
3
+ A developer
4
+ Should be able to search on a single model
5
+
6
+ Scenario: Searching using a basic query
7
+ Given Sphinx is running
8
+ And I am searching on people
9
+ When I search for James
10
+ Then I should get 3 results
11
+
12
+ Scenario: Searching on a specific field
13
+ Given Sphinx is running
14
+ And I am searching on people
15
+ When I search for James on first_name
16
+ Then I should get 2 results
17
+
18
+ Scenario: Searching on multiple fields
19
+ Given Sphinx is running
20
+ And I am searching on people
21
+ When I search for James on first_name
22
+ And I search for Chamberlain on last_name
23
+ Then I should get 1 result
24
+
25
+ Scenario: Searching on association content
26
+ Given Sphinx is running
27
+ And I am searching on posts
28
+
29
+ When I search for "Waffles"
30
+ Then I should get 1 result
31
+
32
+ When I search for "Turtle"
33
+ Then I should get 1 result
34
+
35
+ Scenario: Searching with a filter
36
+ Given Sphinx is running
37
+ And I am searching on alphas
38
+ When I filter by 1 on value
39
+ Then I should get 1 result
40
+
41
+ Scenario: Searching with multiple filters
42
+ Given Sphinx is running
43
+ And I am searching on boxes
44
+ When I filter by 2 on width
45
+ And I filter by 2 on length
46
+ Then I should get 1 result
47
+
48
+ Scenario: Searching with a ranged time filter
49
+ Given Sphinx is running
50
+ And I am searching on people
51
+ When I filter by birthday between 1975 and 1976
52
+ Then I should get 16 results
53
+
54
+ Scenario: Searching to filter multiple values on an MVA
55
+ Given Sphinx is running
56
+ And I am searching on boxes
57
+ When I filter by 11 and 12 on dimensions
58
+ Then I should get 2 results
59
+ When I clear existing filters
60
+ And I filter by both 11 and 12 on dimensions
61
+ Then I should get 1 result
62
+
63
+ Scenario: Filtering on timestamp MVAs
64
+ Given Sphinx is running
65
+ And I am searching on posts
66
+ When I filter by 978307200 on comments_created_at
67
+ Then I should get 1 result
68
+
69
+ Scenario: Searching by NULL/0 values in MVAs
70
+ Given Sphinx is running
71
+ And I am searching on boxes
72
+ When I filter by 0 on dimensions
73
+ Then I should get 1 result
74
+
75
+ Given Sphinx is running
76
+ And I am searching on developers
77
+ When I clear existing filters
78
+ And I filter by 0 on tag_ids
79
+ Then I should get 1 result
80
+
81
+ Scenario: Searching on a MVA configured as ranged_query
82
+ Given Sphinx is running
83
+ And I am searching on posts
84
+ When I filter by 1 on comment_ids
85
+ Then I should get 1 result
86
+ When I clear existing filters
87
+ And I filter by both 1 and 2 on comment_ids
88
+ Then I should get 1 results
89
+ When I clear existing filters
90
+ And I filter by 10 on comment_ids
91
+ Then I should get 0 results
92
+
93
+ Scenario: Searching with ordering by attribute
94
+ Given Sphinx is running
95
+ And I am searching on alphas
96
+ When I order by value
97
+ Then I should get 10 results
98
+ And the value of each result should indicate order
99
+
100
+ Scenario: Searching with ordering on a sortable field
101
+ Given Sphinx is running
102
+ And I am searching on people
103
+ And I order by first_name
104
+ Then I should get 20 results
105
+ And the first_name of each result should indicate order
106
+
107
+ Scenario: Intepreting Sphinx Internal Identifiers
108
+ Given Sphinx is running
109
+ And I am searching on people
110
+ Then I should get 20 results
111
+ And each result id should match the corresponding sphinx internal id
112
+
113
+ Scenario: Retrieving weightings
114
+ Given Sphinx is running
115
+ And I am searching on people
116
+ When I search for "Ellie Ford"
117
+ And I set match mode to any
118
+ Then I can iterate by result and weighting
119
+
120
+ Scenario: Retrieving group counts
121
+ Given Sphinx is running
122
+ And I am searching on people
123
+ When I group results by the birthday attribute
124
+ Then I can iterate by result and count
125
+
126
+ Scenario: Retrieving group values
127
+ Given Sphinx is running
128
+ And I am searching on people
129
+ When I group results by the birthday attribute
130
+ Then I can iterate by result and group
131
+
132
+ Scenario: Retrieving both group values and counts
133
+ Given Sphinx is running
134
+ And I am searching on people
135
+ When I group results by the birthday attribute
136
+ Then I can iterate by result and group and count
137
+
138
+ Scenario: Searching for ids
139
+ Given Sphinx is running
140
+ And I am searching on people
141
+ When I search for Ellie
142
+ And I am searching for ids
143
+ Then I should have an array of integers
144
+
145
+ Scenario: Search results should match Sphinx's order
146
+ Given Sphinx is running
147
+ And I am searching on people
148
+ When I search for Ellie
149
+ And I order by "sphinx_internal_id DESC"
150
+ Then searching for ids should match the record ids of the normal search results
151
+
152
+ Scenario: Retrieving total result count when total is less than a page
153
+ Given Sphinx is running
154
+ And I am searching on people
155
+ When I search for James
156
+ And I am retrieving the result count
157
+ Then I should get a value of 3
158
+
159
+ Scenario: Retrieving total result count for more than a page
160
+ Given Sphinx is running
161
+ And I am searching on people
162
+ When I am retrieving the result count
163
+ Then I should get a value of 1000
164
+
165
+ Scenario: Searching with Unicode Characters
166
+ Given Sphinx is running
167
+ And I am searching on people
168
+ When I search for "José* "
169
+ Then I should get 1 result
170
+
171
+ Scenario: Searching by fields from HABTM joins
172
+ Given Sphinx is running
173
+ And I am searching on posts
174
+ When I search for "Shakespeare"
175
+ Then I should get 1 result
@@ -0,0 +1,56 @@
1
+ Feature: Keeping AR::Base.find arguments in search calls
2
+ To keep things as streamlined as possible
3
+ Thinking Sphinx
4
+ Should respect particular arguments to AR::Base.find calls
5
+
6
+ Scenario: Respecting the include option
7
+ Given Sphinx is running
8
+ And I am searching on posts
9
+ Then I should get 1 result
10
+
11
+ When I get the first comment
12
+ And I track queries
13
+ And I compare comments
14
+ Then I should have 1 query
15
+
16
+ When I include comments
17
+ Then I should get 1 result
18
+ When I track queries
19
+ And I compare comments
20
+ Then I should have 0 queries
21
+
22
+ Scenario: Respecting the include option without using a specific model
23
+ Given Sphinx is running
24
+ And I search for "Hello World"
25
+ Then I should get 1 result
26
+
27
+ When I get the first comment
28
+ And I track queries
29
+ And I compare comments
30
+ Then I should have 1 query
31
+
32
+ When I include comments
33
+ Then I should get 1 result
34
+ When I track queries
35
+ And I compare comments
36
+ Then I should have 0 queries
37
+
38
+ Scenario: Respecting the select option
39
+ Given Sphinx is running
40
+ And I am searching on posts
41
+ Then I should get 1 result
42
+ And I should not get an error accessing the subject
43
+
44
+ When I select only content
45
+ Then I should get 1 result
46
+ And I should get an error accessing the subject
47
+
48
+ Scenario: Respecting the select option without using a specific model
49
+ Given Sphinx is running
50
+ When I search for "Hello World"
51
+ Then I should get 1 result
52
+ And I should not get an error accessing the subject
53
+
54
+ When I select only content
55
+ Then I should get 1 result
56
+ And I should get an error accessing the subject
@@ -0,0 +1,25 @@
1
+ Feature: Checking whether Sphinx is running or not
2
+ In order to avoid unnecessary errors
3
+ Thinking Sphinx
4
+ Should be able to determine whether Sphinx is running or not
5
+
6
+ Scenario: Checking Sphinx's status
7
+ Given Sphinx is running
8
+ Then Sphinx should be running
9
+
10
+ When I stop Sphinx
11
+ And I wait for Sphinx to catch up
12
+ Then Sphinx should not be running
13
+
14
+ When I start Sphinx
15
+ And I wait for Sphinx to catch up
16
+ Then Sphinx should be running
17
+
18
+ Given Sphinx is running
19
+ When I kill the Sphinx process
20
+ And I wait for Sphinx to catch up
21
+ Then Sphinx should not be running
22
+
23
+ When I start Sphinx again
24
+ And I wait for Sphinx to catch up
25
+ Then Sphinx should be running again
@@ -0,0 +1,35 @@
1
+ Feature: Sphinx Scopes
2
+
3
+ Scenario: Single Scope
4
+ Given Sphinx is running
5
+ And I am searching on people
6
+ When I use the with_first_name scope set to "Andrew"
7
+ Then I should get 7 results
8
+
9
+ Scenario: Two Field Scopes
10
+ Given Sphinx is running
11
+ And I am searching on people
12
+ When I use the with_first_name scope set to "Andrew"
13
+ And I use the with_last_name scope set to "Byrne"
14
+ Then I should get 1 result
15
+
16
+ Scenario: Mixing Filter and Field Scopes
17
+ Given Sphinx is running
18
+ And I am searching on people
19
+ When I use the with_first_name scope set to "Andrew"
20
+ And I use the with_id scope set to 99
21
+ Then I should get 1 result
22
+
23
+ Scenario: Mixing Field and ID Scopes
24
+ Given Sphinx is running
25
+ And I am searching on people
26
+ When I use the with_first_name scope set to "Andrew"
27
+ And I use the ids_only scope
28
+ Then I should get 7 results
29
+ And I should have an array of integers
30
+
31
+ Scenario: Non-field/filter Scopes
32
+ Given Sphinx is running
33
+ And I am searching on people
34
+ When I use the ids_only scope
35
+ Then I should have an array of integers
@@ -0,0 +1,3 @@
1
+ When /^I change the (\w+) of alpha (\w+) to (\w+)$/ do |column, name, replacement|
2
+ Alpha.find_by_name(name).update_attributes(column.to_sym => replacement)
3
+ end
@@ -0,0 +1,7 @@
1
+ When /^I create a new beta named (\w+)$/ do |name|
2
+ Beta.create(:name => name, :value => 101)
3
+ end
4
+
5
+ When /^I change the (\w+) of beta (\w+) to (\w+)$/ do |column, name, replacement|
6
+ Beta.find_by_name(name).update_attributes(column.to_sym => replacement)
7
+ end
@@ -0,0 +1,174 @@
1
+ Before do
2
+ $queries_executed = []
3
+ ThinkingSphinx::Deltas::Job.cancel_thinking_sphinx_jobs
4
+
5
+ @model = nil
6
+ @method = :search
7
+ @query = ""
8
+ @conditions = {}
9
+ @with = {}
10
+ @without = {}
11
+ @with_all = {}
12
+ @options = {}
13
+ @results = nil
14
+ end
15
+
16
+ Given /^I am searching on (.+)$/ do |model|
17
+ @model = model.gsub(/\s/, '_').singularize.camelize.constantize
18
+ end
19
+
20
+ When /^I am searching for ids$/ do
21
+ @results = nil
22
+ @method = :search_for_ids
23
+ end
24
+
25
+ When /^I am retrieving the result count$/ do
26
+ @result = nil
27
+ @method = @model ? :search_count : :count
28
+ end
29
+
30
+ When /^I search$/ do
31
+ @results = nil
32
+ end
33
+
34
+ When /^I search for (\w+)$/ do |query|
35
+ @results = nil
36
+ @query = query
37
+ end
38
+
39
+ When /^I search for "([^\"]*)"$/ do |query|
40
+ @results = nil
41
+ @query = query
42
+ end
43
+
44
+ When /^I search for (\w+) on (\w+)$/ do |query, field|
45
+ @results = nil
46
+ @conditions[field.to_sym] = query
47
+ end
48
+
49
+ When /^I clear existing filters$/ do
50
+ @with = {}
51
+ @without = {}
52
+ @with_all = {}
53
+ end
54
+
55
+ When /^I filter by (\w+) on (\w+)$/ do |filter, attribute|
56
+ @results = nil
57
+ @with[attribute.to_sym] = filter.to_i
58
+ end
59
+
60
+ When /^I filter by (\d+) and (\d+) on (\w+)$/ do |value_one, value_two, attribute|
61
+ @results = nil
62
+ @with[attribute.to_sym] = [value_one.to_i, value_two.to_i]
63
+ end
64
+
65
+ When /^I filter by both (\d+) and (\d+) on (\w+)$/ do |value_one, value_two, attribute|
66
+ @results = nil
67
+ @with_all[attribute.to_sym] = [value_one.to_i, value_two.to_i]
68
+ end
69
+
70
+ When /^I filter between ([\d\.]+) and ([\d\.]+) on (\w+)$/ do |first, last, attribute|
71
+ @results = nil
72
+ if first[/\./].nil? && last[/\./].nil?
73
+ @with[attribute.to_sym] = first.to_i..last.to_i
74
+ else
75
+ @with[attribute.to_sym] = first.to_f..last.to_f
76
+ end
77
+ end
78
+
79
+ When /^I filter between (\d+) and (\d+) days ago on (\w+)$/ do |last, first, attribute|
80
+ @results = nil
81
+ @with[attribute.to_sym] = first.to_i.days.ago..last.to_i.days.ago
82
+ end
83
+
84
+ When /^I filter by (\w+) between (\d+) and (\d+)$/ do |attribute, first, last|
85
+ @results = nil
86
+ @with[attribute.to_sym] = Time.utc(first.to_i)..Time.utc(last.to_i)
87
+ end
88
+
89
+ When /^I order by (\w+)$/ do |attribute|
90
+ @results = nil
91
+ @options[:order] = attribute.to_sym
92
+ end
93
+
94
+ When /^I order by "([^\"]+)"$/ do |str|
95
+ @results = nil
96
+ @options[:order] = str
97
+ end
98
+
99
+ When /^I group results by the (\w+) attribute$/ do |attribute|
100
+ @results = nil
101
+ @options[:group_function] = :attr
102
+ @options[:group_by] = attribute
103
+ end
104
+
105
+ When /^I set match mode to (\w+)$/ do |match_mode|
106
+ @results = nil
107
+ @options[:match_mode] = match_mode.to_sym
108
+ end
109
+
110
+ When /^I set per page to (\d+)$/ do |per_page|
111
+ @results = nil
112
+ @options[:per_page] = per_page.to_i
113
+ end
114
+
115
+ When /^I set retry stale to (\w+)$/ do |retry_stale|
116
+ @results = nil
117
+ @options[:retry_stale] = case retry_stale
118
+ when "true" then true
119
+ when "false" then false
120
+ else retry_stale.to_i
121
+ end
122
+ end
123
+
124
+ When /^I destroy (\w+) (\w+)$/ do |model, name|
125
+ model.gsub(/\s/, '_').camelize.
126
+ constantize.find_by_name(name).destroy
127
+ end
128
+
129
+ Then /^the (\w+) of each result should indicate order$/ do |attribute|
130
+ results.inject(nil) do |prev, current|
131
+ unless prev.nil?
132
+ current.send(attribute.to_sym).should >= prev.send(attribute.to_sym)
133
+ end
134
+
135
+ current
136
+ end
137
+ end
138
+
139
+ Then /^I can iterate by result and (\w+)$/ do |attribute|
140
+ iteration = lambda { |result, attr_value|
141
+ result.should be_kind_of(@model)
142
+ unless attribute == "group" && attr_value.nil?
143
+ attr_value.should be_kind_of(Integer)
144
+ end
145
+ }
146
+
147
+ results.send("each_with_#{attribute}", &iteration)
148
+ end
149
+
150
+ Then /^I should get (\d+) results?$/ do |count|
151
+ results.length.should == count.to_i
152
+ end
153
+
154
+ Then /^I should not get (\d+) results?$/ do |count|
155
+ results.length.should_not == count.to_i
156
+ end
157
+
158
+ Then /^I should get as many results as there are (.+)$/ do |model|
159
+ results.length.should == model.gsub(/\s/, '_').singularize.camelize.
160
+ constantize.count
161
+ end
162
+
163
+ def results
164
+ @results ||= (@model || ThinkingSphinx).send(
165
+ @method,
166
+ @query,
167
+ @options.merge(
168
+ :conditions => @conditions,
169
+ :with => @with,
170
+ :without => @without,
171
+ :with_all => @with_all
172
+ )
173
+ )
174
+ end