LP#1756912: restore display of copy counts for preferred library
[working/Evergreen.git] / Open-ILS / src / sql / Pg / upgrade / XXXX.schema.add_pref_lib_to_unapi_feeds.sql
1 BEGIN;
2
3 --- SELECT evergreen.upgrade_deps_block_check('XXXX', :eg_version);
4
5 DROP FUNCTION IF EXISTS unapi.biblio_record_entry_feed (BIGINT[], TEXT, TEXT[], TEXT, INT, HSTORE, HSTORE,
6                                                         BOOL, TEXT, TEXT, TEXT, TEXT, TEXT, XML);
7 DROP FUNCTION IF EXISTS unapi.metabib_virtual_record_feed (BIGINT[], TEXT, TEXT[], TEXT, INT, HSTORE, HSTORE,
8                                                            BOOL, TEXT, TEXT, TEXT, TEXT, TEXT, XML);
9
10 CREATE OR REPLACE FUNCTION unapi.biblio_record_entry_feed ( id_list BIGINT[], format TEXT, includes TEXT[], org TEXT, depth INT DEFAULT NULL, slimit HSTORE DEFAULT NULL, soffset HSTORE DEFAULT NULL, include_xmlns BOOL DEFAULT TRUE, title TEXT DEFAULT NULL, description TEXT DEFAULT NULL, creator TEXT DEFAULT NULL, update_ts TEXT DEFAULT NULL, unapi_url TEXT DEFAULT NULL, header_xml XML DEFAULT NULL, pref_lib INT DEFAULT NULL ) RETURNS XML AS $F$
11 DECLARE
12     layout          unapi.bre_output_layout%ROWTYPE;
13     transform       config.xml_transform%ROWTYPE;
14     item_format     TEXT;
15     tmp_xml         TEXT;
16     xmlns_uri       TEXT := 'http://open-ils.org/spec/feed-xml/v1';
17     ouid            INT;
18     element_list    TEXT[];
19 BEGIN
20
21     IF org = '-' OR org IS NULL THEN
22         SELECT shortname INTO org FROM evergreen.org_top();
23     END IF;
24
25     SELECT id INTO ouid FROM actor.org_unit WHERE shortname = org;
26     SELECT * INTO layout FROM unapi.bre_output_layout WHERE name = format;
27
28     IF layout.name IS NULL THEN
29         RETURN NULL::XML;
30     END IF;
31
32     SELECT * INTO transform FROM config.xml_transform WHERE name = layout.transform;
33     xmlns_uri := COALESCE(transform.namespace_uri,xmlns_uri);
34
35     -- Gather the bib xml
36     SELECT XMLAGG( unapi.bre(i, format, '', includes, org, depth, slimit, soffset, include_xmlns, pref_lib)) INTO tmp_xml FROM UNNEST( id_list ) i;
37
38     IF layout.title_element IS NOT NULL THEN
39         EXECUTE 'SELECT XMLCONCAT( XMLELEMENT( name '|| layout.title_element ||', XMLATTRIBUTES( $1 AS xmlns), $3), $2)' INTO tmp_xml USING xmlns_uri, tmp_xml::XML, title;
40     END IF;
41
42     IF layout.description_element IS NOT NULL THEN
43         EXECUTE 'SELECT XMLCONCAT( XMLELEMENT( name '|| layout.description_element ||', XMLATTRIBUTES( $1 AS xmlns), $3), $2)' INTO tmp_xml USING xmlns_uri, tmp_xml::XML, description;
44     END IF;
45
46     IF layout.creator_element IS NOT NULL THEN
47         EXECUTE 'SELECT XMLCONCAT( XMLELEMENT( name '|| layout.creator_element ||', XMLATTRIBUTES( $1 AS xmlns), $3), $2)' INTO tmp_xml USING xmlns_uri, tmp_xml::XML, creator;
48     END IF;
49
50     IF layout.update_ts_element IS NOT NULL THEN
51         EXECUTE 'SELECT XMLCONCAT( XMLELEMENT( name '|| layout.update_ts_element ||', XMLATTRIBUTES( $1 AS xmlns), $3), $2)' INTO tmp_xml USING xmlns_uri, tmp_xml::XML, update_ts;
52     END IF;
53
54     IF unapi_url IS NOT NULL THEN
55         EXECUTE $$SELECT XMLCONCAT( XMLELEMENT( name link, XMLATTRIBUTES( 'http://www.w3.org/1999/xhtml' AS xmlns, 'unapi-server' AS rel, $1 AS href, 'unapi' AS title)), $2)$$ INTO tmp_xml USING unapi_url, tmp_xml::XML;
56     END IF;
57
58     IF header_xml IS NOT NULL THEN tmp_xml := XMLCONCAT(header_xml,tmp_xml::XML); END IF;
59
60     element_list := regexp_split_to_array(layout.feed_top,E'\\.');
61     FOR i IN REVERSE ARRAY_UPPER(element_list, 1) .. 1 LOOP
62         EXECUTE 'SELECT XMLELEMENT( name '|| quote_ident(element_list[i]) ||', XMLATTRIBUTES( $1 AS xmlns), $2)' INTO tmp_xml USING xmlns_uri, tmp_xml::XML;
63     END LOOP;
64
65     RETURN tmp_xml::XML;
66 END;
67 $F$ LANGUAGE PLPGSQL STABLE;
68
69 CREATE OR REPLACE FUNCTION unapi.metabib_virtual_record_feed ( id_list BIGINT[], format TEXT, includes TEXT[], org TEXT, depth INT DEFAULT NULL, slimit HSTORE DEFAULT NULL, soffset HSTORE DEFAULT NULL, include_xmlns BOOL DEFAULT TRUE, title TEXT DEFAULT NULL, description TEXT DEFAULT NULL, creator TEXT DEFAULT NULL, update_ts TEXT DEFAULT NULL, unapi_url TEXT DEFAULT NULL, header_xml XML DEFAULT NULL, pref_lib INT DEFAULT NULL ) RETURNS XML AS $F$
70 DECLARE
71     layout          unapi.bre_output_layout%ROWTYPE;
72     transform       config.xml_transform%ROWTYPE;
73     item_format     TEXT;
74     tmp_xml         TEXT;
75     xmlns_uri       TEXT := 'http://open-ils.org/spec/feed-xml/v1';
76     ouid            INT;
77     element_list    TEXT[];
78 BEGIN
79
80     IF org = '-' OR org IS NULL THEN
81         SELECT shortname INTO org FROM evergreen.org_top();
82     END IF;
83
84     SELECT id INTO ouid FROM actor.org_unit WHERE shortname = org;
85     SELECT * INTO layout FROM unapi.bre_output_layout WHERE name = format;
86
87     IF layout.name IS NULL THEN
88         RETURN NULL::XML;
89     END IF;
90
91     SELECT * INTO transform FROM config.xml_transform WHERE name = layout.transform;
92     xmlns_uri := COALESCE(transform.namespace_uri,xmlns_uri);
93
94     -- Gather the bib xml
95     SELECT XMLAGG( unapi.mmr(i, format, '', includes, org, depth, slimit, soffset, include_xmlns, pref_lib)) INTO tmp_xml FROM UNNEST( id_list ) i;
96
97     IF layout.title_element IS NOT NULL THEN
98         EXECUTE 'SELECT XMLCONCAT( XMLELEMENT( name '|| layout.title_element ||', XMLATTRIBUTES( $1 AS xmlns), $3), $2)' INTO tmp_xml USING xmlns_uri, tmp_xml::XML, title;
99     END IF;
100
101     IF layout.description_element IS NOT NULL THEN
102         EXECUTE 'SELECT XMLCONCAT( XMLELEMENT( name '|| layout.description_element ||', XMLATTRIBUTES( $1 AS xmlns), $3), $2)' INTO tmp_xml USING xmlns_uri, tmp_xml::XML, description;
103     END IF;
104
105     IF layout.creator_element IS NOT NULL THEN
106         EXECUTE 'SELECT XMLCONCAT( XMLELEMENT( name '|| layout.creator_element ||', XMLATTRIBUTES( $1 AS xmlns), $3), $2)' INTO tmp_xml USING xmlns_uri, tmp_xml::XML, creator;
107     END IF;
108
109     IF layout.update_ts_element IS NOT NULL THEN
110         EXECUTE 'SELECT XMLCONCAT( XMLELEMENT( name '|| layout.update_ts_element ||', XMLATTRIBUTES( $1 AS xmlns), $3), $2)' INTO tmp_xml USING xmlns_uri, tmp_xml::XML, update_ts;
111     END IF;
112
113     IF unapi_url IS NOT NULL THEN
114         EXECUTE $$SELECT XMLCONCAT( XMLELEMENT( name link, XMLATTRIBUTES( 'http://www.w3.org/1999/xhtml' AS xmlns, 'unapi-server' AS rel, $1 AS href, 'unapi' AS title)), $2)$$ INTO tmp_xml USING unapi_url, tmp_xml::XML;
115     END IF;
116
117     IF header_xml IS NOT NULL THEN tmp_xml := XMLCONCAT(header_xml,tmp_xml::XML); END IF;
118
119     element_list := regexp_split_to_array(layout.feed_top,E'\\.');
120     FOR i IN REVERSE ARRAY_UPPER(element_list, 1) .. 1 LOOP
121         EXECUTE 'SELECT XMLELEMENT( name '|| quote_ident(element_list[i]) ||', XMLATTRIBUTES( $1 AS xmlns), $2)' INTO tmp_xml USING xmlns_uri, tmp_xml::XML;
122     END LOOP;
123
124     RETURN tmp_xml::XML;
125 END;
126 $F$ LANGUAGE PLPGSQL STABLE;
127
128 COMMIT;