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