]> git.evergreen-ils.org Git - Evergreen.git/blob - Open-ILS/src/sql/Pg/upgrade/0887.function.no-ff-defaults.sql
Stamping upgrade script for LP 1322285.
[Evergreen.git] / Open-ILS / src / sql / Pg / upgrade / 0887.function.no-ff-defaults.sql
1 BEGIN;
2
3 SELECT evergreen.upgrade_deps_block_check('0887', :eg_version);
4
5 CREATE OR REPLACE FUNCTION vandelay.marc21_extract_fixed_field_list( marc TEXT, ff TEXT, use_default BOOL DEFAULT FALSE ) RETURNS TEXT[] AS $func$
6 DECLARE
7     rtype       TEXT;
8     ff_pos      RECORD;
9     tag_data    RECORD;
10     val         TEXT;
11     collection  TEXT[] := '{}'::TEXT[];
12 BEGIN
13     rtype := (vandelay.marc21_record_type( marc )).code;
14     FOR ff_pos IN SELECT * FROM config.marc21_ff_pos_map WHERE fixed_field = ff AND rec_type = rtype ORDER BY tag DESC LOOP
15         IF ff_pos.tag = 'ldr' THEN
16             val := oils_xpath_string('//*[local-name()="leader"]', marc);
17             IF val IS NOT NULL THEN
18                 val := SUBSTRING( val, ff_pos.start_pos + 1, ff_pos.length );
19                 collection := collection || val;
20             END IF;
21         ELSE
22             FOR tag_data IN SELECT value FROM UNNEST( oils_xpath( '//*[@tag="' || UPPER(ff_pos.tag) || '"]/text()', marc ) ) x(value) LOOP
23                 val := SUBSTRING( tag_data.value, ff_pos.start_pos + 1, ff_pos.length );
24                 collection := collection || val;
25             END LOOP;
26         END IF;
27         CONTINUE WHEN NOT use_default;
28         CONTINUE WHEN ARRAY_UPPER(collection, 1) > 0;
29         val := REPEAT( ff_pos.default_val, ff_pos.length );
30         collection := collection || val;
31     END LOOP;
32
33     RETURN collection;
34 END;
35 $func$ LANGUAGE PLPGSQL;
36
37 CREATE OR REPLACE FUNCTION vandelay.marc21_extract_fixed_field( marc TEXT, ff TEXT, use_default BOOL DEFAULT FALSE ) RETURNS TEXT AS $func$
38 DECLARE
39     rtype       TEXT;
40     ff_pos      RECORD;
41     tag_data    RECORD;
42     val         TEXT;
43 BEGIN
44     rtype := (vandelay.marc21_record_type( marc )).code;
45     FOR ff_pos IN SELECT * FROM config.marc21_ff_pos_map WHERE fixed_field = ff AND rec_type = rtype ORDER BY tag DESC LOOP
46         IF ff_pos.tag = 'ldr' THEN
47             val := oils_xpath_string('//*[local-name()="leader"]', marc);
48             IF val IS NOT NULL THEN
49                 val := SUBSTRING( val, ff_pos.start_pos + 1, ff_pos.length );
50                 RETURN val;
51             END IF;
52         ELSE
53             FOR tag_data IN SELECT value FROM UNNEST( oils_xpath( '//*[@tag="' || UPPER(ff_pos.tag) || '"]/text()', marc ) ) x(value) LOOP
54                 val := SUBSTRING( tag_data.value, ff_pos.start_pos + 1, ff_pos.length );
55                 RETURN val;
56             END LOOP;
57         END IF;
58         CONTINUE WHEN NOT use_default;
59         val := REPEAT( ff_pos.default_val, ff_pos.length );
60         RETURN val;
61     END LOOP;
62
63     RETURN NULL;
64 END;
65 $func$ LANGUAGE PLPGSQL;
66
67 CREATE OR REPLACE FUNCTION vandelay.marc21_extract_all_fixed_fields( marc TEXT, use_default BOOL DEFAULT FALSE ) RETURNS SETOF biblio.record_ff_map AS $func$
68 DECLARE
69     tag_data    TEXT;
70     rtype       TEXT;
71     ff_pos      RECORD;
72     output      biblio.record_ff_map%ROWTYPE;
73 BEGIN
74     rtype := (vandelay.marc21_record_type( marc )).code;
75
76     FOR ff_pos IN SELECT * FROM config.marc21_ff_pos_map WHERE rec_type = rtype ORDER BY tag DESC LOOP
77         output.ff_name  := ff_pos.fixed_field;
78         output.ff_value := NULL;
79
80         IF ff_pos.tag = 'ldr' THEN
81             output.ff_value := oils_xpath_string('//*[local-name()="leader"]', marc);
82             IF output.ff_value IS NOT NULL THEN
83                 output.ff_value := SUBSTRING( output.ff_value, ff_pos.start_pos + 1, ff_pos.length );
84                 RETURN NEXT output;
85                 output.ff_value := NULL;
86             END IF;
87         ELSE
88             FOR tag_data IN SELECT value FROM UNNEST( oils_xpath( '//*[@tag="' || UPPER(ff_pos.tag) || '"]/text()', marc ) ) x(value) LOOP
89                 output.ff_value := SUBSTRING( tag_data, ff_pos.start_pos + 1, ff_pos.length );
90                 CONTINUE WHEN output.ff_value IS NULL AND NOT use_default;
91                 IF output.ff_value IS NULL THEN output.ff_value := REPEAT( ff_pos.default_val, ff_pos.length ); END IF;
92                 RETURN NEXT output;
93                 output.ff_value := NULL;
94             END LOOP;
95         END IF;
96
97     END LOOP;
98
99     RETURN;
100 END;
101 $func$ LANGUAGE PLPGSQL;
102
103 CREATE OR REPLACE FUNCTION biblio.marc21_extract_fixed_field_list( rid BIGINT, ff TEXT ) RETURNS TEXT[] AS $func$
104     SELECT * FROM vandelay.marc21_extract_fixed_field_list( (SELECT marc FROM biblio.record_entry WHERE id = $1), $2, TRUE );
105 $func$ LANGUAGE SQL;
106
107 CREATE OR REPLACE FUNCTION biblio.marc21_extract_fixed_field( rid BIGINT, ff TEXT ) RETURNS TEXT AS $func$
108     SELECT * FROM vandelay.marc21_extract_fixed_field( (SELECT marc FROM biblio.record_entry WHERE id = $1), $2, TRUE );
109 $func$ LANGUAGE SQL;
110
111 CREATE OR REPLACE FUNCTION biblio.marc21_extract_all_fixed_fields( rid BIGINT ) RETURNS SETOF biblio.record_ff_map AS $func$
112     SELECT $1 AS record, ff_name, ff_value FROM vandelay.marc21_extract_all_fixed_fields( (SELECT marc FROM biblio.record_entry WHERE id = $1), TRUE );
113 $func$ LANGUAGE SQL;
114
115 DROP FUNCTION IF EXISTS vandelay.marc21_extract_fixed_field_list( text, text );
116 DROP FUNCTION IF EXISTS vandelay.marc21_extract_fixed_field( text, text );
117 DROP FUNCTION IF EXISTS vandelay.marc21_extract_all_fixed_fields( text );
118
119 COMMIT;
120