sunspot 2.0.0 → 2.5.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (165) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +1 -0
  3. data/.rspec +2 -0
  4. data/Appraisals +7 -0
  5. data/Gemfile +0 -2
  6. data/History.txt +10 -0
  7. data/lib/sunspot.rb +55 -17
  8. data/lib/sunspot/adapters.rb +68 -18
  9. data/lib/sunspot/batcher.rb +1 -1
  10. data/lib/sunspot/configuration.rb +4 -2
  11. data/lib/sunspot/data_extractor.rb +36 -6
  12. data/lib/sunspot/dsl.rb +4 -3
  13. data/lib/sunspot/dsl/adjustable.rb +2 -2
  14. data/lib/sunspot/dsl/field_query.rb +69 -16
  15. data/lib/sunspot/dsl/field_stats.rb +25 -0
  16. data/lib/sunspot/dsl/fields.rb +28 -8
  17. data/lib/sunspot/dsl/fulltext.rb +9 -1
  18. data/lib/sunspot/dsl/group.rb +118 -0
  19. data/lib/sunspot/dsl/paginatable.rb +4 -1
  20. data/lib/sunspot/dsl/scope.rb +19 -10
  21. data/lib/sunspot/dsl/search.rb +1 -1
  22. data/lib/sunspot/dsl/spellcheckable.rb +14 -0
  23. data/lib/sunspot/dsl/standard_query.rb +63 -35
  24. data/lib/sunspot/field.rb +76 -4
  25. data/lib/sunspot/field_factory.rb +60 -11
  26. data/lib/sunspot/indexer.rb +70 -18
  27. data/lib/sunspot/query.rb +5 -4
  28. data/lib/sunspot/query/abstract_field_facet.rb +0 -2
  29. data/lib/sunspot/query/abstract_fulltext.rb +76 -0
  30. data/lib/sunspot/query/abstract_json_field_facet.rb +70 -0
  31. data/lib/sunspot/query/bbox.rb +5 -1
  32. data/lib/sunspot/query/common_query.rb +31 -6
  33. data/lib/sunspot/query/composite_fulltext.rb +58 -8
  34. data/lib/sunspot/query/date_field_json_facet.rb +25 -0
  35. data/lib/sunspot/query/dismax.rb +25 -71
  36. data/lib/sunspot/query/field_json_facet.rb +19 -0
  37. data/lib/sunspot/query/field_list.rb +15 -0
  38. data/lib/sunspot/query/field_stats.rb +61 -0
  39. data/lib/sunspot/query/function_query.rb +1 -2
  40. data/lib/sunspot/query/geo.rb +1 -1
  41. data/lib/sunspot/query/geofilt.rb +8 -3
  42. data/lib/sunspot/query/group.rb +46 -0
  43. data/lib/sunspot/query/group_query.rb +17 -0
  44. data/lib/sunspot/query/join.rb +88 -0
  45. data/lib/sunspot/query/more_like_this.rb +1 -1
  46. data/lib/sunspot/query/pagination.rb +12 -4
  47. data/lib/sunspot/query/range_json_facet.rb +28 -0
  48. data/lib/sunspot/query/restriction.rb +99 -13
  49. data/lib/sunspot/query/sort.rb +41 -0
  50. data/lib/sunspot/query/sort_composite.rb +7 -0
  51. data/lib/sunspot/query/spellcheck.rb +19 -0
  52. data/lib/sunspot/query/standard_query.rb +24 -2
  53. data/lib/sunspot/query/text_field_boost.rb +1 -3
  54. data/lib/sunspot/schema.rb +12 -3
  55. data/lib/sunspot/search.rb +4 -2
  56. data/lib/sunspot/search/abstract_search.rb +93 -43
  57. data/lib/sunspot/search/cursor_paginated_collection.rb +32 -0
  58. data/lib/sunspot/search/field_facet.rb +4 -4
  59. data/lib/sunspot/search/field_json_facet.rb +33 -0
  60. data/lib/sunspot/search/field_stats.rb +21 -0
  61. data/lib/sunspot/search/hit.rb +6 -1
  62. data/lib/sunspot/search/hit_enumerable.rb +4 -1
  63. data/lib/sunspot/search/json_facet_row.rb +40 -0
  64. data/lib/sunspot/search/json_facet_stats.rb +23 -0
  65. data/lib/sunspot/search/paginated_collection.rb +1 -0
  66. data/lib/sunspot/search/query_group.rb +74 -0
  67. data/lib/sunspot/search/standard_search.rb +70 -3
  68. data/lib/sunspot/search/stats_facet.rb +25 -0
  69. data/lib/sunspot/search/stats_json_row.rb +82 -0
  70. data/lib/sunspot/search/stats_row.rb +68 -0
  71. data/lib/sunspot/session.rb +62 -37
  72. data/lib/sunspot/session_proxy/class_sharding_session_proxy.rb +6 -4
  73. data/lib/sunspot/session_proxy/id_sharding_session_proxy.rb +16 -8
  74. data/lib/sunspot/session_proxy/master_slave_session_proxy.rb +2 -2
  75. data/lib/sunspot/session_proxy/retry_5xx_session_proxy.rb +1 -1
  76. data/lib/sunspot/session_proxy/sharding_session_proxy.rb +4 -2
  77. data/lib/sunspot/session_proxy/silent_fail_session_proxy.rb +1 -1
  78. data/lib/sunspot/session_proxy/thread_local_session_proxy.rb +6 -4
  79. data/lib/sunspot/setup.rb +42 -0
  80. data/lib/sunspot/type.rb +20 -0
  81. data/lib/sunspot/util.rb +78 -14
  82. data/lib/sunspot/version.rb +1 -1
  83. data/spec/api/adapters_spec.rb +40 -15
  84. data/spec/api/batcher_spec.rb +15 -15
  85. data/spec/api/binding_spec.rb +3 -3
  86. data/spec/api/class_set_spec.rb +6 -6
  87. data/spec/api/data_extractor_spec.rb +39 -0
  88. data/spec/api/hit_enumerable_spec.rb +32 -9
  89. data/spec/api/indexer/attributes_spec.rb +35 -30
  90. data/spec/api/indexer/batch_spec.rb +8 -7
  91. data/spec/api/indexer/dynamic_fields_spec.rb +8 -8
  92. data/spec/api/indexer/fixed_fields_spec.rb +16 -11
  93. data/spec/api/indexer/fulltext_spec.rb +8 -8
  94. data/spec/api/indexer/removal_spec.rb +24 -14
  95. data/spec/api/indexer_spec.rb +2 -2
  96. data/spec/api/query/advanced_manipulation_examples.rb +3 -3
  97. data/spec/api/query/connectives_examples.rb +26 -14
  98. data/spec/api/query/dsl_spec.rb +24 -6
  99. data/spec/api/query/dynamic_fields_examples.rb +18 -18
  100. data/spec/api/query/faceting_examples.rb +80 -61
  101. data/spec/api/query/fulltext_examples.rb +194 -40
  102. data/spec/api/query/function_spec.rb +116 -13
  103. data/spec/api/query/geo_examples.rb +8 -12
  104. data/spec/api/query/group_spec.rb +27 -5
  105. data/spec/api/query/highlighting_examples.rb +26 -26
  106. data/spec/api/query/join_spec.rb +19 -0
  107. data/spec/api/query/more_like_this_spec.rb +40 -27
  108. data/spec/api/query/ordering_pagination_examples.rb +37 -23
  109. data/spec/api/query/scope_examples.rb +39 -39
  110. data/spec/api/query/spatial_examples.rb +3 -3
  111. data/spec/api/query/spellcheck_examples.rb +20 -0
  112. data/spec/api/query/standard_spec.rb +3 -1
  113. data/spec/api/query/stats_examples.rb +66 -0
  114. data/spec/api/query/text_field_scoping_examples.rb +5 -5
  115. data/spec/api/query/types_spec.rb +4 -4
  116. data/spec/api/search/cursor_paginated_collection_spec.rb +35 -0
  117. data/spec/api/search/dynamic_fields_spec.rb +4 -4
  118. data/spec/api/search/faceting_spec.rb +55 -52
  119. data/spec/api/search/highlighting_spec.rb +7 -7
  120. data/spec/api/search/hits_spec.rb +43 -29
  121. data/spec/api/search/paginated_collection_spec.rb +19 -18
  122. data/spec/api/search/results_spec.rb +13 -13
  123. data/spec/api/search/search_spec.rb +3 -3
  124. data/spec/api/search/stats_spec.rb +94 -0
  125. data/spec/api/session_proxy/class_sharding_session_proxy_spec.rb +23 -16
  126. data/spec/api/session_proxy/id_sharding_session_proxy_spec.rb +16 -4
  127. data/spec/api/session_proxy/master_slave_session_proxy_spec.rb +10 -6
  128. data/spec/api/session_proxy/retry_5xx_session_proxy_spec.rb +11 -11
  129. data/spec/api/session_proxy/sharding_session_proxy_spec.rb +15 -14
  130. data/spec/api/session_proxy/silent_fail_session_proxy_spec.rb +3 -3
  131. data/spec/api/session_proxy/spec_helper.rb +1 -1
  132. data/spec/api/session_proxy/thread_local_session_proxy_spec.rb +40 -26
  133. data/spec/api/session_spec.rb +78 -38
  134. data/spec/api/sunspot_spec.rb +7 -4
  135. data/spec/helpers/integration_helper.rb +11 -1
  136. data/spec/helpers/query_helper.rb +1 -1
  137. data/spec/helpers/search_helper.rb +30 -0
  138. data/spec/integration/atomic_updates_spec.rb +58 -0
  139. data/spec/integration/dynamic_fields_spec.rb +31 -20
  140. data/spec/integration/faceting_spec.rb +252 -39
  141. data/spec/integration/field_grouping_spec.rb +47 -15
  142. data/spec/integration/field_lists_spec.rb +57 -0
  143. data/spec/integration/geospatial_spec.rb +34 -8
  144. data/spec/integration/highlighting_spec.rb +8 -8
  145. data/spec/integration/indexing_spec.rb +7 -6
  146. data/spec/integration/join_spec.rb +45 -0
  147. data/spec/integration/keyword_search_spec.rb +68 -38
  148. data/spec/integration/local_search_spec.rb +4 -4
  149. data/spec/integration/more_like_this_spec.rb +7 -7
  150. data/spec/integration/scoped_search_spec.rb +193 -74
  151. data/spec/integration/spellcheck_spec.rb +119 -0
  152. data/spec/integration/stats_spec.rb +88 -0
  153. data/spec/integration/stored_fields_spec.rb +1 -1
  154. data/spec/integration/test_pagination.rb +4 -4
  155. data/spec/integration/unicode_spec.rb +1 -1
  156. data/spec/mocks/adapters.rb +36 -0
  157. data/spec/mocks/connection.rb +5 -3
  158. data/spec/mocks/photo.rb +32 -1
  159. data/spec/mocks/post.rb +18 -3
  160. data/spec/spec_helper.rb +13 -8
  161. data/sunspot.gemspec +6 -4
  162. data/tasks/rdoc.rake +22 -14
  163. metadata +101 -44
  164. data/lib/sunspot/dsl/field_group.rb +0 -57
  165. data/lib/sunspot/query/field_group.rb +0 -37
