gojee-sunspot 2.0.3 → 2.0.4

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 (178) hide show
  1. data/.gitignore +12 -0
  2. data/Gemfile +5 -0
  3. data/History.txt +252 -0
  4. data/LICENSE +18 -0
  5. data/Rakefile +13 -0
  6. data/TODO +13 -0
  7. data/lib/light_config.rb +40 -0
  8. data/lib/sunspot/adapters.rb +265 -0
  9. data/lib/sunspot/batcher.rb +62 -0
  10. data/lib/sunspot/class_set.rb +23 -0
  11. data/lib/sunspot/composite_setup.rb +202 -0
  12. data/lib/sunspot/configuration.rb +53 -0
  13. data/lib/sunspot/data_extractor.rb +50 -0
  14. data/lib/sunspot/dsl/adjustable.rb +47 -0
  15. data/lib/sunspot/dsl/field_group.rb +57 -0
  16. data/lib/sunspot/dsl/field_query.rb +327 -0
  17. data/lib/sunspot/dsl/fields.rb +103 -0
  18. data/lib/sunspot/dsl/fulltext.rb +243 -0
  19. data/lib/sunspot/dsl/function.rb +27 -0
  20. data/lib/sunspot/dsl/functional.rb +44 -0
  21. data/lib/sunspot/dsl/more_like_this_query.rb +56 -0
  22. data/lib/sunspot/dsl/paginatable.rb +32 -0
  23. data/lib/sunspot/dsl/query_facet.rb +36 -0
  24. data/lib/sunspot/dsl/restriction.rb +25 -0
  25. data/lib/sunspot/dsl/restriction_with_near.rb +160 -0
  26. data/lib/sunspot/dsl/scope.rb +217 -0
  27. data/lib/sunspot/dsl/search.rb +30 -0
  28. data/lib/sunspot/dsl/standard_query.rb +123 -0
  29. data/lib/sunspot/dsl.rb +5 -0
  30. data/lib/sunspot/field.rb +193 -0
  31. data/lib/sunspot/field_factory.rb +129 -0
  32. data/lib/sunspot/indexer.rb +136 -0
  33. data/lib/sunspot/query/abstract_field_facet.rb +52 -0
  34. data/lib/sunspot/query/bbox.rb +15 -0
  35. data/lib/sunspot/query/boost_query.rb +24 -0
  36. data/lib/sunspot/query/common_query.rb +96 -0
  37. data/lib/sunspot/query/composite_fulltext.rb +36 -0
  38. data/lib/sunspot/query/connective.rb +206 -0
  39. data/lib/sunspot/query/date_field_facet.rb +14 -0
  40. data/lib/sunspot/query/dismax.rb +132 -0
  41. data/lib/sunspot/query/field_facet.rb +41 -0
  42. data/lib/sunspot/query/field_group.rb +36 -0
  43. data/lib/sunspot/query/filter.rb +38 -0
  44. data/lib/sunspot/query/function_query.rb +52 -0
  45. data/lib/sunspot/query/geo.rb +53 -0
  46. data/lib/sunspot/query/geofilt.rb +16 -0
  47. data/lib/sunspot/query/highlighting.rb +62 -0
  48. data/lib/sunspot/query/more_like_this.rb +61 -0
  49. data/lib/sunspot/query/more_like_this_query.rb +12 -0
  50. data/lib/sunspot/query/pagination.rb +42 -0
  51. data/lib/sunspot/query/query_facet.rb +16 -0
  52. data/lib/sunspot/query/restriction.rb +262 -0
  53. data/lib/sunspot/query/scope.rb +9 -0
  54. data/lib/sunspot/query/sort.rb +109 -0
  55. data/lib/sunspot/query/sort_composite.rb +34 -0
  56. data/lib/sunspot/query/standard_query.rb +16 -0
  57. data/lib/sunspot/query/text_field_boost.rb +17 -0
  58. data/lib/sunspot/query.rb +11 -0
  59. data/lib/sunspot/schema.rb +151 -0
  60. data/lib/sunspot/search/abstract_search.rb +281 -0
  61. data/lib/sunspot/search/date_facet.rb +35 -0
  62. data/lib/sunspot/search/facet_row.rb +27 -0
  63. data/lib/sunspot/search/field_facet.rb +88 -0
  64. data/lib/sunspot/search/field_group.rb +32 -0
  65. data/lib/sunspot/search/group.rb +50 -0
  66. data/lib/sunspot/search/highlight.rb +38 -0
  67. data/lib/sunspot/search/hit.rb +150 -0
  68. data/lib/sunspot/search/hit_enumerable.rb +72 -0
  69. data/lib/sunspot/search/more_like_this_search.rb +31 -0
  70. data/lib/sunspot/search/paginated_collection.rb +57 -0
  71. data/lib/sunspot/search/query_facet.rb +67 -0
  72. data/lib/sunspot/search/standard_search.rb +21 -0
  73. data/lib/sunspot/search.rb +9 -0
  74. data/lib/sunspot/session.rb +262 -0
  75. data/lib/sunspot/session_proxy/abstract_session_proxy.rb +29 -0
  76. data/lib/sunspot/session_proxy/class_sharding_session_proxy.rb +66 -0
  77. data/lib/sunspot/session_proxy/id_sharding_session_proxy.rb +89 -0
  78. data/lib/sunspot/session_proxy/master_slave_session_proxy.rb +43 -0
  79. data/lib/sunspot/session_proxy/multicore_session_proxy.rb +67 -0
  80. data/lib/sunspot/session_proxy/sharding_session_proxy.rb +222 -0
  81. data/lib/sunspot/session_proxy/silent_fail_session_proxy.rb +42 -0
  82. data/lib/sunspot/session_proxy/thread_local_session_proxy.rb +37 -0
  83. data/lib/sunspot/session_proxy.rb +95 -0
  84. data/lib/sunspot/setup.rb +350 -0
  85. data/lib/sunspot/text_field_setup.rb +29 -0
  86. data/lib/sunspot/type.rb +393 -0
  87. data/lib/sunspot/util.rb +252 -0
  88. data/lib/sunspot/version.rb +3 -0
  89. data/lib/sunspot.rb +579 -0
  90. data/log/.gitignore +1 -0
  91. data/pkg/.gitignore +1 -0
  92. data/script/console +10 -0
  93. data/spec/api/adapters_spec.rb +33 -0
  94. data/spec/api/batcher_spec.rb +112 -0
  95. data/spec/api/binding_spec.rb +50 -0
  96. data/spec/api/class_set_spec.rb +24 -0
  97. data/spec/api/hit_enumerable_spec.rb +47 -0
  98. data/spec/api/indexer/attributes_spec.rb +149 -0
  99. data/spec/api/indexer/batch_spec.rb +72 -0
  100. data/spec/api/indexer/dynamic_fields_spec.rb +42 -0
  101. data/spec/api/indexer/fixed_fields_spec.rb +57 -0
  102. data/spec/api/indexer/fulltext_spec.rb +43 -0
  103. data/spec/api/indexer/removal_spec.rb +53 -0
  104. data/spec/api/indexer/spec_helper.rb +1 -0
  105. data/spec/api/indexer_spec.rb +14 -0
  106. data/spec/api/query/advanced_manipulation_examples.rb +35 -0
  107. data/spec/api/query/connectives_examples.rb +189 -0
  108. data/spec/api/query/dsl_spec.rb +18 -0
  109. data/spec/api/query/dynamic_fields_examples.rb +165 -0
  110. data/spec/api/query/faceting_examples.rb +397 -0
  111. data/spec/api/query/fulltext_examples.rb +313 -0
  112. data/spec/api/query/function_spec.rb +79 -0
  113. data/spec/api/query/geo_examples.rb +68 -0
  114. data/spec/api/query/group_spec.rb +32 -0
  115. data/spec/api/query/highlighting_examples.rb +245 -0
  116. data/spec/api/query/more_like_this_spec.rb +140 -0
  117. data/spec/api/query/ordering_pagination_examples.rb +116 -0
  118. data/spec/api/query/scope_examples.rb +275 -0
  119. data/spec/api/query/spatial_examples.rb +27 -0
  120. data/spec/api/query/spec_helper.rb +1 -0
  121. data/spec/api/query/standard_spec.rb +29 -0
  122. data/spec/api/query/text_field_scoping_examples.rb +30 -0
  123. data/spec/api/query/types_spec.rb +20 -0
  124. data/spec/api/search/dynamic_fields_spec.rb +33 -0
  125. data/spec/api/search/faceting_spec.rb +360 -0
  126. data/spec/api/search/highlighting_spec.rb +69 -0
  127. data/spec/api/search/hits_spec.rb +131 -0
  128. data/spec/api/search/paginated_collection_spec.rb +36 -0
  129. data/spec/api/search/results_spec.rb +72 -0
  130. data/spec/api/search/search_spec.rb +23 -0
  131. data/spec/api/search/spec_helper.rb +1 -0
  132. data/spec/api/session_proxy/class_sharding_session_proxy_spec.rb +85 -0
  133. data/spec/api/session_proxy/id_sharding_session_proxy_spec.rb +30 -0
  134. data/spec/api/session_proxy/master_slave_session_proxy_spec.rb +41 -0
  135. data/spec/api/session_proxy/sharding_session_proxy_spec.rb +77 -0
  136. data/spec/api/session_proxy/silent_fail_session_proxy_spec.rb +24 -0
  137. data/spec/api/session_proxy/spec_helper.rb +9 -0
  138. data/spec/api/session_proxy/thread_local_session_proxy_spec.rb +39 -0
  139. data/spec/api/session_spec.rb +232 -0
  140. data/spec/api/spec_helper.rb +3 -0
  141. data/spec/api/sunspot_spec.rb +29 -0
  142. data/spec/ext.rb +11 -0
  143. data/spec/helpers/indexer_helper.rb +17 -0
  144. data/spec/helpers/integration_helper.rb +8 -0
  145. data/spec/helpers/mock_session_helper.rb +13 -0
  146. data/spec/helpers/query_helper.rb +26 -0
  147. data/spec/helpers/search_helper.rb +68 -0
  148. data/spec/integration/dynamic_fields_spec.rb +57 -0
  149. data/spec/integration/faceting_spec.rb +251 -0
  150. data/spec/integration/field_grouping_spec.rb +66 -0
  151. data/spec/integration/geospatial_spec.rb +85 -0
  152. data/spec/integration/highlighting_spec.rb +44 -0
  153. data/spec/integration/indexing_spec.rb +55 -0
  154. data/spec/integration/keyword_search_spec.rb +317 -0
  155. data/spec/integration/local_search_spec.rb +64 -0
  156. data/spec/integration/more_like_this_spec.rb +43 -0
  157. data/spec/integration/scoped_search_spec.rb +354 -0
  158. data/spec/integration/stored_fields_spec.rb +12 -0
  159. data/spec/integration/test_pagination.rb +43 -0
  160. data/spec/integration/unicode_spec.rb +15 -0
  161. data/spec/mocks/adapters.rb +32 -0
  162. data/spec/mocks/blog.rb +3 -0
  163. data/spec/mocks/comment.rb +21 -0
  164. data/spec/mocks/connection.rb +126 -0
  165. data/spec/mocks/mock_adapter.rb +30 -0
  166. data/spec/mocks/mock_class_sharding_session_proxy.rb +24 -0
  167. data/spec/mocks/mock_record.rb +52 -0
  168. data/spec/mocks/mock_sharding_session_proxy.rb +15 -0
  169. data/spec/mocks/photo.rb +11 -0
  170. data/spec/mocks/post.rb +86 -0
  171. data/spec/mocks/super_class.rb +2 -0
  172. data/spec/mocks/user.rb +13 -0
  173. data/spec/spec_helper.rb +40 -0
  174. data/sunspot.gemspec +42 -0
  175. data/tasks/rdoc.rake +27 -0
  176. data/tasks/schema.rake +19 -0
  177. data/tasks/todo.rake +4 -0
  178. metadata +261 -3
