]> git.evergreen-ils.org Git - Evergreen.git/blob - Open-ILS/src/sql/Pg/upgrade/1311.function.biblio.extract_located_uris.sql
LP2061136 - Stamping 1405 DB upgrade script
[Evergreen.git] / Open-ILS / src / sql / Pg / upgrade / 1311.function.biblio.extract_located_uris.sql
1 BEGIN;
2
3 SELECT evergreen.upgrade_deps_block_check('1311', :eg_version);
4
5 CREATE OR REPLACE FUNCTION biblio.extract_located_uris( bib_id BIGINT, marcxml TEXT, editor_id INT ) RETURNS VOID AS $func$
6 DECLARE
7     uris            TEXT[];
8     uri_xml         TEXT;
9     uri_label       TEXT;
10     uri_href        TEXT;
11     uri_use         TEXT;
12     uri_owner_list  TEXT[];
13     uri_owner       TEXT;
14     uri_owner_id    INT;
15     uri_id          INT;
16     uri_cn_id       INT;
17     uri_map_id      INT;
18     current_uri     INT;
19     current_map     INT;
20     uri_map_count   INT;
21     current_uri_map_list    INT[];
22     current_map_owner_list  INT[];
23
24 BEGIN
25
26     uris := oils_xpath('//*[@tag="856" and (@ind1="4" or @ind1="1") and (@ind2="0" or @ind2="1")]',marcxml);
27     IF ARRAY_UPPER(uris,1) > 0 THEN
28         FOR i IN 1 .. ARRAY_UPPER(uris, 1) LOOP
29             -- First we pull info out of the 856
30             uri_xml     := uris[i];
31
32             uri_href    := (oils_xpath('//*[@code="u"]/text()',uri_xml))[1];
33             uri_label   := (oils_xpath('//*[@code="y"]/text()|//*[@code="3"]/text()',uri_xml))[1];
34             uri_use     := (oils_xpath('//*[@code="z"]/text()|//*[@code="2"]/text()|//*[@code="n"]/text()',uri_xml))[1];
35
36             IF uri_label IS NULL THEN
37                 uri_label := uri_href;
38             END IF;
39             CONTINUE WHEN uri_href IS NULL;
40
41             -- Get the distinct list of libraries wanting to use 
42             SELECT  ARRAY_AGG(
43                         DISTINCT REGEXP_REPLACE(
44                             x,
45                             $re$^.*?\((\w+)\).*$$re$,
46                             E'\\1'
47                         )
48                     ) INTO uri_owner_list
49               FROM  UNNEST(
50                         oils_xpath(
51                             '//*[@code="9"]/text()|//*[@code="w"]/text()|//*[@code="n"]/text()',
52                             uri_xml
53                         )
54                     )x;
55
56             IF ARRAY_UPPER(uri_owner_list,1) > 0 THEN
57
58                 -- look for a matching uri
59                 IF uri_use IS NULL THEN
60                     SELECT id INTO uri_id
61                         FROM asset.uri
62                         WHERE label = uri_label AND href = uri_href AND use_restriction IS NULL AND active
63                         ORDER BY id LIMIT 1;
64                     IF NOT FOUND THEN -- create one
65                         INSERT INTO asset.uri (label, href, use_restriction) VALUES (uri_label, uri_href, uri_use);
66                         SELECT id INTO uri_id
67                             FROM asset.uri
68                             WHERE label = uri_label AND href = uri_href AND use_restriction IS NULL AND active;
69                     END IF;
70                 ELSE
71                     SELECT id INTO uri_id
72                         FROM asset.uri
73                         WHERE label = uri_label AND href = uri_href AND use_restriction = uri_use AND active
74                         ORDER BY id LIMIT 1;
75                     IF NOT FOUND THEN -- create one
76                         INSERT INTO asset.uri (label, href, use_restriction) VALUES (uri_label, uri_href, uri_use);
77                         SELECT id INTO uri_id
78                             FROM asset.uri
79                             WHERE label = uri_label AND href = uri_href AND use_restriction = uri_use AND active;
80                     END IF;
81                 END IF;
82
83                 FOR j IN 1 .. ARRAY_UPPER(uri_owner_list, 1) LOOP
84                     uri_owner := uri_owner_list[j];
85
86                     SELECT id INTO uri_owner_id FROM actor.org_unit WHERE shortname = BTRIM(REPLACE(uri_owner,chr(160),''));
87                     CONTINUE WHEN NOT FOUND;
88
89                     -- we need a call number to link through
90                     SELECT id INTO uri_cn_id FROM asset.call_number WHERE owning_lib = uri_owner_id AND record = bib_id AND label = '##URI##' AND NOT deleted;
91                     IF NOT FOUND THEN
92                         INSERT INTO asset.call_number (owning_lib, record, create_date, edit_date, creator, editor, label)
93                             VALUES (uri_owner_id, bib_id, 'now', 'now', editor_id, editor_id, '##URI##');
94                         SELECT id INTO uri_cn_id FROM asset.call_number WHERE owning_lib = uri_owner_id AND record = bib_id AND label = '##URI##' AND NOT deleted;
95                     END IF;
96
97                     -- now, link them if they're not already
98                     SELECT id INTO uri_map_id FROM asset.uri_call_number_map WHERE call_number = uri_cn_id AND uri = uri_id;
99                     IF NOT FOUND THEN
100                         INSERT INTO asset.uri_call_number_map (call_number, uri) VALUES (uri_cn_id, uri_id);
101                         SELECT id INTO uri_map_id FROM asset.uri_call_number_map WHERE call_number = uri_cn_id AND uri = uri_id;
102                     END IF;
103
104                     current_uri_map_list := current_uri_map_list || uri_map_id;
105                     current_map_owner_list := current_map_owner_list || uri_cn_id;
106
107                 END LOOP;
108
109             END IF;
110
111         END LOOP;
112     END IF;
113
114     -- Clear any orphaned URIs, URI mappings and call
115     -- numbers for this bib that weren't mapped above.
116     FOR current_map IN
117         SELECT  m.id
118           FROM  asset.uri_call_number_map m
119                 LEFT JOIN asset.call_number cn ON (cn.id = m.call_number)
120           WHERE cn.record = bib_id
121                 AND cn.label = '##URI##'
122                 AND (NOT (m.id = ANY (current_uri_map_list))
123                      OR current_uri_map_list is NULL)
124     LOOP
125         SELECT uri INTO current_uri FROM asset.uri_call_number_map WHERE id = current_map;
126         DELETE FROM asset.uri_call_number_map WHERE id = current_map;
127
128         SELECT COUNT(*) INTO uri_map_count FROM asset.uri_call_number_map WHERE uri = current_uri;
129         IF uri_map_count = 0 THEN
130             DELETE FROM asset.uri WHERE id = current_uri;
131         END IF;
132     END LOOP;
133
134     UPDATE asset.call_number
135     SET deleted = TRUE, edit_date = now(), editor = editor_id
136     WHERE id IN (
137         SELECT  id
138           FROM  asset.call_number
139           WHERE record = bib_id
140                 AND label = '##URI##'
141                 AND NOT deleted
142                 AND (NOT (id = ANY (current_map_owner_list))
143                      OR current_map_owner_list is NULL)
144     );
145
146     RETURN;
147 END;
148 $func$ LANGUAGE PLPGSQL;
149
150 -- Remove existing orphaned URIs from the database.
151 DELETE FROM asset.uri
152 WHERE id IN
153 (
154 SELECT uri.id
155 FROM asset.uri
156 LEFT JOIN asset.uri_call_number_map
157 ON uri_call_number_map.uri = uri.id
158 LEFT JOIN serial.item
159 ON item.uri = uri.id
160 WHERE uri_call_number_map IS NULL
161 AND item IS NULL
162 );
163
164 COMMIT;
165