]> git.evergreen-ils.org Git - working/Evergreen.git/blob - Open-ILS/src/sql/Pg/upgrade/0787.schema.authority_normalize_heading.sql
LP#1661688: Add a link and other tweaks to alternate hold pickup feature
[working/Evergreen.git] / Open-ILS / src / sql / Pg / upgrade / 0787.schema.authority_normalize_heading.sql
1 BEGIN;
2
3 INSERT INTO config.upgrade_log (version) VALUES ('0787');
4
5 CREATE OR REPLACE FUNCTION authority.normalize_heading( marcxml TEXT, no_thesaurus BOOL ) RETURNS TEXT AS $func$
6 DECLARE
7     acsaf           authority.control_set_authority_field%ROWTYPE;
8     tag_used        TEXT;
9     nfi_used        TEXT;
10     sf              TEXT;
11     thes_code       TEXT;
12     cset            INT;
13     heading_text    TEXT;
14     tmp_text        TEXT;
15     first_sf        BOOL;
16     auth_id         INT DEFAULT COALESCE(NULLIF(oils_xpath_string('//*[@tag="901"]/*[local-name()="subfield" and @code="c"]', marcxml), ''), '0')::INT;
17 BEGIN
18     SELECT control_set INTO cset FROM authority.record_entry WHERE id = auth_id;
19
20     IF cset IS NULL THEN
21         SELECT  control_set INTO cset
22           FROM  authority.control_set_authority_field
23           WHERE tag IN ( SELECT  UNNEST(XPATH('//*[starts-with(@tag,"1")]/@tag',marcxml::XML)::TEXT[]))
24           LIMIT 1;
25     END IF;
26
27     thes_code := vandelay.marc21_extract_fixed_field(marcxml,'Subj');
28     IF thes_code IS NULL THEN
29         thes_code := '|';
30     ELSIF thes_code = 'z' THEN
31         thes_code := COALESCE( oils_xpath_string('//*[@tag="040"]/*[@code="f"][1]', marcxml), '' );
32     END IF;
33
34     heading_text := '';
35     FOR acsaf IN SELECT * FROM authority.control_set_authority_field WHERE control_set = cset AND main_entry IS NULL LOOP
36         tag_used := acsaf.tag;
37         nfi_used := acsaf.nfi;
38         first_sf := TRUE;
39         FOR sf IN SELECT * FROM regexp_split_to_table(acsaf.sf_list,'') LOOP
40             tmp_text := oils_xpath_string('//*[@tag="'||tag_used||'"]/*[@code="'||sf||'"]', marcxml);
41
42             IF first_sf AND tmp_text IS NOT NULL AND nfi_used IS NOT NULL THEN
43
44                 tmp_text := SUBSTRING(
45                     tmp_text FROM
46                     COALESCE(
47                         NULLIF(
48                             REGEXP_REPLACE(
49                                 oils_xpath_string('//*[@tag="'||tag_used||'"]/@ind'||nfi_used, marcxml),
50                                 $$\D+$$,
51                                 '',
52                                 'g'
53                             ),
54                             ''
55                         )::INT,
56                         0
57                     ) + 1
58                 );
59
60             END IF;
61
62             first_sf := FALSE;
63
64             IF tmp_text IS NOT NULL AND tmp_text <> '' THEN
65                 heading_text := heading_text || E'\u2021' || sf || ' ' || tmp_text;
66             END IF;
67         END LOOP;
68         EXIT WHEN heading_text <> '';
69     END LOOP;
70
71     IF heading_text <> '' THEN
72         IF no_thesaurus IS TRUE THEN
73             heading_text := tag_used || ' ' || public.naco_normalize(heading_text);
74         ELSE
75             heading_text := tag_used || '_' || COALESCE(nfi_used,'-') || '_' || thes_code || ' ' || public.naco_normalize(heading_text);
76         END IF;
77     ELSE
78         heading_text := 'NOHEADING_' || thes_code || ' ' || MD5(marcxml);
79     END IF;
80         RETURN heading_text;
81 END;
82 $func$ LANGUAGE PLPGSQL IMMUTABLE;
83
84 COMMIT;