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