pg_search 1.0.4 → 1.0.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.
- checksums.yaml +4 -4
- data/.codeclimate.yml +2 -0
- data/.rubocop.yml +21 -0
- data/.rubocop_todo.yml +0 -153
- data/.travis.yml +7 -1
- data/CHANGELOG.md +5 -0
- data/Gemfile +5 -3
- data/README.md +23 -5
- data/lib/pg_search.rb +3 -9
- data/lib/pg_search/configuration.rb +0 -1
- data/lib/pg_search/document.rb +1 -1
- data/lib/pg_search/extensions/arel.rb +1 -1
- data/lib/pg_search/features/tsearch.rb +2 -2
- data/lib/pg_search/multisearch.rb +0 -1
- data/lib/pg_search/multisearch/rebuilder.rb +2 -4
- data/lib/pg_search/multisearchable.rb +3 -3
- data/lib/pg_search/normalizer.rb +1 -1
- data/lib/pg_search/scope_options.rb +52 -31
- data/lib/pg_search/tasks.rb +1 -1
- data/lib/pg_search/version.rb +1 -1
- data/pg_search.gemspec +3 -3
- data/spec/.rubocop.yml +14 -0
- data/spec/integration/associations_spec.rb +50 -40
- data/spec/integration/pg_search_spec.rb +42 -32
- data/spec/lib/pg_search/configuration/column_spec.rb +2 -2
- data/spec/lib/pg_search/configuration/foreign_column_spec.rb +2 -2
- data/spec/lib/pg_search/features/dmetaphone_spec.rb +2 -2
- data/spec/lib/pg_search/features/trigram_spec.rb +6 -6
- data/spec/lib/pg_search/features/tsearch_spec.rb +6 -6
- data/spec/lib/pg_search/multisearch/rebuilder_spec.rb +6 -6
- data/spec/lib/pg_search/multisearchable_spec.rb +2 -3
- data/spec/lib/pg_search_spec.rb +20 -30
- data/spec/spec_helper.rb +5 -0
- data/spec/support/database.rb +4 -4
- metadata +8 -6
@@ -10,7 +10,7 @@ describe PgSearch::Configuration::Column do
|
|
10
10
|
|
11
11
|
it "returns the fully-qualified table and column name" do
|
12
12
|
column = described_class.new("name", nil, Model)
|
13
|
-
expect(column.full_name).to eq(%
|
13
|
+
expect(column.full_name).to eq(%(#{Model.quoted_table_name}."name"))
|
14
14
|
end
|
15
15
|
end
|
16
16
|
|
@@ -23,7 +23,7 @@ describe PgSearch::Configuration::Column do
|
|
23
23
|
|
24
24
|
it "returns an expression that casts the column to text and coalesces it with an empty string" do
|
25
25
|
column = described_class.new("name", nil, Model)
|
26
|
-
expect(column.to_sql).to eq(%
|
26
|
+
expect(column.to_sql).to eq(%{coalesce(#{Model.quoted_table_name}."name"::text, '')})
|
27
27
|
end
|
28
28
|
end
|
29
29
|
end
|
@@ -24,8 +24,8 @@ describe PgSearch::Configuration::ForeignColumn do
|
|
24
24
|
|
25
25
|
it "returns a consistent string" do
|
26
26
|
association = PgSearch::Configuration::Association.new(Model,
|
27
|
-
|
28
|
-
|
27
|
+
:another_model,
|
28
|
+
:title)
|
29
29
|
foreign_column = described_class.new("title", nil, Model, association)
|
30
30
|
|
31
31
|
column_alias = foreign_column.alias
|
@@ -21,7 +21,7 @@ describe PgSearch::Features::DMetaphone do
|
|
21
21
|
|
22
22
|
feature = described_class.new(query, options, columns, Model, normalizer)
|
23
23
|
expect(feature.rank.to_sql).to eq(
|
24
|
-
%
|
24
|
+
%{(ts_rank((to_tsvector('simple', pg_search_dmetaphone(coalesce(#{Model.quoted_table_name}."name"::text, ''))) || to_tsvector('simple', pg_search_dmetaphone(coalesce(#{Model.quoted_table_name}."content"::text, '')))), (to_tsquery('simple', ''' ' || pg_search_dmetaphone('query') || ' ''')), 0))}
|
25
25
|
)
|
26
26
|
end
|
27
27
|
end
|
@@ -46,7 +46,7 @@ describe PgSearch::Features::DMetaphone do
|
|
46
46
|
|
47
47
|
feature = described_class.new(query, options, columns, Model, normalizer)
|
48
48
|
expect(feature.conditions.to_sql).to eq(
|
49
|
-
%
|
49
|
+
%{((to_tsvector('simple', pg_search_dmetaphone(coalesce(#{Model.quoted_table_name}."name"::text, ''))) || to_tsvector('simple', pg_search_dmetaphone(coalesce(#{Model.quoted_table_name}."content"::text, '')))) @@ (to_tsquery('simple', ''' ' || pg_search_dmetaphone('query') || ' ''')))}
|
50
50
|
)
|
51
51
|
end
|
52
52
|
end
|
@@ -5,10 +5,12 @@ describe PgSearch::Features::Trigram do
|
|
5
5
|
subject(:feature) { described_class.new(query, options, columns, Model, normalizer) }
|
6
6
|
let(:query) { 'lolwut' }
|
7
7
|
let(:options) { {} }
|
8
|
-
let(:columns) {
|
9
|
-
|
10
|
-
|
11
|
-
|
8
|
+
let(:columns) {
|
9
|
+
[
|
10
|
+
PgSearch::Configuration::Column.new(:name, nil, Model),
|
11
|
+
PgSearch::Configuration::Column.new(:content, nil, Model)
|
12
|
+
]
|
13
|
+
}
|
12
14
|
let(:normalizer) { PgSearch::Normalizer.new(config) }
|
13
15
|
let(:config) { OpenStruct.new(:ignore => [], :postgresql_version => 90000) }
|
14
16
|
|
@@ -59,7 +61,6 @@ describe PgSearch::Features::Trigram do
|
|
59
61
|
coalesced_column = "coalesce(#{Model.quoted_table_name}.\"name\"::text, '')"
|
60
62
|
expect(feature.conditions.to_sql).to eq("((#{coalesced_column}) % '#{query}')")
|
61
63
|
end
|
62
|
-
|
63
64
|
end
|
64
65
|
context 'multiple columns' do
|
65
66
|
let(:options) { { only: [:name, :content] } }
|
@@ -70,7 +71,6 @@ describe PgSearch::Features::Trigram do
|
|
70
71
|
end
|
71
72
|
end
|
72
73
|
end
|
73
|
-
|
74
74
|
end
|
75
75
|
|
76
76
|
describe '#rank' do
|
@@ -21,7 +21,7 @@ describe PgSearch::Features::TSearch do
|
|
21
21
|
|
22
22
|
feature = described_class.new(query, options, columns, Model, normalizer)
|
23
23
|
expect(feature.rank.to_sql).to eq(
|
24
|
-
%
|
24
|
+
%{(ts_rank((to_tsvector('simple', coalesce(#{Model.quoted_table_name}."name"::text, '')) || to_tsvector('simple', coalesce(#{Model.quoted_table_name}."content"::text, ''))), (to_tsquery('simple', ''' ' || 'query' || ' ''')), 0))}
|
25
25
|
)
|
26
26
|
end
|
27
27
|
end
|
@@ -46,7 +46,7 @@ describe PgSearch::Features::TSearch do
|
|
46
46
|
|
47
47
|
feature = described_class.new(query, options, columns, Model, normalizer)
|
48
48
|
expect(feature.conditions.to_sql).to eq(
|
49
|
-
%
|
49
|
+
%{((to_tsvector('simple', coalesce(#{Model.quoted_table_name}."name"::text, '')) || to_tsvector('simple', coalesce(#{Model.quoted_table_name}."content"::text, ''))) @@ (to_tsquery('simple', ''' ' || 'query' || ' ''')))}
|
50
50
|
)
|
51
51
|
end
|
52
52
|
|
@@ -63,7 +63,7 @@ describe PgSearch::Features::TSearch do
|
|
63
63
|
|
64
64
|
feature = described_class.new(query, options, columns, Model, normalizer)
|
65
65
|
expect(feature.conditions.to_sql).to eq(
|
66
|
-
%
|
66
|
+
%{((to_tsvector('simple', coalesce(#{Model.quoted_table_name}."name"::text, '')) || to_tsvector('simple', coalesce(#{Model.quoted_table_name}."content"::text, ''))) @@ (to_tsquery('simple', '!' || ''' ' || 'query' || ' ''')))}
|
67
67
|
)
|
68
68
|
end
|
69
69
|
end
|
@@ -81,7 +81,7 @@ describe PgSearch::Features::TSearch do
|
|
81
81
|
|
82
82
|
feature = described_class.new(query, options, columns, Model, normalizer)
|
83
83
|
expect(feature.conditions.to_sql).to eq(
|
84
|
-
%
|
84
|
+
%{((to_tsvector('simple', coalesce(#{Model.quoted_table_name}."name"::text, '')) || to_tsvector('simple', coalesce(#{Model.quoted_table_name}."content"::text, ''))) @@ (to_tsquery('simple', ''' ' || '!query' || ' ''')))}
|
85
85
|
)
|
86
86
|
end
|
87
87
|
end
|
@@ -99,7 +99,7 @@ describe PgSearch::Features::TSearch do
|
|
99
99
|
|
100
100
|
feature = described_class.new(query, options, columns, Model, normalizer)
|
101
101
|
expect(feature.conditions.to_sql).to eq(
|
102
|
-
%
|
102
|
+
%{((#{Model.quoted_table_name}.\"my_tsvector\") @@ (to_tsquery('simple', ''' ' || 'query' || ' ''')))}
|
103
103
|
)
|
104
104
|
end
|
105
105
|
end
|
@@ -117,7 +117,7 @@ describe PgSearch::Features::TSearch do
|
|
117
117
|
|
118
118
|
feature = described_class.new(query, options, columns, Model, normalizer)
|
119
119
|
expect(feature.conditions.to_sql).to eq(
|
120
|
-
%
|
120
|
+
%{((#{Model.quoted_table_name}.\"tsvector1\" || #{Model.quoted_table_name}.\"tsvector2\") @@ (to_tsquery('simple', ''' ' || 'query' || ' ''')))}
|
121
121
|
)
|
122
122
|
end
|
123
123
|
end
|
@@ -83,7 +83,7 @@ describe PgSearch::Multisearch::Rebuilder do
|
|
83
83
|
|
84
84
|
it "should execute the default SQL" do
|
85
85
|
time = DateTime.parse("2001-01-01")
|
86
|
-
rebuilder = PgSearch::Multisearch::Rebuilder.new(Model,
|
86
|
+
rebuilder = PgSearch::Multisearch::Rebuilder.new(Model, ->{ time } )
|
87
87
|
|
88
88
|
# Handle change in precision of DateTime objects in SQL in Active Record 4.0.1
|
89
89
|
# https://github.com/rails/rails/commit/17f5d8e062909f1fcae25351834d8e89967b645e
|
@@ -114,8 +114,8 @@ describe PgSearch::Multisearch::Rebuilder do
|
|
114
114
|
|
115
115
|
executed_sql = []
|
116
116
|
|
117
|
-
notifier = ActiveSupport::Notifications.subscribe("sql.active_record") do |
|
118
|
-
executed_sql << payload[:sql] if payload[:sql].include?(%
|
117
|
+
notifier = ActiveSupport::Notifications.subscribe("sql.active_record") do |_name, _start, _finish, _id, payload|
|
118
|
+
executed_sql << payload[:sql] if payload[:sql].include?(%(INSERT INTO "pg_search_documents"))
|
119
119
|
end
|
120
120
|
|
121
121
|
rebuilder.rebuild
|
@@ -139,7 +139,7 @@ describe PgSearch::Multisearch::Rebuilder do
|
|
139
139
|
|
140
140
|
it "generates SQL with the correct primary key" do
|
141
141
|
time = DateTime.parse("2001-01-01")
|
142
|
-
rebuilder = PgSearch::Multisearch::Rebuilder.new(ModelWithNonStandardPrimaryKey,
|
142
|
+
rebuilder = PgSearch::Multisearch::Rebuilder.new(ModelWithNonStandardPrimaryKey, ->{ time } )
|
143
143
|
|
144
144
|
# Handle change in precision of DateTime objects in SQL in Active Record 4.0.1
|
145
145
|
# https://github.com/rails/rails/commit/17f5d8e062909f1fcae25351834d8e89967b645e
|
@@ -170,8 +170,8 @@ describe PgSearch::Multisearch::Rebuilder do
|
|
170
170
|
|
171
171
|
executed_sql = []
|
172
172
|
|
173
|
-
notifier = ActiveSupport::Notifications.subscribe("sql.active_record") do |
|
174
|
-
executed_sql << payload[:sql] if payload[:sql].include?(%
|
173
|
+
notifier = ActiveSupport::Notifications.subscribe("sql.active_record") do |_name, _start, _finish, _id, payload|
|
174
|
+
executed_sql << payload[:sql] if payload[:sql].include?(%(INSERT INTO "pg_search_documents"))
|
175
175
|
end
|
176
176
|
|
177
177
|
rebuilder.rebuild
|
@@ -105,7 +105,7 @@ describe PgSearch::Multisearchable do
|
|
105
105
|
|
106
106
|
model do
|
107
107
|
include PgSearch
|
108
|
-
multisearchable :if =>
|
108
|
+
multisearchable :if => ->(record) { record.multisearchable? }
|
109
109
|
end
|
110
110
|
end
|
111
111
|
|
@@ -233,7 +233,7 @@ describe PgSearch::Multisearchable do
|
|
233
233
|
|
234
234
|
model do
|
235
235
|
include PgSearch
|
236
|
-
multisearchable :unless =>
|
236
|
+
multisearchable :unless => ->(record) { record.not_multisearchable? }
|
237
237
|
end
|
238
238
|
end
|
239
239
|
|
@@ -309,7 +309,6 @@ describe PgSearch::Multisearchable do
|
|
309
309
|
expect { PgSearch::Document.find(document.id) }.to raise_error(ActiveRecord::RecordNotFound)
|
310
310
|
end
|
311
311
|
end
|
312
|
-
|
313
312
|
end
|
314
313
|
end
|
315
314
|
|
data/spec/lib/pg_search_spec.rb
CHANGED
@@ -17,7 +17,7 @@ describe PgSearch do
|
|
17
17
|
end
|
18
18
|
|
19
19
|
context "with PgSearch.multisearch_options set to a Hash" do
|
20
|
-
before { allow(PgSearch).to receive(:multisearch_options).and_return(
|
20
|
+
before { allow(PgSearch).to receive(:multisearch_options).and_return(:using => :dmetaphone) }
|
21
21
|
subject { PgSearch.multisearch(query).map(&:searchable) }
|
22
22
|
|
23
23
|
with_model :MultisearchableModel do
|
@@ -94,16 +94,13 @@ describe PgSearch do
|
|
94
94
|
end
|
95
95
|
|
96
96
|
it "returns only results for that subclass" do
|
97
|
-
included =
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
NonSearchableSubclassModel.create!(:content => "foo bar"),
|
105
|
-
NonSearchableSubclassModel.create!(:content => "baz")
|
106
|
-
]
|
97
|
+
included = SearchableSubclassModel.create!(:content => "foo bar")
|
98
|
+
|
99
|
+
SearchableSubclassModel.create!(:content => "baz")
|
100
|
+
SuperclassModel.create!(:content => "foo bar")
|
101
|
+
SuperclassModel.create!(:content => "baz")
|
102
|
+
NonSearchableSubclassModel.create!(:content => "foo bar")
|
103
|
+
NonSearchableSubclassModel.create!(:content => "baz")
|
107
104
|
|
108
105
|
expect(SuperclassModel.count).to be 6
|
109
106
|
expect(SearchableSubclassModel.count).to be 2
|
@@ -112,9 +109,7 @@ describe PgSearch do
|
|
112
109
|
|
113
110
|
results = PgSearch.multisearch("foo bar")
|
114
111
|
|
115
|
-
expect(results
|
116
|
-
expect(results.first.searchable.class).to be SearchableSubclassModel
|
117
|
-
expect(results.first.searchable).to eq included.first
|
112
|
+
expect(results).to eq [included.pg_search_document]
|
118
113
|
end
|
119
114
|
|
120
115
|
it "updates an existing STI model does not create a new pg_search document" do
|
@@ -151,8 +146,8 @@ describe PgSearch do
|
|
151
146
|
end
|
152
147
|
|
153
148
|
it "reindexing searchable STI doesn't clobber other related STI models" do
|
154
|
-
|
155
|
-
|
149
|
+
SearchableSubclassModel.create!(:content => "baz")
|
150
|
+
AnotherSearchableSubclassModel.create!(:content => "baz")
|
156
151
|
|
157
152
|
expect(PgSearch::Document.count).to be 2
|
158
153
|
PgSearch::Multisearch.rebuild(SearchableSubclassModel)
|
@@ -187,16 +182,13 @@ describe PgSearch do
|
|
187
182
|
end
|
188
183
|
|
189
184
|
it "returns only results for that subclass" do
|
190
|
-
included =
|
191
|
-
|
192
|
-
|
193
|
-
|
194
|
-
|
195
|
-
|
196
|
-
|
197
|
-
NonSearchableSubclassModel.create!(:content => "foo bar"),
|
198
|
-
NonSearchableSubclassModel.create!(:content => "baz")
|
199
|
-
]
|
185
|
+
included = SearchableSubclassModel.create!(:content => "foo bar")
|
186
|
+
|
187
|
+
SearchableSubclassModel.create!(:content => "baz")
|
188
|
+
SuperclassModel.create!(:content => "foo bar")
|
189
|
+
SuperclassModel.create!(:content => "baz")
|
190
|
+
NonSearchableSubclassModel.create!(:content => "foo bar")
|
191
|
+
NonSearchableSubclassModel.create!(:content => "baz")
|
200
192
|
|
201
193
|
expect(SuperclassModel.count).to be 6
|
202
194
|
expect(SearchableSubclassModel.count).to be 2
|
@@ -205,9 +197,7 @@ describe PgSearch do
|
|
205
197
|
|
206
198
|
results = PgSearch.multisearch("foo bar")
|
207
199
|
|
208
|
-
expect(results
|
209
|
-
expect(results.first.searchable.class).to be SearchableSubclassModel
|
210
|
-
expect(results.first.searchable).to eq included.first
|
200
|
+
expect(results).to eq [included.pg_search_document]
|
211
201
|
end
|
212
202
|
end
|
213
203
|
end
|
@@ -233,7 +223,7 @@ describe PgSearch do
|
|
233
223
|
@multisearch_enabled_inside = PgSearch.multisearch_enabled?
|
234
224
|
raise
|
235
225
|
end
|
236
|
-
rescue
|
226
|
+
rescue
|
237
227
|
end
|
238
228
|
|
239
229
|
@multisearch_enabled_after = PgSearch.multisearch_enabled?
|
data/spec/spec_helper.rb
CHANGED
@@ -1,3 +1,6 @@
|
|
1
|
+
require "codeclimate-test-reporter"
|
2
|
+
CodeClimate::TestReporter.start
|
3
|
+
|
1
4
|
require "bundler/setup"
|
2
5
|
require "pg_search"
|
3
6
|
|
@@ -9,6 +12,8 @@ RSpec.configure do |config|
|
|
9
12
|
config.mock_with :rspec do |c|
|
10
13
|
c.syntax = :expect
|
11
14
|
end
|
15
|
+
|
16
|
+
config.example_status_persistence_file_path = 'tmp/examples.txt'
|
12
17
|
end
|
13
18
|
|
14
19
|
require 'support/database'
|
data/spec/support/database.rb
CHANGED
@@ -38,12 +38,12 @@ if ENV["LOGGER"]
|
|
38
38
|
ActiveRecord::Base.logger = Logger.new(STDOUT)
|
39
39
|
end
|
40
40
|
|
41
|
-
def install_extension_if_missing(name, query, expected_result)
|
41
|
+
def install_extension_if_missing(name, query, expected_result) # rubocop:disable Metrics/AbcSize
|
42
42
|
connection = ActiveRecord::Base.connection
|
43
43
|
postgresql_version = connection.send(:postgresql_version)
|
44
44
|
result = connection.select_value(query)
|
45
45
|
raise "Unexpected output for #{query}: #{result.inspect}" unless result.downcase == expected_result.downcase
|
46
|
-
rescue
|
46
|
+
rescue
|
47
47
|
begin
|
48
48
|
if postgresql_version >= 90100
|
49
49
|
ActiveRecord::Base.connection.execute "CREATE EXTENSION #{name};"
|
@@ -52,13 +52,13 @@ rescue => e
|
|
52
52
|
ActiveRecord::Base.connection.execute File.read(File.join(share_path, 'contrib', "#{name}.sql"))
|
53
53
|
puts $!.message
|
54
54
|
end
|
55
|
-
rescue =>
|
55
|
+
rescue => exception
|
56
56
|
at_exit do
|
57
57
|
puts "-" * 80
|
58
58
|
puts "Please install the #{name} contrib module"
|
59
59
|
puts "-" * 80
|
60
60
|
end
|
61
|
-
raise
|
61
|
+
raise exception
|
62
62
|
end
|
63
63
|
end
|
64
64
|
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: pg_search
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.0.
|
4
|
+
version: 1.0.5
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Grant Hutchins
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2015-
|
12
|
+
date: 2015-08-30 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: activerecord
|
@@ -85,16 +85,16 @@ dependencies:
|
|
85
85
|
name: rspec
|
86
86
|
requirement: !ruby/object:Gem::Requirement
|
87
87
|
requirements:
|
88
|
-
- - "
|
88
|
+
- - ">="
|
89
89
|
- !ruby/object:Gem::Version
|
90
|
-
version: '3.
|
90
|
+
version: '3.3'
|
91
91
|
type: :development
|
92
92
|
prerelease: false
|
93
93
|
version_requirements: !ruby/object:Gem::Requirement
|
94
94
|
requirements:
|
95
|
-
- - "
|
95
|
+
- - ">="
|
96
96
|
- !ruby/object:Gem::Version
|
97
|
-
version: '3.
|
97
|
+
version: '3.3'
|
98
98
|
- !ruby/object:Gem::Dependency
|
99
99
|
name: with_model
|
100
100
|
requirement: !ruby/object:Gem::Requirement
|
@@ -134,6 +134,7 @@ extra_rdoc_files: []
|
|
134
134
|
files:
|
135
135
|
- ".autotest"
|
136
136
|
- ".bundle/config"
|
137
|
+
- ".codeclimate.yml"
|
137
138
|
- ".gitignore"
|
138
139
|
- ".rspec"
|
139
140
|
- ".rubocop.yml"
|
@@ -175,6 +176,7 @@ files:
|
|
175
176
|
- lib/pg_search/tasks.rb
|
176
177
|
- lib/pg_search/version.rb
|
177
178
|
- pg_search.gemspec
|
179
|
+
- spec/.rubocop.yml
|
178
180
|
- spec/integration/associations_spec.rb
|
179
181
|
- spec/integration/pagination_spec.rb
|
180
182
|
- spec/integration/pg_search_spec.rb
|