4 INSERT INTO config.upgrade_log (version) VALUES ('0217'); --miker
6 ALTER TABLE config.metabib_field ADD COLUMN facet_xpath TEXT;
8 UPDATE config.metabib_field SET facet_field=TRUE WHERE id = 1;
9 UPDATE config.metabib_field SET xpath=$$//mods32:mods/mods32:name[@type='corporate' and mods32:role/mods32:roleTerm[text()='creator']]$$, facet_field=TRUE, facet_xpath=$$*[local-name()='namePart']$$ WHERE id = 7;
10 UPDATE config.metabib_field SET xpath=$$//mods32:mods/mods32:name[@type='personal' and mods32:role/mods32:roleTerm[text()='creator']]$$, facet_field=TRUE, facet_xpath=$$*[local-name()='namePart']$$ WHERE id = 8;
11 UPDATE config.metabib_field SET xpath=$$//mods32:mods/mods32:name[@type='conference' and mods32:role/mods32:roleTerm[text()='creator']]$$, facet_field=TRUE, facet_xpath=$$*[local-name()='namePart']$$ WHERE id = 9;
12 UPDATE config.metabib_field SET xpath=$$//mods32:mods/mods32:name[@type='personal' and not(mods32:role)]$$, facet_field=TRUE, facet_xpath=$$*[local-name()='namePart']$$ WHERE id = 10;
14 UPDATE config.metabib_field SET facet_field=TRUE WHERE id = 11;
15 UPDATE config.metabib_field SET facet_field=TRUE , facet_xpath=$$*[local-name()='namePart']$$ WHERE id = 12;
16 UPDATE config.metabib_field SET facet_field=TRUE WHERE id = 13;
17 UPDATE config.metabib_field SET facet_field=TRUE WHERE id = 14;
19 CREATE OR REPLACE FUNCTION biblio.extract_metabib_field_entry ( rid BIGINT, default_joiner TEXT ) RETURNS SETOF metabib.field_entry_template AS $func$
21 bib biblio.record_entry%ROWTYPE;
22 idx config.metabib_field%ROWTYPE;
23 xfrm config.xml_transform%ROWTYPE;
31 joiner TEXT := default_joiner; -- XXX will index defs supply a joiner?
32 output_row metabib.field_entry_template%ROWTYPE;
36 SELECT INTO bib * FROM biblio.record_entry WHERE id = rid;
38 -- Loop over the indexing entries
39 FOR idx IN SELECT * FROM config.metabib_field ORDER BY format LOOP
41 SELECT INTO xfrm * from config.xml_transform WHERE name = idx.format;
43 -- See if we can skip the XSLT ... it's expensive
44 IF prev_xfrm IS NULL OR prev_xfrm <> xfrm.name THEN
45 -- Can't skip the transform
46 IF xfrm.xslt <> '---' THEN
47 transformed_xml := oils_xslt_process(bib.marc,xfrm.xslt);
49 transformed_xml := bib.marc;
52 prev_xfrm := xfrm.name;
55 xml_node_list := oils_xpath( idx.xpath, transformed_xml, ARRAY[ARRAY[xfrm.prefix, xfrm.namespace_uri]] );
58 FOR xml_node IN SELECT x FROM explode_array(xml_node_list) AS x LOOP
59 CONTINUE WHEN xml_node !~ E'^\\s*<';
61 curr_text := ARRAY_TO_STRING(
62 oils_xpath( '//text()',
63 REGEXP_REPLACE( -- This escapes all &s not followed by "amp;". Data ise returned from oils_xpath (above) in UTF-8, not entity encoded
64 REGEXP_REPLACE( -- This escapes embeded <s
66 $re$(>[^<]+)(<)([^>]+<)$re$,
78 CONTINUE WHEN curr_text IS NULL OR curr_text = '';
80 IF raw_text IS NOT NULL THEN
81 raw_text := raw_text || joiner;
84 raw_text := COALESCE(raw_text,'') || curr_text;
86 -- insert raw node text for faceting
87 IF idx.facet_field THEN
89 IF idx.facet_xpath IS NOT NULL AND idx.facet_xpath <> '' THEN
90 facet_text := oils_xpath_string( idx.facet_xpath, xml_node, joiner, ARRAY[ARRAY[xfrm.prefix, xfrm.namespace_uri]] );
92 facet_text := curr_text;
95 output_row.field_class = idx.field_class;
96 output_row.field = -1 * idx.id;
97 output_row.source = rid;
98 output_row.value = BTRIM(REGEXP_REPLACE(facet_text, E'\\s+', ' ', 'g'));
100 RETURN NEXT output_row;
105 CONTINUE WHEN raw_text IS NULL OR raw_text = '';
107 -- insert combined node text for searching
108 IF idx.search_field THEN
109 output_row.field_class = idx.field_class;
110 output_row.field = idx.id;
111 output_row.source = rid;
112 output_row.value = BTRIM(REGEXP_REPLACE(raw_text, E'\\s+', ' ', 'g'));
114 RETURN NEXT output_row;
120 $func$ LANGUAGE PLPGSQL;