pg_search 2.1.2 → 2.3.6
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 +5 -5
- data/.codeclimate.yml +1 -0
- data/.editorconfig +10 -0
- data/.github/dependabot.yml +11 -0
- data/.github/workflows/ci.yml +75 -0
- data/.jrubyrc +1 -0
- data/.rubocop.yml +95 -10
- data/.travis.yml +26 -48
- data/CHANGELOG.md +179 -112
- data/CODE_OF_CONDUCT.md +76 -0
- data/CONTRIBUTING.md +5 -3
- data/Gemfile +6 -4
- data/LICENSE +1 -1
- data/README.md +307 -198
- data/Rakefile +7 -3
- data/lib/pg_search/configuration/association.rb +2 -0
- data/lib/pg_search/configuration/column.rb +2 -0
- data/lib/pg_search/configuration/foreign_column.rb +2 -0
- data/lib/pg_search/configuration.rb +20 -6
- data/lib/pg_search/document.rb +7 -5
- data/lib/pg_search/features/dmetaphone.rb +7 -7
- data/lib/pg_search/features/feature.rb +4 -2
- data/lib/pg_search/features/trigram.rb +31 -5
- data/lib/pg_search/features/tsearch.rb +18 -14
- data/lib/pg_search/features.rb +2 -0
- data/lib/pg_search/migration/dmetaphone_generator.rb +3 -1
- data/lib/pg_search/migration/generator.rb +4 -2
- data/lib/pg_search/migration/multisearch_generator.rb +2 -1
- data/lib/pg_search/migration/templates/add_pg_search_dmetaphone_support_functions.rb.erb +6 -6
- data/lib/pg_search/migration/templates/create_pg_search_documents.rb.erb +3 -3
- data/lib/pg_search/model.rb +57 -0
- data/lib/pg_search/multisearch/rebuilder.rb +14 -6
- data/lib/pg_search/multisearch.rb +23 -6
- data/lib/pg_search/multisearchable.rb +10 -6
- data/lib/pg_search/normalizer.rb +2 -0
- data/lib/pg_search/railtie.rb +2 -0
- data/lib/pg_search/scope_options.rb +26 -49
- data/lib/pg_search/tasks.rb +5 -1
- data/lib/pg_search/version.rb +3 -1
- data/lib/pg_search.rb +17 -55
- data/pg_search.gemspec +19 -11
- data/spec/.rubocop.yml +2 -2
- data/spec/integration/.rubocop.yml +11 -0
- data/spec/integration/associations_spec.rb +125 -162
- data/spec/integration/deprecation_spec.rb +33 -0
- data/spec/integration/pagination_spec.rb +10 -8
- data/spec/integration/pg_search_spec.rb +359 -306
- data/spec/integration/single_table_inheritance_spec.rb +18 -17
- data/spec/lib/pg_search/configuration/association_spec.rb +17 -13
- data/spec/lib/pg_search/configuration/column_spec.rb +2 -0
- data/spec/lib/pg_search/configuration/foreign_column_spec.rb +6 -4
- data/spec/lib/pg_search/features/dmetaphone_spec.rb +6 -4
- data/spec/lib/pg_search/features/trigram_spec.rb +51 -20
- data/spec/lib/pg_search/features/tsearch_spec.rb +29 -21
- data/spec/lib/pg_search/multisearch/rebuilder_spec.rb +151 -85
- data/spec/lib/pg_search/multisearch_spec.rb +67 -37
- data/spec/lib/pg_search/multisearchable_spec.rb +217 -123
- data/spec/lib/pg_search/normalizer_spec.rb +14 -10
- data/spec/lib/pg_search_spec.rb +102 -89
- data/spec/spec_helper.rb +25 -6
- data/spec/support/database.rb +19 -21
- data/spec/support/with_model.rb +2 -0
- metadata +106 -29
- data/.autotest +0 -5
- data/.rubocop_todo.yml +0 -163
- data/Guardfile +0 -6
@@ -1,7 +1,10 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require "spec_helper"
|
2
4
|
|
3
|
-
|
4
|
-
|
5
|
+
# rubocop:disable RSpec/NestedGroups
|
6
|
+
describe "a pg_search_scope" do
|
7
|
+
context "when joining to another table" do
|
5
8
|
context "without an :against" do
|
6
9
|
with_model :AssociatedModel do
|
7
10
|
table do |t|
|
@@ -12,25 +15,25 @@ describe PgSearch do
|
|
12
15
|
with_model :ModelWithoutAgainst do
|
13
16
|
table do |t|
|
14
17
|
t.string "title"
|
15
|
-
t.belongs_to :another_model, :
|
18
|
+
t.belongs_to :another_model, index: false
|
16
19
|
end
|
17
20
|
|
18
21
|
model do
|
19
|
-
include PgSearch
|
20
|
-
belongs_to :another_model, :
|
22
|
+
include PgSearch::Model
|
23
|
+
belongs_to :another_model, class_name: 'AssociatedModel'
|
21
24
|
|
22
|
-
pg_search_scope :with_another, :
|
25
|
+
pg_search_scope :with_another, associated_against: { another_model: :title }
|
23
26
|
end
|
24
27
|
end
|
25
28
|
|
26
29
|
it "returns rows that match the query in the columns of the associated model only" do
|
27
|
-
associated = AssociatedModel.create!(:
|
30
|
+
associated = AssociatedModel.create!(title: 'abcdef')
|
28
31
|
included = [
|
29
|
-
ModelWithoutAgainst.create!(:
|
30
|
-
ModelWithoutAgainst.create!(:
|
32
|
+
ModelWithoutAgainst.create!(title: 'abcdef', another_model: associated),
|
33
|
+
ModelWithoutAgainst.create!(title: 'ghijkl', another_model: associated)
|
31
34
|
]
|
32
35
|
excluded = [
|
33
|
-
ModelWithoutAgainst.create!(:
|
36
|
+
ModelWithoutAgainst.create!(title: 'abcdef')
|
34
37
|
]
|
35
38
|
|
36
39
|
results = ModelWithoutAgainst.with_another('abcdef')
|
@@ -39,7 +42,7 @@ describe PgSearch do
|
|
39
42
|
end
|
40
43
|
end
|
41
44
|
|
42
|
-
context "
|
45
|
+
context "via a belongs_to association" do
|
43
46
|
with_model :AssociatedModel do
|
44
47
|
table do |t|
|
45
48
|
t.string 'title'
|
@@ -53,21 +56,21 @@ describe PgSearch do
|
|
53
56
|
end
|
54
57
|
|
55
58
|
model do
|
56
|
-
include PgSearch
|
57
|
-
belongs_to :another_model, :
|
59
|
+
include PgSearch::Model
|
60
|
+
belongs_to :another_model, class_name: 'AssociatedModel'
|
58
61
|
|
59
|
-
pg_search_scope :with_associated, :
|
62
|
+
pg_search_scope :with_associated, against: :title, associated_against: { another_model: :title }
|
60
63
|
end
|
61
64
|
end
|
62
65
|
|
63
66
|
it "returns rows that match the query in either its own columns or the columns of the associated model" do
|
64
|
-
associated = AssociatedModel.create!(:
|
67
|
+
associated = AssociatedModel.create!(title: 'abcdef')
|
65
68
|
included = [
|
66
|
-
ModelWithBelongsTo.create!(:
|
67
|
-
ModelWithBelongsTo.create!(:
|
69
|
+
ModelWithBelongsTo.create!(title: 'ghijkl', another_model: associated),
|
70
|
+
ModelWithBelongsTo.create!(title: 'abcdef')
|
68
71
|
]
|
69
|
-
excluded = ModelWithBelongsTo.create!(:
|
70
|
-
:
|
72
|
+
excluded = ModelWithBelongsTo.create!(title: 'mnopqr',
|
73
|
+
another_model: AssociatedModel.create!(title: 'stuvwx'))
|
71
74
|
|
72
75
|
results = ModelWithBelongsTo.with_associated('abcdef')
|
73
76
|
expect(results.map(&:title)).to match_array(included.map(&:title))
|
@@ -75,7 +78,7 @@ describe PgSearch do
|
|
75
78
|
end
|
76
79
|
end
|
77
80
|
|
78
|
-
context "
|
81
|
+
context "via a has_many association" do
|
79
82
|
with_model :AssociatedModelWithHasMany do
|
80
83
|
table do |t|
|
81
84
|
t.string 'title'
|
@@ -89,27 +92,27 @@ describe PgSearch do
|
|
89
92
|
end
|
90
93
|
|
91
94
|
model do
|
92
|
-
include PgSearch
|
93
|
-
has_many :other_models, :
|
95
|
+
include PgSearch::Model
|
96
|
+
has_many :other_models, class_name: 'AssociatedModelWithHasMany', foreign_key: 'ModelWithHasMany_id'
|
94
97
|
|
95
|
-
pg_search_scope :with_associated, :
|
98
|
+
pg_search_scope :with_associated, against: [:title], associated_against: { other_models: :title }
|
96
99
|
end
|
97
100
|
end
|
98
101
|
|
99
102
|
it "returns rows that match the query in either its own columns or the columns of the associated model" do
|
100
103
|
included = [
|
101
|
-
ModelWithHasMany.create!(:
|
102
|
-
AssociatedModelWithHasMany.create!(:
|
103
|
-
AssociatedModelWithHasMany.create!(:
|
104
|
+
ModelWithHasMany.create!(title: 'abcdef', other_models: [
|
105
|
+
AssociatedModelWithHasMany.create!(title: 'foo'),
|
106
|
+
AssociatedModelWithHasMany.create!(title: 'bar')
|
104
107
|
]),
|
105
|
-
ModelWithHasMany.create!(:
|
106
|
-
AssociatedModelWithHasMany.create!(:
|
107
|
-
AssociatedModelWithHasMany.create!(:
|
108
|
+
ModelWithHasMany.create!(title: 'ghijkl', other_models: [
|
109
|
+
AssociatedModelWithHasMany.create!(title: 'foo bar'),
|
110
|
+
AssociatedModelWithHasMany.create!(title: 'mnopqr')
|
108
111
|
]),
|
109
|
-
ModelWithHasMany.create!(:
|
112
|
+
ModelWithHasMany.create!(title: 'foo bar')
|
110
113
|
]
|
111
|
-
excluded = ModelWithHasMany.create!(:
|
112
|
-
AssociatedModelWithHasMany.create!(:
|
114
|
+
excluded = ModelWithHasMany.create!(title: 'stuvwx', other_models: [
|
115
|
+
AssociatedModelWithHasMany.create!(title: 'abcdef')
|
113
116
|
])
|
114
117
|
|
115
118
|
results = ModelWithHasMany.with_associated('foo bar')
|
@@ -118,14 +121,14 @@ describe PgSearch do
|
|
118
121
|
end
|
119
122
|
|
120
123
|
it "uses an unscoped relation of the associated model" do
|
121
|
-
excluded = ModelWithHasMany.create!(:
|
122
|
-
AssociatedModelWithHasMany.create!(:
|
124
|
+
excluded = ModelWithHasMany.create!(title: 'abcdef', other_models: [
|
125
|
+
AssociatedModelWithHasMany.create!(title: 'abcdef')
|
123
126
|
])
|
124
127
|
|
125
128
|
included = [
|
126
|
-
ModelWithHasMany.create!(:
|
127
|
-
AssociatedModelWithHasMany.create!(:
|
128
|
-
AssociatedModelWithHasMany.create!(:
|
129
|
+
ModelWithHasMany.create!(title: 'abcdef', other_models: [
|
130
|
+
AssociatedModelWithHasMany.create!(title: 'foo'),
|
131
|
+
AssociatedModelWithHasMany.create!(title: 'bar')
|
129
132
|
])
|
130
133
|
]
|
131
134
|
|
@@ -139,8 +142,8 @@ describe PgSearch do
|
|
139
142
|
end
|
140
143
|
end
|
141
144
|
|
142
|
-
context "across multiple associations" do
|
143
|
-
context "on different tables" do
|
145
|
+
context "when across multiple associations" do
|
146
|
+
context "when on different tables" do
|
144
147
|
with_model :FirstAssociatedModel do
|
145
148
|
table do |t|
|
146
149
|
t.string 'title'
|
@@ -161,42 +164,42 @@ describe PgSearch do
|
|
161
164
|
end
|
162
165
|
|
163
166
|
model do
|
164
|
-
include PgSearch
|
167
|
+
include PgSearch::Model
|
165
168
|
|
166
169
|
has_many :models_of_first_type,
|
167
|
-
|
168
|
-
|
170
|
+
class_name: 'FirstAssociatedModel',
|
171
|
+
foreign_key: 'ModelWithManyAssociations_id'
|
169
172
|
|
170
173
|
belongs_to :model_of_second_type,
|
171
|
-
|
174
|
+
class_name: 'SecondAssociatedModel'
|
172
175
|
|
173
176
|
pg_search_scope :with_associated,
|
174
|
-
|
175
|
-
|
177
|
+
against: :title,
|
178
|
+
associated_against: { models_of_first_type: :title, model_of_second_type: :title }
|
176
179
|
end
|
177
180
|
end
|
178
181
|
|
179
182
|
it "returns rows that match the query in either its own columns or the columns of the associated model" do
|
180
|
-
matching_second = SecondAssociatedModel.create!(:
|
181
|
-
unmatching_second = SecondAssociatedModel.create!(:
|
183
|
+
matching_second = SecondAssociatedModel.create!(title: "foo bar")
|
184
|
+
unmatching_second = SecondAssociatedModel.create!(title: "uiop")
|
182
185
|
|
183
186
|
included = [
|
184
|
-
ModelWithManyAssociations.create!(:
|
185
|
-
FirstAssociatedModel.create!(:
|
186
|
-
FirstAssociatedModel.create!(:
|
187
|
+
ModelWithManyAssociations.create!(title: 'abcdef', models_of_first_type: [
|
188
|
+
FirstAssociatedModel.create!(title: 'foo'),
|
189
|
+
FirstAssociatedModel.create!(title: 'bar')
|
187
190
|
]),
|
188
|
-
ModelWithManyAssociations.create!(:
|
189
|
-
FirstAssociatedModel.create!(:
|
190
|
-
FirstAssociatedModel.create!(:
|
191
|
+
ModelWithManyAssociations.create!(title: 'ghijkl', models_of_first_type: [
|
192
|
+
FirstAssociatedModel.create!(title: 'foo bar'),
|
193
|
+
FirstAssociatedModel.create!(title: 'mnopqr')
|
191
194
|
]),
|
192
|
-
ModelWithManyAssociations.create!(:
|
193
|
-
ModelWithManyAssociations.create!(:
|
195
|
+
ModelWithManyAssociations.create!(title: 'foo bar'),
|
196
|
+
ModelWithManyAssociations.create!(title: 'qwerty', model_of_second_type: matching_second)
|
194
197
|
]
|
195
198
|
excluded = [
|
196
|
-
ModelWithManyAssociations.create!(:
|
197
|
-
FirstAssociatedModel.create!(:
|
199
|
+
ModelWithManyAssociations.create!(title: 'stuvwx', models_of_first_type: [
|
200
|
+
FirstAssociatedModel.create!(title: 'abcdef')
|
198
201
|
]),
|
199
|
-
ModelWithManyAssociations.create!(:
|
202
|
+
ModelWithManyAssociations.create!(title: 'qwerty', model_of_second_type: unmatching_second)
|
200
203
|
]
|
201
204
|
|
202
205
|
results = ModelWithManyAssociations.with_associated('foo bar')
|
@@ -205,7 +208,7 @@ describe PgSearch do
|
|
205
208
|
end
|
206
209
|
end
|
207
210
|
|
208
|
-
context "on the same table" do
|
211
|
+
context "when on the same table" do
|
209
212
|
with_model :DoublyAssociatedModel do
|
210
213
|
table do |t|
|
211
214
|
t.string 'title'
|
@@ -220,42 +223,42 @@ describe PgSearch do
|
|
220
223
|
end
|
221
224
|
|
222
225
|
model do
|
223
|
-
include PgSearch
|
226
|
+
include PgSearch::Model
|
224
227
|
|
225
228
|
has_many :things,
|
226
|
-
|
227
|
-
|
229
|
+
class_name: 'DoublyAssociatedModel',
|
230
|
+
foreign_key: 'ModelWithDoubleAssociation_id'
|
228
231
|
|
229
232
|
has_many :thingamabobs,
|
230
|
-
|
231
|
-
|
233
|
+
class_name: 'DoublyAssociatedModel',
|
234
|
+
foreign_key: 'ModelWithDoubleAssociation_again_id'
|
232
235
|
|
233
|
-
pg_search_scope :with_associated, :
|
234
|
-
:
|
236
|
+
pg_search_scope :with_associated, against: :title,
|
237
|
+
associated_against: { things: :title, thingamabobs: :title }
|
235
238
|
end
|
236
239
|
end
|
237
240
|
|
238
241
|
it "returns rows that match the query in either its own columns or the columns of the associated model" do
|
239
242
|
included = [
|
240
|
-
ModelWithDoubleAssociation.create!(:
|
241
|
-
DoublyAssociatedModel.create!(:
|
242
|
-
DoublyAssociatedModel.create!(:
|
243
|
+
ModelWithDoubleAssociation.create!(title: 'abcdef', things: [
|
244
|
+
DoublyAssociatedModel.create!(title: 'foo'),
|
245
|
+
DoublyAssociatedModel.create!(title: 'bar')
|
243
246
|
]),
|
244
|
-
ModelWithDoubleAssociation.create!(:
|
245
|
-
DoublyAssociatedModel.create!(:
|
246
|
-
DoublyAssociatedModel.create!(:
|
247
|
+
ModelWithDoubleAssociation.create!(title: 'ghijkl', things: [
|
248
|
+
DoublyAssociatedModel.create!(title: 'foo bar'),
|
249
|
+
DoublyAssociatedModel.create!(title: 'mnopqr')
|
247
250
|
]),
|
248
|
-
ModelWithDoubleAssociation.create!(:
|
249
|
-
ModelWithDoubleAssociation.create!(:
|
250
|
-
DoublyAssociatedModel.create!(:
|
251
|
+
ModelWithDoubleAssociation.create!(title: 'foo bar'),
|
252
|
+
ModelWithDoubleAssociation.create!(title: 'qwerty', thingamabobs: [
|
253
|
+
DoublyAssociatedModel.create!(title: "foo bar")
|
251
254
|
])
|
252
255
|
]
|
253
256
|
excluded = [
|
254
|
-
ModelWithDoubleAssociation.create!(:
|
255
|
-
DoublyAssociatedModel.create!(:
|
257
|
+
ModelWithDoubleAssociation.create!(title: 'stuvwx', things: [
|
258
|
+
DoublyAssociatedModel.create!(title: 'abcdef')
|
256
259
|
]),
|
257
|
-
ModelWithDoubleAssociation.create!(:
|
258
|
-
DoublyAssociatedModel.create!(:
|
260
|
+
ModelWithDoubleAssociation.create!(title: 'qwerty', thingamabobs: [
|
261
|
+
DoublyAssociatedModel.create!(title: "uiop")
|
259
262
|
])
|
260
263
|
]
|
261
264
|
|
@@ -266,7 +269,7 @@ describe PgSearch do
|
|
266
269
|
end
|
267
270
|
end
|
268
271
|
|
269
|
-
context "against multiple attributes on one association" do
|
272
|
+
context "when against multiple attributes on one association" do
|
270
273
|
with_model :AssociatedModel do
|
271
274
|
table do |t|
|
272
275
|
t.string 'title'
|
@@ -280,33 +283,33 @@ describe PgSearch do
|
|
280
283
|
end
|
281
284
|
|
282
285
|
model do
|
283
|
-
include PgSearch
|
284
|
-
belongs_to :another_model, :
|
286
|
+
include PgSearch::Model
|
287
|
+
belongs_to :another_model, class_name: 'AssociatedModel'
|
285
288
|
|
286
|
-
pg_search_scope :with_associated, :
|
289
|
+
pg_search_scope :with_associated, associated_against: { another_model: %i[title author] }
|
287
290
|
end
|
288
291
|
end
|
289
292
|
|
290
|
-
it "
|
293
|
+
it "joins only once" do
|
291
294
|
included = [
|
292
295
|
ModelWithAssociation.create!(
|
293
|
-
:
|
294
|
-
:
|
295
|
-
:
|
296
|
+
another_model: AssociatedModel.create!(
|
297
|
+
title: "foo",
|
298
|
+
author: "bar"
|
296
299
|
)
|
297
300
|
),
|
298
301
|
ModelWithAssociation.create!(
|
299
|
-
:
|
300
|
-
:
|
301
|
-
:
|
302
|
+
another_model: AssociatedModel.create!(
|
303
|
+
title: "foo bar",
|
304
|
+
author: "baz"
|
302
305
|
)
|
303
306
|
)
|
304
307
|
]
|
305
308
|
excluded = [
|
306
309
|
ModelWithAssociation.create!(
|
307
|
-
:
|
308
|
-
:
|
309
|
-
:
|
310
|
+
another_model: AssociatedModel.create!(
|
311
|
+
title: "foo",
|
312
|
+
author: "baz"
|
310
313
|
)
|
311
314
|
)
|
312
315
|
]
|
@@ -319,7 +322,7 @@ describe PgSearch do
|
|
319
322
|
end
|
320
323
|
end
|
321
324
|
|
322
|
-
context "against non-text columns" do
|
325
|
+
context "when against non-text columns" do
|
323
326
|
with_model :AssociatedModel do
|
324
327
|
table do |t|
|
325
328
|
t.integer 'number'
|
@@ -333,21 +336,21 @@ describe PgSearch do
|
|
333
336
|
end
|
334
337
|
|
335
338
|
model do
|
336
|
-
include PgSearch
|
339
|
+
include PgSearch::Model
|
337
340
|
belongs_to :another_model, class_name: 'AssociatedModel'
|
338
341
|
|
339
|
-
pg_search_scope :with_associated, associated_against: {another_model: :number}
|
342
|
+
pg_search_scope :with_associated, associated_against: { another_model: :number }
|
340
343
|
end
|
341
344
|
end
|
342
345
|
|
343
|
-
it "
|
344
|
-
associated = AssociatedModel.create!(:
|
346
|
+
it "casts the columns to text" do
|
347
|
+
associated = AssociatedModel.create!(number: 123)
|
345
348
|
included = [
|
346
|
-
Model.create!(:
|
347
|
-
Model.create!(:
|
349
|
+
Model.create!(number: 123, another_model: associated),
|
350
|
+
Model.create!(number: 456, another_model: associated)
|
348
351
|
]
|
349
352
|
excluded = [
|
350
|
-
Model.create!(:
|
353
|
+
Model.create!(number: 123)
|
351
354
|
]
|
352
355
|
|
353
356
|
results = Model.with_associated('123')
|
@@ -364,8 +367,8 @@ describe PgSearch do
|
|
364
367
|
|
365
368
|
model do
|
366
369
|
has_many :children
|
367
|
-
include PgSearch
|
368
|
-
pg_search_scope :search_name, :
|
370
|
+
include PgSearch::Model
|
371
|
+
pg_search_scope :search_name, against: :name
|
369
372
|
end
|
370
373
|
end
|
371
374
|
|
@@ -381,8 +384,8 @@ describe PgSearch do
|
|
381
384
|
|
382
385
|
# https://github.com/Casecommons/pg_search/issues/14
|
383
386
|
it "supports queries with periods" do
|
384
|
-
included = Parent.create!(:
|
385
|
-
excluded = Parent.create!(:
|
387
|
+
included = Parent.create!(name: 'bar.foo')
|
388
|
+
excluded = Parent.create!(name: 'foo.bar')
|
386
389
|
|
387
390
|
results = Parent.search_name('bar.foo').includes(:children)
|
388
391
|
results.to_a
|
@@ -393,7 +396,7 @@ describe PgSearch do
|
|
393
396
|
end
|
394
397
|
end
|
395
398
|
|
396
|
-
context "merging a pg_search_scope into another model's scope" do
|
399
|
+
context "when merging a pg_search_scope into another model's scope" do
|
397
400
|
with_model :ModelWithAssociation do
|
398
401
|
model do
|
399
402
|
has_many :associated_models
|
@@ -407,27 +410,27 @@ describe PgSearch do
|
|
407
410
|
end
|
408
411
|
|
409
412
|
model do
|
410
|
-
include PgSearch
|
413
|
+
include PgSearch::Model
|
411
414
|
belongs_to :model_with_association
|
412
415
|
|
413
|
-
pg_search_scope :search_content, :
|
416
|
+
pg_search_scope :search_content, against: :content
|
414
417
|
end
|
415
418
|
end
|
416
419
|
|
417
|
-
it "
|
418
|
-
included_associated_1 = AssociatedModel.create(:
|
419
|
-
included_associated_2 = AssociatedModel.create(:
|
420
|
-
excluded_associated_1 = AssociatedModel.create(:
|
421
|
-
excluded_associated_2 = AssociatedModel.create(:
|
420
|
+
it "finds records of the other model" do
|
421
|
+
included_associated_1 = AssociatedModel.create(content: "foo bar")
|
422
|
+
included_associated_2 = AssociatedModel.create(content: "foo baz")
|
423
|
+
excluded_associated_1 = AssociatedModel.create(content: "baz quux")
|
424
|
+
excluded_associated_2 = AssociatedModel.create(content: "baz bar")
|
422
425
|
|
423
426
|
included = [
|
424
|
-
ModelWithAssociation.create(:
|
425
|
-
ModelWithAssociation.create(:
|
427
|
+
ModelWithAssociation.create(associated_models: [included_associated_1]),
|
428
|
+
ModelWithAssociation.create(associated_models: [included_associated_2, excluded_associated_1])
|
426
429
|
]
|
427
430
|
|
428
431
|
excluded = [
|
429
|
-
ModelWithAssociation.create(:
|
430
|
-
ModelWithAssociation.create(:
|
432
|
+
ModelWithAssociation.create(associated_models: [excluded_associated_2]),
|
433
|
+
ModelWithAssociation.create(associated_models: [])
|
431
434
|
]
|
432
435
|
|
433
436
|
relation = AssociatedModel.search_content("foo")
|
@@ -439,48 +442,7 @@ describe PgSearch do
|
|
439
442
|
end
|
440
443
|
end
|
441
444
|
|
442
|
-
context "chained onto a has_many association" do
|
443
|
-
with_model :Company do
|
444
|
-
model do
|
445
|
-
has_many :positions
|
446
|
-
end
|
447
|
-
end
|
448
|
-
|
449
|
-
with_model :Position do
|
450
|
-
table do |t|
|
451
|
-
t.string :title
|
452
|
-
t.belongs_to :company
|
453
|
-
end
|
454
|
-
|
455
|
-
model do
|
456
|
-
include PgSearch
|
457
|
-
pg_search_scope :search, :against => :title, :using => %i[tsearch trigram]
|
458
|
-
end
|
459
|
-
end
|
460
|
-
|
461
|
-
# https://github.com/Casecommons/pg_search/issues/106
|
462
|
-
it "should handle numbers in a trigram query properly" do
|
463
|
-
company = Company.create!
|
464
|
-
another_company = Company.create!
|
465
|
-
|
466
|
-
included = [
|
467
|
-
Position.create!(:company_id => company.id, :title => "teller 1")
|
468
|
-
]
|
469
|
-
|
470
|
-
excluded = [
|
471
|
-
Position.create!(:company_id => nil, :title => "teller 1"),
|
472
|
-
Position.create!(:company_id => another_company.id, :title => "teller 1"),
|
473
|
-
Position.create!(:company_id => company.id, :title => "penn 1")
|
474
|
-
]
|
475
|
-
|
476
|
-
results = company.positions.search('teller 1')
|
477
|
-
|
478
|
-
expect(results).to include(*included)
|
479
|
-
expect(results).not_to include(*excluded)
|
480
|
-
end
|
481
|
-
end
|
482
|
-
|
483
|
-
context "chained onto a has_many association" do
|
445
|
+
context "when chained onto a has_many association" do
|
484
446
|
with_model :Company do
|
485
447
|
model do
|
486
448
|
has_many :positions
|
@@ -494,13 +456,13 @@ describe PgSearch do
|
|
494
456
|
end
|
495
457
|
|
496
458
|
model do
|
497
|
-
include PgSearch
|
498
|
-
pg_search_scope :search, :
|
459
|
+
include PgSearch::Model
|
460
|
+
pg_search_scope :search, against: :title, using: %i[tsearch trigram]
|
499
461
|
end
|
500
462
|
end
|
501
463
|
|
502
464
|
# https://github.com/Casecommons/pg_search/issues/106
|
503
|
-
it "
|
465
|
+
it "handles numbers in a trigram query properly" do
|
504
466
|
company = Company.create!
|
505
467
|
another_company = Company.create!
|
506
468
|
|
@@ -522,3 +484,4 @@ describe PgSearch do
|
|
522
484
|
end
|
523
485
|
end
|
524
486
|
end
|
487
|
+
# rubocop:enable RSpec/NestedGroups
|
@@ -0,0 +1,33 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "spec_helper"
|
4
|
+
|
5
|
+
describe "Including the deprecated PgSearch module" do
|
6
|
+
with_model :SomeModel do
|
7
|
+
model do
|
8
|
+
ActiveSupport::Deprecation.silence do
|
9
|
+
include PgSearch
|
10
|
+
end
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
with_model :AnotherModel
|
15
|
+
|
16
|
+
it "includes PgSearch::Model" do
|
17
|
+
expect(SomeModel.ancestors).to include PgSearch::Model
|
18
|
+
end
|
19
|
+
|
20
|
+
it "prints a deprecation message" do
|
21
|
+
allow(ActiveSupport::Deprecation).to receive(:warn)
|
22
|
+
|
23
|
+
AnotherModel.include(PgSearch)
|
24
|
+
|
25
|
+
expect(ActiveSupport::Deprecation).to have_received(:warn).with(
|
26
|
+
<<~MESSAGE
|
27
|
+
Directly including `PgSearch` into an Active Record model is deprecated and will be removed in pg_search 3.0.
|
28
|
+
|
29
|
+
Please replace `include PgSearch` with `include PgSearch::Model`.
|
30
|
+
MESSAGE
|
31
|
+
)
|
32
|
+
end
|
33
|
+
end
|
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require "spec_helper"
|
2
4
|
|
3
5
|
describe "pagination" do
|
@@ -8,8 +10,8 @@ describe "pagination" do
|
|
8
10
|
end
|
9
11
|
|
10
12
|
model do
|
11
|
-
include PgSearch
|
12
|
-
pg_search_scope :search_name, :
|
13
|
+
include PgSearch::Model
|
14
|
+
pg_search_scope :search_name, against: :name
|
13
15
|
|
14
16
|
def self.page(page_number)
|
15
17
|
offset = (page_number - 1) * 2
|
@@ -19,18 +21,18 @@ describe "pagination" do
|
|
19
21
|
end
|
20
22
|
|
21
23
|
it "is chainable before a search scope" do
|
22
|
-
better = PaginatedModel.create!(:
|
23
|
-
best = PaginatedModel.create!(:
|
24
|
-
good = PaginatedModel.create!(:
|
24
|
+
better = PaginatedModel.create!(name: "foo foo bar")
|
25
|
+
best = PaginatedModel.create!(name: "foo foo foo")
|
26
|
+
good = PaginatedModel.create!(name: "foo bar bar")
|
25
27
|
|
26
28
|
expect(PaginatedModel.page(1).search_name("foo")).to eq([best, better])
|
27
29
|
expect(PaginatedModel.page(2).search_name("foo")).to eq([good])
|
28
30
|
end
|
29
31
|
|
30
32
|
it "is chainable after a search scope" do
|
31
|
-
better = PaginatedModel.create!(:
|
32
|
-
best = PaginatedModel.create!(:
|
33
|
-
good = PaginatedModel.create!(:
|
33
|
+
better = PaginatedModel.create!(name: "foo foo bar")
|
34
|
+
best = PaginatedModel.create!(name: "foo foo foo")
|
35
|
+
good = PaginatedModel.create!(name: "foo bar bar")
|
34
36
|
|
35
37
|
expect(PaginatedModel.search_name("foo").page(1)).to eq([best, better])
|
36
38
|
expect(PaginatedModel.search_name("foo").page(2)).to eq([good])
|