@@ -0,0 +1,19 @@
1
+ require File.expand_path('spec_helper', File.dirname(__FILE__))
2
+
3
+ describe 'join' do
4
+ it 'should search by join' do
5
+ session.search PhotoContainer do
6
+ with(:caption, 'blah')
7
+ end
8
+ expect(connection).to have_last_search_including(
9
+ :fq, "{!join from=photo_container_id_i to=id_i}caption_s:blah")
10
+ end
11
+
12
+ it 'should greater_than search by join' do
13
+ session.search PhotoContainer do
14
+ with(:photo_rating).greater_than(3)
15
+ end
16
+ expect(connection).to have_last_search_including(
17
+ :fq, "{!join from=photo_container_id_i to=id_i}average_rating_ft:{3\\.0 TO *}")
18
+ end
19
+ end
@@ -16,42 +16,42 @@ describe 'more_like_this' do
16
16
  it 'should query passed in object' do
17
17
  p = Post.new
18
18
  session.more_like_this(p)
19
- connection.should have_last_search_with(:q => "id:Post\\ #{p.id}")
19
+ expect(connection).to have_last_search_with(:q => "id:Post\\ #{p.id}")
20
20
  end
21
21
 
22
22
  it 'should use more_like_this fields if no fields specified' do
23
23
  session.more_like_this(Post.new)
