|
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