-- Evergreen DB patch XXXX.schema.unapi-indb-optional-org.sql BEGIN; -- check whether patch can be applied SELECT evergreen.upgrade_deps_block_check('0653', :eg_version); CREATE OR REPLACE FUNCTION evergreen.org_top() RETURNS SETOF actor.org_unit AS $$ SELECT * FROM actor.org_unit WHERE parent_ou IS NULL LIMIT 1; $$ LANGUAGE SQL ROWS 1; CREATE OR REPLACE FUNCTION unapi.biblio_record_entry_feed ( id_list BIGINT[], format TEXT, includes TEXT[], org TEXT DEFAULT '-', depth INT DEFAULT NULL, slimit INT DEFAULT NULL, soffset INT 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 ) RETURNS XML AS $F$ DECLARE layout unapi.bre_output_layout%ROWTYPE; transform config.xml_transform%ROWTYPE; item_format TEXT; tmp_xml TEXT; xmlns_uri TEXT := 'http://open-ils.org/spec/feed-xml/v1'; ouid INT; element_list TEXT[]; BEGIN IF org = '-' OR org IS NULL THEN SELECT shortname INTO org FROM evergreen.org_top(); END IF; SELECT id INTO ouid FROM actor.org_unit WHERE shortname = org; SELECT * INTO layout FROM unapi.bre_output_layout WHERE name = format; IF layout.name IS NULL THEN RETURN NULL::XML; END IF; SELECT * INTO transform FROM config.xml_transform WHERE name = layout.transform; xmlns_uri := COALESCE(transform.namespace_uri,xmlns_uri); -- Gather the bib xml SELECT XMLAGG( unapi.bre(i, format, '', includes, org, depth, slimit, soffset, include_xmlns)) INTO tmp_xml FROM UNNEST( id_list ) i; IF layout.title_element IS NOT NULL THEN EXECUTE 'SELECT XMLCONCAT( XMLELEMENT( name '|| layout.title_element ||', CASE WHEN $4 THEN XMLATTRIBUTES( $1 AS xmlns) ELSE NULL END, $3), $2)' INTO tmp_xml USING xmlns_uri, tmp_xml::XML, title, include_xmlns; END IF; IF layout.description_element IS NOT NULL THEN EXECUTE 'SELECT XMLCONCAT( XMLELEMENT( name '|| layout.description_element ||', CASE WHEN $4 THEN XMLATTRIBUTES( $1 AS xmlns) ELSE NULL END, $3), $2)' INTO tmp_xml USING xmlns_uri, tmp_xml::XML, description, include_xmlns; END IF; IF layout.creator_element IS NOT NULL THEN EXECUTE 'SELECT XMLCONCAT( XMLELEMENT( name '|| layout.creator_element ||', CASE WHEN $4 THEN XMLATTRIBUTES( $1 AS xmlns) ELSE NULL END, $3), $2)' INTO tmp_xml USING xmlns_uri, tmp_xml::XML, creator, include_xmlns; END IF; IF layout.update_ts_element IS NOT NULL THEN EXECUTE 'SELECT XMLCONCAT( XMLELEMENT( name '|| layout.update_ts_element ||', CASE WHEN $4 THEN XMLATTRIBUTES( $1 AS xmlns) ELSE NULL END, $3), $2)' INTO tmp_xml USING xmlns_uri, tmp_xml::XML, update_ts, include_xmlns; END IF; IF unapi_url IS NOT NULL THEN 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; END IF; IF header_xml IS NOT NULL THEN tmp_xml := XMLCONCAT(header_xml,tmp_xml::XML); END IF; element_list := regexp_split_to_array(layout.feed_top,E'\\.'); FOR i IN REVERSE ARRAY_UPPER(element_list, 1) .. 1 LOOP EXECUTE 'SELECT XMLELEMENT( name '|| quote_ident(element_list[i]) ||', CASE WHEN $4 THEN XMLATTRIBUTES( $1 AS xmlns) ELSE NULL END, $2)' INTO tmp_xml USING xmlns_uri, tmp_xml::XML, include_xmlns; END LOOP; RETURN tmp_xml::XML; END; $F$ LANGUAGE PLPGSQL; CREATE OR REPLACE FUNCTION unapi.bre ( obj_id BIGINT, format TEXT, ename TEXT, includes TEXT[], org TEXT DEFAULT '-', depth INT DEFAULT NULL, slimit INT DEFAULT NULL, soffset INT DEFAULT NULL, include_xmlns BOOL DEFAULT TRUE ) RETURNS XML AS $F$ DECLARE me biblio.record_entry%ROWTYPE; layout unapi.bre_output_layout%ROWTYPE; xfrm config.xml_transform%ROWTYPE; ouid INT; tmp_xml TEXT; top_el TEXT; output XML; hxml XML; axml XML; BEGIN IF org = '-' OR org IS NULL THEN SELECT shortname INTO org FROM evergreen.org_top(); END IF; SELECT id INTO ouid FROM actor.org_unit WHERE shortname = org; IF ouid IS NULL THEN RETURN NULL::XML; END IF; IF format = 'holdings_xml' THEN -- the special case output := unapi.holdings_xml( obj_id, ouid, org, depth, includes, slimit, soffset, include_xmlns); RETURN output; END IF; SELECT * INTO layout FROM unapi.bre_output_layout WHERE name = format; IF layout.name IS NULL THEN RETURN NULL::XML; END IF; SELECT * INTO xfrm FROM config.xml_transform WHERE name = layout.transform; SELECT * INTO me FROM biblio.record_entry WHERE id = obj_id; -- grab SVF if we need them IF ('mra' = ANY (includes)) THEN axml := unapi.mra(obj_id,NULL,NULL,NULL,NULL); ELSE axml := NULL::XML; END IF; -- grab hodlings if we need them IF ('holdings_xml' = ANY (includes)) THEN hxml := unapi.holdings_xml(obj_id, ouid, org, depth, evergreen.array_remove_item_by_value(includes,'holdings_xml'), slimit, soffset, include_xmlns); ELSE hxml := NULL::XML; END IF; -- generate our item node IF format = 'marcxml' THEN tmp_xml := me.marc; IF tmp_xml !~ E'(.*?)$', axml || '\\1'); END IF; IF hxml IS NOT NULL THEN -- XXX how do we configure the holdings position? tmp_xml := REGEXP_REPLACE(tmp_xml, '(.*?)$', hxml || '\\1'); END IF; IF ('bre.unapi' = ANY (includes)) THEN output := REGEXP_REPLACE( tmp_xml, '(.*?)', XMLELEMENT( name abbr, XMLATTRIBUTES( 'http://www.w3.org/1999/xhtml' AS xmlns, 'unapi-id' AS class, 'tag:open-ils.org:U2@bre/' || obj_id || '/' || org AS title ) )::TEXT || '\\1' ); ELSE output := tmp_xml; END IF; output := REGEXP_REPLACE(output::TEXT,E'>\\s+<','><','gs')::XML; RETURN output; END; $F$ LANGUAGE PLPGSQL; COMMIT;