4 INSERT INTO config.upgrade_log (version) VALUES ('0213');
6 CREATE TABLE config.metabib_class (
8 label TEXT NOT NULL UNIQUE
11 INSERT INTO config.metabib_class ( name, label ) VALUES ( 'keyword', oils_i18n_gettext('keyword', 'Keyword', 'cmc', 'label') );
12 INSERT INTO config.metabib_class ( name, label ) VALUES ( 'title', oils_i18n_gettext('title', 'Title', 'cmc', 'label') );
13 INSERT INTO config.metabib_class ( name, label ) VALUES ( 'author', oils_i18n_gettext('author', 'Author', 'cmc', 'label') );
14 INSERT INTO config.metabib_class ( name, label ) VALUES ( 'subject', oils_i18n_gettext('subject', 'Subject', 'cmc', 'label') );
15 INSERT INTO config.metabib_class ( name, label ) VALUES ( 'series', oils_i18n_gettext('series', 'Series', 'cmc', 'label') );
17 ALTER TABLE config.metabib_field ADD COLUMN label TEXT;
18 UPDATE config.metabib_field SET label = name;
19 ALTER TABLE config.metabib_field ALTER COLUMN label SET NOT NULL;
21 ALTER TABLE config.metabib_field ADD CONSTRAINT field_class_fkey FOREIGN KEY (field_class) REFERENCES config.metabib_class (name);
23 CREATE OR REPLACE FUNCTION biblio.extract_metabib_field_entry ( rid BIGINT, default_joiner TEXT ) RETURNS SETOF metabib.field_entry_template AS $func$
25 bib biblio.record_entry%ROWTYPE;
26 idx config.metabib_field%ROWTYPE;
27 xfrm config.xml_transform%ROWTYPE;
34 joiner TEXT := default_joiner; -- XXX will index defs supply a joiner?
35 output_row metabib.field_entry_template%ROWTYPE;
39 SELECT INTO bib * FROM biblio.record_entry WHERE id = rid;
41 -- Loop over the indexing entries
42 FOR idx IN SELECT * FROM config.metabib_field ORDER BY format LOOP
44 SELECT INTO xfrm * from config.xml_transform WHERE name = idx.format;
46 -- See if we can skip the XSLT ... it's expensive
47 IF prev_xfrm IS NULL OR prev_xfrm <> xfrm.name THEN
48 -- Can't skip the transform
49 IF xfrm.xslt <> '---' THEN
50 transformed_xml := oils_xslt_process(bib.marc,xfrm.xslt);
52 transformed_xml := bib.marc;
55 prev_xfrm := xfrm.name;
58 xml_node_list := oils_xpath( idx.xpath, transformed_xml, ARRAY[ARRAY[xfrm.prefix, xfrm.namespace_uri]] );
61 FOR xml_node IN SELECT x FROM explode_array(xml_node_list) AS x LOOP
62 CONTINUE WHEN xml_node !~ E'^\\s*<';
64 curr_text := ARRAY_TO_STRING(
65 oils_xpath( '//text()',
66 REGEXP_REPLACE( -- This escapes all &s not followed by "amp;". Data ise returned from oils_xpath (above) in UTF-8, not entity encoded
67 REGEXP_REPLACE( -- This escapes embeded <s
69 $re$(>[^<]+)(<)([^>]+<)$re$,
81 CONTINUE WHEN curr_text IS NULL OR curr_text = '';
83 IF raw_text IS NOT NULL THEN
84 raw_text := raw_text || joiner;
87 raw_text := COALESCE(raw_text,'') || curr_text;
89 -- insert raw node text for faceting
90 IF idx.facet_field THEN
92 output_row.field_class = idx.field_class;
93 output_row.field = idx.id;
94 output_row.source = rid;
95 output_row.value = BTRIM(REGEXP_REPLACE(curr_text, E'\\s+', ' ', 'g'));
97 RETURN NEXT output_row;
102 CONTINUE WHEN raw_text IS NULL OR raw_text = '';
104 -- insert combined node text for searching
105 IF idx.search_field THEN
106 output_row.field_class = idx.field_class;
107 output_row.field = idx.id;
108 output_row.source = rid;
109 output_row.value = BTRIM(REGEXP_REPLACE(raw_text, E'\\s+', ' ', 'g'));
111 RETURN NEXT output_row;
117 $func$ LANGUAGE PLPGSQL;