pg_search 2.3.0 → 2.3.5

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 (40) hide show
  1. checksums.yaml +4 -4
  2. data/.codeclimate.yml +1 -0
  3. data/.github/dependabot.yml +11 -0
  4. data/.jrubyrc +1 -0
  5. data/.rubocop.yml +85 -7
  6. data/.travis.yml +14 -22
  7. data/CHANGELOG.md +41 -16
  8. data/CODE_OF_CONDUCT.md +76 -0
  9. data/Gemfile +1 -1
  10. data/LICENSE +1 -1
  11. data/README.md +60 -18
  12. data/lib/pg_search.rb +4 -6
  13. data/lib/pg_search/document.rb +1 -1
  14. data/lib/pg_search/features/dmetaphone.rb +4 -6
  15. data/lib/pg_search/features/tsearch.rb +13 -12
  16. data/lib/pg_search/migration/templates/add_pg_search_dmetaphone_support_functions.rb.erb +6 -6
  17. data/lib/pg_search/migration/templates/create_pg_search_documents.rb.erb +2 -2
  18. data/lib/pg_search/multisearch.rb +10 -1
  19. data/lib/pg_search/multisearch/rebuilder.rb +7 -3
  20. data/lib/pg_search/scope_options.rb +3 -3
  21. data/lib/pg_search/tasks.rb +2 -1
  22. data/lib/pg_search/version.rb +1 -1
  23. data/pg_search.gemspec +11 -7
  24. data/spec/.rubocop.yml +2 -2
  25. data/spec/integration/.rubocop.yml +11 -0
  26. data/spec/integration/associations_spec.rb +17 -56
  27. data/spec/integration/deprecation_spec.rb +1 -1
  28. data/spec/integration/pg_search_spec.rb +62 -51
  29. data/spec/lib/pg_search/configuration/association_spec.rb +8 -6
  30. data/spec/lib/pg_search/features/dmetaphone_spec.rb +2 -2
  31. data/spec/lib/pg_search/features/trigram_spec.rb +15 -11
  32. data/spec/lib/pg_search/features/tsearch_spec.rb +16 -10
  33. data/spec/lib/pg_search/multisearch/rebuilder_spec.rb +116 -71
  34. data/spec/lib/pg_search/multisearch_spec.rb +48 -29
  35. data/spec/lib/pg_search/multisearchable_spec.rb +150 -97
  36. data/spec/lib/pg_search/normalizer_spec.rb +12 -10
  37. data/spec/lib/pg_search_spec.rb +66 -55
  38. data/spec/spec_helper.rb +13 -4
  39. data/spec/support/database.rb +1 -1
  40. metadata +78 -17
@@ -23,7 +23,7 @@ describe "Including the deprecated PgSearch module" do
23
23
  AnotherModel.include(PgSearch)
24
24
 
25
25
  expect(ActiveSupport::Deprecation).to have_received(:warn).with(
26
- <<-MESSAGE.strip_heredoc
26
+ <<~MESSAGE
27
27
  Directly including `PgSearch` into an Active Record model is deprecated and will be removed in pg_search 3.0.
28
28
 
29
29
  Please replace `include PgSearch` with `include PgSearch::Model`.
@@ -2,6 +2,7 @@
2
2
 
3
3
  require "spec_helper"
4
4
 
5
+ # rubocop:disable RSpec/NestedGroups
5
6
  describe "an Active Record model which includes PgSearch" do
6
7
  with_model :ModelWithPgSearch do
7
8
  table do |t|
@@ -64,7 +65,7 @@ describe "an Active Record model which includes PgSearch" do
64
65
  }.to raise_error(ArgumentError, /foo/)
65
66
  end
66
67
 
67
- context "dynamically" do
68
+ context "with a lambda" do
68
69
  it "raises an exception when invoked" do
69
70
  ModelWithPgSearch.pg_search_scope :with_unknown_option,
70
71
  ->(*) { { against: :content, foo: :bar } }
@@ -87,7 +88,7 @@ describe "an Active Record model which includes PgSearch" do
87
88
  }.to raise_error(ArgumentError, /foo/)
88
89
  end
89
90
 
90
- context "dynamically" do
91
+ context "with a lambda" do
91
92
  it "raises an exception when invoked" do
92
93
  ModelWithPgSearch.pg_search_scope :with_unknown_using,
