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