@@ -0,0 +1,275 @@
1
+ shared_examples_for "scoped query" do
2
+ it 'scopes by exact match with a string' do
3
+ search do
4
+ with :title, 'My Pet Post'
5
+ end
6
+ connection.should have_last_search_including(:fq, 'title_ss:My\ Pet\ Post')
7
+ end
8
+
9
+ it 'scopes by exact match with a special string' do
10
+ search do
11
+ with :title, 'OR'
12
+ end
13
+ connection.should have_last_search_including(:fq, 'title_ss:"OR"')
14
+ end
15
+
16
+ it 'scopes by exact match with time' do
17
+ time = Time.parse('1983-07-08 05:00:00 -0400')
18
+ search do
19
+ with :published_at, time
20
+ end
21
+ connection.should have_last_search_including(
22
+ :fq,
23
+ 'published_at_dt:1983\-07\-08T09\:00\:00Z'
24
+ )
25
+ end
26
+
27
+ it 'scopes by exact match with date' do
28
+ date = Date.new(1983, 7, 8)
29
+ search do
30
+ with :expire_date, date
31
+ end
32
+ connection.should have_last_search_including(
33
+ :fq,
34
+ 'expire_date_d:1983\-07\-08T00\:00\:00Z'
35
+ )
36
+ end
37
+
38
+ it 'scopes by exact match with boolean' do
39
+ search do
40
+ with :featured, false
41
+ end
42
+ connection.should have_last_search_including(:fq, 'featured_bs:false')
43
+ end
44
+
45
+ it 'scopes by less than match with float' do
46
+ search do
47
+ with(:average_rating).less_than 3.0
48
+ end
49
+ connection.should have_last_search_including(:fq, 'average_rating_ft:[* TO 3\.0]')
50
+ end
51
+
52
+ it 'should quote string with space in a less than match' do
53
+ search do
54
+ with(:title).less_than('test value')
55
+ end
56
+ connection.should have_last_search_including(:fq, 'title_ss:[* TO "test\ value"]')
57
+ end
58
+
59
+ it 'scopes by greater than match with float' do
60
+ search do
61
+ with(:average_rating).greater_than 3.0
62
+ end
63
+ connection.should have_last_search_including(:fq, 'average_rating_ft:[3\.0 TO *]')
64
+ end
65
+
66
+ it 'scopes by short-form between match with integers' do
67
+ search do
68
+ with :blog_id, 2..4
69
+ end
70
+ connection.should have_last_search_including(:fq, 'blog_id_i:[2 TO 4]')
71
+ end
72
+
73
+ it 'scopes by between match with float' do
74
+ search do
75
+ with(:average_rating).between 2.0..4.0
76
+ end
77
+ connection.should have_last_search_including(:fq, 'average_rating_ft:[2\.0 TO 4\.0]')
78
+ end
79
+
80
+ it 'scopes by any match with integer' do
81
+ search do
82
+ with(:category_ids).any_of [2, 7, 12]
83
+ end
84
+ connection.should have_last_search_including(:fq, 'category_ids_im:(2 OR 7 OR 12)')
85
+ end
86
+
87
+ it 'scopes by short-form any-of match with integers' do
88
+ search do
89
+ with :category_ids, [2, 7, 12]
90
+ end
91
+ connection.should have_last_search_including(:fq, 'category_ids_im:(2 OR 7 OR 12)')
92
+ end
93
+
94
+ it 'scopes by all match with integer' do
95
+ search do
96
+ with(:category_ids).all_of [2, 7, 12]
97
+ end
98
+ connection.should have_last_search_including(:fq, 'category_ids_im:(2 AND 7 AND 12)')
99
+ end
100
+
101
+ it 'scopes by prefix match with string' do
102
+ search do
103
+ with(:title).starting_with('tes')
104
+ end
105
+ connection.should have_last_search_including(:fq, 'title_ss:tes*')
106
+ end
107
+
108
+ it 'scopes by not equal match with string' do
109
+ search do
110
+ without :title, 'Bad Post'
111
+ end
112
+ connection.should have_last_search_including(:fq, '-title_ss:Bad\ Post')
113
+ end
114
+
115
+ it 'scopes by not less than match with float' do
116
+ search do
117
+ without(:average_rating).less_than 3.0
118
+ end
119
+ connection.should have_last_search_including(:fq, '-average_rating_ft:[* TO 3\.0]')
120
+ end
121
+
122
+ it 'scopes by not greater than match with float' do
123
+ search do
124
+ without(:average_rating).greater_than 3.0
125
+ end
126
+ connection.should have_last_search_including(:fq, '-average_rating_ft:[3\.0 TO *]')
127
+ end
128
+
129
+ it 'scopes by not between match with shorthand' do
130
+ search do
131
+ without(:blog_id, 2..4)
132
+ end
133
+ connection.should have_last_search_including(:fq, '-blog_id_i:[2 TO 4]')
134
+ end
135
+
136
+ it 'scopes by not between match with float' do
137
+ search do
138
+ without(:average_rating).between 2.0..4.0
139
+ end
140
+ connection.should have_last_search_including(:fq, '-average_rating_ft:[2\.0 TO 4\.0]')
141
+ end
142
+
143
+ it 'scopes by not any match with integer' do
144
+ search do
145
+ without(:category_ids).any_of [2, 7, 12]
146
+ end
147
+ connection.should have_last_search_including(:fq, '-category_ids_im:(2 OR 7 OR 12)')
148
+ end
149
+
150
+ it 'scopes by not all match with integer' do
151
+ search do
152
+ without(:category_ids).all_of [2, 7, 12]
153
+ end
154
+ connection.should have_last_search_including(:fq, '-category_ids_im:(2 AND 7 AND 12)')
155
+ end
156
+
157
+ it 'scopes by empty field' do
158
+ search do
159
+ with :average_rating, nil
160
+ end
161
+ connection.should have_last_search_including(:fq, '-average_rating_ft:[* TO *]')
162
+ end
163
+
164
+ it 'scopes by non-empty field' do
165
+ search do
166
+ without :average_rating, nil
167
+ end
168
+ connection.should have_last_search_including(:fq, 'average_rating_ft:[* TO *]')
169
+ end
170
+
171
+ it 'includes by object identity' do
172
+ post = Post.new
173
+ search do
174
+ with post
175
+ end
176
+ connection.should have_last_search_including(:fq, "id:(Post\\ #{post.id})")
177
+ end
178
+
179
+ it 'includes multiple objects passed as varargs by object identity' do
180
+ post1, post2 = Post.new, Post.new
181
+ search do
182
+ with post1, post2
183
+ end
184
+ connection.should have_last_search_including(
185
+ :fq, "id:(Post\\ #{post1.id} OR Post\\ #{post2.id})"
186
+ )
187
+ end
188
+
189
+ it 'includes multiple objects passed as array by object identity' do
190
+ posts = [Post.new, Post.new]
191
+ search do
192
+ with posts
193
+ end
194
+ connection.should have_last_search_including(
195
+ :fq, "id:(Post\\ #{posts.first.id} OR Post\\ #{posts.last.id})"
196
+ )
197
+ end
198
+
199
+ it 'excludes by object identity' do
200
+ post = Post.new
201
+ search do
202
+ without post
203
+ end
204
+ connection.should have_last_search_including(:fq, "-id:(Post\\ #{post.id})")
205
+ end
206
+
207
+ it 'excludes multiple objects passed as varargs by object identity' do
208
+ post1, post2 = Post.new, Post.new
209
+ search do
210
+ without post1, post2
211
+ end
212
+ connection.should have_last_search_including(
213
+ :fq,
214
+ "-id:(Post\\ #{post1.id} OR Post\\ #{post2.id})"
215
+ )
216
+ end
217
+
218
+ it 'excludes multiple objects passed as array by object identity' do
219
+ posts = [Post.new, Post.new]
220
+ search do
221
+ without posts
222
+ end
223
+ connection.should have_last_search_including(
224
+ :fq,
225
+ "-id:(Post\\ #{posts.first.id} OR Post\\ #{posts.last.id})"
226
+ )
227
+ end
228
+
229
+ it 'allows scoping on fields common to all types' do
230
+ time = Time.parse('1983-07-08 05:00:00 -0400')
231
+ search Post, Namespaced::Comment do
232
+ with :published_at, time
233
+ end
234
+ connection.should have_last_search_including(:fq, 'published_at_dt:1983\-07\-08T09\:00\:00Z')
235
+ end
236
+
237
+ it 'allows scoping on field not common to all types' do
238
+ search Post, Namespaced::Comment do
239
+ with :blog_id, 1
240
+ end
241
+ connection.should have_last_search_including(:fq, 'blog_id_i:1')
242
+ end
243
+
244
+ it 'raises Sunspot::UnrecognizedFieldError if search scoped to field configured differently between types' do
245
+ lambda do
246
+ search Post, Namespaced::Comment do
247
+ with :average_rating, 2.2 # this is a float in Post but an integer in Comment
248
+ end
249
+ end.should raise_error(Sunspot::UnrecognizedFieldError)
250
+ end
251
+
252
+ it 'raises Sunspot::UnrecognizedFieldError for nonexistant fields in block scope' do
253
+ lambda do
254
+ search do
255
+ with :bogus, 'Field'
256
+ end
257
+ end.should raise_error(Sunspot::UnrecognizedFieldError)
258
+ end
259
+
260
+ it 'raises NoMethodError if bogus operator referenced' do
261
+ lambda do
262
+ search do
263
+ with(:category_ids).resembling :bogus_condition
264
+ end
265
+ end.should raise_error(NoMethodError)
266
+ end
267
+
268
+ it 'should raise ArgumentError if more than two arguments passed to scope method' do
269
+ lambda do
270
+ search do
271
+ with(:category_ids, 4, 5)
272
+ end
273
+ end.should raise_error(ArgumentError)
274
+ end
275
+ end
@@ -0,0 +1,27 @@
1
+ require 'bigdecimal'
2
+
3
+ shared_examples_for "spatial query" do
4
+ it 'filters by radius' do
5
+ search do
6
+ with(:coordinates_new).in_radius(23, -46, 100)
7
+ end
8
+
9
+ connection.should have_last_search_including(:fq, "{!geofilt sfield=coordinates_new_ll pt=23,-46 d=100}")
10
+ end
11
+
12
+ it 'filters by radius via bbox (inexact)' do
13
+ search do
14
+ with(:coordinates_new).in_radius(23, -46, 100, :bbox => true)
15
+ end
16
+
17
+ connection.should have_last_search_including(:fq, "{!bbox sfield=coordinates_new_ll pt=23,-46 d=100}")
18
+ end
19
+
20
+ it 'filters by bounding box' do
21
+ search do
22
+ with(:coordinates_new).in_bounding_box([45, -94], [46, -93])
23
+ end
24
+
25
+ connection.should have_last_search_including(:fq, "coordinates_new_ll:[45,-94 TO 46,-93]")
26
+ end
27
+ end
@@ -0,0 +1 @@
1
+ require File.expand_path('spec_helper', File.join(File.dirname(__FILE__), '..'))
@@ -0,0 +1,29 @@
1
+ require File.expand_path('spec_helper', File.dirname(__FILE__))
2
+
3
+ describe 'standard query', :type => :query do
4
+ it_should_behave_like "scoped query"
5
+ it_should_behave_like "query with advanced manipulation"
6
+ it_should_behave_like "query with connective scope"
7
+ it_should_behave_like "query with dynamic field support"
8
+ it_should_behave_like "facetable query"
9
+ it_should_behave_like "fulltext query"
10
+ it_should_behave_like "query with highlighting support"
11
+ it_should_behave_like "sortable query"
12
+ it_should_behave_like "query with text field scoping"
13
+ it_should_behave_like "geohash query"
14
+ it_should_behave_like "spatial query"
15
+
16
+ it 'adds a no-op query to :q parameter when no :q provided' do
17
+ session.search Post do
18
+ with :title, 'My Pet Post'
19
+ end
20
+ connection.should have_last_search_with(:q => '*:*')
21
+ end
22
+
23
+ private
24
+
25
+ def search(*classes, &block)
26
+ classes[0] ||= Post
27
+ session.search(*classes, &block)
28
+ end
29
+ end
@@ -0,0 +1,30 @@
1
+ shared_examples_for 'query with text field scoping' do
2
+ it 'should scope with a text field' do
3
+ search do
4
+ text_fields do
5
+ with(:body, 'test')
6
+ end
7
+ end
8
+ connection.should have_last_search_including(:fq, 'body_textsv:test')
9
+ end
10
+
11
+ it 'should raise an UnrecognizedFieldError if differently configured text field is used' do
12
+ lambda do
13
+ search(Post, Namespaced::Comment) do
14
+ text_fields do
15
+ with(:body, 'test')
16
+ end
17
+ end
18
+ end.should raise_error(Sunspot::UnrecognizedFieldError)
19
+ end
20
+
21
+ it 'should raise an UnrecognizedFieldError if no field exists' do
22
+ lambda do
23
+ search do
24
+ text_fields do
25
+ with(:bogus, 'test')
26
+ end
27
+ end
28
+ end.should raise_error(Sunspot::UnrecognizedFieldError)
29
+ end
30
+ end
@@ -0,0 +1,20 @@
1
+ describe 'typed query' do
2
+ it 'properly escapes namespaced type names' do
3
+ session.search(Namespaced::Comment)
4
+ connection.should have_last_search_with(:fq => ['type:Namespaced\:\:Comment'])
5
+ end
6
+
7
+ it 'builds search for multiple types' do
8
+ session.search(Post, Namespaced::Comment)
9
+ connection.should have_last_search_with(:fq => ['type:(Post OR Namespaced\:\:Comment)'])
10
+ end
11
+
12
+ it 'searches type of subclass when superclass is configured' do
13
+ session.search PhotoPost
14
+ connection.should have_last_search_with(:fq => ['type:PhotoPost'])
15
+ end
16
+
17
+ it 'raises an ArgumentError if no types given to search' do
18
+ lambda { session.search }.should raise_error(ArgumentError)
19
+ end
20
+ end
@@ -0,0 +1,33 @@
1
+ require File.expand_path('spec_helper', File.dirname(__FILE__))
2
+
3
+ describe 'search with dynamic fields' do
4
+ it 'returns dynamic string facet' do
5
+ stub_facet(:"custom_string:test_ss", 'two' => 2, 'one' => 1)
6
+ result = session.search(Post) { dynamic(:custom_string) { facet(:test) }}
7
+ result.facet(:custom_string, :test).rows.map { |row| row.value }.should == ['two', 'one']
8
+ end
9
+
10
+ it 'returns dynamic field facet with custom label' do
11
+ stub_facet(:"bogus", 'two' => 2, 'one' => 1)
12
+ result = session.search(Post) { dynamic(:custom_string) { facet(:test, :name => :bogus) }}
13
+ result.facet(:bogus).rows.map { |row| row.value }.should == ['two', 'one']
14
+ end
15
+
16
+ it 'returns query facet specified in dynamic call' do
17
+ stub_query_facet(
18
+ 'custom_string\:test_ss:(foo OR bar)' => 3
19
+ )
20
+ search = session.search(Post) do
21
+ dynamic :custom_string do
22
+ facet :test do
23
+ row :foo_bar do
24
+ with :test, %w(foo bar)
25
+ end
26
+ end
27
+ end
28
+ end
29
+ facet = search.facet(:test)
30
+ facet.rows.first.value.should == :foo_bar
31
+ facet.rows.first.count.should == 3
32
+ end
33
+ end