]> git.evergreen-ils.org Git - working/Evergreen.git/blob - Open-ILS/src/sql/Pg/upgrade/0953.function.unapi-bre.external-includes.sql
LP2042879 Shelving Location Groups Admin accessibility
[working/Evergreen.git] / Open-ILS / src / sql / Pg / upgrade / 0953.function.unapi-bre.external-includes.sql
1
2 BEGIN;
3
4 -- check whether patch can be applied
5 SELECT evergreen.upgrade_deps_block_check('0953', :eg_version);
6
7 CREATE OR REPLACE FUNCTION unapi.bre (
8     obj_id BIGINT,
9     format TEXT,
10     ename TEXT,
11     includes TEXT[],
12     org TEXT,
13     depth INT DEFAULT NULL,
14     slimit HSTORE DEFAULT NULL,
15     soffset HSTORE DEFAULT NULL,
16     include_xmlns BOOL DEFAULT TRUE,
17     pref_lib INT DEFAULT NULL
18 )
19 RETURNS XML AS $F$
20 DECLARE
21     me      biblio.record_entry%ROWTYPE;
22     layout  unapi.bre_output_layout%ROWTYPE;
23     xfrm    config.xml_transform%ROWTYPE;
24     ouid    INT;
25     tmp_xml TEXT;
26     top_el  TEXT;
27     output  XML;
28     hxml    XML;
29     axml    XML;
30     source  XML;
31 BEGIN
32
33     IF org = '-' OR org IS NULL THEN
34         SELECT shortname INTO org FROM evergreen.org_top();
35     END IF;
36
37     SELECT id INTO ouid FROM actor.org_unit WHERE shortname = org;
38
39     IF ouid IS NULL THEN
40         RETURN NULL::XML;
41     END IF;
42
43     IF format = 'holdings_xml' THEN -- the special case
44         output := unapi.holdings_xml( obj_id, ouid, org, depth, includes, slimit, soffset, include_xmlns);
45         RETURN output;
46     END IF;
47
48     SELECT * INTO layout FROM unapi.bre_output_layout WHERE name = format;
49
50     IF layout.name IS NULL THEN
51         RETURN NULL::XML;
52     END IF;
53
54     SELECT * INTO xfrm FROM config.xml_transform WHERE name = layout.transform;
55
56     SELECT * INTO me FROM biblio.record_entry WHERE id = obj_id;
57
58     -- grab bib_source, if any
59     IF ('cbs' = ANY (includes) AND me.source IS NOT NULL) THEN
60         source := unapi.cbs(me.source,NULL,NULL,NULL,NULL);
61     ELSE
62         source := NULL::XML;
63     END IF;
64
65     -- grab SVF if we need them
66     IF ('mra' = ANY (includes)) THEN 
67         axml := unapi.mra(obj_id,NULL,NULL,NULL,NULL);
68     ELSE
69         axml := NULL::XML;
70     END IF;
71
72     -- grab holdings if we need them
73     IF ('holdings_xml' = ANY (includes)) THEN 
74         hxml := unapi.holdings_xml(obj_id, ouid, org, depth, evergreen.array_remove_item_by_value(includes,'holdings_xml'), slimit, soffset, include_xmlns, pref_lib);
75     ELSE
76         hxml := NULL::XML;
77     END IF;
78
79
80     -- generate our item node
81
82
83     IF format = 'marcxml' THEN
84         tmp_xml := me.marc;
85         IF tmp_xml !~ E'<marc:' THEN -- If we're not using the prefixed namespace in this record, then remove all declarations of it
86            tmp_xml := REGEXP_REPLACE(tmp_xml, ' xmlns:marc="http://www.loc.gov/MARC21/slim"', '', 'g');
87         END IF; 
88     ELSE
89         tmp_xml := oils_xslt_process(me.marc, xfrm.xslt)::XML;
90     END IF;
91
92     top_el := REGEXP_REPLACE(tmp_xml, E'^.*?<((?:\\S+:)?' || layout.holdings_element || ').*$', E'\\1');
93
94     IF source IS NOT NULL THEN
95         tmp_xml := REGEXP_REPLACE(tmp_xml, '</' || top_el || '>(.*?)$', source || '</' || top_el || E'>\\1');
96     END IF;
97
98     IF axml IS NOT NULL THEN 
99         tmp_xml := REGEXP_REPLACE(tmp_xml, '</' || top_el || '>(.*?)$', axml || '</' || top_el || E'>\\1');
100     END IF;
101
102     IF hxml IS NOT NULL THEN -- XXX how do we configure the holdings position?
103         tmp_xml := REGEXP_REPLACE(tmp_xml, '</' || top_el || '>(.*?)$', hxml || '</' || top_el || E'>\\1');
104     END IF;
105
106     IF ('bre.unapi' = ANY (includes)) THEN 
107         output := REGEXP_REPLACE(
108             tmp_xml,
109             '</' || top_el || '>(.*?)',
110             XMLELEMENT(
111                 name abbr,
112                 XMLATTRIBUTES(
113                     'http://www.w3.org/1999/xhtml' AS xmlns,
114                     'unapi-id' AS class,
115                     'tag:open-ils.org:U2@bre/' || obj_id || '/' || org AS title
116                 )
117             )::TEXT || '</' || top_el || E'>\\1'
118         );
119     ELSE
120         output := tmp_xml;
121     END IF;
122
123     IF ('bre.extern' = ANY (includes)) THEN 
124         output := REGEXP_REPLACE(
125             tmp_xml,
126             '</' || top_el || '>(.*?)',
127             XMLELEMENT(
128                 name extern,
129                 XMLATTRIBUTES(
130                     'http://open-ils.org/spec/biblio/v1' AS xmlns,
131                     me.creator AS creator,
132                     me.editor AS editor,
133                     me.create_date AS create_date,
134                     me.edit_date AS edit_date,
135                     me.quality AS quality,
136                     me.fingerprint AS fingerprint,
137                     me.tcn_source AS tcn_source,
138                     me.tcn_value AS tcn_value,
139                     me.owner AS owner,
140                     me.share_depth AS share_depth,
141                     me.active AS active,
142                     me.deleted AS deleted
143                 )
144             )::TEXT || '</' || top_el || E'>\\1'
145         );
146     ELSE
147         output := tmp_xml;
148     END IF;
149
150     output := REGEXP_REPLACE(output::TEXT,E'>\\s+<','><','gs')::XML;
151     RETURN output;
152 END;
153 $F$ LANGUAGE PLPGSQL STABLE;
154
155 COMMIT;
156