pg_fts 0.0.0 → 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
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