]> git.evergreen-ils.org Git - Evergreen.git/blob - Open-ILS/src/sql/Pg/upgrade/0343.schema.merger_record_assets.fix.sql
LP#1643709: Stamping upgrade scripts
[Evergreen.git] / Open-ILS / src / sql / Pg / upgrade / 0343.schema.merger_record_assets.fix.sql
1 BEGIN;
2
3 INSERT INTO config.upgrade_log (version) VALUES ('0343'); -- miker 
4
5 CREATE OR REPLACE FUNCTION asset.merge_record_assets( target_record BIGINT, source_record BIGINT ) RETURNS INT AS $func$
6 DECLARE
7     moved_objects INT := 0;
8     source_cn     asset.call_number%ROWTYPE;
9     target_cn     asset.call_number%ROWTYPE;
10     metarec       metabib.metarecord%ROWTYPE;
11     hold          action.hold_request%ROWTYPE;
12     ser_rec       serial.record_entry%ROWTYPE;
13     uri_count     INT := 0;
14     counter       INT := 0;
15     uri_datafield TEXT;
16     uri_text      TEXT := '';
17 BEGIN
18
19     -- move any 856 entries on records that have at least one MARC-mapped URI entry
20     SELECT  INTO uri_count COUNT(*)
21       FROM  asset.uri_call_number_map m
22             JOIN asset.call_number cn ON (m.call_number = cn.id)
23       WHERE cn.record = source_record;
24
25     IF uri_count > 0 THEN
26
27         SELECT  COUNT(*) INTO counter
28           FROM  oils_xpath_table(
29                     'id',
30                     'marc',
31                     'biblio.record_entry',
32                     '//*[@tag="856"]',
33                     'id=' || source_record
34                 ) as t(i int,c text);
35
36         FOR i IN 1 .. counter LOOP
37             SELECT  '<datafield xmlns="http://www.loc.gov/MARC21/slim" tag="856">' ||
38                         array_to_string(
39                             array_accum(
40                                 '<subfield code="' || subfield || '">' ||
41                                 regexp_replace(
42                                     regexp_replace(
43                                         regexp_replace(data,'&','&amp;','g'),
44                                         '>', '&gt;', 'g'
45                                     ),
46                                     '<', '&lt;', 'g'
47                                 ) || '</subfield>'
48                             ), ''
49                         ) || '</datafield>' INTO uri_datafield
50               FROM  oils_xpath_table(
51                         'id',
52                         'marc',
53                         'biblio.record_entry',
54                         '//*[@tag="856"][position()=' || i || ']/*/@code|' ||
55                         '//*[@tag="856"][position()=' || i || ']/*[@code]',
56                         'id=' || source_record
57                     ) as t(id int,subfield text,data text);
58
59             uri_text := uri_text || uri_datafield;
60         END LOOP;
61
62         IF uri_text <> '' THEN
63             UPDATE  biblio.record_entry
64               SET   marc = regexp_replace(marc,'(</[^>]*record>)', uri_text || E'\\1')
65               WHERE id = target_record;
66         END IF;
67
68     END IF;
69
70     -- Find and move metarecords to the target record
71     SELECT  INTO metarec *
72       FROM  metabib.metarecord
73       WHERE master_record = source_record;
74
75     IF FOUND THEN
76         UPDATE  metabib.metarecord
77           SET   master_record = target_record,
78             mods = NULL
79           WHERE id = metarec.id;
80
81         moved_objects := moved_objects + 1;
82     END IF;
83
84     -- Find call numbers attached to the source ...
85     FOR source_cn IN SELECT * FROM asset.call_number WHERE record = source_record LOOP
86
87         SELECT  INTO target_cn *
88           FROM  asset.call_number
89           WHERE label = source_cn.label
90             AND owning_lib = source_cn.owning_lib
91             AND record = target_record;
92
93         -- ... and if there's a conflicting one on the target ...
94         IF FOUND THEN
95
96             -- ... move the copies to that, and ...
97             UPDATE  asset.copy
98               SET   call_number = target_cn.id
99               WHERE call_number = source_cn.id;
100
101             -- ... move V holds to the move-target call number
102             FOR hold IN SELECT * FROM action.hold_request WHERE target = source_cn.id AND hold_type = 'V' LOOP
103
104                 UPDATE  action.hold_request
105                   SET   target = target_cn.id
106                   WHERE id = hold.id;
107
108                 moved_objects := moved_objects + 1;
109             END LOOP;
110
111         -- ... if not ...
112         ELSE
113             -- ... just move the call number to the target record
114             UPDATE  asset.call_number
115               SET   record = target_record
116               WHERE id = source_cn.id;
117         END IF;
118
119         moved_objects := moved_objects + 1;
120     END LOOP;
121
122     -- Find T holds targeting the source record ...
123     FOR hold IN SELECT * FROM action.hold_request WHERE target = source_record AND hold_type = 'T' LOOP
124
125         -- ... and move them to the target record
126         UPDATE  action.hold_request
127           SET   target = target_record
128           WHERE id = hold.id;
129
130         moved_objects := moved_objects + 1;
131     END LOOP;
132
133     -- Find serial records targeting the source record ...
134     FOR ser_rec IN SELECT * FROM serial.record_entry WHERE record = source_record LOOP
135         -- ... and move them to the target record
136         UPDATE  serial.record_entry
137           SET   record = target_record
138           WHERE id = ser_rec.id;
139
140         moved_objects := moved_objects + 1;
141     END LOOP;
142
143     -- Finally, "delete" the source record
144     DELETE FROM biblio.record_entry WHERE id = source_record;
145
146     -- That's all, folks!
147     RETURN moved_objects;
148 END;
149 $func$ LANGUAGE plpgsql;
150
151 COMMIT;