sunspot 2.2.7 → 2.2.8
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.
- checksums.yaml +4 -4
- data/.gitignore +1 -0
- data/.rspec +2 -0
- data/Appraisals +7 -0
- data/Gemfile +0 -8
- data/gemfiles/.gitkeep +0 -0
- data/lib/sunspot/dsl/scope.rb +6 -1
- data/lib/sunspot/field.rb +11 -0
- data/lib/sunspot/field_factory.rb +6 -2
- data/lib/sunspot/query/bbox.rb +5 -1
- data/lib/sunspot/query/restriction.rb +11 -0
- data/lib/sunspot/search/hit_enumerable.rb +4 -1
- data/lib/sunspot/search/standard_search.rb +2 -3
- data/lib/sunspot/version.rb +1 -1
- data/spec/api/adapters_spec.rb +19 -19
- data/spec/api/batcher_spec.rb +15 -15
- data/spec/api/binding_spec.rb +3 -3
- data/spec/api/class_set_spec.rb +3 -3
- data/spec/api/hit_enumerable_spec.rb +32 -9
- data/spec/api/indexer/attributes_spec.rb +31 -31
- data/spec/api/indexer/batch_spec.rb +8 -7
- data/spec/api/indexer/dynamic_fields_spec.rb +8 -8
- data/spec/api/indexer/fixed_fields_spec.rb +12 -12
- data/spec/api/indexer/fulltext_spec.rb +8 -8
- data/spec/api/indexer/removal_spec.rb +14 -14
- data/spec/api/indexer_spec.rb +2 -2
- data/spec/api/query/advanced_manipulation_examples.rb +3 -3
- data/spec/api/query/connectives_examples.rb +26 -14
- data/spec/api/query/dsl_spec.rb +17 -9
- data/spec/api/query/dynamic_fields_examples.rb +18 -18
- data/spec/api/query/faceting_examples.rb +62 -62
- data/spec/api/query/fulltext_examples.rb +56 -55
- data/spec/api/query/function_spec.rb +26 -26
- data/spec/api/query/geo_examples.rb +6 -6
- data/spec/api/query/group_spec.rb +6 -6
- data/spec/api/query/highlighting_examples.rb +26 -26
- data/spec/api/query/join_spec.rb +2 -2
- data/spec/api/query/more_like_this_spec.rb +29 -29
- data/spec/api/query/ordering_pagination_examples.rb +25 -25
- data/spec/api/query/scope_examples.rb +39 -39
- data/spec/api/query/spatial_examples.rb +3 -3
- data/spec/api/query/spellcheck_examples.rb +3 -3
- data/spec/api/query/standard_spec.rb +1 -1
- data/spec/api/query/stats_examples.rb +8 -8
- data/spec/api/query/text_field_scoping_examples.rb +5 -5
- data/spec/api/query/types_spec.rb +4 -4
- data/spec/api/search/cursor_paginated_collection_spec.rb +12 -12
- data/spec/api/search/dynamic_fields_spec.rb +4 -4
- data/spec/api/search/faceting_spec.rb +55 -52
- data/spec/api/search/highlighting_spec.rb +7 -7
- data/spec/api/search/hits_spec.rb +29 -29
- data/spec/api/search/paginated_collection_spec.rb +18 -18
- data/spec/api/search/results_spec.rb +13 -13
- data/spec/api/search/search_spec.rb +3 -3
- data/spec/api/search/stats_spec.rb +10 -10
- data/spec/api/session_proxy/class_sharding_session_proxy_spec.rb +19 -18
- data/spec/api/session_proxy/id_sharding_session_proxy_spec.rb +9 -9
- data/spec/api/session_proxy/master_slave_session_proxy_spec.rb +10 -6
- data/spec/api/session_proxy/retry_5xx_session_proxy_spec.rb +10 -10
- data/spec/api/session_proxy/sharding_session_proxy_spec.rb +14 -13
- data/spec/api/session_proxy/silent_fail_session_proxy_spec.rb +2 -2
- data/spec/api/session_proxy/spec_helper.rb +1 -1
- data/spec/api/session_proxy/thread_local_session_proxy_spec.rb +9 -5
- data/spec/api/session_spec.rb +42 -42
- data/spec/api/sunspot_spec.rb +4 -4
- data/spec/integration/atomic_updates_spec.rb +25 -11
- data/spec/integration/dynamic_fields_spec.rb +10 -10
- data/spec/integration/faceting_spec.rb +39 -39
- data/spec/integration/field_grouping_spec.rb +16 -16
- data/spec/integration/field_lists_spec.rb +41 -0
- data/spec/integration/geospatial_spec.rb +19 -8
- data/spec/integration/highlighting_spec.rb +5 -5
- data/spec/integration/indexing_spec.rb +5 -5
- data/spec/integration/keyword_search_spec.rb +47 -45
- data/spec/integration/local_search_spec.rb +4 -4
- data/spec/integration/more_like_this_spec.rb +7 -7
- data/spec/integration/scoped_search_spec.rb +107 -107
- data/spec/integration/spellcheck_spec.rb +52 -7
- data/spec/integration/stats_spec.rb +10 -10
- data/spec/integration/stored_fields_spec.rb +1 -1
- data/spec/integration/test_pagination.rb +4 -4
- data/spec/integration/unicode_spec.rb +1 -1
- data/spec/mocks/post.rb +5 -1
- data/spec/spec_helper.rb +11 -6
- data/sunspot.gemspec +3 -1
- metadata +40 -7
data/spec/api/sunspot_spec.rb
CHANGED
@@ -7,8 +7,8 @@ describe Sunspot do
|
|
7
7
|
Sunspot.setup(User) do
|
8
8
|
text :name
|
9
9
|
end
|
10
|
-
Sunspot.searchable.
|
11
|
-
Sunspot.searchable.
|
10
|
+
expect(Sunspot.searchable).not_to be_empty
|
11
|
+
expect(Sunspot.searchable).to include(User)
|
12
12
|
end
|
13
13
|
end
|
14
14
|
|
@@ -16,14 +16,14 @@ describe Sunspot do
|
|
16
16
|
it "should reset current session" do
|
17
17
|
old_session = Sunspot.send(:session)
|
18
18
|
Sunspot.reset!(true)
|
19
|
-
Sunspot.send(:session).
|
19
|
+
expect(Sunspot.send(:session)).not_to eq(old_session)
|
20
20
|
end
|
21
21
|
|
22
22
|
it "should keep keep configuration if specified" do
|
23
23
|
Sunspot.config.solr.url = "http://localhost:9999/path/solr"
|
24
24
|
config_before_reset = Sunspot.config
|
25
25
|
Sunspot.reset!(true)
|
26
|
-
Sunspot.config.
|
26
|
+
expect(Sunspot.config).to eq(config_before_reset)
|
27
27
|
end
|
28
28
|
end
|
29
29
|
end
|
@@ -5,14 +5,16 @@ describe 'atomic updates' do
|
|
5
5
|
Sunspot.remove_all
|
6
6
|
end
|
7
7
|
|
8
|
-
def validate_hit(hit,
|
9
|
-
|
10
|
-
|
8
|
+
def validate_hit(hit, values = {})
|
9
|
+
values.each do |field, value|
|
10
|
+
stored = hit.stored(field)
|
11
|
+
expect(stored).to eq(value), "expected #{value.inspect}, but got #{stored.inspect} for field '#{field}'"
|
12
|
+
end
|
11
13
|
end
|
12
14
|
|
13
15
|
def find_indexed_post(id)
|
14
16
|
hit = Sunspot.search(Post).hits.find{ |h| h.primary_key.to_i == id }
|
15
|
-
hit.
|
17
|
+
expect(hit).not_to be_nil
|
16
18
|
hit
|
17
19
|
end
|
18
20
|
|
@@ -20,13 +22,13 @@ describe 'atomic updates' do
|
|
20
22
|
post = Post.new(title: 'A Title', featured: true)
|
21
23
|
Sunspot.index!(post)
|
22
24
|
|
23
|
-
validate_hit(find_indexed_post(post.id), post.title, post.featured)
|
25
|
+
validate_hit(find_indexed_post(post.id), title: post.title, featured: post.featured)
|
24
26
|
|
25
27
|
Sunspot.atomic_update!(Post, post.id => {title: 'A New Title'})
|
26
|
-
validate_hit(find_indexed_post(post.id), 'A New Title', true)
|
28
|
+
validate_hit(find_indexed_post(post.id), title: 'A New Title', featured: true)
|
27
29
|
|
28
30
|
Sunspot.atomic_update!(Post, post.id => {featured: false})
|
29
|
-
validate_hit(find_indexed_post(post.id), 'A New Title', false)
|
31
|
+
validate_hit(find_indexed_post(post.id), title: 'A New Title', featured: false)
|
30
32
|
end
|
31
33
|
|
32
34
|
it 'should update fields for multiple records' do
|
@@ -34,11 +36,23 @@ describe 'atomic updates' do
|
|
34
36
|
post2 = Post.new(title: 'A Second Title', featured: false)
|
35
37
|
Sunspot.index!(post1, post2)
|
36
38
|
|
37
|
-
validate_hit(find_indexed_post(post1.id), post1.title, post1.featured)
|
38
|
-
validate_hit(find_indexed_post(post2.id), post2.title, post2.featured)
|
39
|
+
validate_hit(find_indexed_post(post1.id), title: post1.title, featured: post1.featured)
|
40
|
+
validate_hit(find_indexed_post(post2.id), title: post2.title, featured: post2.featured)
|
39
41
|
|
40
42
|
Sunspot.atomic_update!(Post, post1.id => {title: 'A New Title'}, post2.id => {featured: true})
|
41
|
-
validate_hit(find_indexed_post(post1.id), 'A New Title', true)
|
42
|
-
validate_hit(find_indexed_post(post2.id), 'A Second Title', true)
|
43
|
+
validate_hit(find_indexed_post(post1.id), title: 'A New Title', featured: true)
|
44
|
+
validate_hit(find_indexed_post(post2.id), title: 'A Second Title', featured: true)
|
45
|
+
end
|
46
|
+
|
47
|
+
it 'should clear field value properly' do
|
48
|
+
post = Post.new(title: 'A Title', tags: %w(tag1 tag2), featured: true)
|
49
|
+
Sunspot.index!(post)
|
50
|
+
validate_hit(find_indexed_post(post.id), title: post.title, tag_list: post.tags, featured: true)
|
51
|
+
|
52
|
+
Sunspot.atomic_update!(Post, post.id => {tag_list: []})
|
53
|
+
validate_hit(find_indexed_post(post.id), title: post.title, tag_list: nil, featured: true)
|
54
|
+
|
55
|
+
Sunspot.atomic_update!(Post, post.id => {featured: nil})
|
56
|
+
validate_hit(find_indexed_post(post.id), title: post.title, tag_list: nil, featured: nil)
|
43
57
|
end
|
44
58
|
end
|
@@ -10,11 +10,11 @@ shared_examples 'dynamic fields' do
|
|
10
10
|
end
|
11
11
|
|
12
12
|
it 'should search for dynamic string field' do
|
13
|
-
Sunspot.search(Post) do
|
13
|
+
expect(Sunspot.search(Post) do
|
14
14
|
dynamic(field_name) do
|
15
15
|
with(:cuisine, 'Pizza')
|
16
16
|
end
|
17
|
-
end.results.
|
17
|
+
end.results).to eq([@posts.first])
|
18
18
|
end
|
19
19
|
|
20
20
|
describe 'faceting' do
|
@@ -28,31 +28,31 @@ shared_examples 'dynamic fields' do
|
|
28
28
|
|
29
29
|
it 'should return value "value" with count 2' do
|
30
30
|
row = @search.dynamic_facet(field_name, :cuisine).rows[0]
|
31
|
-
row.value.
|
32
|
-
row.count.
|
31
|
+
expect(row.value).to eq('Greek')
|
32
|
+
expect(row.count).to eq(2)
|
33
33
|
end
|
34
34
|
|
35
35
|
it 'should return value "other" with count 1' do
|
36
36
|
row = @search.dynamic_facet(field_name, :cuisine).rows[1]
|
37
|
-
row.value.
|
38
|
-
row.count.
|
37
|
+
expect(row.value).to eq('Pizza')
|
38
|
+
expect(row.count).to eq(1)
|
39
39
|
end
|
40
40
|
end
|
41
41
|
|
42
42
|
it 'should order by dynamic string field ascending' do
|
43
|
-
Sunspot.search(Post) do
|
43
|
+
expect(Sunspot.search(Post) do
|
44
44
|
dynamic field_name do
|
45
45
|
order_by :cuisine, :asc
|
46
46
|
end
|
47
|
-
end.results.last.
|
47
|
+
end.results.last).to eq(@posts.first)
|
48
48
|
end
|
49
49
|
|
50
50
|
it 'should order by dynamic string field descending' do
|
51
|
-
Sunspot.search(Post) do
|
51
|
+
expect(Sunspot.search(Post) do
|
52
52
|
dynamic field_name do
|
53
53
|
order_by :cuisine, :desc
|
54
54
|
end
|
55
|
-
end.results.first.
|
55
|
+
end.results.first).to eq(@posts.first)
|
56
56
|
end
|
57
57
|
end
|
58
58
|
|
@@ -27,14 +27,14 @@ describe 'search faceting' do
|
|
27
27
|
|
28
28
|
it "should return value #{value1.inspect} with count 2" do
|
29
29
|
row = @search.facet(field).rows[0]
|
30
|
-
row.value.
|
31
|
-
row.count.
|
30
|
+
expect(row.value).to eq(value1)
|
31
|
+
expect(row.count).to eq(2)
|
32
32
|
end
|
33
33
|
|
34
34
|
it "should return value #{value2.inspect} with count 1" do
|
35
35
|
row = @search.facet(field).rows[1]
|
36
|
-
row.value.
|
37
|
-
row.count.
|
36
|
+
expect(row.value).to eq(value2)
|
37
|
+
expect(row.count).to eq(1)
|
38
38
|
end
|
39
39
|
end
|
40
40
|
end
|
@@ -66,7 +66,7 @@ describe 'search faceting' do
|
|
66
66
|
search = Sunspot.search(Post) do
|
67
67
|
facet :title, :limit => 3
|
68
68
|
end
|
69
|
-
search.facet(:title).
|
69
|
+
expect(search.facet(:title).rows.size).to eq(3)
|
70
70
|
end
|
71
71
|
|
72
72
|
it 'should not return zeros by default' do
|
@@ -74,7 +74,7 @@ describe 'search faceting' do
|
|
74
74
|
with :blog_id, 1
|
75
75
|
facet :title
|
76
76
|
end
|
77
|
-
search.facet(:title).rows.map { |row| row.value }.
|
77
|
+
expect(search.facet(:title).rows.map { |row| row.value }).not_to include('zero')
|
78
78
|
end
|
79
79
|
|
80
80
|
it 'should return zeros when specified' do
|
@@ -82,14 +82,14 @@ describe 'search faceting' do
|
|
82
82
|
with :blog_id, 1
|
83
83
|
facet :title, :zeros => true
|
84
84
|
end
|
85
|
-
search.facet(:title).rows.map { |row| row.value }.
|
85
|
+
expect(search.facet(:title).rows.map { |row| row.value }).to include('zero')
|
86
86
|
end
|
87
87
|
|
88
88
|
it 'should return facet rows from an offset' do
|
89
89
|
search = Sunspot.search(Post) do
|
90
90
|
facet :title, :offset => 3
|
91
91
|
end
|
92
|
-
search.facet(:title).rows.map { |row| row.value }.
|
92
|
+
expect(search.facet(:title).rows.map { |row| row.value }).to eq(%w(one zero))
|
93
93
|
end
|
94
94
|
|
95
95
|
it 'should return a specified minimum count' do
|
@@ -97,7 +97,7 @@ describe 'search faceting' do
|
|
97
97
|
with :blog_id, 1
|
98
98
|
facet :title, :minimum_count => 2
|
99
99
|
end
|
100
|
-
search.facet(:title).rows.map { |row| row.value }.
|
100
|
+
expect(search.facet(:title).rows.map { |row| row.value }).to eq(%w(four three two))
|
101
101
|
end
|
102
102
|
|
103
103
|
it 'should order facets lexically' do
|
@@ -105,7 +105,7 @@ describe 'search faceting' do
|
|
105
105
|
with :blog_id, 1
|
106
106
|
facet :title, :sort => :index
|
107
107
|
end
|
108
|
-
search.facet(:title).rows.map { |row| row.value }.
|
108
|
+
expect(search.facet(:title).rows.map { |row| row.value }).to eq(%w(four one three two))
|
109
109
|
end
|
110
110
|
|
111
111
|
it 'should order facets by count' do
|
@@ -113,7 +113,7 @@ describe 'search faceting' do
|
|
113
113
|
with :blog_id, 1
|
114
114
|
facet :title, :sort => :count
|
115
115
|
end
|
116
|
-
search.facet(:title).rows.map { |row| row.value }.
|
116
|
+
expect(search.facet(:title).rows.map { |row| row.value }).to eq(%w(four three two one))
|
117
117
|
end
|
118
118
|
|
119
119
|
it 'should limit facet values by prefix' do
|
@@ -121,7 +121,7 @@ describe 'search faceting' do
|
|
121
121
|
with :blog_id, 1
|
122
122
|
facet :title, :prefix => 't'
|
123
123
|
end
|
124
|
-
search.facet(:title).rows.map { |row| row.value }.sort.
|
124
|
+
expect(search.facet(:title).rows.map { |row| row.value }.sort).to eq(%w(three two))
|
125
125
|
end
|
126
126
|
|
127
127
|
it 'should return :all facet' do
|
@@ -129,8 +129,8 @@ describe 'search faceting' do
|
|
129
129
|
with :blog_id, 1
|
130
130
|
facet :title, :extra => :any
|
131
131
|
end
|
132
|
-
search.facet(:title).rows.first.value.
|
133
|
-
search.facet(:title).rows.first.count.
|
132
|
+
expect(search.facet(:title).rows.first.value).to eq(:any)
|
133
|
+
expect(search.facet(:title).rows.first.count).to eq(10)
|
134
134
|
end
|
135
135
|
|
136
136
|
it 'should return :none facet' do
|
@@ -138,8 +138,8 @@ describe 'search faceting' do
|
|
138
138
|
with :blog_id, 1
|
139
139
|
facet :title, :extra => :none
|
140
140
|
end
|
141
|
-
search.facet(:title).rows.first.value.
|
142
|
-
search.facet(:title).rows.first.count.
|
141
|
+
expect(search.facet(:title).rows.first.value).to eq(:none)
|
142
|
+
expect(search.facet(:title).rows.first.count).to eq(1)
|
143
143
|
end
|
144
144
|
|
145
145
|
it 'gives correct facet count when group == true and truncate == true' do
|
@@ -152,7 +152,7 @@ describe 'search faceting' do
|
|
152
152
|
end
|
153
153
|
|
154
154
|
# Should be 5 instead of 11
|
155
|
-
search.facet(:title).rows.first.count.
|
155
|
+
expect(search.facet(:title).rows.first.count).to eq(5)
|
156
156
|
end
|
157
157
|
end
|
158
158
|
|
@@ -170,7 +170,7 @@ describe 'search faceting' do
|
|
170
170
|
with :blog_id, 1
|
171
171
|
facet :title, :prefix => 'title '
|
172
172
|
end
|
173
|
-
search.facet(:title).rows.map { |row| row.value }.sort.
|
173
|
+
expect(search.facet(:title).rows.map { |row| row.value }.sort).to eq(["title with spaces 1", "title with spaces 2"])
|
174
174
|
end
|
175
175
|
|
176
176
|
it 'should limit facet values by a prefix with slashes' do
|
@@ -178,7 +178,7 @@ describe 'search faceting' do
|
|
178
178
|
with :blog_id, 1
|
179
179
|
facet :title, :prefix => 'title/'
|
180
180
|
end
|
181
|
-
search.facet(:title).rows.map { |row| row.value }.sort.
|
181
|
+
expect(search.facet(:title).rows.map { |row| row.value }.sort).to eq(["title/with/slashes/1", "title/with/slashes/2"])
|
182
182
|
end
|
183
183
|
end
|
184
184
|
|
@@ -199,7 +199,7 @@ describe 'search faceting' do
|
|
199
199
|
category_filter = with(:category_ids, 1)
|
200
200
|
facet(:category_ids, :exclude => category_filter)
|
201
201
|
end
|
202
|
-
search.facet(:category_ids).rows.map { |row| row.value }.to_set.
|
202
|
+
expect(search.facet(:category_ids).rows.map { |row| row.value }.to_set).to eq(Set[1, 2])
|
203
203
|
end
|
204
204
|
|
205
205
|
it 'should use facet keys to facet more than once with different exclusions' do
|
@@ -209,8 +209,8 @@ describe 'search faceting' do
|
|
209
209
|
facet(:category_ids)
|
210
210
|
facet(:category_ids, :exclude => category_filter, :name => :all_category_ids)
|
211
211
|
end
|
212
|
-
search.facet(:category_ids).rows.map { |row| row.value }.
|
213
|
-
search.facet(:all_category_ids).rows.map { |row| row.value }.to_set.
|
212
|
+
expect(search.facet(:category_ids).rows.map { |row| row.value }).to eq([1])
|
213
|
+
expect(search.facet(:all_category_ids).rows.map { |row| row.value }.to_set).to eq(Set[1, 2])
|
214
214
|
end
|
215
215
|
end
|
216
216
|
|
@@ -228,7 +228,7 @@ describe 'search faceting' do
|
|
228
228
|
end
|
229
229
|
end
|
230
230
|
end
|
231
|
-
search.facet(:category_ids).rows.map { |row| [row.value, row.count] }.to_set.
|
231
|
+
expect(search.facet(:category_ids).rows.map { |row| [row.value, row.count] }.to_set).to eq(Set[[:category_1, 1], [:category_2, 1]])
|
232
232
|
end
|
233
233
|
|
234
234
|
it 'should use facet keys to facet more than once with different exclusions' do
|
@@ -253,8 +253,8 @@ describe 'search faceting' do
|
|
253
253
|
end
|
254
254
|
end
|
255
255
|
end
|
256
|
-
search.facet(:category_ids).rows.map { |row| [row.value, row.count] }.to_set.
|
257
|
-
search.facet(:all_category_ids).rows.map { |row| [row.value, row.count] }.to_set.
|
256
|
+
expect(search.facet(:category_ids).rows.map { |row| [row.value, row.count] }.to_set).to eq(Set[[:category_1, 1]])
|
257
|
+
expect(search.facet(:all_category_ids).rows.map { |row| [row.value, row.count] }.to_set).to eq(Set[[:category_1, 1], [:category_2, 1]])
|
258
258
|
end
|
259
259
|
end
|
260
260
|
end
|
@@ -273,10 +273,10 @@ describe 'search faceting' do
|
|
273
273
|
search = Sunspot.search(Post) do
|
274
274
|
facet :published_at, :time_range => time..(time + 60*60*24*2), :sort => :count
|
275
275
|
end
|
276
|
-
search.facet(:published_at).rows.first.value.
|
277
|
-
search.facet(:published_at).rows.first.count.
|
278
|
-
search.facet(:published_at).rows.last.value.
|
279
|
-
search.facet(:published_at).rows.last.count.
|
276
|
+
expect(search.facet(:published_at).rows.first.value).to eq(time..(time + 60*60*24))
|
277
|
+
expect(search.facet(:published_at).rows.first.count).to eq(2)
|
278
|
+
expect(search.facet(:published_at).rows.last.value).to eq((time + 60*60*24)..(time + 60*60*24*2))
|
279
|
+
expect(search.facet(:published_at).rows.last.count).to eq(1)
|
280
280
|
end
|
281
281
|
end
|
282
282
|
|
@@ -290,10 +290,10 @@ describe 'search faceting' do
|
|
290
290
|
search = Sunspot.search(Post, Namespaced::Comment) do
|
291
291
|
facet(:class, :sort => :count)
|
292
292
|
end
|
293
|
-
search.facet(:class).rows.first.value.
|
294
|
-
search.facet(:class).rows.first.count.
|
295
|
-
search.facet(:class).rows.last.value.
|
296
|
-
search.facet(:class).rows.last.count.
|
293
|
+
expect(search.facet(:class).rows.first.value).to eq(Post)
|
294
|
+
expect(search.facet(:class).rows.first.count).to eq(2)
|
295
|
+
expect(search.facet(:class).rows.last.value).to eq(Namespaced::Comment)
|
296
|
+
expect(search.facet(:class).rows.last.count).to eq(1)
|
297
297
|
end
|
298
298
|
end
|
299
299
|
|
@@ -319,12 +319,12 @@ describe 'search faceting' do
|
|
319
319
|
end
|
320
320
|
end
|
321
321
|
facet = search.facet(:rating_range)
|
322
|
-
facet.rows[0].value.
|
323
|
-
facet.rows[0].count.
|
324
|
-
facet.rows[1].value.
|
325
|
-
facet.rows[1].count.
|
326
|
-
facet.rows[2].value.
|
327
|
-
facet.rows[2].count.
|
322
|
+
expect(facet.rows[0].value).to eq(3.0..4.0)
|
323
|
+
expect(facet.rows[0].count).to eq(3)
|
324
|
+
expect(facet.rows[1].value).to eq(1.0..2.0)
|
325
|
+
expect(facet.rows[1].count).to eq(2)
|
326
|
+
expect(facet.rows[2].value).to eq(4.0..5.0)
|
327
|
+
expect(facet.rows[2].count).to eq(1)
|
328
328
|
end
|
329
329
|
end
|
330
330
|
end
|
@@ -19,8 +19,8 @@ describe "field grouping" do
|
|
19
19
|
group :title
|
20
20
|
end
|
21
21
|
|
22
|
-
search.group(:title).groups.
|
23
|
-
search.group(:title).groups.
|
22
|
+
expect(search.group(:title).groups).to include { |g| g.value == "Title1" }
|
23
|
+
expect(search.group(:title).groups).to include { |g| g.value == "Title2" }
|
24
24
|
end
|
25
25
|
|
26
26
|
it "returns the number of matches unique groups" do
|
@@ -28,7 +28,7 @@ describe "field grouping" do
|
|
28
28
|
group :title
|
29
29
|
end
|
30
30
|
|
31
|
-
search.group(:title).total.
|
31
|
+
expect(search.group(:title).total).to eq(2)
|
32
32
|
end
|
33
33
|
|
34
34
|
it "provides access to the number of matches before grouping" do
|
@@ -36,7 +36,7 @@ describe "field grouping" do
|
|
36
36
|
group :title
|
37
37
|
end
|
38
38
|
|
39
|
-
search.group(:title).matches.
|
39
|
+
expect(search.group(:title).matches).to eq(@posts.length)
|
40
40
|
end
|
41
41
|
|
42
42
|
it "allows grouping by multiple fields" do
|
@@ -44,8 +44,8 @@ describe "field grouping" do
|
|
44
44
|
group :title, :sort_title
|
45
45
|
end
|
46
46
|
|
47
|
-
search.group(:title).groups.
|
48
|
-
search.group(:sort_title).groups.
|
47
|
+
expect(search.group(:title).groups).not_to be_empty
|
48
|
+
expect(search.group(:sort_title).groups).not_to be_empty
|
49
49
|
end
|
50
50
|
|
51
51
|
it "allows specification of the number of documents per group" do
|
@@ -56,7 +56,7 @@ describe "field grouping" do
|
|
56
56
|
end
|
57
57
|
|
58
58
|
title1_group = search.group(:title).groups.detect { |g| g.value == "Title1" }
|
59
|
-
title1_group.hits.length.
|
59
|
+
expect(title1_group.hits.length).to eq(2)
|
60
60
|
end
|
61
61
|
|
62
62
|
it "allows specification of the sort within groups" do
|
@@ -69,7 +69,7 @@ describe "field grouping" do
|
|
69
69
|
highest_ranked_post = @posts.sort_by { |p| -p.ratings_average }.first
|
70
70
|
|
71
71
|
title1_group = search.group(:title).groups.detect { |g| g.value == "Title1" }
|
72
|
-
title1_group.hits.first.primary_key.to_i.
|
72
|
+
expect(title1_group.hits.first.primary_key.to_i).to eq(highest_ranked_post.id)
|
73
73
|
end
|
74
74
|
|
75
75
|
it "allows specification of an ordering function within groups" do
|
@@ -82,7 +82,7 @@ describe "field grouping" do
|
|
82
82
|
highest_ranked_post = @posts.sort_by { |p| -p.ratings_average }.first
|
83
83
|
|
84
84
|
title1_group = search.group(:title).groups.detect { |g| g.value == "Title1" }
|
85
|
-
title1_group.hits.first.primary_key.to_i.
|
85
|
+
expect(title1_group.hits.first.primary_key.to_i).to eq(highest_ranked_post.id)
|
86
86
|
end
|
87
87
|
|
88
88
|
it "allows pagination within groups" do
|
@@ -91,8 +91,8 @@ describe "field grouping" do
|
|
91
91
|
paginate :per_page => 1, :page => 2
|
92
92
|
end
|
93
93
|
|
94
|
-
search.group(:title).groups.length.
|
95
|
-
search.group(:title).groups.first.results.
|
94
|
+
expect(search.group(:title).groups.length).to eql(1)
|
95
|
+
expect(search.group(:title).groups.first.results).to eq([ @posts.last ])
|
96
96
|
end
|
97
97
|
|
98
98
|
context "returns a paginated collection" do
|
@@ -104,10 +104,10 @@ describe "field grouping" do
|
|
104
104
|
search.group(:title).groups
|
105
105
|
end
|
106
106
|
|
107
|
-
it { subject.per_page.
|
108
|
-
it { subject.total_pages.
|
109
|
-
it { subject.current_page.
|
110
|
-
it { subject.first_page
|
111
|
-
it { subject.last_page
|
107
|
+
it { expect(subject.per_page).to eql(1) }
|
108
|
+
it { expect(subject.total_pages).to eql(2) }
|
109
|
+
it { expect(subject.current_page).to eql(2) }
|
110
|
+
it { expect(subject.first_page?).to be(false) }
|
111
|
+
it { expect(subject.last_page?).to be(true) }
|
112
112
|
end
|
113
113
|
end
|