]> git.evergreen-ils.org Git - Evergreen.git/blob - Open-ILS/src/sql/Pg/version-upgrade/2.3.2-2.3.3-upgrade-db.sql
LP1779158 Angular7 and ng-lint updates
[Evergreen.git] / Open-ILS / src / sql / Pg / version-upgrade / 2.3.2-2.3.3-upgrade-db.sql
1 --Upgrade Script for 2.3.2 to 2.3.3
2 \set eg_version '''2.3.3'''
3 BEGIN;
4 INSERT INTO config.upgrade_log (version, applied_to) VALUES ('2.3.3', :eg_version);
5 -- Use MARC relator codes (710 subfield 4) to index corporate authors, along
6 -- with the existing relator text (710 subfield e)
7
8
9 -- check whether patch can be applied
10 SELECT evergreen.upgrade_deps_block_check('0749', :eg_version);
11
12 UPDATE config.metabib_field
13   SET xpath = $$//mods32:mods/mods32:name[@type='corporate'
14     and (mods32:role/mods32:roleTerm[text()='creator']
15       or mods32:role/mods32:roleTerm[text()='aut']
16       or mods32:role/mods32:roleTerm[text()='cre']
17     )]$$
18   WHERE id = 7
19 ;
20
21 SELECT metabib.reingest_metabib_field_entries(record, TRUE, TRUE, FALSE)
22   FROM metabib.full_rec
23   WHERE tag = '710'
24     AND subfield = '4'
25     AND value IN ('cre', 'aut')
26 ;
27
28 -- Only consider main entry headings for bib overlay
29
30
31 -- check whether patch can be applied
32 SELECT evergreen.upgrade_deps_block_check('0750', :eg_version);
33
34
35 -- Function to generate an ephemeral overlay template from an authority record
36 CREATE OR REPLACE FUNCTION authority.generate_overlay_template (source_xml TEXT) RETURNS TEXT AS $f$
37 DECLARE
38     cset                INT;
39     main_entry          authority.control_set_authority_field%ROWTYPE;
40     bib_field           authority.control_set_bib_field%ROWTYPE;
41     auth_id             INT DEFAULT oils_xpath_string('//*[@tag="901"]/*[local-name()="subfield" and @code="c"]', source_xml)::INT;
42     replace_data        XML[] DEFAULT '{}'::XML[];
43     replace_rules       TEXT[] DEFAULT '{}'::TEXT[];
44     auth_field          XML[];
45 BEGIN
46     IF auth_id IS NULL THEN
47         RETURN NULL;
48     END IF;
49
50     -- Default to the LoC controll set
51     SELECT control_set INTO cset FROM authority.record_entry WHERE id = auth_id;
52
53     -- if none, make a best guess
54     IF cset IS NULL THEN
55         SELECT  control_set INTO cset
56           FROM  authority.control_set_authority_field
57           WHERE tag IN (
58                     SELECT  UNNEST(XPATH('//*[starts-with(@tag,"1")]/@tag',marc::XML)::TEXT[])
59                       FROM  authority.record_entry
60                       WHERE id = auth_id
61                 )
62           LIMIT 1;
63     END IF;
64
65     -- if STILL none, no-op change
66     IF cset IS NULL THEN
67         RETURN XMLELEMENT(
68             name record,
69             XMLATTRIBUTES('http://www.loc.gov/MARC21/slim' AS xmlns),
70             XMLELEMENT( name leader, '00881nam a2200193   4500'),
71             XMLELEMENT(
72                 name datafield,
73                 XMLATTRIBUTES( '905' AS tag, ' ' AS ind1, ' ' AS ind2),
74                 XMLELEMENT(
75                     name subfield,
76                     XMLATTRIBUTES('d' AS code),
77                     '901c'
78                 )
79             )
80         )::TEXT;
81     END IF;
82
83     FOR main_entry IN SELECT * FROM authority.control_set_authority_field acsaf WHERE acsaf.control_set = cset AND acsaf.main_entry IS NULL LOOP
84         auth_field := XPATH('//*[@tag="'||main_entry.tag||'"][1]',source_xml::XML);
85         IF ARRAY_LENGTH(auth_field,1) > 0 THEN
86             FOR bib_field IN SELECT * FROM authority.control_set_bib_field WHERE authority_field = main_entry.id LOOP
87                 replace_data := replace_data || XMLELEMENT( name datafield, XMLATTRIBUTES(bib_field.tag AS tag), XPATH('//*[local-name()="subfield"]',auth_field[1])::XML[]);
88                 replace_rules := replace_rules || ( bib_field.tag || main_entry.sf_list || E'[0~\\)' || auth_id || '$]' );
89             END LOOP;
90             EXIT;
91         END IF;
92     END LOOP;
93
94     RETURN XMLELEMENT(
95         name record,
96         XMLATTRIBUTES('http://www.loc.gov/MARC21/slim' AS xmlns),
97         XMLELEMENT( name leader, '00881nam a2200193   4500'),
98         replace_data,
99         XMLELEMENT(
100             name datafield,
101             XMLATTRIBUTES( '905' AS tag, ' ' AS ind1, ' ' AS ind2),
102             XMLELEMENT(
103                 name subfield,
104                 XMLATTRIBUTES('r' AS code),
105                 ARRAY_TO_STRING(replace_rules,',')
106             )
107         )
108     )::TEXT;
109 END;
110 $f$ STABLE LANGUAGE PLPGSQL;
111
112 -- Change the two argument form of vandelay.merge_record_xml to
113 -- prevent bibliographic record destruction when there is nothing to
114 -- do.
115
116
117 CREATE OR REPLACE FUNCTION vandelay.merge_record_xml ( target_marc TEXT, template_marc TEXT ) RETURNS TEXT AS $$
118 DECLARE
119     dyn_profile     vandelay.compile_profile%ROWTYPE;
120     replace_rule    TEXT;
121     tmp_marc        TEXT;
122     trgt_marc        TEXT;
123     tmpl_marc        TEXT;
124     match_count     INT;
125 BEGIN
126
127     IF target_marc IS NULL OR template_marc IS NULL THEN
128         -- RAISE NOTICE 'no marc for target or template record';
129         RETURN NULL;
130     END IF;
131
132     dyn_profile := vandelay.compile_profile( template_marc );
133
134     IF dyn_profile.replace_rule <> '' AND dyn_profile.preserve_rule <> '' THEN
135         -- RAISE NOTICE 'both replace [%] and preserve [%] specified', dyn_profile.replace_rule, dyn_profile.preserve_rule;
136         RETURN NULL;
137     END IF;
138
139     IF dyn_profile.replace_rule = '' AND dyn_profile.preserve_rule = '' AND dyn_profile.add_rule = '' THEN
140         --Since we have nothing to do, just return what we were given.
141         RETURN target_marc;
142     ELSIF dyn_profile.replace_rule <> '' THEN
143         trgt_marc = target_marc;
144         tmpl_marc = template_marc;
145         replace_rule = dyn_profile.replace_rule;
146     ELSE
147         tmp_marc = target_marc;
148         trgt_marc = template_marc;
149         tmpl_marc = tmp_marc;
150         replace_rule = dyn_profile.preserve_rule;
151     END IF;
152
153     RETURN vandelay.merge_record_xml( trgt_marc, tmpl_marc, dyn_profile.add_rule, replace_rule, dyn_profile.strip_rule );
154
155 END;
156 $$ LANGUAGE PLPGSQL;
157
158 CREATE OR REPLACE FUNCTION vandelay.template_overlay_bib_record ( v_marc TEXT, eg_id BIGINT, merge_profile_id INT ) RETURNS BOOL AS $$
159 DECLARE
160     merge_profile   vandelay.merge_profile%ROWTYPE;
161     dyn_profile     vandelay.compile_profile%ROWTYPE;
162     editor_string   TEXT;
163     editor_id       INT;
164     source_marc     TEXT;
165     target_marc     TEXT;
166     eg_marc         TEXT;
167     replace_rule    TEXT;
168     match_count     INT;
169 BEGIN
170
171     SELECT  b.marc INTO eg_marc
172       FROM  biblio.record_entry b
173       WHERE b.id = eg_id
174       LIMIT 1;
175
176     IF eg_marc IS NULL OR v_marc IS NULL THEN
177         -- RAISE NOTICE 'no marc for template or bib record';
178         RETURN FALSE;
179     END IF;
180
181     dyn_profile := vandelay.compile_profile( v_marc );
182
183     IF merge_profile_id IS NOT NULL THEN
184         SELECT * INTO merge_profile FROM vandelay.merge_profile WHERE id = merge_profile_id;
185         IF FOUND THEN
186             dyn_profile.add_rule := BTRIM( dyn_profile.add_rule || ',' || COALESCE(merge_profile.add_spec,''), ',');
187             dyn_profile.strip_rule := BTRIM( dyn_profile.strip_rule || ',' || COALESCE(merge_profile.strip_spec,''), ',');
188             dyn_profile.replace_rule := BTRIM( dyn_profile.replace_rule || ',' || COALESCE(merge_profile.replace_spec,''), ',');
189             dyn_profile.preserve_rule := BTRIM( dyn_profile.preserve_rule || ',' || COALESCE(merge_profile.preserve_spec,''), ',');
190         END IF;
191     END IF;
192
193     IF dyn_profile.replace_rule <> '' AND dyn_profile.preserve_rule <> '' THEN
194         -- RAISE NOTICE 'both replace [%] and preserve [%] specified', dyn_profile.replace_rule, dyn_profile.preserve_rule;
195         RETURN FALSE;
196     END IF;
197
198     IF dyn_profile.replace_rule = '' AND dyn_profile.preserve_rule = '' AND dyn_profile.add_rule = '' AND dyn_profile.strip_rule = '' THEN
199         --Since we have nothing to do, just return a NOOP "we did it"
200         RETURN TRUE;
201     ELSIF dyn_profile.replace_rule <> '' THEN
202         source_marc = v_marc;
203         target_marc = eg_marc;
204         replace_rule = dyn_profile.replace_rule;
205     ELSE
206         source_marc = eg_marc;
207         target_marc = v_marc;
208         replace_rule = dyn_profile.preserve_rule;
209     END IF;
210
211     UPDATE  biblio.record_entry
212       SET   marc = vandelay.merge_record_xml( target_marc, source_marc, dyn_profile.add_rule, replace_rule, dyn_profile.strip_rule )
213       WHERE id = eg_id;
214
215     IF NOT FOUND THEN
216         -- RAISE NOTICE 'update of biblio.record_entry failed';
217         RETURN FALSE;
218     END IF;
219
220     RETURN TRUE;
221
222 END;
223 $$ LANGUAGE PLPGSQL;
224
225 CREATE OR REPLACE FUNCTION vandelay.overlay_authority_record ( import_id BIGINT, eg_id BIGINT, merge_profile_id INT ) RETURNS BOOL AS $$
226 DECLARE
227     merge_profile   vandelay.merge_profile%ROWTYPE;
228     dyn_profile     vandelay.compile_profile%ROWTYPE;
229     source_marc     TEXT;
230     target_marc     TEXT;
231     eg_marc         TEXT;
232     v_marc          TEXT;
233     replace_rule    TEXT;
234     match_count     INT;
235 BEGIN
236
237     SELECT  b.marc INTO eg_marc
238       FROM  authority.record_entry b
239             JOIN vandelay.authority_match m ON (m.eg_record = b.id AND m.queued_record = import_id)
240       LIMIT 1;
241
242     SELECT  q.marc INTO v_marc
243       FROM  vandelay.queued_record q
244             JOIN vandelay.authority_match m ON (m.queued_record = q.id AND q.id = import_id)
245       LIMIT 1;
246
247     IF eg_marc IS NULL OR v_marc IS NULL THEN
248         -- RAISE NOTICE 'no marc for vandelay or authority record';
249         RETURN FALSE;
250     END IF;
251
252     dyn_profile := vandelay.compile_profile( v_marc );
253
254     IF merge_profile_id IS NOT NULL THEN
255         SELECT * INTO merge_profile FROM vandelay.merge_profile WHERE id = merge_profile_id;
256         IF FOUND THEN
257             dyn_profile.add_rule := BTRIM( dyn_profile.add_rule || ',' || COALESCE(merge_profile.add_spec,''), ',');
258             dyn_profile.strip_rule := BTRIM( dyn_profile.strip_rule || ',' || COALESCE(merge_profile.strip_spec,''), ',');
259             dyn_profile.replace_rule := BTRIM( dyn_profile.replace_rule || ',' || COALESCE(merge_profile.replace_spec,''), ',');
260             dyn_profile.preserve_rule := BTRIM( dyn_profile.preserve_rule || ',' || COALESCE(merge_profile.preserve_spec,''), ',');
261         END IF;
262     END IF;
263
264     IF dyn_profile.replace_rule <> '' AND dyn_profile.preserve_rule <> '' THEN
265         -- RAISE NOTICE 'both replace [%] and preserve [%] specified', dyn_profile.replace_rule, dyn_profile.preserve_rule;
266         RETURN FALSE;
267     END IF;
268
269     IF dyn_profile.replace_rule = '' AND dyn_profile.preserve_rule = '' AND dyn_profile.add_rule = '' AND dyn_profile.strip_rule = '' THEN
270         --Since we have nothing to do, just return a NOOP "we did it"
271         RETURN TRUE;
272     ELSIF dyn_profile.replace_rule <> '' THEN
273         source_marc = v_marc;
274         target_marc = eg_marc;
275         replace_rule = dyn_profile.replace_rule;
276     ELSE
277         source_marc = eg_marc;
278         target_marc = v_marc;
279         replace_rule = dyn_profile.preserve_rule;
280     END IF;
281
282     UPDATE  authority.record_entry
283       SET   marc = vandelay.merge_record_xml( target_marc, source_marc, dyn_profile.add_rule, replace_rule, dyn_profile.strip_rule )
284       WHERE id = eg_id;
285
286     IF FOUND THEN
287         UPDATE  vandelay.queued_authority_record
288           SET   imported_as = eg_id,
289                 import_time = NOW()
290           WHERE id = import_id;
291         RETURN TRUE;
292     END IF;
293
294     -- RAISE NOTICE 'update of authority.record_entry failed';
295
296     RETURN FALSE;
297
298 END;
299 $$ LANGUAGE PLPGSQL;
300
301
302 SELECT evergreen.upgrade_deps_block_check('0751', :eg_version);
303
304 INSERT INTO acq.cancel_reason (keep_debits, id, org_unit, label, description) 
305     VALUES (
306         'f', 
307         1007, 
308         1, 
309         'Not accepted', 
310         'This line item is not accepted by the seller.'
311     );
312
313
314 COMMIT;