]> git.evergreen-ils.org Git - Evergreen.git/blob - Open-ILS/src/sql/Pg/upgrade/0555.unnest_oils_xpath_table.sql
LP1889113 Staff catalog record holds sticky org select
[Evergreen.git] / Open-ILS / src / sql / Pg / upgrade / 0555.unnest_oils_xpath_table.sql
1 -- Evergreen DB patch 0555.unnest_oils_xpath_table.sql
2 --
3 -- Replace usage of custom explode_array() function with native unnest()
4 --
5 BEGIN;
6
7 -- check whether patch can be applied
8 SELECT evergreen.upgrade_deps_block_check('0555', :eg_version);
9
10 CREATE OR REPLACE FUNCTION oils_xpath_table ( key TEXT, document_field TEXT, relation_name TEXT, xpaths TEXT, criteria TEXT ) RETURNS SETOF RECORD AS $func$
11 DECLARE
12     xpath_list  TEXT[];
13     select_list TEXT[];
14     where_list  TEXT[];
15     q           TEXT;
16     out_record  RECORD;
17     empty_test  RECORD;
18 BEGIN
19     xpath_list := STRING_TO_ARRAY( xpaths, '|' );
20
21     select_list := ARRAY_APPEND( select_list, key || '::INT AS key' );
22
23     FOR i IN 1 .. ARRAY_UPPER(xpath_list,1) LOOP
24         IF xpath_list[i] = 'null()' THEN
25             select_list := ARRAY_APPEND( select_list, 'NULL::TEXT AS c_' || i );
26         ELSE
27             select_list := ARRAY_APPEND(
28                 select_list,
29                 $sel$
30                 unnest(
31                     COALESCE(
32                         NULLIF(
33                             oils_xpath(
34                                 $sel$ ||
35                                     quote_literal(
36                                         CASE
37                                             WHEN xpath_list[i] ~ $re$/[^/[]*@[^/]+$$re$ OR xpath_list[i] ~ $re$text\(\)$$re$ THEN xpath_list[i]
38                                             ELSE xpath_list[i] || '//text()'
39                                         END
40                                     ) ||
41                                 $sel$,
42                                 $sel$ || document_field || $sel$
43                             ),
44                            '{}'::TEXT[]
45                         ),
46                         '{NULL}'::TEXT[]
47                     )
48                 ) AS c_$sel$ || i
49             );
50             where_list := ARRAY_APPEND(
51                 where_list,
52                 'c_' || i || ' IS NOT NULL'
53             );
54         END IF;
55     END LOOP;
56
57     q := $q$
58 SELECT * FROM (
59     SELECT $q$ || ARRAY_TO_STRING( select_list, ', ' ) || $q$ FROM $q$ || relation_name || $q$ WHERE ($q$ || criteria || $q$)
60 )x WHERE $q$ || ARRAY_TO_STRING( where_list, ' OR ' );
61     -- RAISE NOTICE 'query: %', q;
62
63     FOR out_record IN EXECUTE q LOOP
64         RETURN NEXT out_record;
65     END LOOP;
66
67     RETURN;
68 END;
69 $func$ LANGUAGE PLPGSQL IMMUTABLE;
70
71 COMMIT;