angelf-thinking-sphinx 1.3.18

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 (159) hide show
  1. data/LICENCE +20 -0
  2. data/README.textile +170 -0
  3. data/VERSION +1 -0
  4. data/features/abstract_inheritance.feature +10 -0
  5. data/features/alternate_primary_key.feature +27 -0
  6. data/features/attribute_transformation.feature +22 -0
  7. data/features/attribute_updates.feature +77 -0
  8. data/features/deleting_instances.feature +67 -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 +90 -0
  13. data/features/facets_across_model.feature +29 -0
  14. data/features/handling_edits.feature +92 -0
  15. data/features/retry_stale_indexes.feature +24 -0
  16. data/features/searching_across_models.feature +20 -0
  17. data/features/searching_by_index.feature +40 -0
  18. data/features/searching_by_model.feature +175 -0
  19. data/features/searching_with_find_arguments.feature +56 -0
  20. data/features/sphinx_detection.feature +25 -0
  21. data/features/sphinx_scopes.feature +42 -0
  22. data/features/step_definitions/alpha_steps.rb +16 -0
  23. data/features/step_definitions/beta_steps.rb +7 -0
  24. data/features/step_definitions/common_steps.rb +193 -0
  25. data/features/step_definitions/extensible_delta_indexing_steps.rb +7 -0
  26. data/features/step_definitions/facet_steps.rb +96 -0
  27. data/features/step_definitions/find_arguments_steps.rb +36 -0
  28. data/features/step_definitions/gamma_steps.rb +15 -0
  29. data/features/step_definitions/scope_steps.rb +15 -0
  30. data/features/step_definitions/search_steps.rb +89 -0
  31. data/features/step_definitions/sphinx_steps.rb +35 -0
  32. data/features/sti_searching.feature +19 -0
  33. data/features/support/env.rb +21 -0
  34. data/features/support/lib/generic_delta_handler.rb +8 -0
  35. data/features/thinking_sphinx/database.example.yml +3 -0
  36. data/features/thinking_sphinx/db/fixtures/alphas.rb +10 -0
  37. data/features/thinking_sphinx/db/fixtures/authors.rb +1 -0
  38. data/features/thinking_sphinx/db/fixtures/betas.rb +11 -0
  39. data/features/thinking_sphinx/db/fixtures/boxes.rb +9 -0
  40. data/features/thinking_sphinx/db/fixtures/categories.rb +1 -0
  41. data/features/thinking_sphinx/db/fixtures/cats.rb +3 -0
  42. data/features/thinking_sphinx/db/fixtures/comments.rb +24 -0
  43. data/features/thinking_sphinx/db/fixtures/developers.rb +31 -0
  44. data/features/thinking_sphinx/db/fixtures/dogs.rb +3 -0
  45. data/features/thinking_sphinx/db/fixtures/extensible_betas.rb +10 -0
  46. data/features/thinking_sphinx/db/fixtures/foxes.rb +3 -0
  47. data/features/thinking_sphinx/db/fixtures/gammas.rb +10 -0
  48. data/features/thinking_sphinx/db/fixtures/music.rb +4 -0
  49. data/features/thinking_sphinx/db/fixtures/people.rb +1001 -0
  50. data/features/thinking_sphinx/db/fixtures/posts.rb +6 -0
  51. data/features/thinking_sphinx/db/fixtures/robots.rb +14 -0
  52. data/features/thinking_sphinx/db/fixtures/tags.rb +27 -0
  53. data/features/thinking_sphinx/db/migrations/create_alphas.rb +8 -0
  54. data/features/thinking_sphinx/db/migrations/create_animals.rb +5 -0
  55. data/features/thinking_sphinx/db/migrations/create_authors.rb +3 -0
  56. data/features/thinking_sphinx/db/migrations/create_authors_posts.rb +6 -0
  57. data/features/thinking_sphinx/db/migrations/create_betas.rb +5 -0
  58. data/features/thinking_sphinx/db/migrations/create_boxes.rb +5 -0
  59. data/features/thinking_sphinx/db/migrations/create_categories.rb +3 -0
  60. data/features/thinking_sphinx/db/migrations/create_comments.rb +10 -0
  61. data/features/thinking_sphinx/db/migrations/create_developers.rb +7 -0
  62. data/features/thinking_sphinx/db/migrations/create_extensible_betas.rb +5 -0
  63. data/features/thinking_sphinx/db/migrations/create_gammas.rb +3 -0
  64. data/features/thinking_sphinx/db/migrations/create_genres.rb +3 -0
  65. data/features/thinking_sphinx/db/migrations/create_music.rb +6 -0
  66. data/features/thinking_sphinx/db/migrations/create_people.rb +13 -0
  67. data/features/thinking_sphinx/db/migrations/create_posts.rb +5 -0
  68. data/features/thinking_sphinx/db/migrations/create_robots.rb +4 -0
  69. data/features/thinking_sphinx/db/migrations/create_taggings.rb +5 -0
  70. data/features/thinking_sphinx/db/migrations/create_tags.rb +4 -0
  71. data/features/thinking_sphinx/models/alpha.rb +22 -0
  72. data/features/thinking_sphinx/models/animal.rb +5 -0
  73. data/features/thinking_sphinx/models/author.rb +3 -0
  74. data/features/thinking_sphinx/models/beta.rb +8 -0
  75. data/features/thinking_sphinx/models/box.rb +8 -0
  76. data/features/thinking_sphinx/models/cat.rb +3 -0
  77. data/features/thinking_sphinx/models/category.rb +4 -0
  78. data/features/thinking_sphinx/models/comment.rb +10 -0
  79. data/features/thinking_sphinx/models/developer.rb +16 -0
  80. data/features/thinking_sphinx/models/dog.rb +3 -0
  81. data/features/thinking_sphinx/models/extensible_beta.rb +9 -0
  82. data/features/thinking_sphinx/models/fox.rb +5 -0
  83. data/features/thinking_sphinx/models/gamma.rb +5 -0
  84. data/features/thinking_sphinx/models/genre.rb +3 -0
  85. data/features/thinking_sphinx/models/medium.rb +5 -0
  86. data/features/thinking_sphinx/models/music.rb +8 -0
  87. data/features/thinking_sphinx/models/person.rb +23 -0
  88. data/features/thinking_sphinx/models/post.rb +21 -0
  89. data/features/thinking_sphinx/models/robot.rb +12 -0
  90. data/features/thinking_sphinx/models/tag.rb +3 -0
  91. data/features/thinking_sphinx/models/tagging.rb +4 -0
  92. data/lib/cucumber/thinking_sphinx/external_world.rb +8 -0
  93. data/lib/cucumber/thinking_sphinx/internal_world.rb +127 -0
  94. data/lib/cucumber/thinking_sphinx/sql_logger.rb +20 -0
  95. data/lib/thinking_sphinx.rb +242 -0
  96. data/lib/thinking_sphinx/active_record.rb +380 -0
  97. data/lib/thinking_sphinx/active_record/attribute_updates.rb +50 -0
  98. data/lib/thinking_sphinx/active_record/delta.rb +61 -0
  99. data/lib/thinking_sphinx/active_record/has_many_association.rb +51 -0
  100. data/lib/thinking_sphinx/active_record/scopes.rb +75 -0
  101. data/lib/thinking_sphinx/adapters/abstract_adapter.rb +47 -0
  102. data/lib/thinking_sphinx/adapters/mysql_adapter.rb +58 -0
  103. data/lib/thinking_sphinx/adapters/postgresql_adapter.rb +147 -0
  104. data/lib/thinking_sphinx/association.rb +164 -0
  105. data/lib/thinking_sphinx/attribute.rb +380 -0
  106. data/lib/thinking_sphinx/auto_version.rb +22 -0
  107. data/lib/thinking_sphinx/class_facet.rb +15 -0
  108. data/lib/thinking_sphinx/configuration.rb +292 -0
  109. data/lib/thinking_sphinx/context.rb +74 -0
  110. data/lib/thinking_sphinx/core/array.rb +7 -0
  111. data/lib/thinking_sphinx/core/string.rb +15 -0
  112. data/lib/thinking_sphinx/deltas.rb +28 -0
  113. data/lib/thinking_sphinx/deltas/default_delta.rb +62 -0
  114. data/lib/thinking_sphinx/deploy/capistrano.rb +100 -0
  115. data/lib/thinking_sphinx/excerpter.rb +22 -0
  116. data/lib/thinking_sphinx/facet.rb +125 -0
  117. data/lib/thinking_sphinx/facet_search.rb +146 -0
  118. data/lib/thinking_sphinx/field.rb +80 -0
  119. data/lib/thinking_sphinx/index.rb +157 -0
  120. data/lib/thinking_sphinx/index/builder.rb +302 -0
  121. data/lib/thinking_sphinx/index/faux_column.rb +118 -0
  122. data/lib/thinking_sphinx/join.rb +37 -0
  123. data/lib/thinking_sphinx/property.rb +168 -0
  124. data/lib/thinking_sphinx/rails_additions.rb +150 -0
  125. data/lib/thinking_sphinx/search.rb +785 -0
  126. data/lib/thinking_sphinx/search_methods.rb +439 -0
  127. data/lib/thinking_sphinx/source.rb +164 -0
  128. data/lib/thinking_sphinx/source/internal_properties.rb +46 -0
  129. data/lib/thinking_sphinx/source/sql.rb +130 -0
  130. data/lib/thinking_sphinx/tasks.rb +121 -0
  131. data/lib/thinking_sphinx/test.rb +55 -0
  132. data/rails/init.rb +16 -0
  133. data/spec/thinking_sphinx/active_record/delta_spec.rb +128 -0
  134. data/spec/thinking_sphinx/active_record/has_many_association_spec.rb +71 -0
  135. data/spec/thinking_sphinx/active_record/scopes_spec.rb +177 -0
  136. data/spec/thinking_sphinx/active_record_spec.rb +618 -0
  137. data/spec/thinking_sphinx/association_spec.rb +239 -0
  138. data/spec/thinking_sphinx/attribute_spec.rb +548 -0
  139. data/spec/thinking_sphinx/auto_version_spec.rb +39 -0
  140. data/spec/thinking_sphinx/configuration_spec.rb +271 -0
  141. data/spec/thinking_sphinx/context_spec.rb +126 -0
  142. data/spec/thinking_sphinx/core/array_spec.rb +9 -0
  143. data/spec/thinking_sphinx/core/string_spec.rb +9 -0
  144. data/spec/thinking_sphinx/excerpter_spec.rb +49 -0
  145. data/spec/thinking_sphinx/facet_search_spec.rb +176 -0
  146. data/spec/thinking_sphinx/facet_spec.rb +333 -0
  147. data/spec/thinking_sphinx/field_spec.rb +113 -0
  148. data/spec/thinking_sphinx/index/builder_spec.rb +495 -0
  149. data/spec/thinking_sphinx/index/faux_column_spec.rb +36 -0
  150. data/spec/thinking_sphinx/index_spec.rb +183 -0
  151. data/spec/thinking_sphinx/rails_additions_spec.rb +203 -0
  152. data/spec/thinking_sphinx/search_methods_spec.rb +152 -0
  153. data/spec/thinking_sphinx/search_spec.rb +1206 -0
  154. data/spec/thinking_sphinx/source_spec.rb +243 -0
  155. data/spec/thinking_sphinx_spec.rb +204 -0
  156. data/tasks/distribution.rb +46 -0
  157. data/tasks/rails.rake +1 -0
  158. data/tasks/testing.rb +76 -0
  159. metadata +342 -0
