]> git.evergreen-ils.org Git - working/Evergreen.git/blob - Open-ILS/src/sql/Pg/upgrade/0217.schema.facet_xpath.sql
Add default Vandelay match set to schema
[working/Evergreen.git] / Open-ILS / src / sql / Pg / upgrade / 0217.schema.facet_xpath.sql
1
2 BEGIN;
3
4 INSERT INTO config.upgrade_log (version) VALUES ('0217'); --miker
5
6 ALTER TABLE config.metabib_field ADD COLUMN facet_xpath TEXT;
7
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;
13
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;
18
19 CREATE OR REPLACE FUNCTION biblio.extract_metabib_field_entry ( rid BIGINT, default_joiner TEXT ) RETURNS SETOF metabib.field_entry_template AS $func$
20 DECLARE
21     bib     biblio.record_entry%ROWTYPE;
22     idx     config.metabib_field%ROWTYPE;
23     xfrm        config.xml_transform%ROWTYPE;
24     prev_xfrm   TEXT;
25     transformed_xml TEXT;
26     xml_node    TEXT;
27     xml_node_list   TEXT[];
28     facet_text  TEXT;
29     raw_text    TEXT;
30     curr_text   TEXT;
31     joiner      TEXT := default_joiner; -- XXX will index defs supply a joiner?
32     output_row  metabib.field_entry_template%ROWTYPE;
33 BEGIN
34
35     -- Get the record
36     SELECT INTO bib * FROM biblio.record_entry WHERE id = rid;
37
38     -- Loop over the indexing entries
39     FOR idx IN SELECT * FROM config.metabib_field ORDER BY format LOOP
40
41         SELECT INTO xfrm * from config.xml_transform WHERE name = idx.format;
42
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);
48             ELSE
49                 transformed_xml := bib.marc;
50             END IF;
51
52             prev_xfrm := xfrm.name;
53         END IF;
54
55         xml_node_list := oils_xpath( idx.xpath, transformed_xml, ARRAY[ARRAY[xfrm.prefix, xfrm.namespace_uri]] );
56
57         raw_text := NULL;
58         FOR xml_node IN SELECT x FROM explode_array(xml_node_list) AS x LOOP
59             CONTINUE WHEN xml_node !~ E'^\\s*<';
60
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
65                             xml_node,
66                             $re$(>[^<]+)(<)([^>]+<)$re$,
67                             E'\\1&lt;\\3',
68                             'g'
69                         ),
70                         '&(?!amp;)',
71                         '&amp;',
72                         'g'
73                     )
74                 ),
75                 ' '
76             );
77
78             CONTINUE WHEN curr_text IS NULL OR curr_text = '';
79
80             IF raw_text IS NOT NULL THEN
81                 raw_text := raw_text || joiner;
82             END IF;
83
84             raw_text := COALESCE(raw_text,'') || curr_text;
85
86             -- insert raw node text for faceting
87             IF idx.facet_field THEN
88
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]] );
91                 ELSE
92                     facet_text := curr_text;
93                 END IF;
94
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'));
99
100                 RETURN NEXT output_row;
101             END IF;
102
103         END LOOP;
104
105         CONTINUE WHEN raw_text IS NULL OR raw_text = '';
106
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'));
113
114             RETURN NEXT output_row;
115         END IF;
116
117     END LOOP;
118
119 END;
120 $func$ LANGUAGE PLPGSQL;
121
122 COMMIT;
123