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