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.
- data/LICENCE +20 -0
- data/README.textile +170 -0
- data/VERSION +1 -0
- data/features/abstract_inheritance.feature +10 -0
- data/features/alternate_primary_key.feature +27 -0
- data/features/attribute_transformation.feature +22 -0
- data/features/attribute_updates.feature +77 -0
- data/features/deleting_instances.feature +67 -0
- data/features/direct_attributes.feature +11 -0
- data/features/excerpts.feature +13 -0
- data/features/extensible_delta_indexing.feature +9 -0
- data/features/facets.feature +90 -0
- data/features/facets_across_model.feature +29 -0
- data/features/handling_edits.feature +92 -0
- data/features/retry_stale_indexes.feature +24 -0
- data/features/searching_across_models.feature +20 -0
- data/features/searching_by_index.feature +40 -0
- data/features/searching_by_model.feature +175 -0
- data/features/searching_with_find_arguments.feature +56 -0
- data/features/sphinx_detection.feature +25 -0
- data/features/sphinx_scopes.feature +42 -0
- data/features/step_definitions/alpha_steps.rb +16 -0
- data/features/step_definitions/beta_steps.rb +7 -0
- data/features/step_definitions/common_steps.rb +193 -0
- data/features/step_definitions/extensible_delta_indexing_steps.rb +7 -0
- data/features/step_definitions/facet_steps.rb +96 -0
- data/features/step_definitions/find_arguments_steps.rb +36 -0
- data/features/step_definitions/gamma_steps.rb +15 -0
- data/features/step_definitions/scope_steps.rb +15 -0
- data/features/step_definitions/search_steps.rb +89 -0
- data/features/step_definitions/sphinx_steps.rb +35 -0
- data/features/sti_searching.feature +19 -0
- data/features/support/env.rb +21 -0
- data/features/support/lib/generic_delta_handler.rb +8 -0
- data/features/thinking_sphinx/database.example.yml +3 -0
- data/features/thinking_sphinx/db/fixtures/alphas.rb +10 -0
- data/features/thinking_sphinx/db/fixtures/authors.rb +1 -0
- data/features/thinking_sphinx/db/fixtures/betas.rb +11 -0
- data/features/thinking_sphinx/db/fixtures/boxes.rb +9 -0
- data/features/thinking_sphinx/db/fixtures/categories.rb +1 -0
- data/features/thinking_sphinx/db/fixtures/cats.rb +3 -0
- data/features/thinking_sphinx/db/fixtures/comments.rb +24 -0
- data/features/thinking_sphinx/db/fixtures/developers.rb +31 -0
- data/features/thinking_sphinx/db/fixtures/dogs.rb +3 -0
- data/features/thinking_sphinx/db/fixtures/extensible_betas.rb +10 -0
- data/features/thinking_sphinx/db/fixtures/foxes.rb +3 -0
- data/features/thinking_sphinx/db/fixtures/gammas.rb +10 -0
- data/features/thinking_sphinx/db/fixtures/music.rb +4 -0
- data/features/thinking_sphinx/db/fixtures/people.rb +1001 -0
- data/features/thinking_sphinx/db/fixtures/posts.rb +6 -0
- data/features/thinking_sphinx/db/fixtures/robots.rb +14 -0
- data/features/thinking_sphinx/db/fixtures/tags.rb +27 -0
- data/features/thinking_sphinx/db/migrations/create_alphas.rb +8 -0
- data/features/thinking_sphinx/db/migrations/create_animals.rb +5 -0
- data/features/thinking_sphinx/db/migrations/create_authors.rb +3 -0
- data/features/thinking_sphinx/db/migrations/create_authors_posts.rb +6 -0
- data/features/thinking_sphinx/db/migrations/create_betas.rb +5 -0
- data/features/thinking_sphinx/db/migrations/create_boxes.rb +5 -0
- data/features/thinking_sphinx/db/migrations/create_categories.rb +3 -0
- data/features/thinking_sphinx/db/migrations/create_comments.rb +10 -0
- data/features/thinking_sphinx/db/migrations/create_developers.rb +7 -0
- data/features/thinking_sphinx/db/migrations/create_extensible_betas.rb +5 -0
- data/features/thinking_sphinx/db/migrations/create_gammas.rb +3 -0
- data/features/thinking_sphinx/db/migrations/create_genres.rb +3 -0
- data/features/thinking_sphinx/db/migrations/create_music.rb +6 -0
- data/features/thinking_sphinx/db/migrations/create_people.rb +13 -0
- data/features/thinking_sphinx/db/migrations/create_posts.rb +5 -0
- data/features/thinking_sphinx/db/migrations/create_robots.rb +4 -0
- data/features/thinking_sphinx/db/migrations/create_taggings.rb +5 -0
- data/features/thinking_sphinx/db/migrations/create_tags.rb +4 -0
- data/features/thinking_sphinx/models/alpha.rb +22 -0
- data/features/thinking_sphinx/models/animal.rb +5 -0
- data/features/thinking_sphinx/models/author.rb +3 -0
- data/features/thinking_sphinx/models/beta.rb +8 -0
- data/features/thinking_sphinx/models/box.rb +8 -0
- data/features/thinking_sphinx/models/cat.rb +3 -0
- data/features/thinking_sphinx/models/category.rb +4 -0
- data/features/thinking_sphinx/models/comment.rb +10 -0
- data/features/thinking_sphinx/models/developer.rb +16 -0
- data/features/thinking_sphinx/models/dog.rb +3 -0
- data/features/thinking_sphinx/models/extensible_beta.rb +9 -0
- data/features/thinking_sphinx/models/fox.rb +5 -0
- data/features/thinking_sphinx/models/gamma.rb +5 -0
- data/features/thinking_sphinx/models/genre.rb +3 -0
- data/features/thinking_sphinx/models/medium.rb +5 -0
- data/features/thinking_sphinx/models/music.rb +8 -0
- data/features/thinking_sphinx/models/person.rb +23 -0
- data/features/thinking_sphinx/models/post.rb +21 -0
- data/features/thinking_sphinx/models/robot.rb +12 -0
- data/features/thinking_sphinx/models/tag.rb +3 -0
- data/features/thinking_sphinx/models/tagging.rb +4 -0
- data/lib/cucumber/thinking_sphinx/external_world.rb +8 -0
- data/lib/cucumber/thinking_sphinx/internal_world.rb +127 -0
- data/lib/cucumber/thinking_sphinx/sql_logger.rb +20 -0
- data/lib/thinking_sphinx.rb +242 -0
- data/lib/thinking_sphinx/active_record.rb +380 -0
- data/lib/thinking_sphinx/active_record/attribute_updates.rb +50 -0
- data/lib/thinking_sphinx/active_record/delta.rb +61 -0
- data/lib/thinking_sphinx/active_record/has_many_association.rb +51 -0
- data/lib/thinking_sphinx/active_record/scopes.rb +75 -0
- data/lib/thinking_sphinx/adapters/abstract_adapter.rb +47 -0
- data/lib/thinking_sphinx/adapters/mysql_adapter.rb +58 -0
- data/lib/thinking_sphinx/adapters/postgresql_adapter.rb +147 -0
- data/lib/thinking_sphinx/association.rb +164 -0
- data/lib/thinking_sphinx/attribute.rb +380 -0
- data/lib/thinking_sphinx/auto_version.rb +22 -0
- data/lib/thinking_sphinx/class_facet.rb +15 -0
- data/lib/thinking_sphinx/configuration.rb +292 -0
- data/lib/thinking_sphinx/context.rb +74 -0
- data/lib/thinking_sphinx/core/array.rb +7 -0
- data/lib/thinking_sphinx/core/string.rb +15 -0
- data/lib/thinking_sphinx/deltas.rb +28 -0
- data/lib/thinking_sphinx/deltas/default_delta.rb +62 -0
- data/lib/thinking_sphinx/deploy/capistrano.rb +100 -0
- data/lib/thinking_sphinx/excerpter.rb +22 -0
- data/lib/thinking_sphinx/facet.rb +125 -0
- data/lib/thinking_sphinx/facet_search.rb +146 -0
- data/lib/thinking_sphinx/field.rb +80 -0
- data/lib/thinking_sphinx/index.rb +157 -0
- data/lib/thinking_sphinx/index/builder.rb +302 -0
- data/lib/thinking_sphinx/index/faux_column.rb +118 -0
- data/lib/thinking_sphinx/join.rb +37 -0
- data/lib/thinking_sphinx/property.rb +168 -0
- data/lib/thinking_sphinx/rails_additions.rb +150 -0
- data/lib/thinking_sphinx/search.rb +785 -0
- data/lib/thinking_sphinx/search_methods.rb +439 -0
- data/lib/thinking_sphinx/source.rb +164 -0
- data/lib/thinking_sphinx/source/internal_properties.rb +46 -0
- data/lib/thinking_sphinx/source/sql.rb +130 -0
- data/lib/thinking_sphinx/tasks.rb +121 -0
- data/lib/thinking_sphinx/test.rb +55 -0
- data/rails/init.rb +16 -0
- data/spec/thinking_sphinx/active_record/delta_spec.rb +128 -0
- data/spec/thinking_sphinx/active_record/has_many_association_spec.rb +71 -0
- data/spec/thinking_sphinx/active_record/scopes_spec.rb +177 -0
- data/spec/thinking_sphinx/active_record_spec.rb +618 -0
- data/spec/thinking_sphinx/association_spec.rb +239 -0
- data/spec/thinking_sphinx/attribute_spec.rb +548 -0
- data/spec/thinking_sphinx/auto_version_spec.rb +39 -0
- data/spec/thinking_sphinx/configuration_spec.rb +271 -0
- data/spec/thinking_sphinx/context_spec.rb +126 -0
- data/spec/thinking_sphinx/core/array_spec.rb +9 -0
- data/spec/thinking_sphinx/core/string_spec.rb +9 -0
- data/spec/thinking_sphinx/excerpter_spec.rb +49 -0
- data/spec/thinking_sphinx/facet_search_spec.rb +176 -0
- data/spec/thinking_sphinx/facet_spec.rb +333 -0
- data/spec/thinking_sphinx/field_spec.rb +113 -0
- data/spec/thinking_sphinx/index/builder_spec.rb +495 -0
- data/spec/thinking_sphinx/index/faux_column_spec.rb +36 -0
- data/spec/thinking_sphinx/index_spec.rb +183 -0
- data/spec/thinking_sphinx/rails_additions_spec.rb +203 -0
- data/spec/thinking_sphinx/search_methods_spec.rb +152 -0
- data/spec/thinking_sphinx/search_spec.rb +1206 -0
- data/spec/thinking_sphinx/source_spec.rb +243 -0
- data/spec/thinking_sphinx_spec.rb +204 -0
- data/tasks/distribution.rb +46 -0
- data/tasks/rails.rake +1 -0
- data/tasks/testing.rb +76 -0
- 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,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
|