93
94
  ->(*) { { against: :content, using: :foo } }
@@ -110,7 +111,7 @@ describe "an Active Record model which includes PgSearch" do
110
111
  }.to raise_error(ArgumentError, /ignoring.*foo/)
111
112
  end
112
113
 
113
- context "dynamically" do
114
+ context "with a lambda" do
114
115
  it "raises an exception when invoked" do
115
116
  ModelWithPgSearch.pg_search_scope :with_unknown_ignoring,
116
117
  ->(*) { { against: :content, ignoring: :foo } }
@@ -130,7 +131,7 @@ describe "an Active Record model which includes PgSearch" do
130
131
  }.to raise_error(ArgumentError, /against/)
131
132
  end
132
133
 
133
- context "dynamically" do
134
+ context "with a lambda" do
134
135
  it "raises an exception when invoked" do
135
136
  ModelWithPgSearch.pg_search_scope :with_unknown_ignoring, ->(*) { {} }
136
137
 
@@ -144,7 +145,7 @@ describe "an Active Record model which includes PgSearch" do
144
145
  end
145
146
 
146
147
  describe "a search scope" do
147
- context "against a single column" do
148
+ context "when against a single column" do
148
149
  before do
149
150
  ModelWithPgSearch.pg_search_scope :search_content, against: :content
150
151
  end
@@ -157,7 +158,7 @@ describe "an Active Record model which includes PgSearch" do
157
158
  results = ModelWithPgSearch.select('id, title').search_content('foo')
158
159
 
159
160
  expect(results).to include(included)
160
- expect(results).to_not include(excluded)
161
+ expect(results).not_to include(excluded)
161
162
 
162
163
  expect(results.first.attributes.key?('content')).to eq false
163
164
 
@@ -174,7 +175,7 @@ describe "an Active Record model which includes PgSearch" do
174
175
  results = ModelWithPgSearch.search_content('foo').select('id, title')
175
176
 
176
177
  expect(results).to include(included)
177
- expect(results).to_not include(excluded)
178
+ expect(results).not_to include(excluded)
178
179
 
179
180
  expect(results.first.attributes.key?('content')).to eq false
180
181
 
@@ -191,7 +192,7 @@ describe "an Active Record model which includes PgSearch" do
191
192
  results = ModelWithPgSearch.select('id').search_content('foo').select('title')
192
193
 
193
194
  expect(results).to include(included)
194
- expect(results).to_not include(excluded)
195
+ expect(results).not_to include(excluded)
195
196
 
196
197
  expect(results.first.attributes.key?('content')).to eq false
197
198
 
@@ -200,7 +201,7 @@ describe "an Active Record model which includes PgSearch" do
200
201
  end
201
202
  end
202
203
 
203
- context "chained to a cross-table scope" do
204
+ context "when chained to a cross-table scope" do
204
205
  with_model :House do
205
206
  table do |t|
206
207
  t.references :person
@@ -270,7 +271,7 @@ describe "an Active Record model which includes PgSearch" do
270
271
  it "does not raise an exception" do
271
272
  relation = Person.named('foo').house_search_city('bar')
272
273
 
273
- expect { relation.to_a }.to_not raise_error
274
+ expect { relation.to_a }.not_to raise_error
274
275
  end
275
276
  end
276
277
  end
@@ -283,7 +284,7 @@ describe "an Active Record model which includes PgSearch" do
283
284
  it "does not raise an exception" do
284
285
  relation = ModelWithPgSearch.search_content('foo').search_title('bar')
285
286
 
286
- expect { relation.to_a }.to_not raise_error
287
+ expect { relation.to_a }.not_to raise_error
287
288
  end
288
289
  end
289
290
 
@@ -451,7 +452,7 @@ describe "an Active Record model which includes PgSearch" do
451
452
 
452
453
  it "accepts non-string queries and calls #to_s on them" do
453
454
  foo = ModelWithPgSearch.create!(content: "foo")
454
- not_a_string = double(to_s: "foo")
455
+ not_a_string = instance_double("Object", to_s: "foo")
455
456
  expect(ModelWithPgSearch.search_content(not_a_string)).to eq([foo])
456
457
  end
457
458
 
@@ -481,7 +482,7 @@ describe "an Active Record model which includes PgSearch" do
481
482
  end
482
483
  end
483
484
 