24
- connection.searches.last[:"mlt.fl"].split(',').sort.should == %w(body_textsv tags_textv)
24
+ expect(connection.searches.last[:"mlt.fl"].split(',').sort).to eq(%w(body_textsv tags_textv))
25
25
  end
26
26
 
27
27
  it 'should use more_like_this fields if specified' do
28
28
  session.more_like_this(Post.new) do
29
29
  fields :body
30
30
  end
31
- connection.should have_last_search_with(:"mlt.fl" => "body_textsv")
31
+ expect(connection).to have_last_search_with(:"mlt.fl" => "body_textsv")
32
32
  end
33
33
 
34
34
  it 'assigns boosts to fields when specified' do
35
35
  session.more_like_this(Post.new) do
36
36
  fields :body, :tags => 8
37
37
  end
38
- connection.searches.last[:"mlt.fl"].split(',').sort.should == %w(body_textsv tags_textv)
39
- connection.should have_last_search_with(:qf => "tags_textv^8")
38
+ expect(connection.searches.last[:"mlt.fl"].split(',').sort).to eq(%w(body_textsv tags_textv))
39
+ expect(connection).to have_last_search_with(:"mlt.qf" => "tags_textv^8")
40
40
  end
41
41
 
42
42
  it 'doesn\'t assign boosts to fields when not specified' do
43
43
  session.more_like_this(Post.new) do
44
44
  fields :body
45
45
  end
46
- connection.should_not have_last_search_with(:qf)
46
+ expect(connection).not_to have_last_search_with(:qf)
47
47
  end
48
48
 
49
49
  it 'should raise ArgumentError if a field is not setup for more_like_this' do
50
- lambda do
50
+ expect do
51
51
  session.more_like_this(Post.new) do
52
52
  fields :title
53
53
  end
54
- end.should raise_error(ArgumentError)
54
+ end.to raise_error(ArgumentError)
55
55
  end
56
56
 
57
57
  it 'should accept options' do
@@ -63,12 +63,12 @@ describe 'more_like_this' do
63
63
  maximum_query_terms 5
64
64
  boost_by_relevance false
65
65
  end
