adding xml_transform support. this will require a patched xml2 module.
authormiker <miker@dcc99617-32d9-48b4-a31d-7c20da2025e4>
Mon, 5 Mar 2007 21:48:32 +0000 (21:48 +0000)
committermiker <miker@dcc99617-32d9-48b4-a31d-7c20da2025e4>
Mon, 5 Mar 2007 21:48:32 +0000 (21:48 +0000)
git-svn-id: svn://svn.open-ils.org/ILS/trunk@7032 dcc99617-32d9-48b4-a31d-7c20da2025e4

Open-ILS/src/sql/Pg/002.schema.config.sql

index bea525f..1df121b 100644 (file)
@@ -98,6 +98,14 @@ INSERT INTO config.standing (value) VALUES ('Good');
 INSERT INTO config.standing (value) VALUES ('Barred');
 
 
+CREATE TABLE config.xml_transform (
+       name            TEXT    PRIMARY KEY,
+       namespace_uri   TEXT    NOT NULL UNIQUE,
+       prefix          TEXT    NOT NULL,
+       xslt            TEXT    NOT NULL
+);
+INSERT INTO config.xml_transform VALUES ( 'marcxml', 'http://www.loc.gov/MARC21/slim', 'marc', '---' );
+INSERT INTO config.xml_transform VALUES ( 'mods', 'http://www.loc.gov/mods/', 'mods', '/home/miker/MARC21slim2MODS.xsl' );
 
 CREATE TABLE config.metabib_field (
        id              SERIAL  PRIMARY KEY,
@@ -105,7 +113,9 @@ CREATE TABLE config.metabib_field (
        name            TEXT    NOT NULL UNIQUE,
        xpath           TEXT    NOT NULL,
        weight          INT     NOT NULL DEFAULT 1,
-       format          TEXT    NOT NULL DEFAULT 'mods'
+       format          TEXT    NOT NULL DEFAULT 'mods',
+       search          BOOL    NOT NULL DEFAULT TRUE,
+       facet           BOOL    NOT NULL DEFAULT FALSE
 );
 COMMENT ON TABLE config.metabib_field IS $$
 /*
@@ -150,6 +160,48 @@ INSERT INTO config.metabib_field ( field_class, name, xpath ) VALUES ( 'subject'
 -- INSERT INTO config.metabib_field ( field_class, name, xpath ) VALUES ( 'subject', 'genre', $$//mods:mods/mods:genre$$ );
 INSERT INTO config.metabib_field ( field_class, name, xpath ) VALUES ( 'keyword', 'keyword', $$//mods:mods/*[not(local-name()='originInfo')]$$ ); -- /* to fool vim */
 
+
+
+CREATE OR REPLACE FUNCTION oils_xml_transform ( TEXT, TEXT ) RETURNS TEXT AS $_$
+       SELECT  CASE    WHEN (SELECT COUNT(*) FROM config.xml_transform WHERE name = $2 AND xslt = '---') > 0 THEN $1
+                       ELSE xslt_process($1, (SELECT xslt FROM config.xml_transform WHERE name = $2))
+               END;
+$_$ LANGUAGE SQL STRICT IMMUTABLE;
+
+
+
+CREATE TYPE biblio_field_vtype AS ( record BIGINT, field INT, content TEXT );
+CREATE OR REPLACE FUNCTION biblio_field_table ( record BIGINT, field_list INT[] ) RETURNS SETOF biblio_field_vtype AS $_$
+DECLARE
+       i INT;
+       rec biblio_field_vtype%ROWTYPE;
+BEGIN
+       FOR i IN ARRAY_LOWER(field_list,1) .. ARRAY_UPPER(field_list,1) LOOP
+               FOR rec IN      SELECT  DISTINCT r, field_list[i], BTRIM(REGEXP_REPLACE(REGEXP_REPLACE(f, E'\n', ' ', 'g'), '[ ]+', ' ', 'g'))
+                                 FROM  xpath_table_ns(
+                                               'id',
+                                               $$oils_xml_transform(marc,'$$ || (SELECT format FROM config.metabib_field WHERE id = field_list[i]) || $$')$$,
+                                               'biblio.record_entry',
+                                               (SELECT xpath FROM config.metabib_field WHERE id = field_list[i]),
+                                               'id = ' || record,
+                                               (SELECT x.prefix FROM config.xml_transform x JOIN config.metabib_field m ON (m.format = x.name) WHERE m.id = field_list[i]),
+                                               (SELECT x.namespace_uri FROM config.xml_transform x JOIN config.metabib_field m ON (m.format = x.name) WHERE m.id = field_list[i])
+                                       ) AS t( r bigint, f text)
+                                 WHERE f IS NOT NULL LOOP
+                       RETURN NEXT rec;
+               END LOOP;
+       END LOOP;
+END;
+$_$ LANGUAGE PLPGSQL;
+
+
+
+CREATE OR REPLACE FUNCTION biblio_field_table ( record BIGINT, field INT ) RETURNS SETOF biblio_field_vtype AS $_$
+       SELECT * FROM biblio_field_table( $1, ARRAY[$2] )
+$_$ LANGUAGE SQL;
+
+
+
 CREATE TABLE config.non_cataloged_type (
        id              SERIAL          PRIMARY KEY,
        owning_lib      INT             NOT NULL, -- REFERENCES actor.org_unit (id),