]> git.evergreen-ils.org Git - working/Evergreen.git/blob - Open-ILS/src/sql/Pg/upgrade/0489.schema.unapi2.sql
Allow combined search to be optional per class
[working/Evergreen.git] / Open-ILS / src / sql / Pg / upgrade / 0489.schema.unapi2.sql
1 BEGIN;
2
3 INSERT INTO config.upgrade_log (version) VALUES ('0489'); -- miker
4
5 CREATE SCHEMA unapi;
6
7 CREATE OR REPLACE FUNCTION array_remove_item_by_value(inp ANYARRAY, el ANYELEMENT) RETURNS anyarray AS $$ SELECT ARRAY_ACCUM(x.e) FROM UNNEST( $1 ) x(e) WHERE x.e <> $2; $$ LANGUAGE SQL;
8
9 CREATE TABLE unapi.bre_output_layout (
10     name                TEXT    PRIMARY KEY,
11     transform           TEXT    REFERENCES config.xml_transform (name) ON DELETE CASCADE ON UPDATE CASCADE DEFERRABLE INITIALLY DEFERRED,
12     mime_type           TEXT    NOT NULL,
13     feed_top            TEXT    NOT NULL,
14     holdings_element    TEXT,
15     title_element       TEXT,
16     description_element TEXT,
17     creator_element     TEXT,
18     update_ts_element   TEXT
19 );
20
21 INSERT INTO unapi.bre_output_layout
22     (name,           transform, mime_type,              holdings_element, feed_top,         title_element, description_element, creator_element, update_ts_element)
23         VALUES
24     ('holdings_xml', NULL,      'application/xml',      NULL,             'hxml',           NULL,          NULL,                NULL,            NULL),
25     ('marcxml',      'marcxml', 'application/marc+xml', 'record',         'collection',     NULL,          NULL,                NULL,            NULL),
26     ('mods32',       'mods32',  'application/mods+xml', 'mods',           'modsCollection', NULL,          NULL,                NULL,            NULL)
27 ;
28
29 -- Dummy functions, so we can create the real ones out of order
30 CREATE OR REPLACE FUNCTION unapi.aou    ( obj_id BIGINT, format TEXT, ename TEXT, includes TEXT[], org TEXT, depth INT DEFAULT NULL, slimit INT DEFAULT NULL, soffset INT DEFAULT NULL ) RETURNS XML AS $F$ SELECT NULL::XML $F$ LANGUAGE SQL;
31 CREATE OR REPLACE FUNCTION unapi.acn    ( obj_id BIGINT, format TEXT, ename TEXT, includes TEXT[], org TEXT, depth INT DEFAULT NULL, slimit INT DEFAULT NULL, soffset INT DEFAULT NULL ) RETURNS XML AS $F$ SELECT NULL::XML $F$ LANGUAGE SQL;
32 CREATE OR REPLACE FUNCTION unapi.ssub   ( obj_id BIGINT, format TEXT, ename TEXT, includes TEXT[], org TEXT, depth INT DEFAULT NULL, slimit INT DEFAULT NULL, soffset INT DEFAULT NULL ) RETURNS XML AS $F$ SELECT NULL::XML $F$ LANGUAGE SQL;
33 CREATE OR REPLACE FUNCTION unapi.sdist  ( obj_id BIGINT, format TEXT, ename TEXT, includes TEXT[], org TEXT, depth INT DEFAULT NULL, slimit INT DEFAULT NULL, soffset INT DEFAULT NULL ) RETURNS XML AS $F$ SELECT NULL::XML $F$ LANGUAGE SQL;
34 CREATE OR REPLACE FUNCTION unapi.sstr   ( obj_id BIGINT, format TEXT, ename TEXT, includes TEXT[], org TEXT, depth INT DEFAULT NULL, slimit INT DEFAULT NULL, soffset INT DEFAULT NULL ) RETURNS XML AS $F$ SELECT NULL::XML $F$ LANGUAGE SQL;
35 CREATE OR REPLACE FUNCTION unapi.sitem  ( obj_id BIGINT, format TEXT, ename TEXT, includes TEXT[], org TEXT, depth INT DEFAULT NULL, slimit INT DEFAULT NULL, soffset INT DEFAULT NULL ) RETURNS XML AS $F$ SELECT NULL::XML $F$ LANGUAGE SQL;
36 CREATE OR REPLACE FUNCTION unapi.sunit  ( obj_id BIGINT, format TEXT, ename TEXT, includes TEXT[], org TEXT, depth INT DEFAULT NULL, slimit INT DEFAULT NULL, soffset INT DEFAULT NULL ) RETURNS XML AS $F$ SELECT NULL::XML $F$ LANGUAGE SQL;
37 CREATE OR REPLACE FUNCTION unapi.sisum  ( obj_id BIGINT, format TEXT, ename TEXT, includes TEXT[], org TEXT, depth INT DEFAULT NULL, slimit INT DEFAULT NULL, soffset INT DEFAULT NULL ) RETURNS XML AS $F$ SELECT NULL::XML $F$ LANGUAGE SQL;
38 CREATE OR REPLACE FUNCTION unapi.sbsum  ( obj_id BIGINT, format TEXT, ename TEXT, includes TEXT[], org TEXT, depth INT DEFAULT NULL, slimit INT DEFAULT NULL, soffset INT DEFAULT NULL ) RETURNS XML AS $F$ SELECT NULL::XML $F$ LANGUAGE SQL;
39 CREATE OR REPLACE FUNCTION unapi.sssum  ( obj_id BIGINT, format TEXT, ename TEXT, includes TEXT[], org TEXT, depth INT DEFAULT NULL, slimit INT DEFAULT NULL, soffset INT DEFAULT NULL ) RETURNS XML AS $F$ SELECT NULL::XML $F$ LANGUAGE SQL;
40 CREATE OR REPLACE FUNCTION unapi.siss   ( obj_id BIGINT, format TEXT, ename TEXT, includes TEXT[], org TEXT, depth INT DEFAULT NULL, slimit INT DEFAULT NULL, soffset INT DEFAULT NULL ) RETURNS XML AS $F$ SELECT NULL::XML $F$ LANGUAGE SQL;
41 CREATE OR REPLACE FUNCTION unapi.auri   ( obj_id BIGINT, format TEXT, ename TEXT, includes TEXT[], org TEXT, depth INT DEFAULT NULL, slimit INT DEFAULT NULL, soffset INT DEFAULT NULL ) RETURNS XML AS $F$ SELECT NULL::XML $F$ LANGUAGE SQL;
42 CREATE OR REPLACE FUNCTION unapi.acp    ( obj_id BIGINT, format TEXT, ename TEXT, includes TEXT[], org TEXT, depth INT DEFAULT NULL, slimit INT DEFAULT NULL, soffset INT DEFAULT NULL ) RETURNS XML AS $F$ SELECT NULL::XML $F$ LANGUAGE SQL;
43 CREATE OR REPLACE FUNCTION unapi.acpn   ( obj_id BIGINT, format TEXT, ename TEXT, includes TEXT[], org TEXT, depth INT DEFAULT NULL, slimit INT DEFAULT NULL, soffset INT DEFAULT NULL ) RETURNS XML AS $F$ SELECT NULL::XML $F$ LANGUAGE SQL;
44 CREATE OR REPLACE FUNCTION unapi.acl    ( obj_id BIGINT, format TEXT, ename TEXT, includes TEXT[], org TEXT, depth INT DEFAULT NULL, slimit INT DEFAULT NULL, soffset INT DEFAULT NULL ) RETURNS XML AS $F$ SELECT NULL::XML $F$ LANGUAGE SQL;
45 CREATE OR REPLACE FUNCTION unapi.ccs    ( obj_id BIGINT, format TEXT, ename TEXT, includes TEXT[], org TEXT, depth INT DEFAULT NULL, slimit INT DEFAULT NULL, soffset INT DEFAULT NULL ) RETURNS XML AS $F$ SELECT NULL::XML $F$ LANGUAGE SQL;
46 CREATE OR REPLACE FUNCTION unapi.ascecm ( obj_id BIGINT, format TEXT, ename TEXT, includes TEXT[], org TEXT, depth INT DEFAULT NULL, slimit INT DEFAULT NULL, soffset INT DEFAULT NULL ) RETURNS XML AS $F$ SELECT NULL::XML $F$ LANGUAGE SQL;
47 CREATE OR REPLACE FUNCTION unapi.bre    ( obj_id BIGINT, format TEXT, ename TEXT, includes TEXT[], org TEXT, depth INT DEFAULT NULL, slimit INT DEFAULT NULL, soffset INT DEFAULT NULL ) RETURNS XML AS $F$ SELECT NULL::XML $F$ LANGUAGE SQL;
48
49 CREATE OR REPLACE FUNCTION unapi.holdings_xml ( bid BIGINT, ouid INT, org TEXT, depth INT DEFAULT NULL, includes TEXT[] DEFAULT NULL::TEXT[], slimit INT DEFAULT NULL, soffset INT DEFAULT NULL) RETURNS XML AS $F$ SELECT NULL::XML $F$ LANGUAGE SQL;
50 CREATE OR REPLACE FUNCTION unapi.biblio_record_entry_feed ( id_list BIGINT[], format TEXT, includes TEXT[], org TEXT, depth INT DEFAULT NULL, slimit INT DEFAULT NULL, soffset INT DEFAULT NULL, 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 ) RETURNS XML AS $F$ SELECT NULL::XML $F$ LANGUAGE SQL;
51
52 CREATE OR REPLACE FUNCTION unapi.memoize (classname TEXT, obj_id BIGINT, format TEXT,  ename TEXT, includes TEXT[], org TEXT, depth INT DEFAULT NULL, slimit INT DEFAULT NULL, soffset INT DEFAULT NULL ) RETURNS XML AS $F$
53 DECLARE
54     key     TEXT;
55     output  XML;
56 BEGIN
57     key :=
58         'id'        || COALESCE(obj_id::TEXT,'') ||
59         'format'    || COALESCE(format::TEXT,'') ||
60         'ename'     || COALESCE(ename::TEXT,'') ||
61         'includes'   || COALESCE(includes::TEXT,'{}'::TEXT[]::TEXT) ||
62         'org'       || COALESCE(org::TEXT,'') ||
63         'depth'     || COALESCE(depth::TEXT,'') ||
64         'slimit'    || COALESCE(slimit::TEXT,'') ||
65         'soffset'   || COALESCE(soffset::TEXT,'');
66     -- RAISE NOTICE 'memoize key: %', key;
67
68     key := MD5(key);
69     -- RAISE NOTICE 'memoize hash: %', key;
70
71     -- XXX cache logic ... memcached? table?
72
73     EXECUTE $$SELECT unapi.$$ || classname || $$( $1, $2, $3, $4, $5, $6, $7, $8);$$ INTO output USING obj_id, format, ename, includes, org, depth, slimit, soffset;
74     RETURN output;
75 END;
76 $F$ LANGUAGE PLPGSQL;
77
78 CREATE OR REPLACE FUNCTION unapi.biblio_record_entry_feed ( id_list BIGINT[], format TEXT, includes TEXT[], org TEXT, depth INT DEFAULT NULL, slimit INT DEFAULT NULL, soffset INT DEFAULT NULL, 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 ) RETURNS XML AS $F$
79 DECLARE
80     layout          unapi.bre_output_layout%ROWTYPE;
81     transform       config.xml_transform%ROWTYPE;
82     item_format     TEXT;
83     tmp_xml         TEXT;
84     xmlns_uri       TEXT := 'http://open-ils.org/spec/feed-xml/v1';
85     ouid            INT;
86     element_list    TEXT[];
87 BEGIN
88
89     SELECT id INTO ouid FROM actor.org_unit WHERE shortname = org;
90     SELECT * INTO layout FROM unapi.bre_output_layout WHERE name = format;
91
92     IF layout.name IS NULL THEN
93         RETURN NULL::XML;
94     END IF;
95
96     SELECT * INTO transform FROM config.xml_transform WHERE name = layout.transform;
97     xmlns_uri := COALESCE(transform.namespace_uri,xmlns_uri);
98
99     -- Gather the bib xml
100     SELECT XMLAGG( unapi.bre(i, format, '', includes, org, depth, slimit, soffset)) INTO tmp_xml FROM UNNEST( id_list ) i;
101
102     IF layout.title_element IS NOT NULL THEN
103         EXECUTE 'SELECT XMLCONCAT( XMLELEMENT( name '|| layout.title_element ||', XMLATTRIBUTES( $1 AS xmlns), $3), $2)' INTO tmp_xml USING xmlns_uri, tmp_xml::XML, title;
104     END IF;
105
106     IF layout.description_element IS NOT NULL THEN
107         EXECUTE 'SELECT XMLCONCAT( XMLELEMENT( name '|| layout.description_element ||', XMLATTRIBUTES( $1 AS xmlns), $3), $2)' INTO tmp_xml USING xmlns_uri, tmp_xml::XML, description;
108     END IF;
109
110     IF layout.creator_element IS NOT NULL THEN
111         EXECUTE 'SELECT XMLCONCAT( XMLELEMENT( name '|| layout.creator_element ||', XMLATTRIBUTES( $1 AS xmlns), $3), $2)' INTO tmp_xml USING xmlns_uri, tmp_xml::XML, creator;
112     END IF;
113
114     IF layout.update_ts_element IS NOT NULL THEN
115         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;
116     END IF;
117
118     IF unapi_url IS NOT NULL THEN
119         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;
120     END IF;
121
122     IF header_xml IS NOT NULL THEN tmp_xml := XMLCONCAT(header_xml,tmp_xml::XML); END IF;
123
124     element_list := regexp_split_to_array(layout.feed_top,E'\\.');
125     FOR i IN REVERSE ARRAY_UPPER(element_list, 1) .. 1 LOOP
126         EXECUTE 'SELECT XMLELEMENT( name '|| quote_ident(element_list[i]) ||', XMLATTRIBUTES( $1 AS xmlns), $2)' INTO tmp_xml USING xmlns_uri, tmp_xml::XML;
127     END LOOP;
128
129     RETURN tmp_xml::XML;
130 END;
131 $F$ LANGUAGE PLPGSQL;
132
133 CREATE OR REPLACE FUNCTION unapi.bre ( obj_id BIGINT, format TEXT,  ename TEXT, includes TEXT[], org TEXT, depth INT DEFAULT NULL, slimit INT DEFAULT NULL, soffset INT DEFAULT NULL ) RETURNS XML AS $F$
134 DECLARE
135     me      biblio.record_entry%ROWTYPE;
136     layout  unapi.bre_output_layout%ROWTYPE;
137     xfrm    config.xml_transform%ROWTYPE;
138     ouid    INT;
139     tmp_xml TEXT;
140     top_el  TEXT;
141     output  XML;
142     hxml    XML;
143 BEGIN
144
145     SELECT id INTO ouid FROM actor.org_unit WHERE shortname = org;
146
147     IF ouid IS NULL THEN
148         RETURN NULL::XML;
149     END IF;
150
151     IF format = 'holdings_xml' THEN -- the special case
152         output := unapi.holdings_xml( obj_id, ouid, org, depth, includes, slimit, soffset);
153         RETURN output;
154     END IF;
155
156     SELECT * INTO layout FROM unapi.bre_output_layout WHERE name = format;
157
158     IF layout.name IS NULL THEN
159         RETURN NULL::XML;
160     END IF;
161
162     SELECT * INTO xfrm FROM config.xml_transform WHERE name = layout.transform;
163
164     SELECT * INTO me FROM biblio.record_entry WHERE id = obj_id;
165
166     -- grab hodlings if we need them
167     IF ('holdings_xml' = ANY (includes)) THEN 
168         hxml := unapi.holdings_xml(obj_id, ouid, org, depth, array_remove_item_by_value(includes,'holdings_xml'), slimit, soffset);
169     ELSE
170         hxml := NULL::XML;
171     END IF;
172
173
174     -- generate our item node
175
176
177     IF format = 'marcxml' THEN
178         tmp_xml := me.marc;
179     ELSE
180         tmp_xml := oils_xslt_process(me.marc, xfrm.xslt)::XML;
181     END IF;
182
183     top_el := REGEXP_REPLACE(tmp_xml, E'^.*?<((?:\\S+:)?' || layout.holdings_element || ').*$', E'\\1');
184
185     IF hxml IS NOT NULL THEN -- XXX how do we configure the holdings position?
186         tmp_xml := REGEXP_REPLACE(tmp_xml, '</' || top_el || '>(.*?)$', hxml || '</' || top_el || E'>\\1');
187     END IF;
188
189     IF ('bre.unapi' = ANY (includes)) THEN 
190         output := REGEXP_REPLACE(
191             tmp_xml,
192             '</' || top_el || '>(.*?)',
193             XMLELEMENT(
194                 name abbr,
195                 XMLATTRIBUTES(
196                     'http://www.w3.org/1999/xhtml' AS xmlns,
197                     'unapi-id' AS class,
198                     'tag:open-ils.org:U2@bre/' || obj_id || '/' || org AS title
199                 )
200             )::TEXT || '</' || top_el || E'>\\1'
201         );
202     ELSE
203         output := tmp_xml;
204     END IF;
205
206     RETURN output;
207 END;
208 $F$ LANGUAGE PLPGSQL;
209
210 CREATE OR REPLACE FUNCTION unapi.holdings_xml (bid BIGINT, ouid INT, org TEXT, depth INT DEFAULT NULL, includes TEXT[] DEFAULT NULL::TEXT[], slimit INT DEFAULT NULL, soffset INT DEFAULT NULL) RETURNS XML AS $F$
211      SELECT  XMLELEMENT(
212                  name holdings,
213                  XMLATTRIBUTES(
214                     'http://open-ils.org/spec/holdings/v1' AS xmlns,
215                     CASE WHEN ('bre' = ANY ('{acn,auri}'::TEXT[] || $5)) THEN 'tag:open-ils.org:U2@bre/' || $1 || '/' || $3 ELSE NULL END AS id
216                  ),
217                  XMLELEMENT(
218                      name counts,
219                      (SELECT  XMLAGG(XMLELEMENT::XML) FROM (
220                          SELECT  XMLELEMENT(
221                                      name count,
222                                      XMLATTRIBUTES('public' as type, depth, org_unit, coalesce(transcendant,0) as transcendant, available, visible as count, unshadow)
223                                  )::text
224                            FROM  asset.opac_ou_record_copy_count($2,  $1)
225                                      UNION
226                          SELECT  XMLELEMENT(
227                                      name count,
228                                      XMLATTRIBUTES('staff' as type, depth, org_unit, coalesce(transcendant,0) as transcendant, available, visible as count, unshadow)
229                                  )::text
230                            FROM  asset.staff_ou_record_copy_count($2, $1)
231                                      ORDER BY 1
232                      )x)
233                  ),
234                  CASE WHEN ('acn' = ANY ('{acn,auri}'::TEXT[] || $5)) THEN 
235                      XMLELEMENT(
236                          name volumes,
237                          (SELECT XMLAGG(acn) FROM (
238                             SELECT  unapi.acn(acn.id,'xml','volume',array_remove_item_by_value(array_remove_item_by_value('{acn,auri}'::TEXT[] || $5,'holdings_xml'),'bre'), $3, $4, $6, $7)
239                               FROM  asset.call_number acn
240                               WHERE acn.record = $1
241                                     AND EXISTS (
242                                         SELECT  1
243                                           FROM  asset.copy acp
244                                                 JOIN actor.org_unit_descendants(
245                                                     $2,
246                                                     (COALESCE(
247                                                         $4,
248                                                         (SELECT aout.depth
249                                                           FROM  actor.org_unit_type aout
250                                                                 JOIN actor.org_unit aou ON (aou.ou_type = aout.id AND aou.id = $2)
251                                                         )
252                                                     ))
253                                                 ) aoud ON (acp.circ_lib = aoud.id)
254                                           LIMIT 1
255                                     )
256                               ORDER BY label_sortkey
257                               LIMIT $6
258                               OFFSET $7
259                          )x)
260                      )
261                  ELSE NULL END,
262                  CASE WHEN ('ssub' = ANY ('{acn,auri}'::TEXT[] || $5)) THEN 
263                      XMLELEMENT(
264                          name subscriptions,
265                          (SELECT XMLAGG(ssub) FROM (
266                             SELECT  unapi.ssub(id,'xml','subscription','{}'::TEXT[], $3, $4, $6, $7)
267                               FROM  serial.subscription
268                               WHERE record_entry = $1
269                         )x)
270                      )
271                  ELSE NULL END
272              );
273 $F$ LANGUAGE SQL;
274
275 CREATE OR REPLACE FUNCTION unapi.ssub ( obj_id BIGINT, format TEXT,  ename TEXT, includes TEXT[], org TEXT, depth INT DEFAULT NULL, slimit INT DEFAULT NULL, soffset INT DEFAULT NULL ) RETURNS XML AS $F$
276         SELECT  XMLELEMENT(
277                     name subscription,
278                     XMLATTRIBUTES(
279                         'http://open-ils.org/spec/holdings/v1' AS xmlns,
280                         'tag:open-ils.org:U2@ssub/' || id AS id,
281                         start_date AS start, end_date AS end, expected_date_offset
282                     ),
283                     unapi.aou( owning_lib, $2, 'owning_lib', array_remove_item_by_value($4,'ssub'), $5, $6, $7, $8),
284                     XMLELEMENT( name distributions,
285                         CASE 
286                             WHEN ('sdist' = ANY ($4)) THEN
287                                 XMLAGG((SELECT unapi.sdist( id, 'xml', 'distribution', array_remove_item_by_value($4,'ssub'), $5, $6, $7, $8) FROM serial.distribution WHERE subscription = ssub.id))
288                             ELSE NULL
289                         END
290                     )
291                 )
292           FROM  serial.subscription ssub
293           WHERE id = $1
294           GROUP BY id, start_date, end_date, expected_date_offset, owning_lib;
295 $F$ LANGUAGE SQL;
296
297 CREATE OR REPLACE FUNCTION unapi.sdist ( obj_id BIGINT, format TEXT,  ename TEXT, includes TEXT[], org TEXT, depth INT DEFAULT NULL, slimit INT DEFAULT NULL, soffset INT DEFAULT NULL ) RETURNS XML AS $F$
298         SELECT  XMLELEMENT(
299                     name distribution,
300                     XMLATTRIBUTES(
301                         'http://open-ils.org/spec/holdings/v1' AS xmlns,
302                         'tag:open-ils.org:U2@sdist/' || id AS id,
303                         'tag:open-ils.org:U2@acn/' || receive_call_number AS receive_call_number,
304                         'tag:open-ils.org:U2@acn/' || bind_call_number AS bind_call_number,
305                         unit_label_prefix, label, unit_label_suffix, summary_method
306                     ),
307                     unapi.aou( holding_lib, $2, 'holding_lib', array_remove_item_by_value($4,'sdist'), $5, $6, $7, $8),
308                     CASE WHEN subscription IS NOT NULL AND ('ssub' = ANY ($4)) THEN unapi.ssub( subscription, 'xml', 'subscription', array_remove_item_by_value($4,'sdist'), $5, $6, $7, $8) ELSE NULL END,
309                     XMLELEMENT( name streams,
310                         CASE 
311                             WHEN ('sstr' = ANY ($4)) THEN
312                                 XMLAGG((SELECT unapi.sstr( id, 'xml', 'stream', array_remove_item_by_value($4,'sdist'), $5, $6, $7, $8) FROM serial.stream WHERE distribution = sdist.id))
313                             ELSE NULL
314                         END
315                     ),
316                     XMLELEMENT( name summaries,
317                         CASE 
318                             WHEN ('ssum' = ANY ($4)) THEN
319                                 XMLAGG((SELECT unapi.sbsum( id, 'xml', 'serial_summary', array_remove_item_by_value($4,'sdist'), $5, $6, $7, $8) FROM serial.basic_summary WHERE distribution = sdist.id))
320                             ELSE NULL
321                         END,
322                         CASE 
323                             WHEN ('ssum' = ANY ($4)) THEN
324                                 XMLAGG((SELECT unapi.sisum( id, 'xml', 'serial_summary', array_remove_item_by_value($4,'sdist'), $5, $6, $7, $8) FROM serial.index_summary WHERE distribution = sdist.id))
325                             ELSE NULL
326                         END,
327                         CASE 
328                             WHEN ('ssum' = ANY ($4)) THEN
329                                 XMLAGG((SELECT unapi.sssum( id, 'xml', 'serial_summary', array_remove_item_by_value($4,'sdist'), $5, $6, $7, $8) FROM serial.supplement_summary WHERE distribution = sdist.id))
330                             ELSE NULL
331                         END
332                     )
333                 )
334           FROM  serial.distribution sdist
335           WHERE id = $1
336           GROUP BY id, label, unit_label_prefix, unit_label_suffix, holding_lib, summary_method, subscription, receive_call_number, bind_call_number;
337 $F$ LANGUAGE SQL;
338
339 CREATE OR REPLACE FUNCTION unapi.sstr ( obj_id BIGINT, format TEXT,  ename TEXT, includes TEXT[], org TEXT, depth INT DEFAULT NULL, slimit INT DEFAULT NULL, soffset INT DEFAULT NULL ) RETURNS XML AS $F$
340     SELECT  XMLELEMENT(
341                 name stream,
342                 XMLATTRIBUTES(
343                     'http://open-ils.org/spec/holdings/v1' AS xmlns,
344                     'tag:open-ils.org:U2@sstr/' || id AS id,
345                     routing_label
346                 ),
347                 CASE WHEN distribution IS NOT NULL AND ('sdist' = ANY ($4)) THEN unapi.sssum( distribution, 'xml', 'distribtion', array_remove_item_by_value($4,'sstr'), $5, $6, $7, $8) ELSE NULL END,
348                 XMLELEMENT( name items,
349                     CASE 
350                         WHEN ('sitem' = ANY ($4)) THEN
351                             XMLAGG((SELECT unapi.sitem( id, 'xml', 'serial_item', array_remove_item_by_value($4,'sstr'), $5, $6, $7, $8) FROM serial.item WHERE stream = sstr.id))
352                         ELSE NULL
353                     END
354                 )
355             )
356       FROM  serial.stream sstr
357       WHERE id = $1
358       GROUP BY id, routing_label, distribution;
359 $F$ LANGUAGE SQL;
360
361 CREATE OR REPLACE FUNCTION unapi.siss ( obj_id BIGINT, format TEXT,  ename TEXT, includes TEXT[], org TEXT, depth INT DEFAULT NULL, slimit INT DEFAULT NULL, soffset INT DEFAULT NULL ) RETURNS XML AS $F$
362     SELECT  XMLELEMENT(
363                 name issuance,
364                 XMLATTRIBUTES(
365                     'http://open-ils.org/spec/holdings/v1' AS xmlns,
366                     'tag:open-ils.org:U2@siss/' || id AS id,
367                     create_date, edit_date, label, date_published,
368                     holding_code, holding_type, holding_link_id
369                 ),
370                 CASE WHEN subscription IS NOT NULL AND ('ssub' = ANY ($4)) THEN unapi.ssub( subscription, 'xml', 'subscription', array_remove_item_by_value($4,'siss'), $5, $6, $7, $8) ELSE NULL END,
371                 XMLELEMENT( name items,
372                     CASE 
373                         WHEN ('sitem' = ANY ($4)) THEN
374                             XMLAGG((SELECT unapi.sitem( id, 'xml', 'serial_item', array_remove_item_by_value($4,'siss'), $5, $6, $7, $8) FROM serial.item WHERE issuance = sstr.id))
375                         ELSE NULL
376                     END
377                 )
378             )
379       FROM  serial.issuance sstr
380       WHERE id = $1
381       GROUP BY id, create_date, edit_date, label, date_published, holding_code, holding_type, holding_link_id, subscription;
382 $F$ LANGUAGE SQL;
383
384 CREATE OR REPLACE FUNCTION unapi.sitem ( obj_id BIGINT, format TEXT,  ename TEXT, includes TEXT[], org TEXT, depth INT DEFAULT NULL, slimit INT DEFAULT NULL, soffset INT DEFAULT NULL ) RETURNS XML AS $F$
385         SELECT  XMLELEMENT(
386                     name serial_item,
387                     XMLATTRIBUTES(
388                         'http://open-ils.org/spec/holdings/v1' AS xmlns,
389                         'tag:open-ils.org:U2@sitem/' || id AS id,
390                         'tag:open-ils.org:U2@siss/' || issuance AS issuance,
391                         date_expected, date_received
392                     ),
393                     CASE WHEN issuance IS NOT NULL AND ('siss' = ANY ($4)) THEN unapi.siss( issuance, $2, 'issuance', array_remove_item_by_value($4,'sitem'), $5, $6, $7, $8) ELSE NULL END,
394                     CASE WHEN stream IS NOT NULL AND ('sstr' = ANY ($4)) THEN unapi.sstr( stream, $2, 'stream', array_remove_item_by_value($4,'sitem'), $5, $6, $7, $8) ELSE NULL END,
395                     CASE WHEN unit IS NOT NULL AND ('sunit' = ANY ($4)) THEN unapi.sunit( stream, $2, 'serial_unit', array_remove_item_by_value($4,'sitem'), $5, $6, $7, $8) ELSE NULL END,
396                     CASE WHEN uri IS NOT NULL AND ('auri' = ANY ($4)) THEN unapi.auri( uri, $2, 'uri', array_remove_item_by_value($4,'sitem'), $5, $6, $7, $8) ELSE NULL END
397 --                    XMLELEMENT( name notes,
398 --                        CASE 
399 --                            WHEN ('acpn' = ANY ($4)) THEN
400 --                                XMLAGG((SELECT unapi.acpn( id, 'xml', 'copy_note', array_remove_item_by_value($4,'acp'), $5, $6, $7, $8) FROM asset.copy_note WHERE owning_copy = cp.id AND pub))
401 --                            ELSE NULL
402 --                        END
403 --                    )
404                 )
405           FROM  serial.item sitem
406           WHERE id = $1;
407 $F$ LANGUAGE SQL;
408
409
410 CREATE OR REPLACE FUNCTION unapi.sssum ( obj_id BIGINT, format TEXT,  ename TEXT, includes TEXT[], org TEXT, depth INT DEFAULT NULL, slimit INT DEFAULT NULL, soffset INT DEFAULT NULL ) RETURNS XML AS $F$
411     SELECT  XMLELEMENT(
412                 name serial_summary,
413                 XMLATTRIBUTES(
414                     'http://open-ils.org/spec/holdings/v1' AS xmlns,
415                     'tag:open-ils.org:U2@sbsum/' || id AS id,
416                     'sssum' AS type, generated_coverage, textual_holdings, show_generated
417                 ),
418                 CASE WHEN ('sdist' = ANY ($4)) THEN unapi.sdist( distribution, 'xml', 'distribtion', array_remove_item_by_value($4,'ssum'), $5, $6, $7, $8) ELSE NULL END
419             )
420       FROM  serial.supplement_summary ssum
421       WHERE id = $1
422       GROUP BY id, generated_coverage, textual_holdings, distribution, show_generated;
423 $F$ LANGUAGE SQL;
424
425 CREATE OR REPLACE FUNCTION unapi.sbsum ( obj_id BIGINT, format TEXT,  ename TEXT, includes TEXT[], org TEXT, depth INT DEFAULT NULL, slimit INT DEFAULT NULL, soffset INT DEFAULT NULL ) RETURNS XML AS $F$
426     SELECT  XMLELEMENT(
427                 name serial_summary,
428                 XMLATTRIBUTES(
429                     'http://open-ils.org/spec/holdings/v1' AS xmlns,
430                     'tag:open-ils.org:U2@sbsum/' || id AS id,
431                     'sbsum' AS type, generated_coverage, textual_holdings, show_generated
432                 ),
433                 CASE WHEN ('sdist' = ANY ($4)) THEN unapi.sdist( distribution, 'xml', 'distribtion', array_remove_item_by_value($4,'ssum'), $5, $6, $7, $8) ELSE NULL END
434             )
435       FROM  serial.basic_summary ssum
436       WHERE id = $1
437       GROUP BY id, generated_coverage, textual_holdings, distribution, show_generated;
438 $F$ LANGUAGE SQL;
439
440 CREATE OR REPLACE FUNCTION unapi.sisum ( obj_id BIGINT, format TEXT,  ename TEXT, includes TEXT[], org TEXT, depth INT DEFAULT NULL, slimit INT DEFAULT NULL, soffset INT DEFAULT NULL ) RETURNS XML AS $F$
441     SELECT  XMLELEMENT(
442                 name serial_summary,
443                 XMLATTRIBUTES(
444                     'http://open-ils.org/spec/holdings/v1' AS xmlns,
445                     'tag:open-ils.org:U2@sbsum/' || id AS id,
446                     'sisum' AS type, generated_coverage, textual_holdings, show_generated
447                 ),
448                 CASE WHEN ('sdist' = ANY ($4)) THEN unapi.sdist( distribution, 'xml', 'distribtion', array_remove_item_by_value($4,'ssum'), $5, $6, $7, $8) ELSE NULL END
449             )
450       FROM  serial.index_summary ssum
451       WHERE id = $1
452       GROUP BY id, generated_coverage, textual_holdings, distribution, show_generated;
453 $F$ LANGUAGE SQL;
454
455
456 CREATE OR REPLACE FUNCTION unapi.aou ( obj_id BIGINT, format TEXT,  ename TEXT, includes TEXT[], org TEXT, depth INT DEFAULT NULL, slimit INT DEFAULT NULL, soffset INT DEFAULT NULL ) RETURNS XML AS $F$
457 DECLARE
458     output XML;
459 BEGIN
460     IF ename = 'circlib' THEN
461         SELECT  XMLELEMENT(
462                     name circlib,
463                     XMLATTRIBUTES(
464                         'http://open-ils.org/spec/actors/v1' AS xmlns,
465                         id AS ident
466                     ),
467                     name
468                 ) INTO output
469           FROM  actor.org_unit aou
470           WHERE id = obj_id;
471     ELSE
472         EXECUTE $$SELECT  XMLELEMENT(
473                     name $$ || ename || $$,
474                     XMLATTRIBUTES(
475                         'http://open-ils.org/spec/actors/v1' AS xmlns,
476                         'tag:open-ils.org:U2@aou/' || id AS id,
477                         shortname, name, opac_visible
478                     )
479                 )
480           FROM  actor.org_unit aou
481          WHERE id = $1 $$ INTO output USING obj_id;
482     END IF;
483
484     RETURN output;
485
486 END;
487 $F$ LANGUAGE PLPGSQL;
488
489 CREATE OR REPLACE FUNCTION unapi.acl ( obj_id BIGINT, format TEXT,  ename TEXT, includes TEXT[], org TEXT, depth INT DEFAULT NULL, slimit INT DEFAULT NULL, soffset INT DEFAULT NULL ) RETURNS XML AS $F$
490     SELECT  XMLELEMENT(
491                 name location,
492                 XMLATTRIBUTES(
493                     'http://open-ils.org/spec/holdings/v1' AS xmlns,
494                     id AS ident
495                 ),
496                 name
497             )
498       FROM  asset.copy_location
499       WHERE id = $1;
500 $F$ LANGUAGE SQL;
501
502 CREATE OR REPLACE FUNCTION unapi.ccs ( obj_id BIGINT, format TEXT,  ename TEXT, includes TEXT[], org TEXT, depth INT DEFAULT NULL, slimit INT DEFAULT NULL, soffset INT DEFAULT NULL ) RETURNS XML AS $F$
503     SELECT  XMLELEMENT(
504                 name status,
505                 XMLATTRIBUTES(
506                     'http://open-ils.org/spec/holdings/v1' AS xmlns,
507                     id AS ident
508                 ),
509                 name
510             )
511       FROM  config.copy_status
512       WHERE id = $1;
513 $F$ LANGUAGE SQL;
514
515 CREATE OR REPLACE FUNCTION unapi.acpn ( obj_id BIGINT, format TEXT,  ename TEXT, includes TEXT[], org TEXT, depth INT DEFAULT NULL, slimit INT DEFAULT NULL, soffset INT DEFAULT NULL ) RETURNS XML AS $F$
516         SELECT  XMLELEMENT(
517                     name copy_note,
518                     XMLATTRIBUTES(
519                         'http://open-ils.org/spec/holdings/v1' AS xmlns,
520                         create_date AS date,
521                         title
522                     ),
523                     value
524                 )
525           FROM  asset.copy_note
526           WHERE id = $1;
527 $F$ LANGUAGE SQL;
528
529 CREATE OR REPLACE FUNCTION unapi.ascecm ( obj_id BIGINT, format TEXT,  ename TEXT, includes TEXT[], org TEXT, depth INT DEFAULT NULL, slimit INT DEFAULT NULL, soffset INT DEFAULT NULL ) RETURNS XML AS $F$
530         SELECT  XMLELEMENT(
531                     name statcat,
532                     XMLATTRIBUTES(
533                         'http://open-ils.org/spec/holdings/v1' AS xmlns,
534                         sc.name,
535                         sc.opac_visible
536                     ),
537                     asce.value
538                 )
539           FROM  asset.stat_cat_entry asce
540                 JOIN asset.stat_cat sc ON (sc.id = asce.stat_cat)
541           WHERE asce.id = $1;
542 $F$ LANGUAGE SQL;
543
544 CREATE OR REPLACE FUNCTION unapi.acp ( obj_id BIGINT, format TEXT,  ename TEXT, includes TEXT[], org TEXT, depth INT DEFAULT NULL, slimit INT DEFAULT NULL, soffset INT DEFAULT NULL ) RETURNS XML AS $F$
545         SELECT  XMLELEMENT(
546                     name copy,
547                     XMLATTRIBUTES(
548                         'http://open-ils.org/spec/holdings/v1' AS xmlns,
549                         'tag:open-ils.org:U2@acp/' || id AS id,
550                         create_date, edit_date, copy_number, circulate, deposit,
551                         ref, holdable, deleted, deposit_amount, price, barcode,
552                         circ_modifier, circ_as_type, opac_visible
553                     ),
554                     unapi.ccs( status, $2, 'status', array_remove_item_by_value($4,'acp'), $5, $6, $7, $8),
555                     unapi.acl( location, $2, 'location', array_remove_item_by_value($4,'acp'), $5, $6, $7, $8),
556                     unapi.aou( circ_lib, $2, 'circ_lib', array_remove_item_by_value($4,'acp'), $5, $6, $7, $8),
557                     unapi.aou( circ_lib, $2, 'circlib', array_remove_item_by_value($4,'acp'), $5, $6, $7, $8),
558                     CASE WHEN ('acn' = ANY ($4)) THEN unapi.acn( call_number, $2, 'call_number', array_remove_item_by_value($4,'acp'), $5, $6, $7, $8) ELSE NULL END,
559                     XMLELEMENT( name copy_notes,
560                         CASE 
561                             WHEN ('acpn' = ANY ($4)) THEN
562                                 XMLAGG((SELECT unapi.acpn( id, 'xml', 'copy_note', array_remove_item_by_value($4,'acp'), $5, $6, $7, $8) FROM asset.copy_note WHERE owning_copy = cp.id AND pub))
563                             ELSE NULL
564                         END
565                     ),
566                     XMLELEMENT( name statcats,
567                         CASE 
568                             WHEN ('ascecm' = ANY ($4)) THEN
569                                 XMLAGG((SELECT unapi.acpn( stat_cat_entry, 'xml', 'statcat', array_remove_item_by_value($4,'acp'), $5, $6, $7, $8) FROM asset.stat_cat_entry_copy_map WHERE owning_copy = cp.id))
570                             ELSE NULL
571                         END
572                     )
573                 )
574           FROM  asset.copy cp
575           WHERE id = $1
576           GROUP BY id, status, location, circ_lib, call_number, create_date, edit_date, copy_number, circulate, deposit, ref, holdable, deleted, deposit_amount, price, barcode, circ_modifier, circ_as_type, opac_visible;
577 $F$ LANGUAGE SQL;
578
579 CREATE OR REPLACE FUNCTION unapi.sunit ( obj_id BIGINT, format TEXT,  ename TEXT, includes TEXT[], org TEXT, depth INT DEFAULT NULL, slimit INT DEFAULT NULL, soffset INT DEFAULT NULL ) RETURNS XML AS $F$
580         SELECT  XMLELEMENT(
581                     name serial_unit,
582                     XMLATTRIBUTES(
583                         'http://open-ils.org/spec/holdings/v1' AS xmlns,
584                         'tag:open-ils.org:U2@acp/' || id AS id,
585                         create_date, edit_date, copy_number, circulate, deposit,
586                         ref, holdable, deleted, deposit_amount, price, barcode,
587                         circ_modifier, circ_as_type, opac_visible, status_changed_time,
588                         floating, mint_condition, detailed_contents, sort_key, summary_contents, cost 
589                     ),
590                     unapi.ccs( status, $2, 'status', array_remove_item_by_value(array_remove_item_by_value($4,'acp'),'sunit'), $5, $6, $7, $8),
591                     unapi.acl( location, $2, 'location', array_remove_item_by_value(array_remove_item_by_value($4,'acp'),'sunit'), $5, $6, $7, $8),
592                     unapi.aou( circ_lib, $2, 'circ_lib', array_remove_item_by_value(array_remove_item_by_value($4,'acp'),'sunit'), $5, $6, $7, $8),
593                     unapi.aou( circ_lib, $2, 'circlib', array_remove_item_by_value(array_remove_item_by_value($4,'acp'),'sunit'), $5, $6, $7, $8),
594                     CASE WHEN ('acn' = ANY ($4)) THEN unapi.acn( call_number, $2, 'call_number', array_remove_item_by_value($4,'acp'), $5, $6, $7, $8) ELSE NULL END,
595                     XMLELEMENT( name copy_notes,
596                         CASE 
597                             WHEN ('acpn' = ANY ($4)) THEN
598                                 XMLAGG((SELECT unapi.acpn( id, 'xml', 'copy_note', array_remove_item_by_value(array_remove_item_by_value($4,'acp'),'sunit'), $5, $6, $7, $8) FROM asset.copy_note WHERE owning_copy = cp.id AND pub))
599                             ELSE NULL
600                         END
601                     ),
602                     XMLELEMENT( name statcats,
603                         CASE 
604                             WHEN ('ascecm' = ANY ($4)) THEN
605                                 XMLAGG((SELECT unapi.acpn( stat_cat_entry, 'xml', 'statcat', array_remove_item_by_value(array_remove_item_by_value($4,'acp'),'sunit'), $5, $6, $7, $8) FROM asset.stat_cat_entry_copy_map WHERE owning_copy = cp.id))
606                             ELSE NULL
607                         END
608                     )
609                 )
610           FROM  serial.unit cp
611           WHERE id = $1
612           GROUP BY  id, status, location, circ_lib, call_number, create_date, edit_date, copy_number, circulate, floating, mint_condition,
613                     deposit, ref, holdable, deleted, deposit_amount, price, barcode, circ_modifier, circ_as_type, opac_visible, status_changed_time, detailed_contents, sort_key, summary_contents, cost;
614 $F$ LANGUAGE SQL;
615
616 CREATE OR REPLACE FUNCTION unapi.acn ( obj_id BIGINT, format TEXT,  ename TEXT, includes TEXT[], org TEXT, depth INT DEFAULT NULL, slimit INT DEFAULT NULL, soffset INT DEFAULT NULL ) RETURNS XML AS $F$
617         SELECT  XMLELEMENT(
618                     name volume,
619                     XMLATTRIBUTES(
620                         'http://open-ils.org/spec/holdings/v1' AS xmlns,
621                         'tag:open-ils.org:U2@acn/' || acn.id AS id,
622                         o.shortname AS lib,
623                         o.opac_visible AS opac_visible,
624                         deleted, label, label_sortkey, label_class, record
625                     ),
626                     unapi.aou( owning_lib, $2, 'owning_lib', array_remove_item_by_value($4,'acn'), $5, $6, $7, $8),
627                     XMLELEMENT( name copies,
628                         CASE 
629                             WHEN ('acp' = ANY ($4)) THEN
630                                 (SELECT XMLAGG(acp) FROM (
631                                     SELECT  unapi.acp( cp.id, 'xml', 'copy', array_remove_item_by_value($4,'acn'), $5, $6, $7, $8)
632                                       FROM  asset.copy cp
633                                             JOIN actor.org_unit_descendants(
634                                                 (SELECT id FROM actor.org_unit WHERE shortname = $5),
635                                                 (COALESCE($6,(SELECT aout.depth FROM actor.org_unit_type aout JOIN actor.org_unit aou ON (aou.ou_type = aout.id AND aou.shortname = $5))))
636                                             ) aoud ON (cp.circ_lib = aoud.id)
637                                       WHERE cp.call_number = acn.id
638                                       ORDER BY COALESCE(cp.copy_number,0), cp.barcode
639                                       LIMIT $7
640                                       OFFSET $8
641                                 )x)
642                             ELSE NULL
643                         END
644                     ),
645                     XMLELEMENT(
646                         name uris,
647                         (SELECT XMLAGG(auri) FROM (SELECT unapi.auri(uri,'xml','uri', array_remove_item_by_value($4,'acn'), $5, $6, $7, $8) FROM asset.uri_call_number_map WHERE call_number = acn.id)x)
648                     ),
649                     CASE WHEN ('bre' = ANY ($4)) THEN unapi.bre( acn.record, 'marcxml', 'record', array_remove_item_by_value($4,'acn'), $5, $6, $7, $8) ELSE NULL END
650                 ) AS x
651           FROM  asset.call_number acn
652                 JOIN actor.org_unit o ON (o.id = acn.owning_lib)
653           WHERE acn.id = $1
654           GROUP BY acn.id, o.shortname, o.opac_visible, deleted, label, label_sortkey, label_class, owning_lib, record;
655 $F$ LANGUAGE SQL;
656
657 CREATE OR REPLACE FUNCTION unapi.auri ( obj_id BIGINT, format TEXT,  ename TEXT, includes TEXT[], org TEXT, depth INT DEFAULT NULL, slimit INT DEFAULT NULL, soffset INT DEFAULT NULL ) RETURNS XML AS $F$
658         SELECT  XMLELEMENT(
659                     name volume,
660                     XMLATTRIBUTES(
661                         'http://open-ils.org/spec/holdings/v1' AS xmlns,
662                         'tag:open-ils.org:U2@auri/' || uri.id AS id,
663                         use_restriction,
664                         href,
665                         label
666                     ),
667                     XMLELEMENT( name copies,
668                         CASE 
669                             WHEN ('acn' = ANY ($4)) THEN
670                                 (SELECT XMLAGG(acn) FROM (SELECT unapi.acn( call_number, 'xml', 'copy', array_remove_item_by_value($4,'auri'), $5, $6, $7, $8) FROM asset.uri_call_number_map WHERE uri = uri.id)x)
671                             ELSE NULL
672                         END
673                     )
674                 ) AS x
675           FROM  asset.uri uri
676           WHERE uri.id = $1
677           GROUP BY uri.id, use_restriction, href, label;
678 $F$ LANGUAGE SQL;
679
680 /*
681
682  -- Some test queries
683
684 SELECT unapi.memoize( 'bre', 1,'mods32','','{holdings_xml,acp}'::TEXT[], 'SYS1');
685 SELECT unapi.memoize( 'bre', 1,'marcxml','','{holdings_xml,acp}'::TEXT[], 'SYS1');
686 SELECT unapi.memoize( 'bre', 1,'holdings_xml','','{holdings_xml,acp}'::TEXT[], 'SYS1');
687
688 SELECT unapi.biblio_record_entry_feed('{1}'::BIGINT[],'mods32','{holdings_xml,acp}'::TEXT[],'SYS1',NULL,1,NULL, NULL,NULL,NULL,NULL,'http://c64/opac/extras/unapi', '<totalResults xmlns="http://a9.com/-/spec/opensearch/1.1/">2</totalResults><startIndex xmlns="http://a9.com/-/spec/opensearch/1.1/">1</startIndex><itemsPerPage xmlns="http://a9.com/-/spec/opensearch/1.1/">10</itemsPerPage>');
689
690 SELECT unapi.biblio_record_entry_feed('{7209,7394}'::BIGINT[],'marcxml','{}'::TEXT[],'SYS1',NULL,1,NULL, NULL,NULL,NULL,NULL,'http://fulfillment2.esilibrary.com/opac/extras/unapi', '<totalResults xmlns="http://a9.com/-/spec/opensearch/1.1/">2</totalResults><startIndex xmlns="http://a9.com/-/spec/opensearch/1.1/">1</startIndex><itemsPerPage xmlns="http://a9.com/-/spec/opensearch/1.1/">10</itemsPerPage>');
691 EXPLAIN ANALYZE SELECT unapi.biblio_record_entry_feed('{7209,7394}'::BIGINT[],'marcxml','{}'::TEXT[],'SYS1',NULL,1,NULL, NULL,NULL,NULL,NULL,'http://fulfillment2.esilibrary.com/opac/extras/unapi', '<totalResults xmlns="http://a9.com/-/spec/opensearch/1.1/">2</totalResults><startIndex xmlns="http://a9.com/-/spec/opensearch/1.1/">1</startIndex><itemsPerPage xmlns="http://a9.com/-/spec/opensearch/1.1/">10</itemsPerPage>');
692 EXPLAIN ANALYZE SELECT unapi.biblio_record_entry_feed('{7209,7394}'::BIGINT[],'marcxml','{holdings_xml}'::TEXT[],'SYS1',NULL,1,NULL, NULL,NULL,NULL,NULL,'http://fulfillment2.esilibrary.com/opac/extras/unapi', '<totalResults xmlns="http://a9.com/-/spec/opensearch/1.1/">2</totalResults><startIndex xmlns="http://a9.com/-/spec/opensearch/1.1/">1</startIndex><itemsPerPage xmlns="http://a9.com/-/spec/opensearch/1.1/">10</itemsPerPage>');
693 EXPLAIN ANALYZE SELECT unapi.biblio_record_entry_feed('{7209,7394}'::BIGINT[],'mods32','{holdings_xml}'::TEXT[],'SYS1',NULL,1,NULL, NULL,NULL,NULL,NULL,'http://fulfillment2.esilibrary.com/opac/extras/unapi', '<totalResults xmlns="http://a9.com/-/spec/opensearch/1.1/">2</totalResults><startIndex xmlns="http://a9.com/-/spec/opensearch/1.1/">1</startIndex><itemsPerPage xmlns="http://a9.com/-/spec/opensearch/1.1/">10</itemsPerPage>');
694
695 SELECT unapi.biblio_record_entry_feed('{216}'::BIGINT[],'marcxml','{}'::TEXT[], 'BR1');
696 EXPLAIN ANALYZE SELECT unapi.bre(216,'marcxml','record','{holdings_xml,bre.unapi}'::TEXT[], 'BR1');
697 EXPLAIN ANALYZE SELECT unapi.bre(216,'holdings_xml','record','{}'::TEXT[], 'BR1');
698 EXPLAIN ANALYZE SELECT unapi.holdings_xml(216,4,'BR1',2,'{bre}'::TEXT[]);
699 EXPLAIN ANALYZE SELECT unapi.bre(216,'mods32','record','{}'::TEXT[], 'BR1');
700
701 */
702
703 COMMIT;
704