66
- connection.should have_last_search_with(:"mlt.mintf" => 1)
67
- connection.should have_last_search_with(:"mlt.mindf" => 2)
68
- connection.should have_last_search_with(:"mlt.minwl" => 3)
69
- connection.should have_last_search_with(:"mlt.maxwl" => 4)
70
- connection.should have_last_search_with(:"mlt.maxqt" => 5)
71
- connection.should have_last_search_with(:"mlt.boost" => false)
66
+ expect(connection).to have_last_search_with(:"mlt.mintf" => 1)
67
+ expect(connection).to have_last_search_with(:"mlt.mindf" => 2)
68
+ expect(connection).to have_last_search_with(:"mlt.minwl" => 3)
69
+ expect(connection).to have_last_search_with(:"mlt.maxwl" => 4)
70
+ expect(connection).to have_last_search_with(:"mlt.maxqt" => 5)
71
+ expect(connection).to have_last_search_with(:"mlt.boost" => false)
72
72
  end
73
73
 
74
74
  it 'should accept short options' do
@@ -80,45 +80,45 @@ describe 'more_like_this' do
80
80
  maxqt 5
81
81
  boost true
82
82
  end
83
- connection.should have_last_search_with(:"mlt.mintf" => 1)
84
- connection.should have_last_search_with(:"mlt.mindf" => 2)
85
- connection.should have_last_search_with(:"mlt.minwl" => 3)
86
- connection.should have_last_search_with(:"mlt.maxwl" => 4)
87
- connection.should have_last_search_with(:"mlt.maxqt" => 5)
88
- connection.should have_last_search_with(:"mlt.boost" => true)
83
+ expect(connection).to have_last_search_with(:"mlt.mintf" => 1)
84
+ expect(connection).to have_last_search_with(:"mlt.mindf" => 2)
85
+ expect(connection).to have_last_search_with(:"mlt.minwl" => 3)
86
+ expect(connection).to have_last_search_with(:"mlt.maxwl" => 4)
87
+ expect(connection).to have_last_search_with(:"mlt.maxqt" => 5)
88
+ expect(connection).to have_last_search_with(:"mlt.boost" => true)
89
89
  end
90
90
 
91
91
  it 'paginates using default per_page when page not provided' do
92
92
  session.more_like_this(Post.new)
93
- connection.should have_last_search_with(:rows => 30)
93
+ expect(connection).to have_last_search_with(:rows => 30)
94
94
  end
95
95
 
96
96
  it 'paginates using default per_page when page provided' do
97
97
  session.more_like_this(Post.new) do
98
98
  paginate :page => 2
99
99
  end
100
- connection.should have_last_search_with(:rows => 30, :start => 30)
100
+ expect(connection).to have_last_search_with(:rows => 30, :start => 30)
101
101
  end
102
102
 
103
103
  it 'paginates using provided per_page' do
104
104
  session.more_like_this(Post.new) do
105
105
  paginate :page => 4, :per_page => 15
106
106
  end
107
- connection.should have_last_search_with(:rows => 15, :start => 45)
107
+ expect(connection).to have_last_search_with(:rows => 15, :start => 45)
108
108
  end
109
109
 
110
110
  it 'defaults to page 1 if no :page argument given' do
111
111
  session.more_like_this(Post.new) do
112
112
  paginate :per_page => 15
113
113
  end
114
- connection.should have_last_search_with(:rows => 15, :start => 0)
114
+ expect(connection).to have_last_search_with(:rows => 15, :start => 0)
115
115
  end
116
116
 
117
117
  it 'paginates from string argument' do
118
118
  session.more_like_this(Post.new) do
119
119
  paginate :page => '3', :per_page => '15'
120
120
  end
121
- connection.should have_last_search_with(:rows => 15, :start => 30)
121
+ expect(connection).to have_last_search_with(:rows => 15, :start => 30)
122
122
  end
123
123
 
124
124
  it "should send query to solr with adjusted parameters (keyword example)" do
@@ -128,8 +128,21 @@ describe 'more_like_this' do
128
128
  params[:some] = 'param'
129
129
  end
130
130
  end
131
- connection.should have_last_search_with(:q => 'new search')
132
- connection.should have_last_search_with(:some => 'param')
131
+ expect(connection).to have_last_search_with(:q => 'new search')
132
+ expect(connection).to have_last_search_with(:some => 'param')
133
+ end
134
+
135
+ it "should send query to solr with adjusted parameters in multiple blocks" do
136
+ session.more_like_this(Post.new) do
137
+ adjust_solr_params do |params|
138
+ params[:q] = 'new search'
139
+ end
140
+ adjust_solr_params do |params|
141
+ params[:some] = 'param'
142
+ end
143
+ end
144
+ expect(connection).to have_last_search_with(:q => 'new search')
145
+ expect(connection).to have_last_search_with(:some => 'param')
133
146
  end
134
147
 
135
148
  private
@@ -1,56 +1,70 @@
1
1
  shared_examples_for 'sortable query' do
2
2
  it 'paginates using default per_page when page not provided' do
3
3
  search
4
- connection.should have_last_search_with(:rows => 30)
4
+ expect(connection).to have_last_search_with(:rows => 30)
5
5
  end
6
6
 
7
7
  it 'paginates using default per_page when page provided' do
8
8
  search do
9
9
  paginate :page => 2
10
10
  end