484
- context "against multiple columns" do
485
+ context "when against multiple columns" do
485
486
  before do
486
487
  ModelWithPgSearch.pg_search_scope :search_title_and_content, against: %i[title content]
487
488
  end
@@ -520,7 +521,7 @@ describe "an Active Record model which includes PgSearch" do
520
521
  end
521
522
  end
522
523
 
523
- context "using trigram" do
524
+ context "when using trigram" do
524
525
  before do
525
526
  ModelWithPgSearch.pg_search_scope :with_trigrams, against: %i[title content], using: :trigram
526
527
  end
@@ -562,7 +563,7 @@ describe "an Active Record model which includes PgSearch" do
562
563
  end
563
564
  end
564
565
 
565
- context "using tsearch" do
566
+ context "when using tsearch" do
566
567
  before do
567
568
  ModelWithPgSearch.pg_search_scope :search_title_with_prefixes,
568
569
  against: :title,
@@ -712,7 +713,7 @@ describe "an Active Record model which includes PgSearch" do
712
713
  end
713
714
  end
714
715
 
715
- context "against columns ranked with arrays" do
716
+ context "when against columns ranked with arrays" do
716
717
  before do
717
718
  ModelWithPgSearch.pg_search_scope :search_weighted_by_array_of_arrays,
718
719
  against: [[:content, 'B'], [:title, 'A']]
@@ -728,7 +729,7 @@ describe "an Active Record model which includes PgSearch" do
728
729
  end
729
730
  end
730
731
 
731
- context "against columns ranked with a hash" do
732
+ context "when against columns ranked with a hash" do
732
733
  before do
733
734
  ModelWithPgSearch.pg_search_scope :search_weighted_by_hash,
734
735
  against: { content: 'B', title: 'A' }
@@ -744,7 +745,7 @@ describe "an Active Record model which includes PgSearch" do
744
745
  end
745
746
  end
746
747
 
747
- context "against columns of which only some are ranked" do
748
+ context "when against columns of which only some are ranked" do
748
749
  before do
749
750
  ModelWithPgSearch.pg_search_scope :search_weighted,
750
751
  against: [:content, [:title, 'A']]
@@ -760,7 +761,7 @@ describe "an Active Record model which includes PgSearch" do
760
761
  end
761
762
  end
762
763
 
763
- context "searching any_word option" do
764
+ context "when searching any_word option" do
764
765
  before do
765
766
  ModelWithPgSearch.pg_search_scope :search_title_with_any_word,
766
767
  against: :title,
@@ -838,7 +839,7 @@ describe "an Active Record model which includes PgSearch" do
838
839
  end
839
840
  end
840
841
 
841
- context "using dmetaphone" do
842
+ context "when using dmetaphone" do
842
843
  before do
843
844
  ModelWithPgSearch.pg_search_scope :with_dmetaphones,
844
845
  against: %i[title content],
@@ -877,7 +878,7 @@ describe "an Active Record model which includes PgSearch" do
877
878
  end
878
879
  end
879
880
 
880
- context "using multiple features" do
881
+ context "when using multiple features" do
881
882
  before do
882
883
  ModelWithPgSearch.pg_search_scope :with_tsearch,
883
884
  against: :title,
@@ -950,33 +951,40 @@ describe "an Active Record model which includes PgSearch" do
950
951
  end
951
952
 
952
953
  context "with feature-specific configuration" do
953
- before do
954
- @tsearch_config = tsearch_config = { dictionary: 'english' }
955
- @trigram_config = trigram_config = { foo: 'bar' }
954
+ let(:tsearch_config) { { dictionary: 'english' } }
955
+ let(:trigram_config) { { foo: 'bar' } }
956
956
 
957
+ before do
957
958
  ModelWithPgSearch.pg_search_scope :with_tsearch_and_trigram_using_hash,
958
959
  against: :title,
959
- using: {
960
- tsearch: tsearch_config,
961
- trigram: trigram_config
962
- }
960
+ using: { tsearch: tsearch_config, trigram: trigram_config }
963
961
  end
964
962
 
