pg_search 1.0.1 → 1.0.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +5 -1
- data/lib/pg_search/multisearch/rebuilder.rb +10 -1
- data/lib/pg_search/version.rb +1 -1
- data/spec/lib/pg_search/multisearch/rebuilder_spec.rb +123 -84
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: cfa2efbbbc811da8b5c62690f0084c9ddd60615d
|
4
|
+
data.tar.gz: 90e7078224516ca17fdc503b418f309fd72560ae
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 9c177eb231f004b44affdd5006ab5de2d75b13b4b4da0fbc0c4cb85b9d4394a1d96e26a27f28d23c4200638fc523e1dda1f414067a350c417f160ab0d2a96a2c
|
7
|
+
data.tar.gz: 7e98e612c9d089f5bab6c19365485c6190ad0b6338f662bfeb8864516592618f7883508c019bb031c7472ff3b5793b51f35ec27aaafcee748b9b85a5006fffe0
|
data/CHANGELOG.md
CHANGED
@@ -1,8 +1,12 @@
|
|
1
1
|
# pg_search changelog
|
2
2
|
|
3
|
+
## 1.0.2
|
4
|
+
|
5
|
+
* Don’t use SQL to rebuild search documents when models are multisearchable against dynamic methods and not just columns. Iterate over each record with `find_each` instead.
|
6
|
+
|
3
7
|
## 1.0.1
|
4
8
|
|
5
|
-
* Call `.unscoped` on relation used to build subquery, to eliminate unnecessary JOINs. (Markus Doits)
|
9
|
+
* Call `.unscoped` on relation used to build subquery, to eliminate unnecessary JOINs. (Markus Doits)
|
6
10
|
|
7
11
|
## 1.0.0
|
8
12
|
|
@@ -13,7 +13,7 @@ module PgSearch
|
|
13
13
|
def rebuild
|
14
14
|
if model.respond_to?(:rebuild_pg_search_documents)
|
15
15
|
model.rebuild_pg_search_documents
|
16
|
-
elsif
|
16
|
+
elsif conditional? || dynamic?
|
17
17
|
model.find_each { |record| record.update_pg_search_document }
|
18
18
|
else
|
19
19
|
model.connection.execute(rebuild_sql)
|
@@ -24,6 +24,15 @@ module PgSearch
|
|
24
24
|
|
25
25
|
attr_reader :model
|
26
26
|
|
27
|
+
def conditional?
|
28
|
+
model.pg_search_multisearchable_options.key?(:if) || model.pg_search_multisearchable_options.key?(:unless)
|
29
|
+
end
|
30
|
+
|
31
|
+
def dynamic?
|
32
|
+
column_names = model.columns.map(&:name)
|
33
|
+
columns.any? { |column| !column_names.include?(column.to_s) }
|
34
|
+
end
|
35
|
+
|
27
36
|
def connection
|
28
37
|
model.connection
|
29
38
|
end
|
data/lib/pg_search/version.rb
CHANGED
@@ -23,7 +23,7 @@ describe PgSearch::Multisearch::Rebuilder do
|
|
23
23
|
end
|
24
24
|
end
|
25
25
|
|
26
|
-
context "
|
26
|
+
context "and multisearchable is conditional" do
|
27
27
|
[:if, :unless].each do |conditional_key|
|
28
28
|
context "via :#{conditional_key}" do
|
29
29
|
with_model :Model do
|
@@ -51,55 +51,56 @@ describe PgSearch::Multisearch::Rebuilder do
|
|
51
51
|
end
|
52
52
|
|
53
53
|
context "when the model does not define .rebuild_pg_search_documents" do
|
54
|
-
context "
|
55
|
-
|
56
|
-
|
57
|
-
t
|
58
|
-
|
54
|
+
context "and multisearchable is not conditional" do
|
55
|
+
context "when :against only includes columns" do
|
56
|
+
with_model :Model do
|
57
|
+
table do |t|
|
58
|
+
t.string :name
|
59
|
+
end
|
59
60
|
|
60
|
-
|
61
|
-
|
62
|
-
|
61
|
+
model do
|
62
|
+
include PgSearch
|
63
|
+
multisearchable :against => :name
|
64
|
+
end
|
63
65
|
end
|
64
|
-
end
|
65
66
|
|
66
|
-
|
67
|
-
|
67
|
+
it "should not call :rebuild_pg_search_documents" do
|
68
|
+
rebuilder = PgSearch::Multisearch::Rebuilder.new(Model)
|
68
69
|
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
70
|
+
# stub respond_to? to return false since should_not_receive defines the method
|
71
|
+
original_respond_to = Model.method(:respond_to?)
|
72
|
+
allow(Model).to receive(:respond_to?) do |method_name, *args|
|
73
|
+
if method_name == :rebuild_pg_search_documents
|
74
|
+
false
|
75
|
+
else
|
76
|
+
original_respond_to.call(method_name, *args)
|
77
|
+
end
|
76
78
|
end
|
77
|
-
end
|
78
79
|
|
79
|
-
|
80
|
-
|
81
|
-
|
80
|
+
expect(Model).not_to receive(:rebuild_pg_search_documents)
|
81
|
+
rebuilder.rebuild
|
82
|
+
end
|
82
83
|
|
83
|
-
|
84
|
-
|
85
|
-
|
84
|
+
it "should execute the default SQL" do
|
85
|
+
time = DateTime.parse("2001-01-01")
|
86
|
+
rebuilder = PgSearch::Multisearch::Rebuilder.new(Model, lambda { time } )
|
86
87
|
|
87
|
-
|
88
|
-
|
89
|
-
|
88
|
+
# Handle change in precision of DateTime objects in SQL in Active Record 4.0.1
|
89
|
+
# https://github.com/rails/rails/commit/17f5d8e062909f1fcae25351834d8e89967b645e
|
90
|
+
version_4_0_1_or_newer = (
|
90
91
|
(ActiveRecord::VERSION::MAJOR > 4) ||
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
92
|
+
(ActiveRecord::VERSION::MAJOR == 4 && ActiveRecord::VERSION::MINOR >= 1) ||
|
93
|
+
(ActiveRecord::VERSION::MAJOR == 4 && ActiveRecord::VERSION::MINOR == 0 && ActiveRecord::VERSION::TINY >= 1)
|
94
|
+
)
|
95
|
+
|
96
|
+
expected_timestamp =
|
97
|
+
if version_4_0_1_or_newer
|
98
|
+
"2001-01-01 00:00:00.000000"
|
99
|
+
else
|
100
|
+
"2001-01-01 00:00:00"
|
101
|
+
end
|
101
102
|
|
102
|
-
|
103
|
+
expected_sql = <<-SQL.strip_heredoc
|
103
104
|
INSERT INTO "pg_search_documents" (searchable_type, searchable_id, content, created_at, updated_at)
|
104
105
|
SELECT 'Model' AS searchable_type,
|
105
106
|
#{Model.quoted_table_name}.#{Model.primary_key} AS searchable_id,
|
@@ -109,53 +110,53 @@ describe PgSearch::Multisearch::Rebuilder do
|
|
109
110
|
'#{expected_timestamp}' AS created_at,
|
110
111
|
'#{expected_timestamp}' AS updated_at
|
111
112
|
FROM #{Model.quoted_table_name}
|
112
|
-
|
113
|
+
SQL
|
113
114
|
|
114
|
-
|
115
|
+
executed_sql = []
|
115
116
|
|
116
|
-
|
117
|
-
|
118
|
-
|
117
|
+
notifier = ActiveSupport::Notifications.subscribe("sql.active_record") do |name, start, finish, id, payload|
|
118
|
+
executed_sql << payload[:sql] if payload[:sql].include?(%Q{INSERT INTO "pg_search_documents"})
|
119
|
+
end
|
119
120
|
|
120
|
-
|
121
|
-
|
121
|
+
rebuilder.rebuild
|
122
|
+
ActiveSupport::Notifications.unsubscribe(notifier)
|
122
123
|
|
123
|
-
|
124
|
-
|
125
|
-
|
124
|
+
expect(executed_sql.length).to eq(1)
|
125
|
+
expect(executed_sql.first.strip).to eq(expected_sql.strip)
|
126
|
+
end
|
126
127
|
|
127
|
-
|
128
|
-
|
129
|
-
|
130
|
-
|
131
|
-
|
128
|
+
context "for a model with a non-standard primary key" do
|
129
|
+
with_model :ModelWithNonStandardPrimaryKey do
|
130
|
+
table primary_key: :non_standard_primary_key do |t|
|
131
|
+
t.string :name
|
132
|
+
end
|
132
133
|
|
133
|
-
|
134
|
-
|
135
|
-
|
134
|
+
model do
|
135
|
+
include PgSearch
|
136
|
+
multisearchable :against => :name
|
137
|
+
end
|
136
138
|
end
|
137
|
-
end
|
138
139
|
|
139
|
-
|
140
|
-
|
141
|
-
|
140
|
+
it "generates SQL with the correct primary key" do
|
141
|
+
time = DateTime.parse("2001-01-01")
|
142
|
+
rebuilder = PgSearch::Multisearch::Rebuilder.new(ModelWithNonStandardPrimaryKey, lambda { time } )
|
142
143
|
|
143
|
-
|
144
|
-
|
145
|
-
|
144
|
+
# Handle change in precision of DateTime objects in SQL in Active Record 4.0.1
|
145
|
+
# https://github.com/rails/rails/commit/17f5d8e062909f1fcae25351834d8e89967b645e
|
146
|
+
version_4_0_1_or_newer = (
|
146
147
|
(ActiveRecord::VERSION::MAJOR > 4) ||
|
147
|
-
|
148
|
-
|
149
|
-
|
150
|
-
|
151
|
-
|
152
|
-
|
153
|
-
|
154
|
-
|
155
|
-
|
156
|
-
|
148
|
+
(ActiveRecord::VERSION::MAJOR == 4 && ActiveRecord::VERSION::MINOR >= 1) ||
|
149
|
+
(ActiveRecord::VERSION::MAJOR == 4 && ActiveRecord::VERSION::MINOR == 0 && ActiveRecord::VERSION::TINY >= 1)
|
150
|
+
)
|
151
|
+
|
152
|
+
expected_timestamp =
|
153
|
+
if version_4_0_1_or_newer
|
154
|
+
"2001-01-01 00:00:00.000000"
|
155
|
+
else
|
156
|
+
"2001-01-01 00:00:00"
|
157
|
+
end
|
157
158
|
|
158
|
-
|
159
|
+
expected_sql = <<-SQL.strip_heredoc
|
159
160
|
INSERT INTO "pg_search_documents" (searchable_type, searchable_id, content, created_at, updated_at)
|
160
161
|
SELECT 'ModelWithNonStandardPrimaryKey' AS searchable_type,
|
161
162
|
#{ModelWithNonStandardPrimaryKey.quoted_table_name}.non_standard_primary_key AS searchable_id,
|
@@ -165,24 +166,62 @@ describe PgSearch::Multisearch::Rebuilder do
|
|
165
166
|
'#{expected_timestamp}' AS created_at,
|
166
167
|
'#{expected_timestamp}' AS updated_at
|
167
168
|
FROM #{ModelWithNonStandardPrimaryKey.quoted_table_name}
|
168
|
-
|
169
|
+
SQL
|
169
170
|
|
170
|
-
|
171
|
+
executed_sql = []
|
171
172
|
|
172
|
-
|
173
|
-
|
173
|
+
notifier = ActiveSupport::Notifications.subscribe("sql.active_record") do |name, start, finish, id, payload|
|
174
|
+
executed_sql << payload[:sql] if payload[:sql].include?(%Q{INSERT INTO "pg_search_documents"})
|
175
|
+
end
|
176
|
+
|
177
|
+
rebuilder.rebuild
|
178
|
+
ActiveSupport::Notifications.unsubscribe(notifier)
|
179
|
+
|
180
|
+
expect(executed_sql.length).to eq(1)
|
181
|
+
expect(executed_sql.first.strip).to eq(expected_sql.strip)
|
174
182
|
end
|
183
|
+
end
|
184
|
+
end
|
185
|
+
|
186
|
+
context "when :against includes non-column dynamic methods" do
|
187
|
+
with_model :Model do
|
188
|
+
table do
|
189
|
+
end
|
190
|
+
|
191
|
+
model do
|
192
|
+
include PgSearch
|
193
|
+
multisearchable against: [:foo]
|
194
|
+
|
195
|
+
def foo
|
196
|
+
"bar"
|
197
|
+
end
|
198
|
+
end
|
199
|
+
end
|
200
|
+
|
201
|
+
it "calls update_pg_search_document on each record" do
|
202
|
+
record = Model.create!
|
203
|
+
|
204
|
+
rebuilder = PgSearch::Multisearch::Rebuilder.new(Model)
|
205
|
+
|
206
|
+
# stub respond_to? to return false since should_not_receive defines the method
|
207
|
+
original_respond_to = Model.method(:respond_to?)
|
208
|
+
allow(Model).to receive(:respond_to?) do |method_name, *args|
|
209
|
+
if method_name == :rebuild_pg_search_documents
|
210
|
+
false
|
211
|
+
else
|
212
|
+
original_respond_to.call(method_name, *args)
|
213
|
+
end
|
214
|
+
end
|
215
|
+
expect(Model).not_to receive(:rebuild_pg_search_documents)
|
175
216
|
|
176
217
|
rebuilder.rebuild
|
177
|
-
ActiveSupport::Notifications.unsubscribe(notifier)
|
178
218
|
|
179
|
-
expect(
|
180
|
-
expect(executed_sql.first.strip).to eq(expected_sql.strip)
|
219
|
+
expect(record.pg_search_document).to be_present
|
181
220
|
end
|
182
221
|
end
|
183
222
|
end
|
184
223
|
|
185
|
-
context "
|
224
|
+
context "and multisearchable is conditional" do
|
186
225
|
context "via :if" do
|
187
226
|
with_model :Model do
|
188
227
|
table do |t|
|
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.2
|
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-05-
|
12
|
+
date: 2015-05-04 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: activerecord
|