11
- connection.should have_last_search_with(:rows => 30, :start => 30)
11
+ expect(connection).to have_last_search_with(:rows => 30, :start => 30)
12
12
  end
13
13
 
14
14
  it 'paginates using provided per_page' do
15
15
  search do
16
16
  paginate :page => 4, :per_page => 15
17
17
  end
18
- connection.should have_last_search_with(:rows => 15, :start => 45)
18
+ expect(connection).to have_last_search_with(:rows => 15, :start => 45)
19
19
  end
20
20
 
21
21
  it 'defaults to page 1 if no :page argument given' do
22
22
  search do
23
23
  paginate :per_page => 15
24
24
  end
25
- connection.should have_last_search_with(:rows => 15, :start => 0)
25
+ expect(connection).to have_last_search_with(:rows => 15, :start => 0)
26
26
  end
27
27
 
28
28
  it 'paginates with an offset' do
29
29
  search do
30
30
  paginate :per_page => 15, :offset => 3
31
31
  end
32
- connection.should have_last_search_with(:rows => 15, :start => 3)
32
+ expect(connection).to have_last_search_with(:rows => 15, :start => 3)
33
33
  end
34
34
 
35
35
  it 'paginates with an offset as a string' do
36
36
  search do
37
37
  paginate :per_page => 15, :offset => '3'
38
38
  end
39
- connection.should have_last_search_with(:rows => 15, :start => 3)
39
+ expect(connection).to have_last_search_with(:rows => 15, :start => 3)
40
40
  end
41
41
 
42
42
  it 'paginates from string argument' do
43
43
  search do
44
44
  paginate :page => '3', :per_page => '15'
45
45
  end
46
- connection.should have_last_search_with(:rows => 15, :start => 30)
46
+ expect(connection).to have_last_search_with(:rows => 15, :start => 30)
47
+ end
48
+
49
+ it 'paginates with initial cursor' do
50
+ search do
51
+ paginate :cursor => '*', :per_page => 15
52
+ end
53
+ expect(connection).to have_last_search_with(:rows => 15, :cursorMark => '*')
54
+ end
55
+
56
+ it 'paginates with given cursor' do
57
+ search do
58
+ paginate :cursor => 'AoIIP4AAACxQcm9maWxlIDEwMTk='
59
+ end
60
+ expect(connection).to have_last_search_with(:cursorMark => 'AoIIP4AAACxQcm9maWxlIDEwMTk=')
47
61
  end
48
62
 
49
63
  it 'orders by a single field' do
50
64
  search do
51
65
  order_by :average_rating, :desc
52
66
  end
53
- connection.should have_last_search_with(:sort => 'average_rating_ft desc')
67
+ expect(connection).to have_last_search_with(:sort => 'average_rating_ft desc')
54
68
  end
55
69
 
56
70
  it 'orders by multiple fields' do
@@ -58,80 +72,80 @@ shared_examples_for 'sortable query' do
58
72
  order_by :average_rating, :desc
59
73
  order_by :sort_title, :asc
60
74
  end
61
- connection.should have_last_search_with(:sort => 'average_rating_ft desc, sort_title_s asc')
75
+ expect(connection).to have_last_search_with(:sort => 'average_rating_ft desc, sort_title_s asc')
62
76
  end
63
77
 
64
78
  it 'orders by random' do
65
79
  search do
66
80
  order_by :random
67
81
  end
68
- connection.searches.last[:sort].should =~ /^random_\d+ asc$/
82
+ expect(connection.searches.last[:sort]).to match(/^random_\d+ asc$/)
69
83
  end
70
84
 
71
85
  it 'orders by random with declared direction' do
72
86
  search do
73
87
  order_by :random, :desc
74
88
  end
75
- connection.searches.last[:sort].should =~ /^random_\d+ desc$/
89
+ expect(connection.searches.last[:sort]).to match(/^random_\d+ desc$/)
76
90
  end
77
91
 
78
92
  it 'orders by random with provided seed value' do
79
93
  search do
80
94
  order_by :random, :seed => 9001
81
95
  end
82
- connection.searches.last[:sort].should =~ /^random_9001 asc$/
96
+ expect(connection.searches.last[:sort]).to match(/^random_9001 asc$/)
83
97
  end
84
98
 
85
99
  it 'orders by random with provided seed value and direction' do
86
100
  search do
87
101
  order_by :random, :seed => 12345, :direction => :desc
88
102
  end
89
- connection.searches.last[:sort].should =~ /^random_12345 desc$/
103
+ expect(connection.searches.last[:sort]).to match(/^random_12345 desc$/)
90
104
  end
91
105
 
92
106
  it 'orders by score' do
93
107
  search do
94
108
  order_by :score, :desc
95
109
  end
96
- connection.should have_last_search_with(:sort => 'score desc')
110
+ expect(connection).to have_last_search_with(:sort => 'score desc')
97
111
  end
98
112
 
99
113
  it 'orders by geodist' do
100
114
  search do
101
115
  order_by_geodist :coordinates_new, 32, -68, :desc
102
116
  end
