]> git.evergreen-ils.org Git - working/Evergreen.git/blob - Open-ILS/src/sql/Pg/upgrade/0338.functions.biblio.indexing.sql
Upgrade script numbering for acq order indentifier selector
[working/Evergreen.git] / Open-ILS / src / sql / Pg / upgrade / 0338.functions.biblio.indexing.sql
1 BEGIN;
2
3 INSERT INTO config.upgrade_log (version) VALUES ('0338'); -- dbs
4
5 CREATE OR REPLACE FUNCTION biblio.indexing_ingest_or_delete () RETURNS TRIGGER AS $func$
6 BEGIN
7
8     IF NEW.deleted IS TRUE THEN -- If this bib is deleted
9         DELETE FROM metabib.metarecord_source_map WHERE source = NEW.id; -- Rid ourselves of the search-estimate-killing linkage
10         DELETE FROM authority.bib_linking WHERE bib = NEW.id; -- Avoid updating fields in bibs that are no longer visible
11         RETURN NEW; -- and we're done
12     END IF;
13
14     IF TG_OP = 'UPDATE' THEN -- re-ingest?
15         PERFORM * FROM config.internal_flag WHERE name = 'ingest.reingest.force_on_same_marc' AND enabled;
16
17         IF NOT FOUND AND OLD.marc = NEW.marc THEN -- don't do anything if the MARC didn't change
18             RETURN NEW;
19         END IF;
20     END IF;
21
22     -- Record authority linking
23     PERFORM * FROM config.internal_flag WHERE name = 'ingest.disable_authority_linking' AND enabled;
24     IF NOT FOUND THEN
25         PERFORM biblio.map_authority_linking( NEW.id, NEW.marc );
26     END IF;
27
28     -- Flatten and insert the mfr data
29     PERFORM * FROM config.internal_flag WHERE name = 'ingest.disable_metabib_full_rec' AND enabled;
30     IF NOT FOUND THEN
31         PERFORM metabib.reingest_metabib_full_rec(NEW.id);
32         PERFORM * FROM config.internal_flag WHERE name = 'ingest.disable_metabib_rec_descriptor' AND enabled;
33         IF NOT FOUND THEN
34             PERFORM metabib.reingest_metabib_rec_descriptor(NEW.id);
35         END IF;
36     END IF;
37
38     -- Gather and insert the field entry data
39     PERFORM metabib.reingest_metabib_field_entries(NEW.id);
40
41     -- Located URI magic
42     IF TG_OP = 'INSERT' THEN
43         PERFORM * FROM config.internal_flag WHERE name = 'ingest.disable_located_uri' AND enabled;
44         IF NOT FOUND THEN
45             PERFORM biblio.extract_located_uris( NEW.id, NEW.marc, NEW.editor );
46         END IF;
47     ELSE
48         PERFORM * FROM config.internal_flag WHERE name = 'ingest.disable_located_uri' AND enabled;
49         IF NOT FOUND THEN
50             PERFORM biblio.extract_located_uris( NEW.id, NEW.marc, NEW.editor );
51         END IF;
52     END IF;
53
54     -- (re)map metarecord-bib linking
55     IF TG_OP = 'INSERT' THEN -- if not deleted and performing an insert, check for the flag
56         PERFORM * FROM config.internal_flag WHERE name = 'ingest.metarecord_mapping.skip_on_insert' AND enabled;
57         IF NOT FOUND THEN
58             PERFORM metabib.remap_metarecord_for_bib( NEW.id, NEW.fingerprint );
59         END IF;
60     ELSE -- we're doing an update, and we're not deleted, remap
61         PERFORM metabib.remap_metarecord_for_bib( NEW.id, NEW.fingerprint );
62     END IF;
63
64     RETURN NEW;
65 END;
66 $func$ LANGUAGE PLPGSQL;
67
68 CREATE OR REPLACE FUNCTION asset.merge_record_assets( target_record BIGINT, source_record BIGINT ) RETURNS INT AS $func$
69 DECLARE
70     moved_objects INT := 0;
71     source_cn     asset.call_number%ROWTYPE;
72     target_cn     asset.call_number%ROWTYPE;
73     metarec       metabib.metarecord%ROWTYPE;
74     hold          action.hold_request%ROWTYPE;
75     ser_rec       serial.record_entry%ROWTYPE;
76     uri_count     INT := 0;
77     counter       INT := 0;
78     uri_datafield TEXT;
79     uri_text      TEXT := '';
80 BEGIN
81
82     -- move any 856 entries on records that have at least one MARC-mapped URI entry
83     SELECT  INTO uri_count COUNT(*)
84       FROM  asset.uri_call_number_map m
85             JOIN asset.call_number cn ON (m.call_number = cn.id)
86       WHERE cn.record = source_record;
87
88     IF uri_count > 0 THEN
89         
90         SELECT  COUNT(*) INTO counter
91           FROM  oils_xpath_table(
92                     'id',
93                     'marc',
94                     'biblio.record_entry',
95                     '//*[@tag="856"]',
96                     'id=' || lineitem
97                 ) as t(i int,c text);
98     
99         FOR i IN 1 .. counter LOOP
100             SELECT  '<datafield xmlns="http://www.loc.gov/MARC21/slim" tag="856">' ||
101                         array_to_string(
102                             array_accum(
103                                 '<subfield code="' || subfield || '">' ||
104                                 regexp_replace(
105                                     regexp_replace(
106                                         regexp_replace(data,'&','&amp;','g'),
107                                         '>', '&gt;', 'g'
108                                     ),
109                                     '<', '&lt;', 'g'
110                                 ) || '</subfield>'
111                             ), ''
112                         ) || '</datafield>' INTO uri_datafield
113               FROM  oils_xpath_table(
114                         'id',
115                         'marc',
116                         'biblio.record_entry',
117                         '//*[@tag="856"][position()=' || i || ']/*/@code|' ||
118                         '//*[@tag="856"][position()=' || i || ']/*[@code]',
119                         'id=' || source_record
120                     ) as t(id int,subfield text,data text);
121
122             uri_text := uri_text || uri_datafield;
123         END LOOP;
124
125         IF uri_text <> '' THEN
126             UPDATE  biblio.record_entry
127               SET   marc = regexp_replace(marc,'(</[^>]*record>)', uri_text || E'\\1')
128               WHERE id = target_record;
129         END IF;
130
131     END IF;
132
133     -- Find and move metarecords to the target record
134     SELECT    INTO metarec *
135       FROM    metabib.metarecord
136       WHERE    master_record = source_record;
137
138     IF FOUND THEN
139         UPDATE    metabib.metarecord
140           SET    master_record = target_record,
141             mods = NULL
142           WHERE    id = metarec.id;
143
144         moved_objects := moved_objects + 1;
145     END IF;
146
147     -- Find call numbers attached to the source ...
148     FOR source_cn IN SELECT * FROM asset.call_number WHERE record = source_record LOOP
149
150         SELECT    INTO target_cn *
151           FROM    asset.call_number
152           WHERE    label = source_cn.label
153             AND owning_lib = source_cn.owning_lib
154             AND record = target_record;
155
156         -- ... and if there's a conflicting one on the target ...
157         IF FOUND THEN
158
159             -- ... move the copies to that, and ...
160             UPDATE    asset.copy
161               SET    call_number = target_cn.id
162               WHERE    call_number = source_cn.id;
163
164             -- ... move V holds to the move-target call number
165             FOR hold IN SELECT * FROM action.hold_request WHERE target = source_cn.id AND hold_type = 'V' LOOP
166         
167                 UPDATE    action.hold_request
168                   SET    target = target_cn.id
169                   WHERE    id = hold.id;
170         
171                 moved_objects := moved_objects + 1;
172             END LOOP;
173
174         -- ... if not ...
175         ELSE
176             -- ... just move the call number to the target record
177             UPDATE    asset.call_number
178               SET    record = target_record
179               WHERE    id = source_cn.id;
180         END IF;
181
182         moved_objects := moved_objects + 1;
183     END LOOP;
184
185     -- Find T holds targeting the source record ...
186     FOR hold IN SELECT * FROM action.hold_request WHERE target = source_record AND hold_type = 'T' LOOP
187
188         -- ... and move them to the target record
189         UPDATE    action.hold_request
190           SET    target = target_record
191           WHERE    id = hold.id;
192
193         moved_objects := moved_objects + 1;
194     END LOOP;
195
196     -- Find serial records targeting the source record ...
197     FOR ser_rec IN SELECT * FROM serial.record_entry WHERE record = source_record LOOP
198         -- ... and move them to the target record
199         UPDATE    serial.record_entry
200           SET    record = target_record
201           WHERE    id = ser_rec.id;
202
203         moved_objects := moved_objects + 1;
204     END LOOP;
205
206     -- Finally, "delete" the source record
207     DELETE FROM biblio.record_entry WHERE id = source_record;
208
209     -- That's all, folks!
210     RETURN moved_objects;
211 END;
212 $func$ LANGUAGE plpgsql;
213
214 COMMIT;