pg_fts 0.0.0 → 0.2.0

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 3458e83b224d9191b68c2f32ce1172cf5f5280a0
4
- data.tar.gz: a945387bb0a70cfaa15b9059b522293cdefda53f
3
+ metadata.gz: 1ea680738925689db1fc42b39c9c093cb8614dc7
4
+ data.tar.gz: d7d82abffb9221c04a4a3ff8941adfc936b7c4e6
5
5
  SHA512:
6
- metadata.gz: f72e926e83c7b218f79ee42d7d1e9d8b38b73eac9214db1253229e3c876943de75edbd7975bc80b68dcdbef3ea9a9605a5cad2913308c41b8905d54dbb240cc0
7
- data.tar.gz: 80793c65aeb3342d6209205a5064dd775f756deb14441f2e60be32513b8ccd07405dedd1ef87d92c81871d5ddb935886cbdf8efa97005f4faa0c6c1759de02c1
6
+ metadata.gz: 0ee0f73f4700ca766afc752ebe714f90f93a2ac4b6d63cb1baceea623b9cc80fa418d9afad231f3d63d9ad3be1ff678c4de223a396226bd7ba7fc18eecc2ba32
7
+ data.tar.gz: 5a5584885fa6f196bb43a313a21716cc814a25272d198cbc22695d78d4b2eb99e0e32cc57e37c6f577a9f395cccf4ce478ce8b89a262028f634ecd0f1c1ccb8c
@@ -0,0 +1,325 @@
1
+ # many documents, one source
2
+ class PG::FTS::Index::ManyToOne
3
+ attr_reader :table, :fields, :catalog, :document, :key, :foreign_key, :name
4
+ alias source table
5
+
6
+ include PG::FTS::Index
7
+ include PG::FTS::Naming
8
+ include PG::FTS::TSVector
9
+
10
+ # rubocop:disable Metrics/ParameterLists
11
+ def initialize(table, *fields,
12
+ document: nil, key: nil, foreign_key: nil,
13
+ catalog: nil,
14
+ as: nil)
15
+ @table = table
16
+ @fields = fields
17
+ @catalog = catalog || PG::FTS.catalog
18
+ @document = document || fail(ArgumentError, ':document required')
19
+ @key = key || :id
20
+ @foreign_key = foreign_key || :"#{table}_id"
21
+ @name = as
22
+ end
23
+ # rubocop:enable Metrics/ParameterLists
24
+
25
+ def build_query
26
+ <<-SQL.gsub(/^ {4}/, '')
27
+ INSERT INTO "#{PG::FTS.table}" (
28
+ "document_id",
29
+ "document_table",
30
+ "source_id",
31
+ "source_table",
32
+ "tsv")
33
+ SELECT "#{document}"."#{key}",
34
+ '#{document}',
35
+ "#{source}"."#{key}",
36
+ '#{source}',
37
+ #{ts_vector(source)}
38
+ FROM "#{document}", "#{source}"
39
+ WHERE "#{document}"."#{foreign_key}" = "#{source}"."#{key}";
40
+ SQL
41
+ end
42
+
43
+ def on_source_insert_query
44
+ <<-SQL.gsub(/^ {4}/, '')
45
+ INSERT INTO "#{PG::FTS.table}" (
46
+ "document_id",
47
+ "document_table",
48
+ "source_id",
49
+ "source_table",
50
+ "tsv")
51
+ SELECT
52
+ "#{document}"."#{key}",
53
+ '#{document}',
54
+ NEW."#{key}",
55
+ '#{source}',
56
+ #{ts_vector}
57
+ FROM "#{document}"
58
+ WHERE "#{document}"."#{foreign_key}" = NEW."#{key}";
59
+ SQL
60
+ end
61
+
62
+ def on_source_insert_procedure
63
+ <<-SQL.gsub(/^ {4}/, '')
64
+ CREATE FUNCTION "#{on_source_insert_procedure_name}"()
65
+ RETURNS TRIGGER AS $$
66
+ BEGIN
67
+ #{on_source_insert_query.gsub(/^/, ' ')}
68
+ RETURN NEW;
69
+ END;
70
+ $$ LANGUAGE plpgsql;
71
+ SQL
72
+ end
73
+
74
+ def on_source_update_query
75
+ <<-SQL.gsub(/^ {4}/, '')
76
+ UPDATE "#{PG::FTS.table}"
77
+ SET
78
+ "tsv" = (#{ts_vector}),
79
+ "document_table" = '#{document}',
80
+ "document_id" = "#{document}"."#{key}"
81
+ FROM "#{document}"
82
+ WHERE "#{document}"."#{foreign_key}" = NEW."#{key}"
83
+ AND "#{PG::FTS.table}"."source_id" = OLD."#{key}"
84
+ AND "#{PG::FTS.table}"."source_table" = '#{source}'
85
+ AND "#{PG::FTS.table}"."document_id" = "#{document}"."#{key}"
86
+ AND "#{PG::FTS.table}"."document_table" = '#{document}';
87
+ SQL
88
+ end
89
+
90
+ def on_source_update_procedure
91
+ <<-SQL.gsub(/^ {4}/, '')
92
+ CREATE FUNCTION "#{on_source_update_procedure_name}"()
93
+ RETURNS TRIGGER AS $$
94
+ BEGIN
95
+ #{on_source_update_query.gsub(/^/, ' ')}
96
+ RETURN NEW;
97
+ END;
98
+ $$ LANGUAGE plpgsql;
99
+ SQL
100
+ end
101
+
102
+ def on_source_delete_query
103
+ <<-SQL.gsub(/^ {4}/, '')
104
+ DELETE FROM "#{PG::FTS.table}"
105
+ WHERE "#{PG::FTS.table}"."source_id" = OLD."#{key}"
106
+ AND "#{PG::FTS.table}"."source_table" = '#{source}'
107
+ AND "#{PG::FTS.table}"."document_table" = '#{document}';
108
+ SQL
109
+ end
110
+
111
+ def on_source_delete_procedure
112
+ <<-SQL.gsub(/^ {4}/, '')
113
+ CREATE FUNCTION "#{on_source_delete_procedure_name}"()
114
+ RETURNS TRIGGER AS $$
115
+ BEGIN
116
+ #{on_source_delete_query.gsub(/^/, ' ')}
117
+ RETURN OLD;
118
+ END;
119
+ $$ LANGUAGE plpgsql;
120
+ SQL
121
+ end
122
+
123
+ def on_source_truncate_query
124
+ <<-SQL.gsub(/^ {4}/, '')
125
+ DELETE FROM "#{PG::FTS.table}"
126
+ WHERE "#{PG::FTS.table}"."source_table" = '#{source}'
127
+ AND "#{PG::FTS.table}"."document_table" = '#{document}';
128
+ SQL
129
+ end
130
+
131
+ def on_source_truncate_procedure
132
+ <<-SQL.gsub(/^ {4}/, '')
133
+ CREATE FUNCTION "#{on_source_truncate_procedure_name}"()
134
+ RETURNS TRIGGER AS $$
135
+ BEGIN
136
+ #{on_source_truncate_query.gsub(/^/, ' ')}
137
+ RETURN NULL;
138
+ END;
139
+ $$ LANGUAGE plpgsql;
140
+ SQL
141
+ end
142
+
143
+ def on_source_insert_trigger
144
+ <<-SQL.gsub(/^ {4}/, '')
145
+ CREATE TRIGGER "#{on_source_insert_trigger_name}"
146
+ AFTER INSERT ON "#{source}"
147
+ FOR EACH ROW
148
+ EXECUTE PROCEDURE "#{on_source_insert_procedure_name}"();
149
+ SQL
150
+ end
151
+
152
+ def on_source_update_trigger
153
+ <<-SQL.gsub(/^ {4}/, '')
154
+ CREATE TRIGGER "#{on_source_update_trigger_name}"
155
+ AFTER UPDATE ON "#{source}"
156
+ FOR EACH ROW
157
+ EXECUTE PROCEDURE "#{on_source_update_procedure_name}"();
158
+ SQL
159
+ end
160
+
161
+ def on_source_delete_trigger
162
+ <<-SQL.gsub(/^ {4}/, '')
163
+ CREATE TRIGGER "#{on_source_delete_trigger_name}"
164
+ AFTER DELETE ON "#{source}"
165
+ FOR EACH ROW
166
+ EXECUTE PROCEDURE "#{on_source_delete_procedure_name}"();
167
+ SQL
168
+ end
169
+
170
+ def on_source_truncate_trigger
171
+ <<-SQL.gsub(/^ {4}/, '')
172
+ CREATE TRIGGER "#{on_source_truncate_trigger_name}"
173
+ AFTER TRUNCATE ON "#{source}"
174
+ FOR EACH STATEMENT
175
+ EXECUTE PROCEDURE "#{on_source_truncate_procedure_name}"();
176
+ SQL
177
+ end
178
+
179
+ def on_document_insert_query
180
+ <<-SQL.gsub(/^ {4}/, '')
181
+ INSERT INTO "#{PG::FTS.table}" (
182
+ "document_id",
183
+ "document_table",
184
+ "source_id",
185
+ "source_table",
186
+ "tsv")
187
+ SELECT
188
+ NEW."#{key}",
189
+ '#{document}',
190
+ NEW."#{foreign_key}",
191
+ '#{source}',
192
+ #{ts_vector(source)}
193
+ FROM "#{source}"
194
+ WHERE "#{source}"."#{key}" = NEW."#{foreign_key}";
195
+ SQL
196
+ end
197
+
198
+ def on_document_insert_procedure
199
+ <<-SQL.gsub(/^ {4}/, '')
200
+ CREATE FUNCTION "#{on_document_insert_procedure_name}"()
201
+ RETURNS TRIGGER AS $$
202
+ BEGIN
203
+ IF NEW."#{foreign_key}" IS NULL THEN
204
+ RETURN NEW;
205
+ END IF;
206
+ #{on_document_insert_query.gsub(/^/, ' ')}
207
+ RETURN NEW;
208
+ END;
209
+ $$ LANGUAGE plpgsql;
210
+ SQL
211
+ end
212
+
213
+ def on_document_update_query
214
+ <<-SQL.gsub(/^ {4}/, '')
215
+ UPDATE "#{PG::FTS.table}"
216
+ SET
217
+ "tsv" = (#{ts_vector(source)}),
218
+ "source_table" = '#{source}',
219
+ "source_id" = NEW."#{foreign_key}"
220
+ FROM "#{source}"
221
+ WHERE "#{source}"."#{key}" = NEW."#{foreign_key}"
222
+ AND "#{PG::FTS.table}"."source_id" = OLD."#{foreign_key}"
223
+ AND "#{PG::FTS.table}"."source_table" = '#{source}'
224
+ AND "#{PG::FTS.table}"."document_id" = OLD."#{key}"
225
+ AND "#{PG::FTS.table}"."document_table" = '#{document}';
226
+ SQL
227
+ end
228
+
229
+ def on_document_update_procedure
230
+ <<-SQL.gsub(/^ {4}/, '')
231
+ CREATE FUNCTION "#{on_document_update_procedure_name}"()
232
+ RETURNS TRIGGER AS $$
233
+ BEGIN
234
+ #{on_document_update_query.gsub(/^/, ' ')}
235
+ IF NOT FOUND THEN
236
+ #{on_document_insert_query.gsub(/^/, ' ')}
237
+ IF NOT FOUND THEN
238
+ #{on_document_delete_query.gsub(/^/, ' ')}
239
+ END IF;
240
+ RETURN NEW;
241
+ END IF;
242
+ RETURN NEW;
243
+ END;
244
+ $$ LANGUAGE plpgsql;
245
+ SQL
246
+ end
247
+
248
+ def on_document_delete_query
249
+ <<-SQL.gsub(/^ {4}/, '')
250
+ DELETE FROM "#{PG::FTS.table}"
251
+ WHERE "#{PG::FTS.table}"."source_id" = OLD."#{foreign_key}"
252
+ AND "#{PG::FTS.table}"."source_table" = '#{source}'
253
+ AND "#{PG::FTS.table}"."document_id" = OLD."#{key}"
254
+ AND "#{PG::FTS.table}"."document_table" = '#{document}';
255
+ SQL
256
+ end
257
+
258
+ def on_document_delete_procedure
259
+ <<-SQL.gsub(/^ {4}/, '')
260
+ CREATE FUNCTION "#{on_document_delete_procedure_name}"()
261
+ RETURNS TRIGGER AS $$
262
+ BEGIN
263
+ #{on_document_delete_query.gsub(/^/, ' ')}
264
+ RETURN OLD;
265
+ END;
266
+ $$ LANGUAGE plpgsql;
267
+ SQL
268
+ end
269
+
270
+ def on_document_truncate_query
271
+ <<-SQL.gsub(/^ {4}/, '')
272
+ DELETE FROM "#{PG::FTS.table}"
273
+ WHERE "#{PG::FTS.table}"."source_table" = '#{source}'
274
+ AND "#{PG::FTS.table}"."document_table" = '#{document}';
275
+ SQL
276
+ end
277
+
278
+ def on_document_truncate_procedure
279
+ <<-SQL.gsub(/^ {4}/, '')
280
+ CREATE FUNCTION "#{on_document_truncate_procedure_name}"()
281
+ RETURNS TRIGGER AS $$
282
+ BEGIN
283
+ #{on_document_truncate_query.gsub(/^/, ' ')}
284
+ RETURN NULL;
285
+ END;
286
+ $$ LANGUAGE plpgsql;
287
+ SQL
288
+ end
289
+
290
+ def on_document_insert_trigger
291
+ <<-SQL.gsub(/^ {4}/, '')
292
+ CREATE TRIGGER "#{on_document_insert_trigger_name}"
293
+ AFTER INSERT ON "#{document}"
294
+ FOR EACH ROW
295
+ EXECUTE PROCEDURE "#{on_document_insert_procedure_name}"();
296
+ SQL
297
+ end
298
+
299
+ def on_document_update_trigger
300
+ <<-SQL.gsub(/^ {4}/, '')
301
+ CREATE TRIGGER "#{on_document_update_trigger_name}"
302
+ AFTER UPDATE ON "#{document}"
303
+ FOR EACH ROW
304
+ EXECUTE PROCEDURE "#{on_document_update_procedure_name}"();
305
+ SQL
306
+ end
307
+
308
+ def on_document_delete_trigger
309
+ <<-SQL.gsub(/^ {4}/, '')
310
+ CREATE TRIGGER "#{on_document_delete_trigger_name}"
311
+ AFTER DELETE ON "#{document}"
312
+ FOR EACH ROW
313
+ EXECUTE PROCEDURE "#{on_document_delete_procedure_name}"();
314
+ SQL
315
+ end
316
+
317
+ def on_document_truncate_trigger
318
+ <<-SQL.gsub(/^ {4}/, '')
319
+ CREATE TRIGGER "#{on_document_truncate_trigger_name}"
320
+ AFTER TRUNCATE ON "#{document}"
321
+ FOR EACH STATEMENT
322
+ EXECUTE PROCEDURE "#{on_document_truncate_procedure_name}"();
323
+ SQL
324
+ end
325
+ end