]> git.evergreen-ils.org Git - Evergreen.git/blob - Open-ILS/src/sql/Pg/version-upgrade/2.3.5-2.3.6-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.3.5-2.3.6-upgrade-db.sql
1 --Upgrade Script for 2.3.5 to 2.3.6
2 \set eg_version '''2.3.6'''
3 BEGIN;
4 INSERT INTO config.upgrade_log (version, applied_to) VALUES ('2.3.6', :eg_version);
5 -- Evergreen DB patch XXXX.function.axis_authority_tags_refs_aggregate.sql
6 --
7
8 -- check whether patch can be applied
9 SELECT evergreen.upgrade_deps_block_check('0784', :eg_version);
10
11 CREATE OR REPLACE FUNCTION authority.axis_authority_tags_refs(a TEXT) RETURNS INT[] AS $$
12     SELECT ARRAY_AGG(y) from (
13        SELECT  unnest(ARRAY_CAT(
14                  ARRAY[a.field],
15                  (SELECT ARRAY_ACCUM(x.id) FROM authority.control_set_authority_field x WHERE x.main_entry = a.field)
16              )) y
17        FROM  authority.browse_axis_authority_field_map a
18        WHERE axis = $1) x;
19 $$ LANGUAGE SQL;
20
21 CREATE OR REPLACE FUNCTION authority.btag_authority_tags_refs(btag TEXT) RETURNS INT[] AS $$
22     SELECT ARRAY_AGG(y) from (
23         SELECT  unnest(ARRAY_CAT(
24                     ARRAY[a.authority_field],
25                     (SELECT ARRAY_ACCUM(x.id) FROM authority.control_set_authority_field x WHERE x.main_entry = a.authority_field)
26                 )) y
27       FROM  authority.control_set_bib_field a
28       WHERE a.tag = $1) x
29 $$ LANGUAGE SQL;
30
31 CREATE OR REPLACE FUNCTION authority.atag_authority_tags_refs(atag TEXT) RETURNS INT[] AS $$
32     SELECT ARRAY_AGG(y) from (
33         SELECT  unnest(ARRAY_CAT(
34                     ARRAY[a.id],
35                     (SELECT ARRAY_ACCUM(x.id) FROM authority.control_set_authority_field x WHERE x.main_entry = a.id)
36                 )) y
37       FROM  authority.control_set_authority_field a
38       WHERE a.tag = $1) x
39 $$ LANGUAGE SQL;
40
41
42
43 INSERT INTO config.upgrade_log (version) VALUES ('0787');
44
45 CREATE OR REPLACE FUNCTION authority.normalize_heading( marcxml TEXT, no_thesaurus BOOL ) RETURNS TEXT AS $func$
46 DECLARE
47     acsaf           authority.control_set_authority_field%ROWTYPE;
48     tag_used        TEXT;
49     nfi_used        TEXT;
50     sf              TEXT;
51     thes_code       TEXT;
52     cset            INT;
53     heading_text    TEXT;
54     tmp_text        TEXT;
55     first_sf        BOOL;
56     auth_id         INT DEFAULT COALESCE(NULLIF(oils_xpath_string('//*[@tag="901"]/*[local-name()="subfield" and @code="c"]', marcxml), ''), '0')::INT;
57 BEGIN
58     SELECT control_set INTO cset FROM authority.record_entry WHERE id = auth_id;
59
60     IF cset IS NULL THEN
61         SELECT  control_set INTO cset
62           FROM  authority.control_set_authority_field
63           WHERE tag IN ( SELECT  UNNEST(XPATH('//*[starts-with(@tag,"1")]/@tag',marcxml::XML)::TEXT[]))
64           LIMIT 1;
65     END IF;
66
67     thes_code := vandelay.marc21_extract_fixed_field(marcxml,'Subj');
68     IF thes_code IS NULL THEN
69         thes_code := '|';
70     ELSIF thes_code = 'z' THEN
71         thes_code := COALESCE( oils_xpath_string('//*[@tag="040"]/*[@code="f"][1]', marcxml), '' );
72     END IF;
73
74     heading_text := '';
75     FOR acsaf IN SELECT * FROM authority.control_set_authority_field WHERE control_set = cset AND main_entry IS NULL LOOP
76         tag_used := acsaf.tag;
77         nfi_used := acsaf.nfi;
78         first_sf := TRUE;
79         FOR sf IN SELECT * FROM regexp_split_to_table(acsaf.sf_list,'') LOOP
80             tmp_text := oils_xpath_string('//*[@tag="'||tag_used||'"]/*[@code="'||sf||'"]', marcxml);
81
82             IF first_sf AND tmp_text IS NOT NULL AND nfi_used IS NOT NULL THEN
83
84                 tmp_text := SUBSTRING(
85                     tmp_text FROM
86                     COALESCE(
87                         NULLIF(
88                             REGEXP_REPLACE(
89                                 oils_xpath_string('//*[@tag="'||tag_used||'"]/@ind'||nfi_used, marcxml),
90                                 $$\D+$$,
91                                 '',
92                                 'g'
93                             ),
94                             ''
95                         )::INT,
96                         0
97                     ) + 1
98                 );
99
100             END IF;
101
102             first_sf := FALSE;
103
104             IF tmp_text IS NOT NULL AND tmp_text <> '' THEN
105                 heading_text := heading_text || E'\u2021' || sf || ' ' || tmp_text;
106             END IF;
107         END LOOP;
108         EXIT WHEN heading_text <> '';
109     END LOOP;
110
111     IF heading_text <> '' THEN
112         IF no_thesaurus IS TRUE THEN
113             heading_text := tag_used || ' ' || public.naco_normalize(heading_text);
114         ELSE
115             heading_text := tag_used || '_' || COALESCE(nfi_used,'-') || '_' || thes_code || ' ' || public.naco_normalize(heading_text);
116         END IF;
117     ELSE
118         heading_text := 'NOHEADING_' || thes_code || ' ' || MD5(marcxml);
119     END IF;
120         RETURN heading_text;
121 END;
122 $func$ LANGUAGE PLPGSQL IMMUTABLE;
123
124 COMMIT;