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