|
46 | 46 | it 'ranks better match above worse match' do
|
47 | 47 | results = Meilisearch::Rails.federated_search(
|
48 | 48 | queries: [
|
49 |
| - { q: 'Steve', class_name: 'Book' }, |
50 |
| - { q: 'black', class_name: 'Color' } |
| 49 | + { q: 'Steve', scope: Book.all }, |
| 50 | + { q: 'black', scope: Color.all } |
51 | 51 | ]
|
52 | 52 | )
|
53 | 53 |
|
|
57 | 57 |
|
58 | 58 | context 'when :index_uid is passed' do
|
59 | 59 | it 'takes precedence over other sources of index uids' do
|
60 |
| - Meilisearch::Rails.client.create_index('temp_books').await |
| 60 | + Meilisearch::Rails.client.create_index('temp_books') |
61 | 61 | Meilisearch::Rails.client.swap_indexes(['temp_books', Book.index.uid]).await
|
62 | 62 |
|
63 | 63 | results = Meilisearch::Rails.federated_search(
|
64 |
| - queries: [{ q: 'Moby', class_name: 'Book', index_uid: 'temp_books' }] |
| 64 | + queries: [{ q: 'Moby', scope: Book.all, index_uid: 'temp_books' }] |
65 | 65 | )
|
66 | 66 |
|
67 | 67 | expect(results).to contain_exactly(books['Moby Dick'])
|
|
70 | 70 | end
|
71 | 71 | end
|
72 | 72 |
|
73 |
| - context 'when :class_name is passed' do |
74 |
| - it 'returns ORM records with inferred index names' do |
75 |
| - results = Meilisearch::Rails.federated_search( |
76 |
| - queries: [ |
77 |
| - { q: 'Steve', class_name: 'Book' }, |
78 |
| - { q: 'palm', class_name: 'Product' }, |
79 |
| - { q: 'bl', class_name: 'Color' } |
80 |
| - ] |
81 |
| - ) |
| 73 | + context 'when :scope is passed' do |
| 74 | + context 'when :scope is a model' do |
| 75 | + it 'returns ORM records with inferred index names' do |
| 76 | + results = Meilisearch::Rails.federated_search( |
| 77 | + queries: [ |
| 78 | + { q: 'Steve', scope: Book }, |
| 79 | + { q: 'palm', scope: Product }, |
| 80 | + { q: 'bl', scope: Color } |
| 81 | + ] |
| 82 | + ) |
82 | 83 |
|
83 |
| - expect(results).to contain_exactly( |
84 |
| - books['Steve Jobs'], products['palmpre'], products['palm pixi plus'], colors['blue'], colors['black'] |
85 |
| - ) |
| 84 | + expect(results).to contain_exactly( |
| 85 | + books['Steve Jobs'], products['palmpre'], products['palm pixi plus'], colors['blue'], colors['black'] |
| 86 | + ) |
| 87 | + end |
| 88 | + end |
| 89 | + |
| 90 | + context 'when :scope is a Relation' do |
| 91 | + it 'returns results within scope' do |
| 92 | + results = Meilisearch::Rails.federated_search( |
| 93 | + queries: [ |
| 94 | + { q: 'Steve', scope: Book }, |
| 95 | + { q: 'palm', scope: Product.where(name: 'palmpre') }, |
| 96 | + { q: 'bl', scope: Color } |
| 97 | + ] |
| 98 | + ) |
| 99 | + |
| 100 | + expect(results).to contain_exactly( |
| 101 | + books['Steve Jobs'], products['palmpre'], colors['blue'], colors['black'] |
| 102 | + ) |
| 103 | + end |
86 | 104 | end
|
87 | 105 | end
|
88 | 106 |
|
89 |
| - context 'without :class_name' do |
| 107 | + context 'without :scope' do |
90 | 108 | it 'returns raw hashes' do
|
91 | 109 | results = Meilisearch::Rails.federated_search(
|
92 | 110 | queries: [{ q: 'Steve', index_uid: Book.index.uid }]
|
|
99 | 117 |
|
100 | 118 | context 'with queries passed as a hash' do
|
101 | 119 | context 'when the keys are index names' do
|
102 |
| - it 'loads the right models with :class_name' do |
| 120 | + it 'loads the right models with :scope' do |
103 | 121 | Meilisearch::Rails.client.create_index('temp_books').await
|
104 | 122 | Meilisearch::Rails.client.swap_indexes(['temp_books', Book.index.uid]).await
|
105 | 123 |
|
106 | 124 | results = Meilisearch::Rails.federated_search(
|
107 | 125 | queries: {
|
108 |
| - 'temp_books' => { q: 'Steve', class_name: 'Book' } |
| 126 | + 'temp_books' => { q: 'Steve', scope: Book } |
109 | 127 | }
|
110 | 128 | )
|
111 | 129 |
|
|
114 | 132 | Meilisearch::Rails.client.delete_index('temp_books')
|
115 | 133 | end
|
116 | 134 |
|
117 |
| - it 'returns hashes without :class_name' do |
| 135 | + it 'returns hashes without :scope' do |
118 | 136 | results = Meilisearch::Rails.federated_search(
|
119 | 137 | queries: {
|
120 | 138 | Book.index.uid => { q: 'Steve' }
|
|
159 | 177 |
|
160 | 178 | results = Meilisearch::Rails.federated_search(
|
161 | 179 | queries: {
|
162 |
| - classics: { q: 'Moby', class_name: 'Book', index_uid: 'temp_books' } |
| 180 | + classics: { q: 'Moby', scope: Book, index_uid: 'temp_books' } |
163 | 181 | }
|
164 | 182 | )
|
165 | 183 |
|
|
171 | 189 | it 'requires :index_uid to search the correct index' do
|
172 | 190 | expect do
|
173 | 191 | Meilisearch::Rails.federated_search(
|
174 |
| - queries: { all_books: { q: 'Moby', class_name: 'Book' } } |
| 192 | + queries: { all_books: { q: 'Moby', scope: Book } } |
175 | 193 | )
|
176 | 194 | end.to raise_error(Meilisearch::ApiError).with_message(/Index `all_books` not found/)
|
177 | 195 | end
|
|
185 | 203 | allow(Meilisearch::Rails).to receive(:logger).and_return(logger)
|
186 | 204 | end
|
187 | 205 |
|
188 |
| - it 'warns if query has pagination options' do |
| 206 | + it 'warns if query has pagination options, but completes the search anyway' do |
189 | 207 | results = Meilisearch::Rails.federated_search(
|
190 | 208 | queries: [
|
191 |
| - { q: 'Steve', class_name: 'Book', limit: 1 }, |
192 |
| - { q: 'No results please', class_name: 'Book', offset: 1 }, |
193 |
| - { q: 'No results please', class_name: 'Book', hits_per_page: 1 }, |
194 |
| - { q: 'No results please', class_name: 'Book', page: 1 } |
| 209 | + { q: 'Steve', scope: Book, limit: 1 }, |
| 210 | + { q: 'No results please', scope: Book, offset: 1 }, |
| 211 | + { q: 'No results please', scope: Book, hits_per_page: 1 }, |
| 212 | + { q: 'No results please', scope: Book, page: 1 } |
195 | 213 | ]
|
196 | 214 | )
|
197 | 215 |
|
|
203 | 221 | expect(results).to contain_exactly(books['Steve Jobs'])
|
204 | 222 | end
|
205 | 223 |
|
206 |
| - it 'warns if :class_name argument is not a meilisearch model' do |
| 224 | + it 'warns if :scope model is not a meilisearch model' do |
207 | 225 | results = Meilisearch::Rails.federated_search(
|
208 |
| - queries: [{ q: 'Steve', class_name: 'String' }] |
| 226 | + queries: [{ q: 'Steve', scope: String }] |
209 | 227 | )
|
210 | 228 |
|
211 | 229 | expect(logger).to have_received('warn').with(a_string_including('does not have an #index'))
|
212 | 230 | expect(results).to be_empty
|
213 | 231 | end
|
214 | 232 |
|
215 |
| - it 'warns if :federation argument is nil' do |
| 233 | + it 'warns if :federation argument is nil, but completes search anyway' do |
216 | 234 | # This would disable federated search if not caught
|
217 | 235 | results = Meilisearch::Rails.federated_search(
|
218 |
| - queries: [{ q: 'Steve', class_name: 'Book' }], |
| 236 | + queries: [{ q: 'Steve', scope: Book }], |
219 | 237 | federation: nil
|
220 | 238 | )
|
221 | 239 |
|
|
0 commit comments