]> git.evergreen-ils.org Git - working/Evergreen.git/blob - Open-ILS/src/sql/Pg/upgrade/0905.schema.use_current_normalize_heading.sql
LP#1415572: Stamping upgrade script for ensuring correct version of authority.normali...
[working/Evergreen.git] / Open-ILS / src / sql / Pg / upgrade / 0905.schema.use_current_normalize_heading.sql
1 -- Evergreen DB patch 0905.schema.use_current_normalize_heading.sql
2 --
3 -- LP#1415572: ensure current version of authority.normalize_heading() is in place
4 --
5 BEGIN;
6
7
8 -- check whether patch can be applied
9 SELECT evergreen.upgrade_deps_block_check('0905', :eg_version);
10
11 CREATE OR REPLACE FUNCTION authority.normalize_heading( marcxml TEXT, no_thesaurus BOOL ) RETURNS TEXT AS $func$
12 DECLARE
13     acsaf           authority.control_set_authority_field%ROWTYPE;
14     tag_used        TEXT;
15     nfi_used        TEXT;
16     sf              TEXT;
17     sf_node         TEXT;
18     tag_node        TEXT;
19     thes_code       TEXT;
20     cset            INT;
21     heading_text    TEXT;
22     tmp_text        TEXT;
23     first_sf        BOOL;
24     auth_id         INT DEFAULT COALESCE(NULLIF(oils_xpath_string('//*[@tag="901"]/*[local-name()="subfield" and @code="c"]', marcxml), ''), '0')::INT; 
25 BEGIN
26     SELECT control_set INTO cset FROM authority.record_entry WHERE id = auth_id;
27
28     IF cset IS NULL THEN
29         SELECT  control_set INTO cset
30           FROM  authority.control_set_authority_field
31           WHERE tag IN ( SELECT  UNNEST(XPATH('//*[starts-with(@tag,"1")]/@tag',marcxml::XML)::TEXT[]))
32           LIMIT 1;
33     END IF;
34
35     thes_code := vandelay.marc21_extract_fixed_field(marcxml,'Subj');
36     IF thes_code IS NULL THEN
37         thes_code := '|';
38     ELSIF thes_code = 'z' THEN
39         thes_code := COALESCE( oils_xpath_string('//*[@tag="040"]/*[@code="f"][1]', marcxml), '' );
40     END IF;
41
42     heading_text := '';
43     FOR acsaf IN SELECT * FROM authority.control_set_authority_field WHERE control_set = cset AND main_entry IS NULL LOOP
44         tag_used := acsaf.tag;
45         nfi_used := acsaf.nfi;
46         first_sf := TRUE;
47
48         FOR tag_node IN SELECT unnest(oils_xpath('//*[@tag="'||tag_used||'"]',marcxml)) LOOP
49             FOR sf_node IN SELECT unnest(oils_xpath('./*[contains("'||acsaf.sf_list||'",@code)]',tag_node)) LOOP
50
51                 tmp_text := oils_xpath_string('.', sf_node);
52                 sf := oils_xpath_string('./@code', sf_node);
53
54                 IF first_sf AND tmp_text IS NOT NULL AND nfi_used IS NOT NULL THEN
55
56                     tmp_text := SUBSTRING(
57                         tmp_text FROM
58                         COALESCE(
59                             NULLIF(
60                                 REGEXP_REPLACE(
61                                     oils_xpath_string('./@ind'||nfi_used, tag_node),
62                                     $$\D+$$,
63                                     '',
64                                     'g'
65                                 ),
66                                 ''
67                             )::INT,
68                             0
69                         ) + 1
70                     );
71
72                 END IF;
73
74                 first_sf := FALSE;
75
76                 IF tmp_text IS NOT NULL AND tmp_text <> '' THEN
77                     heading_text := heading_text || E'\u2021' || sf || ' ' || tmp_text;
78                 END IF;
79             END LOOP;
80
81             EXIT WHEN heading_text <> '';
82         END LOOP;
83
84         EXIT WHEN heading_text <> '';
85     END LOOP;
86
87     IF heading_text <> '' THEN
88         IF no_thesaurus IS TRUE THEN
89             heading_text := tag_used || ' ' || public.naco_normalize(heading_text);
90         ELSE
91             heading_text := tag_used || '_' || COALESCE(nfi_used,'-') || '_' || thes_code || ' ' || public.naco_normalize(heading_text);
92         END IF;
93     ELSE
94         heading_text := 'NOHEADING_' || thes_code || ' ' || MD5(marcxml);
95     END IF;
96
97     RETURN heading_text;
98 END;
99 $func$ LANGUAGE PLPGSQL STABLE STRICT;
100
101 -- fix heading and simple_headings columns without
102 -- causing a full authority reingest
103 ALTER TABLE authority.record_entry DISABLE TRIGGER a_marcxml_is_well_formed;
104 ALTER TABLE authority.record_entry DISABLE TRIGGER aaa_auth_ingest_or_delete;
105 ALTER TABLE authority.record_entry DISABLE TRIGGER b_maintain_901;
106 ALTER TABLE authority.record_entry DISABLE TRIGGER c_maintain_control_numbers;
107 ALTER TABLE authority.record_entry DISABLE TRIGGER map_thesaurus_to_control_set;
108
109 UPDATE authority.record_entry SET id = id WHERE heading LIKE 'NOHEADING%';
110
111 ALTER TABLE authority.record_entry ENABLE TRIGGER a_marcxml_is_well_formed;
112 ALTER TABLE authority.record_entry ENABLE TRIGGER aaa_auth_ingest_or_delete;
113 ALTER TABLE authority.record_entry ENABLE TRIGGER b_maintain_901;
114 ALTER TABLE authority.record_entry ENABLE TRIGGER c_maintain_control_numbers;
115 ALTER TABLE authority.record_entry ENABLE TRIGGER map_thesaurus_to_control_set;
116
117 COMMIT;