]> git.evergreen-ils.org Git - Evergreen.git/blob - Open-ILS/src/sql/Pg/upgrade/0928.function.vandelay-oils_xpath_tag_to_table.sql
LP1779158 Vandelay workstation setting repairs/additions
[Evergreen.git] / Open-ILS / src / sql / Pg / upgrade / 0928.function.vandelay-oils_xpath_tag_to_table.sql
1 BEGIN;
2
3 SELECT evergreen.upgrade_deps_block_check('0928', :eg_version);
4
5 CREATE OR REPLACE FUNCTION oils_xpath_tag_to_table(marc text, tag text, xpaths text[]) RETURNS SETOF record AS $function$
6
7 -- This function currently populates columns with the FIRST matching value
8 -- of each XPATH.  It would be reasonable to add a 'return_arrays' option
9 -- where each column is an array of all matching values for each path, but
10 -- that remains as a TODO
11
12 DECLARE
13     field RECORD;
14     output RECORD;
15     select_list TEXT[];
16     from_list TEXT[];
17     q TEXT;
18 BEGIN
19     -- setup query select
20     FOR i IN 1 .. ARRAY_UPPER(xpaths,1) LOOP
21         IF xpaths[i] = 'null()' THEN
22             select_list := ARRAY_APPEND(select_list, 'NULL::TEXT AS c_' || i );
23         ELSE
24             select_list := ARRAY_APPEND(select_list, '(oils_xpath(' ||
25                 quote_literal(
26                     CASE
27                         WHEN xpaths[i] ~ $re$/[^/[]*@[^/]+$$re$ -- attribute
28                             OR xpaths[i] ~ $re$text\(\)$$re$
29                         THEN xpaths[i]
30                         ELSE xpaths[i] || '//text()'
31                     END
32                 ) || ', field_marc))[1] AS cl_' || i);
33                 -- hardcoded to first value for each path
34         END IF;
35     END LOOP;
36
37     -- run query over tag set
38     q := 'SELECT ' || ARRAY_TO_STRING(select_list, ',')
39         || ' FROM UNNEST(oils_xpath(' || quote_literal('//*[@tag="' || tag
40         || '"]') || ', ' || quote_literal(marc) || ')) AS field_marc;';
41     --RAISE NOTICE '%', q;
42
43     RETURN QUERY EXECUTE q;
44 END;
45
46 $function$ LANGUAGE PLPGSQL;
47
48 COMMIT;