]> git.evergreen-ils.org Git - Evergreen.git/blob - Open-ILS/src/sql/Pg/upgrade/0847.function.auth_overlay_generator.sql
LP#1835085: stamp DB update
[Evergreen.git] / Open-ILS / src / sql / Pg / upgrade / 0847.function.auth_overlay_generator.sql
1 BEGIN;
2
3 SELECT evergreen.upgrade_deps_block_check('0847', :eg_version);
4
5 CREATE OR REPLACE FUNCTION authority.generate_overlay_template (source_xml TEXT) RETURNS TEXT AS $f$
6 DECLARE
7     cset                INT;
8     main_entry          authority.control_set_authority_field%ROWTYPE;
9     bib_field           authority.control_set_bib_field%ROWTYPE;
10     auth_id             INT DEFAULT oils_xpath_string('//*[@tag="901"]/*[local-name()="subfield" and @code="c"]', source_xml)::INT;
11     tmp_data            XML;
12     replace_data        XML[] DEFAULT '{}'::XML[];
13     replace_rules       TEXT[] DEFAULT '{}'::TEXT[];
14     auth_field          XML[];
15     auth_i1             TEXT;
16     auth_i2             TEXT;
17 BEGIN
18     IF auth_id IS NULL THEN
19         RETURN NULL;
20     END IF;
21
22     -- Default to the LoC controll set
23     SELECT control_set INTO cset FROM authority.record_entry WHERE id = auth_id;
24
25     -- if none, make a best guess
26     IF cset IS NULL THEN
27         SELECT  control_set INTO cset
28           FROM  authority.control_set_authority_field
29           WHERE tag IN (
30                     SELECT  UNNEST(XPATH('//*[starts-with(@tag,"1")]/@tag',marc::XML)::TEXT[])
31                       FROM  authority.record_entry
32                       WHERE id = auth_id
33                 )
34           LIMIT 1;
35     END IF;
36
37     -- if STILL none, no-op change
38     IF cset IS NULL THEN
39         RETURN XMLELEMENT(
40             name record,
41             XMLATTRIBUTES('http://www.loc.gov/MARC21/slim' AS xmlns),
42             XMLELEMENT( name leader, '00881nam a2200193   4500'),
43             XMLELEMENT(
44                 name datafield,
45                 XMLATTRIBUTES( '905' AS tag, ' ' AS ind1, ' ' AS ind2),
46                 XMLELEMENT(
47                                       name subfield,
48                     XMLATTRIBUTES('d' AS code),
49                     '901c'
50                 )
51             )
52         )::TEXT;
53     END IF;
54
55     FOR main_entry IN SELECT * FROM authority.control_set_authority_field acsaf WHERE acsaf.control_set = cset AND acsaf.main_entry IS NULL LOOP
56         auth_field := XPATH('//*[@tag="'||main_entry.tag||'"][1]',source_xml::XML);
57         auth_i1 = (XPATH('@ind1',auth_field[1]))[1];
58         auth_i2 = (XPATH('@ind2',auth_field[1]))[1];
59         IF ARRAY_LENGTH(auth_field,1) > 0 THEN
60             FOR bib_field IN SELECT * FROM authority.control_set_bib_field WHERE authority_field = main_entry.id LOOP
61                 SELECT XMLELEMENT( -- XMLAGG avoids magical <element> creation, but requires unnest subquery
62                     name datafield,
63                     XMLATTRIBUTES(bib_field.tag AS tag, auth_i1 AS ind1, auth_i2 AS ind2),
64                     XMLAGG(UNNEST)
65                 ) INTO tmp_data FROM UNNEST(XPATH('//*[local-name()="subfield"]', auth_field[1]));
66                 replace_data := replace_data || tmp_data;
67                 replace_rules := replace_rules || ( bib_field.tag || main_entry.sf_list || E'[0~\\)' || auth_id || '$]' );
68                 tmp_data = NULL;
69             END LOOP;
70             EXIT;
71         END IF;
72     END LOOP;
73
74     SELECT XMLAGG(UNNEST) INTO tmp_data FROM UNNEST(replace_data);
75
76     RETURN XMLELEMENT(
77         name record,
78         XMLATTRIBUTES('http://www.loc.gov/MARC21/slim' AS xmlns),
79         XMLELEMENT( name leader, '00881nam a2200193   4500'),
80         tmp_data,
81         XMLELEMENT(
82             name datafield,
83                          XMLATTRIBUTES( '905' AS tag, ' ' AS ind1, ' ' AS ind2),
84             XMLELEMENT(
85                 name subfield,
86                 XMLATTRIBUTES('r' AS code),
87                 ARRAY_TO_STRING(replace_rules,',')
88             )
89         )
90     )::TEXT;
91 END;
92 $f$ STABLE LANGUAGE PLPGSQL;
93
94 COMMIT;