]> git.evergreen-ils.org Git - Evergreen.git/blob - Open-ILS/src/sql/Pg/version-upgrade/2.5.0-2.5.1-upgrade-db.sql
LP#1772028 Add some FK violation functions just in case they are missing
[Evergreen.git] / Open-ILS / src / sql / Pg / version-upgrade / 2.5.0-2.5.1-upgrade-db.sql
1 --Upgrade Script for 2.5.0 to 2.5.1
2 \set eg_version '''2.5.1'''
3 BEGIN;
4 INSERT INTO config.upgrade_log (version, applied_to) VALUES ('2.5.1', :eg_version);
5
6 SELECT evergreen.upgrade_deps_block_check('0848', :eg_version);
7
8 CREATE OR REPLACE FUNCTION authority.normalize_heading( marcxml TEXT, no_thesaurus BOOL ) RETURNS TEXT AS $func$
9 DECLARE
10     acsaf           authority.control_set_authority_field%ROWTYPE;
11     tag_used        TEXT;
12     nfi_used        TEXT;
13     sf              TEXT;
14     sf_node         TEXT;
15     tag_node        TEXT;
16     thes_code       TEXT;
17     cset            INT;
18     heading_text    TEXT;
19     tmp_text        TEXT;
20     first_sf        BOOL;
21     auth_id         INT DEFAULT COALESCE(NULLIF(oils_xpath_string('//*[@tag="901"]/*[local-name()="subfield" and @code="c"]', marcxml), ''), '0')::INT;
22 BEGIN
23     SELECT control_set INTO cset FROM authority.record_entry WHERE id = auth_id;
24
25     IF cset IS NULL THEN
26         SELECT  control_set INTO cset
27           FROM  authority.control_set_authority_field
28           WHERE tag IN ( SELECT  UNNEST(XPATH('//*[starts-with(@tag,"1")]/@tag',marcxml::XML)::TEXT[]))
29           LIMIT 1;
30     END IF;
31
32     thes_code := vandelay.marc21_extract_fixed_field(marcxml,'Subj');
33     IF thes_code IS NULL THEN
34         thes_code := '|';
35     ELSIF thes_code = 'z' THEN
36         thes_code := COALESCE( oils_xpath_string('//*[@tag="040"]/*[@code="f"][1]', marcxml), '' );
37     END IF;
38
39     heading_text := '';
40     FOR acsaf IN SELECT * FROM authority.control_set_authority_field WHERE control_set = cset AND main_entry IS NULL LOOP
41         tag_used := acsaf.tag;
42         nfi_used := acsaf.nfi;
43         first_sf := TRUE;
44
45         FOR tag_node IN SELECT unnest(oils_xpath('//*[@tag="'||tag_used||'"]',marcxml)) LOOP
46             FOR sf_node IN SELECT unnest(oils_xpath('//*[contains("'||acsaf.sf_list||'",@code)]',tag_node)) LOOP
47
48                 tmp_text := oils_xpath_string('.', sf_node);
49                 sf := oils_xpath_string('./@code', sf_node);
50
51                 IF first_sf AND tmp_text IS NOT NULL AND nfi_used IS NOT NULL THEN
52
53                     tmp_text := SUBSTRING(
54                         tmp_text FROM
55                         COALESCE(
56                             NULLIF(
57                                 REGEXP_REPLACE(
58                                     oils_xpath_string('./@ind'||nfi_used, tag_node),
59                                     $$\D+$$,
60                                     '',
61                                     'g'
62                                 ),
63                                 ''
64                             )::INT,
65                             0
66                         ) + 1
67                     );
68
69                 END IF;
70
71                 first_sf := FALSE;
72
73                 IF tmp_text IS NOT NULL AND tmp_text <> '' THEN
74                     heading_text := heading_text || E'\u2021' || sf || ' ' || tmp_text;
75                 END IF;
76             END LOOP;
77
78             EXIT WHEN heading_text <> '';
79         END LOOP;
80
81         EXIT WHEN heading_text <> '';
82     END LOOP;
83
84     IF heading_text <> '' THEN
85         IF no_thesaurus IS TRUE THEN
86             heading_text := tag_used || ' ' || public.naco_normalize(heading_text);
87         ELSE
88             heading_text := tag_used || '_' || COALESCE(nfi_used,'-') || '_' || thes_code || ' ' || public.naco_normalize(heading_text);
89         END IF;
90     ELSE
91         heading_text := 'NOHEADING_' || thes_code || ' ' || MD5(marcxml);
92     END IF;
93
94     RETURN heading_text;
95 END;
96 $func$ LANGUAGE PLPGSQL IMMUTABLE;
97
98 CREATE OR REPLACE FUNCTION authority.simple_heading_set( marcxml TEXT ) RETURNS SETOF authority.simple_heading AS $func$
99 DECLARE
100     res             authority.simple_heading%ROWTYPE;
101     acsaf           authority.control_set_authority_field%ROWTYPE;
102     tag_used        TEXT;
103     nfi_used        TEXT;
104     sf              TEXT;
105     cset            INT;
106     heading_text    TEXT;
107     sort_text       TEXT;
108     tmp_text        TEXT;
109     tmp_xml         TEXT;
110     first_sf        BOOL;
111     auth_id         INT DEFAULT oils_xpath_string('//*[@tag="901"]/*[local-name()="subfield" and @code="c"]', marcxml)::INT;
112 BEGIN
113
114     res.record := auth_id;
115
116     SELECT  control_set INTO cset
117       FROM  authority.control_set_authority_field
118       WHERE tag IN ( SELECT UNNEST(XPATH('//*[starts-with(@tag,"1")]/@tag',marcxml::XML)::TEXT[]) )
119       LIMIT 1;
120
121     FOR acsaf IN SELECT * FROM authority.control_set_authority_field WHERE control_set = cset LOOP
122
123         res.atag := acsaf.id;
124         tag_used := acsaf.tag;
125         nfi_used := acsaf.nfi;
126
127         FOR tmp_xml IN SELECT UNNEST(XPATH('//*[@tag="'||tag_used||'"]', marcxml::XML)) LOOP
128
129             heading_text := public.naco_normalize(
130                 COALESCE(
131                     oils_xpath_string('//*[contains("'||acsaf.sf_list||'",@code)]',tmp_xml::TEXT, ' '),
132                     ''
133                 )
134             );
135
136             IF nfi_used IS NOT NULL THEN
137
138                 sort_text := SUBSTRING(
139                     heading_text FROM
140                     COALESCE(
141                         NULLIF(
142                             REGEXP_REPLACE(
143                                 oils_xpath_string('./@ind'||nfi_used, tmp_xml::TEXT),
144                                 $$\D+$$,
145                                 '',
146                                 'g'
147                             ),
148                             ''
149                         )::INT,
150                         0
151                     ) + 1
152                 );
153
154             ELSE
155                 sort_text := heading_text;
156             END IF;
157
158             IF heading_text IS NOT NULL AND heading_text <> '' THEN
159                 res.value := heading_text;
160                 res.sort_value := sort_text;
161                 RETURN NEXT res;
162             END IF;
163
164         END LOOP;
165
166     END LOOP;
167
168     RETURN;
169 END;
170 $func$ LANGUAGE PLPGSQL IMMUTABLE;
171
172
173 COMMIT;