]> git.evergreen-ils.org Git - working/Evergreen.git/blob - Open-ILS/src/sql/Pg/upgrade/XXXX.schema.svf-phase-one.sql
commit at the end ... and I'd like to reserve a db version number, but not until...
[working/Evergreen.git] / Open-ILS / src / sql / Pg / upgrade / XXXX.schema.svf-phase-one.sql
1 BEGIN;
2
3 INSERT INTO config.upgrade_log (version) VALUES ('XXXX'); -- miker
4
5 CREATE TABLE config.record_attr_definition (
6     name        TEXT    PRIMARY KEY,
7     label       TEXT    NOT NULL, -- I18N
8     filter      BOOL    NOT NULL DEFAULT TRUE,  -- becomes QP filter if true
9     sorter      BOOL    NOT NULL DEFAULT FALSE, -- becomes QP sort() axis if true
10
11 -- For pre-extracted fields. Takes the first occurance, uses naive subfield ordering
12     tag         TEXT, -- LIKE format
13     sf_list     TEXT, -- pile-o-values, like 'abcd' for a and b and c and d
14
15 -- This is used for both tag/sf and xpath entries
16     joiner      TEXT,
17
18 -- For xpath-extracted attrs
19     xpath       TEXT,
20     format      TEXT    REFERENCES config.xml_transform (name) ON DELETE CASCADE DEFERRABLE INITIALLY DEFERRED,
21     start_pos   INT,
22     string_len  INT,
23
24 -- For fixed fields
25     fixed_field TEXT, -- should exist in config.marc21_ff_pos_map.fixed_field
26
27 -- For phys-char fields
28     phys_char_sf    INT REFERENCES config.marc21_physical_characteristic_subfield_map (id)
29 );
30
31 CREATE TABLE config.record_attr_index_norm_map (
32     id      SERIAL  PRIMARY KEY,
33     attr    TEXT    NOT NULL REFERENCES config.record_attr_definition (name) ON DELETE CASCADE DEFERRABLE INITIALLY DEFERRED,
34     norm    INT     NOT NULL REFERENCES config.index_normalizer (id) ON DELETE CASCADE DEFERRABLE INITIALLY DEFERRED,
35     params  TEXT,
36     pos     INT     NOT NULL DEFAULT 0
37 );
38
39 CREATE TABLE config.coded_value_map (
40     id          SERIAL  PRIMARY KEY,
41     ctype       TEXT    NOT NULL REFERENCES config.record_attr_definition (name) ON DELETE CASCADE DEFERRABLE INITIALLY DEFERRED,
42     code        TEXT    NOT NULL,
43     value       TEXT    NOT NULL,
44     description TEXT
45 );
46
47 -- record attributes
48 INSERT INTO config.record_attr_definition (name,label,fixed_field) values ('alph','Alph','Alph');
49 INSERT INTO config.record_attr_definition (name,label,fixed_field) values ('audience','Audn','Audn');
50 INSERT INTO config.record_attr_definition (name,label,fixed_field) values ('bib_level','BLvl','BLvl');
51 INSERT INTO config.record_attr_definition (name,label,fixed_field) values ('biog','Biog','Biog');
52 INSERT INTO config.record_attr_definition (name,label,fixed_field) values ('conf','Conf','Conf');
53 INSERT INTO config.record_attr_definition (name,label,fixed_field) values ('control_type','Ctrl','Ctrl');
54 INSERT INTO config.record_attr_definition (name,label,fixed_field) values ('ctry','Ctry','Ctry');
55 INSERT INTO config.record_attr_definition (name,label,fixed_field) values ('date1','Date1','Date1');
56 INSERT INTO config.record_attr_definition (name,label,fixed_field,sorter,filter) values ('pubdate','Pub Date','Date1',TRUE,FALSE);
57 INSERT INTO config.record_attr_definition (name,label,fixed_field) values ('date2','Date2','Date2');
58 INSERT INTO config.record_attr_definition (name,label,fixed_field) values ('cat_form','Desc','Desc');
59 INSERT INTO config.record_attr_definition (name,label,fixed_field) values ('pub_status','DtSt','DtSt');
60 INSERT INTO config.record_attr_definition (name,label,fixed_field) values ('enc_level','ELvl','ELvl');
61 INSERT INTO config.record_attr_definition (name,label,fixed_field) values ('fest','Fest','Fest');
62 INSERT INTO config.record_attr_definition (name,label,fixed_field) values ('item_form','Form','Form');
63 INSERT INTO config.record_attr_definition (name,label,fixed_field) values ('gpub','GPub','GPub');
64 INSERT INTO config.record_attr_definition (name,label,fixed_field) values ('ills','Ills','Ills');
65 INSERT INTO config.record_attr_definition (name,label,fixed_field) values ('indx','Indx','Indx');
66 INSERT INTO config.record_attr_definition (name,label,fixed_field) values ('item_lang','Lang','Lang');
67 INSERT INTO config.record_attr_definition (name,label,fixed_field) values ('lit_form','LitF','LitF');
68 INSERT INTO config.record_attr_definition (name,label,fixed_field) values ('mrec','MRec','MRec');
69 INSERT INTO config.record_attr_definition (name,label,fixed_field) values ('ff_sl','S/L','S/L');
70 INSERT INTO config.record_attr_definition (name,label,fixed_field) values ('type_mat','TMat','TMat');
71 INSERT INTO config.record_attr_definition (name,label,fixed_field) values ('item_type','Type','Type');
72 INSERT INTO config.record_attr_definition (name,label,phys_char_sf) values ('vr_format','Videorecording format',72);
73 INSERT INTO config.record_attr_definition (name,label,sorter,filter,tag) values ('titlesort','Title',TRUE,FALSE,'tnf');
74 INSERT INTO config.record_attr_definition (name,label,sorter,filter,tag) values ('authorsort','Author',TRUE,FALSE,'1%');
75
76 INSERT INTO config.coded_value_map (ctype,code,value,description)
77     SELECT 'item_lang' AS ctype, code, value, NULL FROM config.language_map
78         UNION
79     SELECT 'bib_level' AS ctype, code, value, NULL FROM config.bib_level_map
80         UNION
81     SELECT 'item_form' AS ctype, code, value, NULL FROM config.item_form_map
82         UNION
83     SELECT 'item_type' AS ctype, code, value, NULL FROM config.item_type_map
84         UNION
85     SELECT 'lit_form' AS ctype, code, value, description FROM config.lit_form_map
86         UNION
87     SELECT 'audience' AS ctype, code, value, description FROM config.audience_map
88         UNION
89     SELECT 'vr_format' AS ctype, code, value, NULL FROM config.videorecording_format_map;
90
91 ALTER TABLE config.i18n_locale DROP CONSTRAINT i18n_locale_marc_code_fkey;
92
93 ALTER TABLE config.circ_matrix_matchpoint DROP CONSTRAINT circ_matrix_matchpoint_marc_form_fkey;
94 ALTER TABLE config.circ_matrix_matchpoint DROP CONSTRAINT circ_matrix_matchpoint_marc_type_fkey;
95 ALTER TABLE config.circ_matrix_matchpoint DROP CONSTRAINT circ_matrix_matchpoint_marc_vr_format_fkey;
96
97 ALTER TABLE config.hold_matrix_matchpoint DROP CONSTRAINT hold_matrix_matchpoint_marc_form_fkey;
98 ALTER TABLE config.hold_matrix_matchpoint DROP CONSTRAINT hold_matrix_matchpoint_marc_type_fkey;
99 ALTER TABLE config.hold_matrix_matchpoint DROP CONSTRAINT hold_matrix_matchpoint_marc_vr_format_fkey;
100
101 DROP TABLE config.language_map;
102 DROP TABLE config.bib_level_map;
103 DROP TABLE config.item_form_map;
104 DROP TABLE config.item_type_map;
105 DROP TABLE config.lit_form_map;
106 DROP TABLE config.audience_map;
107 DROP TABLE config.videorecording_format_map;
108
109 CREATE VIEW config.language_map AS SELECT code, value FROM config.coded_value_map WHERE ctype = 'item_lang';
110 CREATE VIEW config.bib_level_map AS SELECT code, value FROM config.coded_value_map WHERE ctype = 'bib_level';
111 CREATE VIEW config.item_form_map AS SELECT code, value FROM config.coded_value_map WHERE ctype = 'item_form';
112 CREATE VIEW config.item_type_map AS SELECT code, value FROM config.coded_value_map WHERE ctype = 'item_type';
113 CREATE VIEW config.lit_form_map AS SELECT code, value, description FROM config.coded_value_map WHERE ctype = 'lit_form';
114 CREATE VIEW config.audience_map AS SELECT code, value, description FROM config.coded_value_map WHERE ctype = 'audience';
115 CREATE VIEW config.videorecording_format_map AS SELECT code, value FROM config.coded_value_map WHERE ctype = 'vr_format';
116
117 CREATE TABLE metabib.record_attr (
118        id              BIGINT  PRIMARY KEY REFERENCES biblio.record_entry (id) ON DELETE CASCADE,
119        attrs   HSTORE  NOT NULL DEFAULT ''::HSTORE
120 );
121 CREATE INDEX metabib_svf_attrs_idx ON metabib.record_attr USING GIST (attrs);
122 CREATE INDEX metabib_svf_date1_idx ON metabib.record_attr ( (attrs->'date1') );
123 CREATE INDEX metabib_svf_dates_idx ON metabib.record_attr ( (attrs->'date1'), (attrs->'date2') );
124
125 INSERT INTO metabib.record_attr (id,attrs)
126     SELECT mrd.record, hstore(mrd) - '{id,record}'::TEXT[] FROM metabib.rec_descriptor mrd;
127
128 -- Back-compat view ... we're moving to an HSTORE world
129 CREATE TYPE metabib.rec_desc_type AS (
130     item_type       TEXT,
131     item_form       TEXT,
132     bib_level       TEXT,
133     control_type    TEXT,
134     char_encoding   TEXT,
135     enc_level       TEXT,
136     audience        TEXT,
137     lit_form        TEXT,
138     type_mat        TEXT,
139     cat_form        TEXT,
140     pub_status      TEXT,
141     item_lang       TEXT,
142     vr_format       TEXT,
143     date1           TEXT,
144     date2           TEXT
145 );
146
147 DROP TABLE metabib.rec_descriptor CASCADE;
148
149 CREATE VIEW metabib.rec_descriptor AS
150     SELECT  id,
151             id AS record,
152             (populate_record(NULL::metabib.rec_desc_type, attrs)).*
153       FROM  metabib.record_attr;
154
155 CREATE OR REPLACE FUNCTION vandelay.marc21_record_type( marc TEXT ) RETURNS config.marc21_rec_type_map AS $func$
156 DECLARE
157     ldr         TEXT;
158     tval        TEXT;
159     tval_rec    RECORD;
160     bval        TEXT;
161     bval_rec    RECORD;
162     retval      config.marc21_rec_type_map%ROWTYPE;
163 BEGIN
164     ldr := oils_xpath_string( '//*[local-name()="leader"]', marc );
165
166     IF ldr IS NULL OR ldr = '' THEN
167         SELECT * INTO retval FROM config.marc21_rec_type_map WHERE code = 'BKS';
168         RETURN retval;
169     END IF;
170
171     SELECT * INTO tval_rec FROM config.marc21_ff_pos_map WHERE fixed_field = 'Type' LIMIT 1; -- They're all the same
172     SELECT * INTO bval_rec FROM config.marc21_ff_pos_map WHERE fixed_field = 'BLvl' LIMIT 1; -- They're all the same
173
174
175     tval := SUBSTRING( ldr, tval_rec.start_pos + 1, tval_rec.length );
176     bval := SUBSTRING( ldr, bval_rec.start_pos + 1, bval_rec.length );
177
178     -- RAISE NOTICE 'type %, blvl %, ldr %', tval, bval, ldr;
179
180     SELECT * INTO retval FROM config.marc21_rec_type_map WHERE type_val LIKE '%' || tval || '%' AND blvl_val LIKE '%' || bval || '%';
181
182
183     IF retval.code IS NULL THEN
184         SELECT * INTO retval FROM config.marc21_rec_type_map WHERE code = 'BKS';
185     END IF;
186
187     RETURN retval;
188 END;
189 $func$ LANGUAGE PLPGSQL;
190
191 CREATE OR REPLACE FUNCTION biblio.marc21_record_type( rid BIGINT ) RETURNS config.marc21_rec_type_map AS $func$
192     SELECT * FROM vandelay.marc21_record_type( (SELECT marc FROM biblio.record_entry WHERE id = $1) );
193 $func$ LANGUAGE SQL;
194
195 CREATE OR REPLACE FUNCTION vandelay.marc21_extract_fixed_field( marc TEXT, ff TEXT ) RETURNS TEXT AS $func$
196 DECLARE
197     rtype       TEXT;
198     ff_pos      RECORD;
199     tag_data    RECORD;
200     val         TEXT;
201 BEGIN
202     rtype := (vandelay.marc21_record_type( marc )).code;
203     FOR ff_pos IN SELECT * FROM config.marc21_ff_pos_map WHERE fixed_field = ff AND rec_type = rtype ORDER BY tag DESC LOOP
204         FOR tag_data IN SELECT value FROM UNNEST( oils_xpath( '//*[@tag="' || UPPER(tag) || '"]/text()', marc ) ) x(value) LOOP
205             val := SUBSTRING( tag_data.value, ff_pos.start_pos + 1, ff_pos.length );
206             RETURN val;
207         END LOOP;
208         val := REPEAT( ff_pos.default_val, ff_pos.length );
209         RETURN val;
210     END LOOP;
211
212     RETURN NULL;
213 END;
214 $func$ LANGUAGE PLPGSQL;
215
216 CREATE OR REPLACE FUNCTION biblio.marc21_extract_fixed_field( rid BIGINT, ff TEXT ) RETURNS TEXT AS $func$
217     SELECT * FROM vandelay.marc21_extract_fixed_field( (SELECT marc FROM biblio.record_entry WHERE id = $1), $2 );
218 $func$ LANGUAGE SQL;
219
220 CREATE TYPE biblio.record_ff_map AS (record BIGINT, ff_name TEXT, ff_value TEXT);
221 CREATE OR REPLACE FUNCTION vandelay.marc21_extract_all_fixed_fields( marc TEXT ) RETURNS SETOF biblio.record_ff_map AS $func$
222 DECLARE
223     tag_data    TEXT;
224     rtype       TEXT;
225     ff_pos      RECORD;
226     output      biblio.record_ff_map%ROWTYPE;
227 BEGIN
228     rtype := (vandelay.marc21_record_type( marc )).code;
229
230     FOR ff_pos IN SELECT * FROM config.marc21_ff_pos_map WHERE rec_type = rtype ORDER BY tag DESC LOOP
231         output.ff_name  := ff_pos.fixed_field;
232         output.ff_value := NULL;
233
234         FOR tag_data IN SELECT value FROM UNNEST( oils_xpath( '//*[@tag="' || UPPER(tag) || '"]/text()', marc ) ) x(value) LOOP
235             output.ff_value := SUBSTRING( tag_data.value, ff_pos.start_pos + 1, ff_pos.length );
236             IF output.ff_value IS NULL THEN output.ff_value := REPEAT( ff_pos.default_val, ff_pos.length ); END IF;
237             RETURN NEXT output;
238             output.ff_value := NULL;
239         END LOOP;
240
241     END LOOP;
242
243     RETURN;
244 END;
245 $func$ LANGUAGE PLPGSQL;
246
247 CREATE OR REPLACE FUNCTION biblio.marc21_extract_all_fixed_fields( rid BIGINT ) RETURNS SETOF biblio.record_ff_map AS $func$
248     SELECT $1 AS record, ff_name, ff_value FROM vandelay.marc21_extract_all_fixed_fields( (SELECT marc FROM biblio.record_entry WHERE id = $1) );
249 $func$ LANGUAGE SQL;
250
251 CREATE OR REPLACE FUNCTION vandelay.marc21_physical_characteristics( marc TEXT) RETURNS SETOF biblio.marc21_physical_characteristics AS $func$
252 DECLARE
253     rowid   INT := 0;
254     _007    RECORD;
255     ptype   config.marc21_physical_characteristic_type_map%ROWTYPE;
256     psf     config.marc21_physical_characteristic_subfield_map%ROWTYPE;
257     pval    config.marc21_physical_characteristic_value_map%ROWTYPE;
258     retval  biblio.marc21_physical_characteristics%ROWTYPE;
259 BEGIN
260
261     _007 := oils_xpath_string( '//*[@tag="007"]', marc );
262
263     IF _007 IS NOT NULL AND _007 <> '' THEN
264         SELECT * INTO ptype FROM config.marc21_physical_characteristic_type_map WHERE ptype_key = SUBSTRING( _007, 1, 1 );
265
266         IF ptype.ptype_key IS NOT NULL THEN
267             FOR psf IN SELECT * FROM config.marc21_physical_characteristic_subfield_map WHERE ptype_key = ptype.ptype_key LOOP
268                 SELECT * INTO pval FROM config.marc21_physical_characteristic_value_map WHERE ptype_subfield = psf.id AND value = SUBSTRING( _007, psf.start_pos + 1, psf.length );
269
270                 IF pval.id IS NOT NULL THEN
271                     rowid := rowid + 1;
272                     retval.id := rowid;
273                     retval.ptype := ptype.ptype_key;
274                     retval.subfield := psf.id;
275                     retval.value := pval.id;
276                     RETURN NEXT retval;
277                 END IF;
278
279             END LOOP;
280         END IF;
281     END IF;
282
283     RETURN;
284 END;
285 $func$ LANGUAGE PLPGSQL;
286
287 CREATE OR REPLACE FUNCTION biblio.marc21_physical_characteristics( rid BIGINT ) RETURNS SETOF biblio.marc21_physical_characteristics AS $func$
288     SELECT id, $1 AS record, ptype, subfield, value FROM vandelay.marc21_physical_characteristics( (SELECT marc FROM biblio.record_entry WHERE id = $1) );
289 $func$ LANGUAGE SQL;
290
291 CREATE OR REPLACE FUNCTION biblio.indexing_ingest_or_delete () RETURNS TRIGGER AS $func$
292 DECLARE
293     transformed_xml TEXT;
294     prev_xfrm       TEXT;
295     normalizer      RECORD;
296     xfrm            config.xml_transform%ROWTYPE;
297     attr_value      TEXT;
298     new_attrs       HSTORE := ''::HSTORE;
299     attr_def        config.record_attr_definition%ROWTYPE;
300 BEGIN
301
302     IF NEW.deleted IS TRUE THEN -- If this bib is deleted
303         DELETE FROM metabib.metarecord_source_map WHERE source = NEW.id; -- Rid ourselves of the search-estimate-killing linkage
304         DELETE FROM metabib.record_attr WHERE id = NEW.id; -- Kill the attrs hash, useless on deleted records
305         DELETE FROM authority.bib_linking WHERE bib = NEW.id; -- Avoid updating fields in bibs that are no longer visible
306         RETURN NEW; -- and we're done
307     END IF;
308
309     IF TG_OP = 'UPDATE' THEN -- re-ingest?
310         PERFORM * FROM config.internal_flag WHERE name = 'ingest.reingest.force_on_same_marc' AND enabled;
311
312         IF NOT FOUND AND OLD.marc = NEW.marc THEN -- don't do anything if the MARC didn't change
313             RETURN NEW;
314         END IF;
315     END IF;
316
317     -- Record authority linking
318     PERFORM * FROM config.internal_flag WHERE name = 'ingest.disable_authority_linking' AND enabled;
319     IF NOT FOUND THEN
320         PERFORM biblio.map_authority_linking( NEW.id, NEW.marc );
321     END IF;
322
323     -- Flatten and insert the mfr data
324     PERFORM * FROM config.internal_flag WHERE name = 'ingest.disable_metabib_full_rec' AND enabled;
325     IF NOT FOUND THEN
326         PERFORM metabib.reingest_metabib_full_rec(NEW.id);
327
328         -- Now we pull out attribute data, which is dependent on the mfr for all but XPath-based fields
329         PERFORM * FROM config.internal_flag WHERE name = 'ingest.disable_metabib_rec_descriptor' AND enabled;
330         IF NOT FOUND THEN
331             FOR attr_def IN SELECT * FROM config.record_attr_definition ORDER BY format LOOP
332
333                 IF attr_def.tag THEN -- tag (and optional subfield list) selection
334                     SELECT  ARRAY_TO_STRING(ARRAY_ACCUM(value), COALESCE(attr_def.joiner,' ')) INTO attr_value
335                       FROM  (SELECT * FROM metabib.full_rec ORDER BY tag, subfield) AS x
336                       WHERE record = NEW.id
337                             AND tag LIKE attr_def.tag
338                             AND CASE
339                                 WHEN attr_def.sf_list IS NOT NULL
340                                     THEN POSITION(subfield IN attr_def.sf_list) > 0
341                                 ELSE TRUE
342                                 END
343                       GROUP BY tag
344                       ORDER BY tag
345                       LIMIT 1;
346
347                 ELSIF attr_def.fixed_field IS NOT NULL THEN -- a named fixed field, see config.marc21_ff_pos_map.fixed_field
348                     attr_value := biblio.marc21_extract_fixed_field(NEW.id, attr_def.fixed_field);
349
350                 ELSIF attr_def.xpath IS NOT NULL THEN -- and xpath expression
351
352                     SELECT INTO xfrm * FROM config.xml_transform WHERE name = attr_def.format;
353
354                     -- See if we can skip the XSLT ... it's expensive
355                     IF prev_xfrm IS NULL OR prev_xfrm <> xfrm.name THEN
356                         -- Can't skip the transform
357                         IF xfrm.xslt <> '---' THEN
358                             transformed_xml := oils_xslt_process(NEW.marc,xfrm.xslt);
359                         ELSE
360                             transformed_xml := NEW.marc;
361                         END IF;
362
363                         prev_xfrm := xfrm.name;
364                     END IF;
365
366                     IF xfrm.name IS NULL THEN
367                         -- just grab the marcxml (empty) transform
368                         SELECT INTO xfrm * FROM config.xml_transform WHERE xslt = '---' LIMIT 1;
369                         prev_xfrm := xfrm.name;
370                     END IF;
371
372                     attr_value := oils_xpath_string(attr_def.xpath, transformed_xml, COALESCE(attr_def.joiner,' '), ARRAY[ARRAY[xfrm.prefix, xfrm.namespace_uri]]);
373
374                 ELSIF attr_def.phys_char IS NOT NULL THEN -- a named Physical Characteristic, see config.marc21_physical_characteristic_*_map
375                     SELECT  value::TEXT INTO attr_value
376                       FROM  biblio.marc21_physical_characteristics(NEW.id)
377                       WHERE subfield = attr_def.phys_char_sf
378                       LIMIT 1; -- Just in case ...
379
380                 END IF;
381
382                 -- apply index normalizers to attr_value
383                 FOR normalizer IN
384                     SELECT  n.func AS func,
385                             n.param_count AS param_count,
386                             m.params AS params
387                       FROM  config.index_normalizer n
388                             JOIN config.record_attr_index_norm_map m ON (m.norm = n.id)
389                       WHERE attr = attr_def.name
390                       ORDER BY m.pos LOOP
391                         EXECUTE 'SELECT ' || normalizer.func || '(' ||
392                             quote_literal( attr_value ) ||
393                             CASE
394                                 WHEN normalizer.param_count > 0
395                                     THEN ',' || REPLACE(REPLACE(BTRIM(normalizer.params,'[]'),E'\'',E'\\\''),E'"',E'\'')
396                                     ELSE ''
397                                 END ||
398                             ')' INTO attr_value;
399
400                 END LOOP;
401
402                 -- Add the new value to the hstore
403                 new_attrs := new_attrs || hstore( attr_def.name, attr_value );
404
405             END LOOP;
406
407             IF TG_OP = 'INSERT' OR OLD.deleted THEN -- initial insert OR revivication
408                 INSERT INTO metabib.record_attr (id, attrs) VALUES (NEW.id, new_attrs);
409             ELSE
410                 UPDATE metabib.record_attr SET attrs = attrs || new_attrs WHERE id = NEW.id;
411             END IF;
412
413         END IF;
414     END IF;
415
416     -- Gather and insert the field entry data
417     PERFORM metabib.reingest_metabib_field_entries(NEW.id);
418
419     -- Located URI magic
420     IF TG_OP = 'INSERT' THEN
421         PERFORM * FROM config.internal_flag WHERE name = 'ingest.disable_located_uri' AND enabled;
422         IF NOT FOUND THEN
423             PERFORM biblio.extract_located_uris( NEW.id, NEW.marc, NEW.editor );
424         END IF;
425     ELSE
426         PERFORM * FROM config.internal_flag WHERE name = 'ingest.disable_located_uri' AND enabled;
427         IF NOT FOUND THEN
428             PERFORM biblio.extract_located_uris( NEW.id, NEW.marc, NEW.editor );
429         END IF;
430     END IF;
431
432     -- (re)map metarecord-bib linking
433     IF TG_OP = 'INSERT' THEN -- if not deleted and performing an insert, check for the flag
434         PERFORM * FROM config.internal_flag WHERE name = 'ingest.metarecord_mapping.skip_on_insert' AND enabled;
435         IF NOT FOUND THEN
436             PERFORM metabib.remap_metarecord_for_bib( NEW.id, NEW.fingerprint );
437         END IF;
438     ELSE -- we're doing an update, and we're not deleted, remap
439         PERFORM * FROM config.internal_flag WHERE name = 'ingest.metarecord_mapping.skip_on_update' AND enabled;
440         IF NOT FOUND THEN
441             PERFORM metabib.remap_metarecord_for_bib( NEW.id, NEW.fingerprint );
442         END IF;
443     END IF;
444
445     RETURN NEW;
446 END;
447 $func$ LANGUAGE PLPGSQL;
448
449 DROP FUNCTION metabib.reingest_metabib_rec_descriptor( bib_id BIGINT );
450
451 COMMIT;
452