]> git.evergreen-ils.org Git - working/Evergreen.git/blob - Open-ILS/src/sql/Pg/upgrade/0423.schema.support-null-function-in-xpath_table.sql
Stamping upgrade scripts for LP#818740
[working/Evergreen.git] / Open-ILS / src / sql / Pg / upgrade / 0423.schema.support-null-function-in-xpath_table.sql
1 BEGIN;
2
3 INSERT INTO config.upgrade_log (version) VALUES ('0423'); --miker
4
5 CREATE OR REPLACE FUNCTION oils_xpath_table ( key TEXT, document_field TEXT, relation_name TEXT, xpaths TEXT, criteria TEXT ) RETURNS SETOF RECORD AS $func$
6 DECLARE
7     xpath_list  TEXT[];
8     select_list TEXT[];
9     where_list  TEXT[];
10     q           TEXT;
11     out_record  RECORD;
12     empty_test  RECORD;
13 BEGIN
14     xpath_list := STRING_TO_ARRAY( xpaths, '|' );
15  
16     select_list := ARRAY_APPEND( select_list, key || '::INT AS key' );
17  
18     FOR i IN 1 .. ARRAY_UPPER(xpath_list,1) LOOP
19         IF xpath_list[i] = 'null()' THEN
20             select_list := ARRAY_APPEND( select_list, 'NULL::TEXT AS c_' || i );
21         ELSE
22             select_list := ARRAY_APPEND(
23                 select_list,
24                 $sel$
25                 EXPLODE_ARRAY(
26                     COALESCE(
27                         NULLIF(
28                             oils_xpath(
29                                 $sel$ ||
30                                     quote_literal(
31                                         CASE
32                                             WHEN xpath_list[i] ~ $re$/[^/[]*@[^/]+$$re$ OR xpath_list[i] ~ $re$text\(\)$$re$ THEN xpath_list[i]
33                                             ELSE xpath_list[i] || '//text()'
34                                         END
35                                     ) ||
36                                 $sel$,
37                                 $sel$ || document_field || $sel$
38                             ),
39                            '{}'::TEXT[]
40                         ),
41                         '{NULL}'::TEXT[]
42                     )
43                 ) AS c_$sel$ || i
44             );
45             where_list := ARRAY_APPEND(
46                 where_list,
47                 'c_' || i || ' IS NOT NULL'
48             );
49         END IF;
50     END LOOP;
51  
52     q := $q$
53 SELECT * FROM (
54     SELECT $q$ || ARRAY_TO_STRING( select_list, ', ' ) || $q$ FROM $q$ || relation_name || $q$ WHERE ($q$ || criteria || $q$)
55 )x WHERE $q$ || ARRAY_TO_STRING( where_list, ' AND ' );
56     -- RAISE NOTICE 'query: %', q;
57  
58     FOR out_record IN EXECUTE q LOOP
59         RETURN NEXT out_record;
60     END LOOP;
61  
62     RETURN;
63 END;
64 $func$ LANGUAGE PLPGSQL IMMUTABLE;
65
66 COMMIT;
67