965
- it "should pass the custom configuration down to the specified feature" do
966
- stub_feature = double(
963
+ it "passes the custom configuration down to the specified feature" do
964
+ tsearch_feature = instance_double(
965
+ "PgSearch::Features::TSearch",
967
966
  conditions: Arel::Nodes::Grouping.new(Arel.sql("1 = 1")),
968
967
  rank: Arel::Nodes::Grouping.new(Arel.sql("1.0"))
969
968
  )
970
969
 
971
- expect(PgSearch::Features::TSearch).to receive(:new).with(anything, @tsearch_config, anything, anything, anything).at_least(:once).and_return(stub_feature)
972
- expect(PgSearch::Features::Trigram).to receive(:new).with(anything, @trigram_config, anything, anything, anything).at_least(:once).and_return(stub_feature)
970
+ trigram_feature = instance_double(
971
+ "PgSearch::Features::Trigram",
972
+ conditions: Arel::Nodes::Grouping.new(Arel.sql("1 = 1")),
973
+ rank: Arel::Nodes::Grouping.new(Arel.sql("1.0"))
974
+ )
975
+
976
+ allow(PgSearch::Features::TSearch).to receive(:new).with(anything, tsearch_config, anything, anything, anything).and_return(tsearch_feature)
977
+ allow(PgSearch::Features::Trigram).to receive(:new).with(anything, trigram_config, anything, anything, anything).and_return(trigram_feature)
973
978
 
974
979
  ModelWithPgSearch.with_tsearch_and_trigram_using_hash("foo")
980
+
981
+ expect(PgSearch::Features::TSearch).to have_received(:new).with(anything, tsearch_config, anything, anything, anything).at_least(:once)
982
+ expect(PgSearch::Features::Trigram).to have_received(:new).with(anything, trigram_config, anything, anything, anything).at_least(:once)
975
983
  end
976
984
  end
977
985
  end
978
986
 
979
- context "using a tsvector column and an association" do
987
+ context "when using a tsvector column and an association" do
980
988
  with_model :Comment do
981
989
  table do |t|
982
990
  t.integer :post_id
@@ -1004,7 +1012,7 @@ describe "an Active Record model which includes PgSearch" do
1004
1012
  let!(:unexpected) { Post.create!(content: 'longcat is looooooooong') }
1005
1013
 
1006
1014
  before do
1007
- ActiveRecord::Base.connection.execute <<-SQL.strip_heredoc
1015
+ ActiveRecord::Base.connection.execute <<~SQL.squish
1008
1016
  UPDATE #{Post.quoted_table_name}
1009
1017
  SET content_tsvector = to_tsvector('english'::regconfig, #{Post.quoted_table_name}."content")
1010
1018
  SQL
@@ -1022,20 +1030,20 @@ describe "an Active Record model which includes PgSearch" do
1022
1030
  }
1023
1031
  end
1024
1032
 
1025
- it "should find by the tsvector column" do
1033
+ it "finds by the tsvector column" do
1026
1034
  expect(Post.search_by_content_with_tsvector("phooey").map(&:id)).to eq([expected.id])
1027
1035
  end
1028
1036
 
1029
- it "should find by the associated record" do
1037
+ it "finds by the associated record" do
1030
1038
  expect(Post.search_by_content_with_tsvector("commentone").map(&:id)).to eq([expected.id])
1031
1039
  end
1032
1040
 
1033
- it 'should find by a combination of the two' do
1041
+ it 'finds by a combination of the two' do
1034
1042
  expect(Post.search_by_content_with_tsvector("phooey commentone").map(&:id)).to eq([expected.id])
1035
1043
  end
1036
1044
  end
1037
1045
 
1038
- context 'using multiple tsvector columns' do
1046
+ context 'when using multiple tsvector columns' do
1039
1047
  with_model :ModelWithTsvector do
1040
1048
  model do
1041
1049
  include PgSearch::Model
@@ -1059,7 +1067,7 @@ describe "an Active Record model which includes PgSearch" do
1059
1067
  end
1060
1068
  end
1061
1069
 
1062
- context "using a tsvector column with" do
1070
+ context "when using a tsvector column with" do
1063
1071
  with_model :ModelWithTsvector do
1064
1072
  table do |t|
1065
1073
  t.text 'content'
@@ -1070,10 +1078,11 @@ describe "an Active Record model which includes PgSearch" do
1070
1078
  end
1071
1079
 
1072
1080
  let!(:expected) { ModelWithTsvector.create!(content: 'tiling is grouty') }
1073
- let!(:unexpected) { ModelWithTsvector.create!(content: 'longcat is looooooooong') }
1074
1081
 
1075
1082
  before do
1076
- ActiveRecord::Base.connection.execute <<-SQL.strip_heredoc
1083
+ ModelWithTsvector.create!(content: 'longcat is looooooooong')
1084
+
1085
+ ActiveRecord::Base.connection.execute <<~SQL.squish
1077
1086
  UPDATE #{ModelWithTsvector.quoted_table_name}
1078
1087
  SET content_tsvector = to_tsvector('english'::regconfig, #{ModelWithTsvector.quoted_table_name}."content")
1079
1088
  SQL
@@ -1088,11 +1097,11 @@ describe "an Active Record model which includes PgSearch" do
1088
1097
  }
1089
1098
  end
1090
1099
 
1091
- it "should not use to_tsvector in the query" do
1100
+ it "does not use to_tsvector in the query" do
1092
1101
  expect(ModelWithTsvector.search_by_content_with_tsvector("tiles").to_sql).not_to match(/to_tsvector/)
1093
1102
  end
1094
1103
 
1095
- it "should find the expected result" do
1104
+ it "finds the expected result" do
1096
1105
  expect(ModelWithTsvector.search_by_content_with_tsvector("tiles").map(&:id)).to eq([expected.id])
1097
1106
  end
1098
1107
 
@@ -1108,7 +1117,7 @@ describe "an Active Record model which includes PgSearch" do
1108
1117
  ModelWithTsvector.has_many :another_models
1109
1118
  end
1110
1119
 
1111
- it "should refer to the tsvector column in the query unambiguously" do
1120
+ it "refers to the tsvector column in the query unambiguously" do
1112
1121
  expect {
1113
1122
  ModelWithTsvector.joins(:another_models).search_by_content_with_tsvector("test").to_a
1114
1123
  }.not_to raise_exception
@@ -1116,7 +1125,7 @@ describe "an Active Record model which includes PgSearch" do
1116
1125
  end
1117
1126
  end
1118
1127
 
1119
- context "ignoring accents" do
1128
+ context "when ignoring accents" do
1120
1129
  before do
1121
1130
  ModelWithPgSearch.pg_search_scope :search_title_without_accents,
1122
1131
  against: :title,
@@ -1157,13 +1166,13 @@ describe "an Active Record model which includes PgSearch" do
1157
1166
  ranked_by: ":tsearch * importance"
1158
1167
  end
1159
1168
 
1160
- it "should return records with a rank attribute equal to the :ranked_by expression" do
1169
+ it "returns records with a rank attribute equal to the :ranked_by expression" do
1161
1170
  ModelWithPgSearch.create!(content: 'foo', importance: 10)
1162
1171
  results = ModelWithPgSearch.search_content_with_importance_as_rank("foo").with_pg_search_rank
1163
1172
  expect(results.first.pg_search_rank).to eq(10)
1164
1173
  end
1165
1174
 
1166
- it "should substitute :tsearch with the tsearch rank expression in the :ranked_by expression" do
1175
+ it "substitutes :tsearch with the tsearch rank expression in the :ranked_by expression" do
1167
1176
  ModelWithPgSearch.create!(content: 'foo', importance: 10)
1168
1177
 
1169
1178
  tsearch_result =
@@ -1181,7 +1190,7 @@ describe "an Active Record model which includes PgSearch" do
1181
1190
  expect(multiplied_rank).to be_within(0.001).of(tsearch_rank * 10)
1182
1191
  end
1183
1192
 
1184
- it "should return results in descending order of the value of the rank expression" do
1193
+ it "returns results in descending order of the value of the rank expression" do
1185
1194
  records = [
1186
1195
  ModelWithPgSearch.create!(content: 'foo', importance: 1),
1187
1196
  ModelWithPgSearch.create!(content: 'foo', importance: 3),
@@ -1195,6 +1204,7 @@ describe "an Active Record model which includes PgSearch" do
1195
1204
  %w[tsearch trigram dmetaphone].each do |feature|
1196
1205
  context "using the #{feature} ranking algorithm" do
1197
1206
  let(:scope_name) { :"search_content_ranked_by_#{feature}" }
1207
+
1198
1208
  before do
1199
1209
  ModelWithPgSearch.pg_search_scope scope_name,
1200
1210
  against: :content,
@@ -1231,7 +1241,7 @@ describe "an Active Record model which includes PgSearch" do
1231
1241
  end
1232
1242
  end
1233
1243
 
1234
- context "using the tsearch ranking algorithm" do
1244
+ context "when using the tsearch ranking algorithm" do
1235
1245
  it "sorts results by the tsearch rank" do
1236
1246
  ModelWithPgSearch.pg_search_scope :search_content_ranked_by_tsearch,
1237
1247
  using: :tsearch,
@@ -1246,7 +1256,7 @@ describe "an Active Record model which includes PgSearch" do
1246
1256
  end
1247
1257
  end
1248
1258
 
1249
- context "using the trigram ranking algorithm" do
1259
+ context "when using the trigram ranking algorithm" do
1250
1260
  it "sorts results by the trigram rank" do
1251
1261
  ModelWithPgSearch.pg_search_scope :search_content_ranked_by_trigram,
1252
1262
  using: :trigram,
@@ -1261,7 +1271,7 @@ describe "an Active Record model which includes PgSearch" do
1261
1271
  end
1262
1272
  end
1263
1273
 
1264
- context "using the dmetaphone ranking algorithm" do
1274
+ context "when using the dmetaphone ranking algorithm" do
1265
1275
  it "sorts results by the dmetaphone rank" do
1266
1276
  ModelWithPgSearch.pg_search_scope :search_content_ranked_by_dmetaphone,
1267
1277
  using: :dmetaphone,
@@ -1298,3 +1308,4 @@ describe "an Active Record model which includes PgSearch" do
1298
1308
  end
1299
1309
  end
1300
1310
  end
1311
+ # rubocop:enable RSpec/NestedGroups
@@ -2,6 +2,7 @@
2
2
 
3
3
  require "spec_helper"
4
4
 
5
+ # rubocop:disable RSpec/NestedGroups
5
6
  describe PgSearch::Configuration::Association do
6
7
  with_model :Avatar do
7
8
  table do |t|
@@ -39,7 +40,7 @@ describe PgSearch::Configuration::Association do
39
40
  end
40
41
  end
41
42
 
42
- context "has_one" do
43
+ context "with has_one" do
43
44
  let(:association) { described_class.new(User, :avatar, :url) }
44
45
 
45
46
  describe "#table_name" do
@@ -50,7 +51,7 @@ describe PgSearch::Configuration::Association do
50
51
 
51
52
  describe "#join" do
52
53
  let(:expected_sql) do
53
- <<-SQL.gsub(/\s+/, ' ').strip
54
+ <<~SQL.squish
54
55
  LEFT OUTER JOIN
55
56
  (SELECT model_id AS id,
56
57
  #{column_select} AS #{association.columns.first.alias}
@@ -70,7 +71,7 @@ describe PgSearch::Configuration::Association do
70
71
  end
71
72
  end
72
73
 
73
- context "belongs_to" do
74
+ context "with belongs_to" do
74
75
  let(:association) { described_class.new(User, :site, :title) }
75
76
 
76
77
  describe "#table_name" do
@@ -81,7 +82,7 @@ describe PgSearch::Configuration::Association do
81
82
 
82
83
  describe "#join" do
83
84
  let(:expected_sql) do
84
- <<-SQL.gsub(/\s+/, ' ').strip
85
+ <<~SQL.squish
85
86
  LEFT OUTER JOIN
86
87
  (SELECT model_id AS id,
87
88
  #{column_select} AS #{association.columns.first.alias}
@@ -101,7 +102,7 @@ describe PgSearch::Configuration::Association do
101
102
  end
102
103
  end
103
104
 
104
- context "has_many" do
105
+ context "with has_many" do
105
106
  let(:association) { described_class.new(Site, :users, :name) }
106
107
 
107
108
  describe "#table_name" do
@@ -112,7 +113,7 @@ describe PgSearch::Configuration::Association do
112
113
 
113
114
  describe "#join" do
114
115
  let(:expected_sql) do
115
- <<-SQL.gsub(/\s+/, ' ').strip
116
+ <<~SQL.squish
116
117
  LEFT OUTER JOIN
117
118
  (SELECT model_id AS id,
118
119
  string_agg(\"#{association.table_name}\".\"name\"::text, ' ') AS #{association.columns.first.alias}
@@ -138,3 +139,4 @@ describe PgSearch::Configuration::Association do
138
139
  end
139
140
  end
140
141
  end
142
+ # rubocop:enable RSpec/NestedGroups