103
- connection.should have_last_search_with(:sort => 'geodist(coordinates_new_ll,32,-68) desc')
117
+ expect(connection).to have_last_search_with(:sort => 'geodist(coordinates_new_ll,32,-68) desc')
104
118
  end
105
119
 
106
120
  it 'throws an ArgumentError if a bogus order direction is given' do
107
- lambda do
121
+ expect do
108
122
  search do
109
123
  order_by :sort_title, :sideways
110
124
  end
111
- end.should raise_error(ArgumentError)
125
+ end.to raise_error(ArgumentError)
112
126
  end
113
127
 
114
128
  it 'throws an UnrecognizedFieldError if :distance is given for sort' do
115
- lambda do
129
+ expect do
116
130
  search do
117
131
  order_by :distance, :asc
118
132
  end
119
- end.should raise_error(Sunspot::UnrecognizedFieldError)
133
+ end.to raise_error(Sunspot::UnrecognizedFieldError)
120
134
  end
121
135
 
122
136
  it 'does not allow ordering by multiple-value fields' do
123
- lambda do
137
+ expect do
124
138
  search do
125
139
  order_by :category_ids
126
140
  end
127
- end.should raise_error(ArgumentError)
141
+ end.to raise_error(ArgumentError)
128
142
  end
129
143
 
130
144
  it 'raises ArgumentError if bogus argument given to paginate' do
131
- lambda do
145
+ expect do
132
146
  search do
133
147
  paginate :page => 4, :ugly => :puppy
134
148
  end
135
- end.should raise_error(ArgumentError)
149
+ end.to raise_error(ArgumentError)
136
150
  end
137
151
  end
@@ -3,14 +3,14 @@ shared_examples_for "scoped query" do
3
3
  search do
4
4
  with :title, 'My Pet Post'
5
5
  end
6
- connection.should have_last_search_including(:fq, 'title_ss:My\ Pet\ Post')
6
+ expect(connection).to have_last_search_including(:fq, 'title_ss:My\ Pet\ Post')
7
7
  end
8
8
 
9
9
  it 'scopes by exact match with a special string' do
10
10
  search do
11
11
  with :title, 'OR'
12
12
  end
13
- connection.should have_last_search_including(:fq, 'title_ss:"OR"')
13
+ expect(connection).to have_last_search_including(:fq, 'title_ss:"OR"')
14
14
  end
15
15
 
16
16
  it 'scopes by exact match with time' do
@@ -18,7 +18,7 @@ shared_examples_for "scoped query" do
18
18
  search do
19
19
  with :published_at, time
20
20
  end