@@ -0,0 +1,42 @@
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
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
@@ -0,0 +1,16 @@
1
+ When /^I create a new alpha named (\w+)$/ do |name|
2
+ Alpha.create!(:name => name, :value => 101)
3
+ end
4
+
5
+ When /^I change the (\w+) of alpha (\w+) to (\w+)$/ do |column, name, replacement|
6
+ Alpha.find_by_name(name).update_attributes(column.to_sym => replacement)
7
+ end
8
+
9
+ When /^I filter by active alphas$/ do
10
+ @results = nil
11
+ @with[:active] = true
12
+ end
13
+
14
+ When /^I flag alpha (\w+) as inactive$/ do |name|
15
+ Alpha.find_by_name(name).update_attributes(:active => false)
16
+ 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,193 @@
1
+ Before do
2
+ $queries_executed = []
3
+
4
+ @model = nil
5
+ @method = :search
6
+ @query = ""
7
+ @conditions = {}
8
+ @with = {}
9
+ @without = {}
10
+ @with_all = {}
11
+ @options = {}
12
+ @results = nil
13
+
14
+ Given "updates are enabled"
15
+ end
16
+
17
+ Given /^I am searching on (.+)$/ do |model|
18
+ @model = model.gsub(/\s/, '_').singularize.camelize.constantize
19
+ end
20
+
21
+ Given /^updates are (\w+)$/ do |action|
22
+ ThinkingSphinx.updates_enabled = (action == "enabled")
23
+ end
24
+
25
+ When /^I am searching for ids$/ do
26
+ @results = nil
27
+ @method = :search_for_ids
28
+ end
29
+
30
+ When /^I use index (.+)$/ do |index|
31
+ @results = nil
32
+ @options[:index] = index
33
+ end
34
+
35
+ When /^I am retrieving the result count$/ do
36
+ @result = nil
37
+ @method = @model ? :search_count : :count
38
+ end
39
+
40
+ When /^I search$/ do
41
+ @results = nil
42
+ end
43
+
44
+ When /^I search for (\w+)$/ do |query|
45
+ @results = nil
46
+ @query = query
47
+ end
48
+
49
+ When /^I search for "([^\"]*)"$/ do |query|
50
+ @results = nil
51
+ @query = query
52
+ end
53
+
54
+ When /^I search for (\w+) on (\w+)$/ do |query, field|
55
+ @results = nil
56
+ @conditions[field.to_sym] = query
57
+ end
58
+
59
+ When /^I output the raw result data$/ do
60
+ puts results.results.inspect
61
+ end
62
+
63
+ When /^I clear existing filters$/ do
64
+ @with = {}
65
+ @without = {}
66
+ @with_all = {}
67
+ end
68
+
69
+ When /^I filter by (\w+) on (\w+)$/ do |filter, attribute|
70
+ @results = nil
71
+ @with[attribute.to_sym] = filter.to_i
72
+ end
73
+
74
+ When /^I filter by (\d\d\d\d)\-(\d\d)\-(\d\d) on (\w+)$/ do |y, m, d, attribute|
75
+ @results = nil
76
+ @with[attribute.to_sym] = Time.local(y.to_i, m.to_i, d.to_i).to_i
77
+ end
78
+
79
+ When /^I filter by (\d+) and (\d+) on (\w+)$/ do |value_one, value_two, attribute|
80
+ @results = nil
81
+ @with[attribute.to_sym] = [value_one.to_i, value_two.to_i]
82
+ end
83
+
84
+ When /^I filter by both (\d+) and (\d+) on (\w+)$/ do |value_one, value_two, attribute|
85
+ @results = nil
86
+ @with_all[attribute.to_sym] = [value_one.to_i, value_two.to_i]
87
+ end
88
+
89
+ When /^I filter between ([\d\.]+) and ([\d\.]+) on (\w+)$/ do |first, last, attribute|
90
+ @results = nil
91
+ if first[/\./].nil? && last[/\./].nil?
92
+ @with[attribute.to_sym] = first.to_i..last.to_i
93
+ else
94
+ @with[attribute.to_sym] = first.to_f..last.to_f
95
+ end
96
+ end
97
+
98
+ When /^I filter between (\d+) and (\d+) days ago on (\w+)$/ do |last, first, attribute|
99
+ @results = nil
100
+ @with[attribute.to_sym] = first.to_i.days.ago..last.to_i.days.ago
101
+ end
102
+
103
+ When /^I filter by (\w+) between (\d+) and (\d+)$/ do |attribute, first, last|
104
+ @results = nil
105
+ @with[attribute.to_sym] = Time.utc(first.to_i)..Time.utc(last.to_i)
106
+ end
107
+
108
+ When /^I order by (\w+)$/ do |attribute|
109
+ @results = nil
110
+ @options[:order] = attribute.to_sym
111
+ end
112
+
113
+ When /^I order by "([^\"]+)"$/ do |str|
114
+ @results = nil
115
+ @options[:order] = str
116
+ end
117
+
118
+ When /^I group results by the (\w+) attribute$/ do |attribute|
119
+ @results = nil
120
+ @options[:group_function] = :attr
121
+ @options[:group_by] = attribute
122
+ end
123
+
124
+ When /^I set match mode to (\w+)$/ do |match_mode|
125
+ @results = nil
126
+ @options[:match_mode] = match_mode.to_sym
127
+ end
128
+
129
+ When /^I set per page to (\d+)$/ do |per_page|
130
+ @results = nil
131
+ @options[:per_page] = per_page.to_i
132
+ end
133
+
134
+ When /^I set retry stale to (\w+)$/ do |retry_stale|
135
+ @results = nil
136
+ @options[:retry_stale] = case retry_stale
137
+ when "true" then true
138
+ when "false" then false
139
+ else retry_stale.to_i
140
+ end
141
+ end
142
+
143
+ When /^I destroy (\w+) (\w+)$/ do |model, name|
144
+ model.gsub(/\s/, '_').camelize.
145
+ constantize.find_by_name(name).destroy
146
+ end
147
+
148
+ Then /^the (\w+) of each result should indicate order$/ do |attribute|
149
+ results.inject(nil) do |prev, current|
150
+ unless prev.nil?
151
+ current.send(attribute.to_sym).should >= prev.send(attribute.to_sym)
152
+ end
153
+
154
+ current
155
+ end
156
+ end
157
+
158
+ Then /^I can iterate by result and (\w+)$/ do |attribute|
159
+ iteration = lambda { |result, attr_value|
160
+ result.should be_kind_of(@model)
161
+ unless attribute == "group" && attr_value.nil?
162
+ attr_value.should be_kind_of(Integer)
163
+ end
164
+ }
165
+
166
+ results.send("each_with_#{attribute}", &iteration)
167
+ end
168
+
169
+ Then /^I should get (\d+) results?$/ do |count|
170
+ results.length.should == count.to_i
171
+ end
172
+
173
+ Then /^I should not get (\d+) results?$/ do |count|
174
+ results.length.should_not == count.to_i
175
+ end
176
+
177
+ Then /^I should get as many results as there are (.+)$/ do |model|
178
+ results.length.should == model.gsub(/\s/, '_').singularize.camelize.
179
+ constantize.count
180
+ end
181
+
182
+ def results
183
+ @results ||= (@model || ThinkingSphinx).send(
184
+ @method,
185
+ @query,
186
+ @options.merge(
187
+ :conditions => @conditions,
188
+ :with => @with,
189
+ :without => @without,
190
+ :with_all => @with_all
191
+ )
192
+ )
193
+ end
@@ -0,0 +1,7 @@
1
+ When /I change the name of extensible beta (\w+) to (\w+)$/ do |current, replacement|
2
+ ExtensibleBeta.find_by_name(current).update_attributes(:name => replacement)
3
+ end
4
+
5
+ Then /^the generic delta handler should handle the delta indexing$/ do
6
+ ExtensibleBeta.find(:first, :conditions => {:changed_by_generic => true}).should_not be_nil
7
+ end
@@ -0,0 +1,96 @@
1
+ When /^I am requesting facet results$/ do
2
+ @results = nil
3
+ @method = :facets
4
+ end
5
+
6
+ When /^I am requesting just the facet (\w+)$/ do |facet|
7
+ @results = nil
8
+ @options[:facets] = facet.downcase.to_sym
9
+ end
10
+
11
+ When /^I am requesting just the facets (\w+) and (\w+)$/ do |one, two|
12
+ @results = nil
13
+ @options[:facets] = [one.downcase.to_sym, two.downcase.to_sym]
14
+ end
15
+
16
+ When "I want classes included" do
17
+ @options[:class_facet] = true
18
+ end
19
+
20
+ When "I don't want classes included" do
21
+ @options[:class_facet] = false
22
+ end
23
+
24
+ When "I want all possible attributes" do
25
+ @options[:all_facets] = true
26
+ end
27
+
28
+ When /^I drill down where (\w+) is (\w+)$/ do |facet, value|
29
+ @results = results.for(facet.downcase.to_sym => value)
30
+ end
31
+
32
+ When /^I drill down where (\w+) is (\w+) and (\w+) is (\w+)$/ do |facet_one, value_one, facet_two, value_two|
33
+ value_one = value_one.to_i unless value_one[/^\d+$/].nil?
34
+ value_two = value_two.to_i unless value_two[/^\d+$/].nil?
35
+
36
+ @results = results.for(
37
+ facet_one.downcase.to_sym => value_one,
38
+ facet_two.downcase.to_sym => value_two
39
+ )
40
+ end
41
+
42
+ When /^I drill down where ([\w_]+) includes the id of tag (\w+)$/ do |facet, text|
43
+ tag = Tag.find_by_text(text)
44
+ @results = results.for(facet.downcase.to_sym => tag.id)
45
+ end
46
+
47
+ When /^I drill down where ([\w_]+) includes the id of tags (\w+) or (\w+)$/ do |facet, text_one, text_two|
48
+ tag_one = Tag.find_by_text(text_one)
49
+ tag_two = Tag.find_by_text(text_two)
50
+ @results = results.for(facet.downcase.to_sym => [tag_one.id, tag_two.id])
51
+ end
52
+
53
+ Then "I should have valid facet results" do
54
+ results.should be_kind_of(Hash)
55
+ results.values.each { |value| value.should be_kind_of(Hash) }
56
+ end
57
+
58
+ Then /^I should have (\d+) facets?$/ do |count|
59
+ results.keys.length.should == count.to_i
60
+ end
61
+
62
+ Then /^I should have the facet ([\w_\s]+)$/ do |name|
63
+ results[facet_name(name)].should be_kind_of(Hash)
64
+ end
65
+
66
+ Then /^I should not have the facet ([\w_\s]+)$/ do |name|
67
+ results.keys.should_not include(facet_name(name))
68
+ end
69
+
70
+ Then /^the ([\w_\s]+) facet should have an? "([\w\s_]+)" key with (\d+) hits$/ do |name, key, hit_count|
71
+ facet_name = facet_name name
72
+ results[facet_name].keys.should include(key)
73
+ results[facet_name][key].should eql(hit_count.to_i)
74
+ end
75
+
76
+ Then /^the ([\w_\s]+) facet should have an? "(\w+)" key$/ do |name, key|
77
+ results[facet_name(name)].keys.should include(key)
78
+ end
79
+
80
+ Then /^the ([\w_\s]+) facet should have an? (\d+\.?\d*) key$/ do |name, key|
81
+ if key[/\./]
82
+ key = key.to_f
83
+ else
84
+ key = key.to_i
85
+ end
86
+
87
+ results[facet_name(name)].keys.should include(key)
88
+ end
89
+
90
+ Then /^the ([\w\s]+) facet should have (\d+) keys$/ do |name, count|
91
+ results[facet_name(name)].keys.length.should == count.to_i
92
+ end
93
+
94
+ def facet_name(string)
95
+ string.gsub(/\s/, '').underscore.to_sym
96
+ end
@@ -0,0 +1,36 @@
1
+ When "I include comments" do
2
+ @results = nil
3
+ @options[:include] = :comments
4
+ end
5
+
6
+ When /^I get the first comment$/ do
7
+ @comment = Comment.find(:first)
8
+ end
9
+
10
+ When /^I track queries$/ do
11
+ $queries_executed = []
12
+ end
13
+
14
+ When /^I compare comments$/ do
15
+ results.first.comments.first.should == @comment
16
+ end
17
+
18
+ When /^I select only content$/ do
19
+ @results = nil
20
+ @options[:select] = "id, content"
21
+ end
22
+
23
+ Then /^I should have (\d+) quer[yies]+$/ do |count|
24
+ $queries_executed.length.should == count.to_i
25
+ end
26
+
27
+ Then /^I should not get an error accessing the subject$/ do
28
+ lambda { results.first.subject }.should_not raise_error
29
+ end
30
+
31
+ Then /^I should get an error accessing the subject$/ do
32
+ error_class = NoMethodError
33
+ error_class = ActiveRecord::MissingAttributeError if ActiveRecord.constants.include?("MissingAttributeError")
34
+
35
+ lambda { results.first.subject }.should raise_error(error_class)
36
+ end
@@ -0,0 +1,15 @@
1
+ When /^I destroy gamma (\w+) without callbacks$/ do |name|
2
+ @results = nil
3
+ gamma = Gamma.find_by_name(name)
4
+ Gamma.delete(gamma.id) if gamma
5
+ end
6
+
7
+ Then "I should get a single result of nil" do
8
+ results.to_a.should == [nil]
9
+ end
10
+
11
+ Then /^I should get a single gamma result with a name of (\w+)$/ do |name|
12
+ results.length.should == 1
13
+ results.first.should be_a(Gamma)
14
+ results.first.name.should == name
15
+ end
@@ -0,0 +1,15 @@
1
+ When /^I use the ([\w]+) scope$/ do |scope|
2
+ @results = results.send(scope.to_sym)
3
+ end
4
+
5
+ When /^I use the ([\w]+) scope set to "([^\"]*)"$/ do |scope, value|
6
+ @results = results.send(scope.to_sym, value)
7
+ end
8
+
9
+ When /^I use the ([\w]+) scope set to (\d+)$/ do |scope, int|
10
+ @results = results.send(scope.to_sym, int.to_i)
11
+ end
12
+
13
+ When /^I am retrieving the scoped result count$/ do
14
+ @results = results.search_count
15
+ end
@@ -0,0 +1,89 @@
1
+ # encoding: UTF-8
2
+ When /^I search for the specific id of (\d+) in the (\w+) index$/ do |id, index|
3
+ @id = id.to_i
4
+ @index = index
5
+ end
6
+
7
+ When /^I search for the document id of (\w+) (\w+) in the (\w+) index$/ do |model, name, index|
8
+ model = model.gsub(/\s/, '_').camelize.constantize
9
+ @id = model.find_by_name(name).sphinx_document_id
10
+ @index = index
11
+ end
12
+
13
+ Then "it should exist" do
14
+ ThinkingSphinx::Search.search_for_id(@id, @index).should == true
15
+ end
16
+
17
+ Then "it should not exist" do
18
+ ThinkingSphinx::Search.search_for_id(@id, @index).should == false
19
+ end
20
+
21
+ Then "it should exist if using Rails 2.1 or newer" do
22
+ require 'active_record/version'
23
+ unless ActiveRecord::VERSION::STRING.to_f < 2.1
24
+ ThinkingSphinx::Search.search_for_id(@id, @index).should == true
25
+ end
26
+ end
27
+
28
+ Then "it should not exist if using Rails 2.1 or newer" do
29
+ require 'active_record/version'
30
+ unless ActiveRecord::VERSION::STRING.to_f < 2.1
31
+ ThinkingSphinx::Search.search_for_id(@id, @index).should == false
32
+ end
33
+ end
34
+
35
+ Then /^I can iterate by result and group and count$/ do
36
+ results.each_with_groupby_and_count do |result, group, count|
37
+ result.should be_kind_of(@model)
38
+ count.should be_kind_of(Integer)
39
+ group.should be_kind_of(Integer)
40
+ end
41
+ end
42
+
43
+ Then "each result id should match the corresponding sphinx internal id" do
44
+ results.each_with_sphinx_internal_id do |result, id|
45
+ result.id.should == id
46
+ end
47
+ end
48
+
49
+ Then "I should have an array of integers" do
50
+ results.each do |result|
51
+ result.should be_kind_of(Integer)
52
+ end
53
+ end
54
+
55
+ Then "searching for ids should match the record ids of the normal search results" do
56
+ normal_results = results
57
+
58
+ # reset search, switch method
59
+ @results = nil
60
+ @method = :search_for_ids
61
+
62
+ results.to_a.should == normal_results.collect(&:id)
63
+ end
64
+
65
+ Then /^I should get a value of (\d+)$/ do |count|
66
+ results.should == count.to_i
67
+ end
68
+
69
+ Then /^the (\w+) excerpt of the first result is "(.*)"$/ do |column, string|
70
+ excerpt = results.excerpt_for(results.first.send(column))
71
+ if excerpt.respond_to?(:force_encoding)
72
+ excerpt = excerpt.force_encoding('UTF-8')
73
+ end
74
+
75
+ excerpt.should == string
76
+ end
77
+
78
+ Then /^calling (\w+) on the first result excerpts object should return "(.*)"$/ do |column, string|
79
+ excerpt = results.first.excerpts.send(column)
80
+ if excerpt.respond_to?(:force_encoding)
81
+ excerpt = excerpt.force_encoding('UTF-8')
82
+ end
83
+
84
+ excerpt.should == string
85
+ end
86
+
87
+ Then /^the first result should have a (\w+\s?\w*) of (\d+)$/ do |attribute, value|
88
+ results.first.sphinx_attributes[attribute.gsub(/\s+/, '_')].should == value.to_i
89
+ end