21
- connection.should have_last_search_including(
21
+ expect(connection).to have_last_search_including(
22
22
  :fq,
23
23
  'published_at_dt:1983\-07\-08T09\:00\:00Z'
24
24
  )
@@ -29,7 +29,7 @@ shared_examples_for "scoped query" do
29
29
  search do
30
30
  with :expire_date, date
31
31
  end
32
- connection.should have_last_search_including(
32
+ expect(connection).to have_last_search_including(
33
33
  :fq,
34
34
  'expire_date_d:1983\-07\-08T00\:00\:00Z'
35
35
  )
@@ -39,133 +39,133 @@ shared_examples_for "scoped query" do
39
39
  search do
40
40
  with :featured, false
41
41
  end
42
- connection.should have_last_search_including(:fq, 'featured_bs:false')
42
+ expect(connection).to have_last_search_including(:fq, 'featured_bs:false')
43
43
  end
44
44
 
45
45
  it 'scopes by less than match with float' do
46
46
  search do
47
47
  with(:average_rating).less_than 3.0
48
48
  end
49
- connection.should have_last_search_including(:fq, 'average_rating_ft:{* TO 3\.0}')
49
+ expect(connection).to have_last_search_including(:fq, 'average_rating_ft:{* TO 3\.0}')
50
50
  end
51
51
 
52
52
  it 'should quote string with space in a less than match' do
53
53
  search do
54
54
  with(:title).less_than('test value')
55
55
  end
56
- connection.should have_last_search_including(:fq, 'title_ss:{* TO "test\ value"}')
56
+ expect(connection).to have_last_search_including(:fq, 'title_ss:{* TO "test\ value"}')
57
57
  end
58
58
 
59
59
  it 'scopes by greater than match with float' do
60
60
  search do
61
61
  with(:average_rating).greater_than 3.0
62
62
  end
63
- connection.should have_last_search_including(:fq, 'average_rating_ft:{3\.0 TO *}')
63
+ expect(connection).to have_last_search_including(:fq, 'average_rating_ft:{3\.0 TO *}')
64
64
  end
65
65
 
66
66
  it 'scopes by short-form between match with integers' do
67
67
  search do
68
68
  with :blog_id, 2..4
69
69
  end
70
- connection.should have_last_search_including(:fq, 'blog_id_i:[2 TO 4]')
70
+ expect(connection).to have_last_search_including(:fq, 'blog_id_i:[2 TO 4]')
71
71
  end
72
72
 
73
73
  it 'scopes by between match with float' do
74
74
  search do
75
75
  with(:average_rating).between 2.0..4.0
76
76
  end
77
- connection.should have_last_search_including(:fq, 'average_rating_ft:[2\.0 TO 4\.0]')
77
+ expect(connection).to have_last_search_including(:fq, 'average_rating_ft:[2\.0 TO 4\.0]')
78
78
  end
79
79
 
80
80
  it 'scopes by any match with integer' do
81
81
  search do
82
82
  with(:category_ids).any_of [2, 7, 12]
83
83
  end
84
- connection.should have_last_search_including(:fq, 'category_ids_im:(2 OR 7 OR 12)')
84
+ expect(connection).to have_last_search_including(:fq, 'category_ids_im:(2 OR 7 OR 12)')
85
85
  end
86
86
 
87
87
  it 'scopes by short-form any-of match with integers' do
88
88
  search do
89
89
  with :category_ids, [2, 7, 12]
90
90
  end
91
- connection.should have_last_search_including(:fq, 'category_ids_im:(2 OR 7 OR 12)')
91
+ expect(connection).to have_last_search_including(:fq, 'category_ids_im:(2 OR 7 OR 12)')
92
92
  end
93
93
 
94
94
  it 'scopes by all match with integer' do
95
95
  search do
96
96
  with(:category_ids).all_of [2, 7, 12]
97
97
  end
98
- connection.should have_last_search_including(:fq, 'category_ids_im:(2 AND 7 AND 12)')
98
+ expect(connection).to have_last_search_including(:fq, 'category_ids_im:(2 AND 7 AND 12)')
99
99
  end
100
100
 
101
101
  it 'scopes by prefix match with string' do
102
102
  search do
103
103
  with(:title).starting_with('tes')
104
104
  end
105
- connection.should have_last_search_including(:fq, 'title_ss:tes*')
105
+ expect(connection).to have_last_search_including(:fq, 'title_ss:tes*')
106
106
  end
107
107
 
108
108
  it 'scopes by not equal match with string' do
109
109
  search do
110
110
  without :title, 'Bad Post'
111
111
  end
112
- connection.should have_last_search_including(:fq, '-title_ss:Bad\ Post')
112
+ expect(connection).to have_last_search_including(:fq, '-title_ss:Bad\ Post')
113
113
  end
114
114
 
115
115
  it 'scopes by not less than match with float' do
116
116
  search do
117
117
  without(:average_rating).less_than 3.0
118
118
  end
119
- connection.should have_last_search_including(:fq, '-average_rating_ft:{* TO 3\.0}')
119
+ expect(connection).to have_last_search_including(:fq, '-average_rating_ft:{* TO 3\.0}')
120
120
  end
121
121
 
122
122
  it 'scopes by not greater than match with float' do
123
123
  search do
124
124
  without(:average_rating).greater_than 3.0
125
125
  end
126
- connection.should have_last_search_including(:fq, '-average_rating_ft:{3\.0 TO *}')
126
+ expect(connection).to have_last_search_including(:fq, '-average_rating_ft:{3\.0 TO *}')
127
127
  end
128
128
 
129
129
  it 'scopes by not between match with shorthand' do
130
130
  search do
131
131
  without(:blog_id, 2..4)
132
132
  end
133
- connection.should have_last_search_including(:fq, '-blog_id_i:[2 TO 4]')
133
+ expect(connection).to have_last_search_including(:fq, '-blog_id_i:[2 TO 4]')
134
134
  end
135
135
 
136
136
  it 'scopes by not between match with float' do
137
137
  search do
138
138
  without(:average_rating).between 2.0..4.0
139
139
  end
140
- connection.should have_last_search_including(:fq, '-average_rating_ft:[2\.0 TO 4\.0]')
140
+ expect(connection).to have_last_search_including(:fq, '-average_rating_ft:[2\.0 TO 4\.0]')
141
141
  end
142
142
 
143
143
  it 'scopes by not any match with integer' do
144
144
  search do
145
145
  without(:category_ids).any_of [2, 7, 12]
146
146
  end
147
- connection.should have_last_search_including(:fq, '-category_ids_im:(2 OR 7 OR 12)')
147
+ expect(connection).to have_last_search_including(:fq, '-category_ids_im:(2 OR 7 OR 12)')
148
148
  end
149
149
 
150
150
  it 'scopes by not all match with integer' do
151
151
  search do
152
152
  without(:category_ids).all_of [2, 7, 12]
153
153
  end
154
- connection.should have_last_search_including(:fq, '-category_ids_im:(2 AND 7 AND 12)')
154
+ expect(connection).to have_last_search_including(:fq, '-category_ids_im:(2 AND 7 AND 12)')
155
155
  end
156
156
 
157
157
  it 'scopes by empty field' do
158
158
  search do
159
159
  with :average_rating, nil
160
160
  end
161
- connection.should have_last_search_including(:fq, '-average_rating_ft:[* TO *]')
161
+ expect(connection).to have_last_search_including(:fq, '-average_rating_ft:[* TO *]')
162
162
  end
163
163
 
164
164
  it 'scopes by non-empty field' do
165
165
  search do
166
166
  without :average_rating, nil
167
167
  end
168
- connection.should have_last_search_including(:fq, 'average_rating_ft:[* TO *]')
168
+ expect(connection).to have_last_search_including(:fq, 'average_rating_ft:[* TO *]')
169
169
  end
170
170
 
171
171
  it 'includes by object identity' do
@@ -173,7 +173,7 @@ shared_examples_for "scoped query" do
173
173
  search do
174
174
  with post
175
175
  end
176
- connection.should have_last_search_including(:fq, "id:(Post\\ #{post.id})")
176
+ expect(connection).to have_last_search_including(:fq, "id:(Post\\ #{post.id})")
177
177
  end
178
178
 
179
179
  it 'includes multiple objects passed as varargs by object identity' do
@@ -181,7 +181,7 @@ shared_examples_for "scoped query" do
181
181
  search do
182
182
  with post1, post2
183
183
  end
184
- connection.should have_last_search_including(
184
+ expect(connection).to have_last_search_including(
185
185
  :fq, "id:(Post\\ #{post1.id} OR Post\\ #{post2.id})"
186
186
  )
187
187
  end
@@ -191,7 +191,7 @@ shared_examples_for "scoped query" do
191
191
  search do
192
192
  with posts
193
193
  end
194
- connection.should have_last_search_including(
194
+ expect(connection).to have_last_search_including(
195
195
  :fq, "id:(Post\\ #{posts.first.id} OR Post\\ #{posts.last.id})"
196
196
  )
197
197
  end
@@ -201,7 +201,7 @@ shared_examples_for "scoped query" do
201
201
  search do
202
202
  without post
203
203
  end
204
- connection.should have_last_search_including(:fq, "-id:(Post\\ #{post.id})")
204
+ expect(connection).to have_last_search_including(:fq, "-id:(Post\\ #{post.id})")
205
205
  end
206
206
 
207
207
  it 'excludes multiple objects passed as varargs by object identity' do
@@ -209,7 +209,7 @@ shared_examples_for "scoped query" do
209
209
  search do
210
210
  without post1, post2
211
211
  end
212
- connection.should have_last_search_including(
212
+ expect(connection).to have_last_search_including(
213
213
  :fq,
214
214
  "-id:(Post\\ #{post1.id} OR Post\\ #{post2.id})"
215
215
  )
@@ -220,7 +220,7 @@ shared_examples_for "scoped query" do
220
220
  search do
221
221
  without posts
222
222
  end
223
- connection.should have_last_search_including(
223
+ expect(connection).to have_last_search_including(
224
224
  :fq,
225
225
  "-id:(Post\\ #{posts.first.id} OR Post\\ #{posts.last.id})"
226
226
  )
@@ -231,45 +231,45 @@ shared_examples_for "scoped query" do
231
231
  search Post, Namespaced::Comment do
232
232
  with :published_at, time
233
233
  end
234
- connection.should have_last_search_including(:fq, 'published_at_dt:1983\-07\-08T09\:00\:00Z')
234
+ expect(connection).to have_last_search_including(:fq, 'published_at_dt:1983\-07\-08T09\:00\:00Z')
235
235
  end
236
236
 
237
237
  it 'allows scoping on field not common to all types' do
238
238
  search Post, Namespaced::Comment do
239
239
  with :blog_id, 1
240
240
  end
241
- connection.should have_last_search_including(:fq, 'blog_id_i:1')
241
+ expect(connection).to have_last_search_including(:fq, 'blog_id_i:1')
242
242
  end
243
243
 
244
244
  it 'raises Sunspot::UnrecognizedFieldError if search scoped to field configured differently between types' do
245
- lambda do
245
+ expect do
246
246
  search Post, Namespaced::Comment do
247
247
  with :average_rating, 2.2 # this is a float in Post but an integer in Comment
248
248
  end
249
- end.should raise_error(Sunspot::UnrecognizedFieldError)
249
+ end.to raise_error(Sunspot::UnrecognizedFieldError)
250
250
  end
251
251
 
252
252
  it 'raises Sunspot::UnrecognizedFieldError for nonexistant fields in block scope' do
253
- lambda do
253
+ expect do
254
254
  search do
255
255
  with :bogus, 'Field'
256
256
  end
257
- end.should raise_error(Sunspot::UnrecognizedFieldError)
257
+ end.to raise_error(Sunspot::UnrecognizedFieldError)
258
258
  end
259
259
 
260
260
  it 'raises NoMethodError if bogus operator referenced' do
261
- lambda do
261
+ expect do
262
262
  search do
263
263
  with(:category_ids).resembling :bogus_condition
264
264
  end
265
- end.should raise_error(NoMethodError)
265
+ end.to raise_error(NoMethodError)
266
266
  end
267
267
 
268
268
  it 'should raise ArgumentError if more than two arguments passed to scope method' do
269
- lambda do
269
+ expect do
270
270
  search do
271
271
  with(:category_ids, 4, 5)
272
272
  end
273
- end.should raise_error(ArgumentError)
273
+ end.to raise_error(ArgumentError)
274
274
  end
275
275
  end