]> git.evergreen-ils.org Git - Evergreen.git/blob - Open-ILS/src/sql/Pg/version-upgrade/2.6.1-2.6.2-upgrade-db.sql
LP#1772028 Add some FK violation functions just in case they are missing
[Evergreen.git] / Open-ILS / src / sql / Pg / version-upgrade / 2.6.1-2.6.2-upgrade-db.sql
1 --Upgrade Script for 2.6.1 to 2.6.2
2 \set eg_version '''2.6.2'''
3 BEGIN;
4 INSERT INTO config.upgrade_log (version, applied_to) VALUES ('2.6.2', :eg_version);
5
6 SELECT evergreen.upgrade_deps_block_check('0882', :eg_version);
7
8 CREATE OR REPLACE FUNCTION search.query_parser_fts (
9
10     param_search_ou INT,
11     param_depth     INT,
12     param_query     TEXT,
13     param_statuses  INT[],
14     param_locations INT[],
15     param_offset    INT,
16     param_check     INT,
17     param_limit     INT,
18     metarecord      BOOL,
19     staff           BOOL,
20     deleted_search  BOOL,
21     param_pref_ou   INT DEFAULT NULL
22 ) RETURNS SETOF search.search_result AS $func$
23 DECLARE
24
25     current_res         search.search_result%ROWTYPE;
26     search_org_list     INT[];
27     luri_org_list       INT[];
28     tmp_int_list        INT[];
29
30     check_limit         INT;
31     core_limit          INT;
32     core_offset         INT;
33     tmp_int             INT;
34
35     core_result         RECORD;
36     core_cursor         REFCURSOR;
37     core_rel_query      TEXT;
38
39     total_count         INT := 0;
40     check_count         INT := 0;
41     deleted_count       INT := 0;
42     visible_count       INT := 0;
43     excluded_count      INT := 0;
44
45     luri_as_copy        BOOL;
46 BEGIN
47
48     check_limit := COALESCE( param_check, 1000 );
49     core_limit  := COALESCE( param_limit, 25000 );
50     core_offset := COALESCE( param_offset, 0 );
51
52     SELECT COALESCE( enabled, FALSE ) INTO luri_as_copy FROM config.global_flag WHERE name = 'opac.located_uri.act_as_copy';
53
54     -- core_skip_chk := COALESCE( param_skip_chk, 1 );
55
56     IF param_search_ou > 0 THEN
57         IF param_depth IS NOT NULL THEN
58             SELECT ARRAY_AGG(distinct id) INTO search_org_list FROM actor.org_unit_descendants( param_search_ou, param_depth );
59         ELSE
60             SELECT ARRAY_AGG(distinct id) INTO search_org_list FROM actor.org_unit_descendants( param_search_ou );
61         END IF;
62
63         IF luri_as_copy THEN
64             SELECT ARRAY_AGG(distinct id) INTO luri_org_list FROM actor.org_unit_full_path( param_search_ou );
65         ELSE
66             SELECT ARRAY_AGG(distinct id) INTO luri_org_list FROM actor.org_unit_ancestors( param_search_ou );
67         END IF;
68
69     ELSIF param_search_ou < 0 THEN
70         SELECT ARRAY_AGG(distinct org_unit) INTO search_org_list FROM actor.org_lasso_map WHERE lasso = -param_search_ou;
71
72         FOR tmp_int IN SELECT * FROM UNNEST(search_org_list) LOOP
73
74             IF luri_as_copy THEN
75                 SELECT ARRAY_AGG(distinct id) INTO tmp_int_list FROM actor.org_unit_full_path( tmp_int );
76             ELSE
77                 SELECT ARRAY_AGG(distinct id) INTO tmp_int_list FROM actor.org_unit_ancestors( tmp_int );
78             END IF;
79
80             luri_org_list := luri_org_list || tmp_int_list;
81         END LOOP;
82
83         SELECT ARRAY_AGG(DISTINCT x.id) INTO luri_org_list FROM UNNEST(luri_org_list) x(id);
84
85     ELSIF param_search_ou = 0 THEN
86         -- reserved for user lassos (ou_buckets/type='lasso') with ID passed in depth ... hack? sure.
87     END IF;
88
89     IF param_pref_ou IS NOT NULL THEN
90             IF luri_as_copy THEN
91                 SELECT ARRAY_AGG(distinct id) INTO tmp_int_list FROM actor.org_unit_full_path( param_pref_ou );
92             ELSE
93                 SELECT ARRAY_AGG(distinct id) INTO tmp_int_list FROM actor.org_unit_ancestors( param_pref_ou );
94             END IF;
95
96         luri_org_list := luri_org_list || tmp_int_list;
97     END IF;
98
99     OPEN core_cursor FOR EXECUTE param_query;
100
101     LOOP
102
103         FETCH core_cursor INTO core_result;
104         EXIT WHEN NOT FOUND;
105         EXIT WHEN total_count >= core_limit;
106
107         total_count := total_count + 1;
108
109         CONTINUE WHEN total_count NOT BETWEEN  core_offset + 1 AND check_limit + core_offset;
110
111         check_count := check_count + 1;
112
113         IF NOT deleted_search THEN
114
115             PERFORM 1 FROM biblio.record_entry b WHERE NOT b.deleted AND b.id IN ( SELECT * FROM unnest( core_result.records ) );
116             IF NOT FOUND THEN
117                 -- RAISE NOTICE ' % were all deleted ... ', core_result.records;
118                 deleted_count := deleted_count + 1;
119                 CONTINUE;
120             END IF;
121
122             PERFORM 1
123               FROM  biblio.record_entry b
124                     JOIN config.bib_source s ON (b.source = s.id)
125               WHERE s.transcendant
126                     AND b.id IN ( SELECT * FROM unnest( core_result.records ) );
127
128             IF FOUND THEN
129                 -- RAISE NOTICE ' % were all transcendant ... ', core_result.records;
130                 visible_count := visible_count + 1;
131
132                 current_res.id = core_result.id;
133                 current_res.rel = core_result.rel;
134
135                 tmp_int := 1;
136                 IF metarecord THEN
137                     SELECT COUNT(DISTINCT s.source) INTO tmp_int FROM metabib.metarecord_source_map s WHERE s.metarecord = core_result.id;
138                 END IF;
139
140                 IF tmp_int = 1 THEN
141                     current_res.record = core_result.records[1];
142                 ELSE
143                     current_res.record = NULL;
144                 END IF;
145
146                 RETURN NEXT current_res;
147
148                 CONTINUE;
149             END IF;
150
151             PERFORM 1
152               FROM  asset.call_number cn
153                     JOIN asset.uri_call_number_map map ON (map.call_number = cn.id)
154                     JOIN asset.uri uri ON (map.uri = uri.id)
155               WHERE NOT cn.deleted
156                     AND cn.label = '##URI##'
157                     AND uri.active
158                     AND ( param_locations IS NULL OR array_upper(param_locations, 1) IS NULL )
159                     AND cn.record IN ( SELECT * FROM unnest( core_result.records ) )
160                     AND cn.owning_lib IN ( SELECT * FROM unnest( luri_org_list ) )
161               LIMIT 1;
162
163             IF FOUND THEN
164                 -- RAISE NOTICE ' % have at least one URI ... ', core_result.records;
165                 visible_count := visible_count + 1;
166
167                 current_res.id = core_result.id;
168                 current_res.rel = core_result.rel;
169
170                 tmp_int := 1;
171                 IF metarecord THEN
172                     SELECT COUNT(DISTINCT s.source) INTO tmp_int FROM metabib.metarecord_source_map s WHERE s.metarecord = core_result.id;
173                 END IF;
174
175                 IF tmp_int = 1 THEN
176                     current_res.record = core_result.records[1];
177                 ELSE
178                     current_res.record = NULL;
179                 END IF;
180
181                 RETURN NEXT current_res;
182
183                 CONTINUE;
184             END IF;
185
186             IF param_statuses IS NOT NULL AND array_upper(param_statuses, 1) > 0 THEN
187
188                 PERFORM 1
189                   FROM  asset.call_number cn
190                         JOIN asset.copy cp ON (cp.call_number = cn.id)
191                   WHERE NOT cn.deleted
192                         AND NOT cp.deleted
193                         AND cp.status IN ( SELECT * FROM unnest( param_statuses ) )
194                         AND cn.record IN ( SELECT * FROM unnest( core_result.records ) )
195                         AND cp.circ_lib IN ( SELECT * FROM unnest( search_org_list ) )
196                   LIMIT 1;
197
198                 IF NOT FOUND THEN
199                     PERFORM 1
200                       FROM  biblio.peer_bib_copy_map pr
201                             JOIN asset.copy cp ON (cp.id = pr.target_copy)
202                       WHERE NOT cp.deleted
203                             AND cp.status IN ( SELECT * FROM unnest( param_statuses ) )
204                             AND pr.peer_record IN ( SELECT * FROM unnest( core_result.records ) )
205                             AND cp.circ_lib IN ( SELECT * FROM unnest( search_org_list ) )
206                       LIMIT 1;
207
208                     IF NOT FOUND THEN
209                     -- RAISE NOTICE ' % and multi-home linked records were all status-excluded ... ', core_result.records;
210                         excluded_count := excluded_count + 1;
211                         CONTINUE;
212                     END IF;
213                 END IF;
214
215             END IF;
216
217             IF param_locations IS NOT NULL AND array_upper(param_locations, 1) > 0 THEN
218
219                 PERFORM 1
220                   FROM  asset.call_number cn
221                         JOIN asset.copy cp ON (cp.call_number = cn.id)
222                   WHERE NOT cn.deleted
223                         AND NOT cp.deleted
224                         AND cp.location IN ( SELECT * FROM unnest( param_locations ) )
225                         AND cn.record IN ( SELECT * FROM unnest( core_result.records ) )
226                         AND cp.circ_lib IN ( SELECT * FROM unnest( search_org_list ) )
227                   LIMIT 1;
228
229                 IF NOT FOUND THEN
230                     PERFORM 1
231                       FROM  biblio.peer_bib_copy_map pr
232                             JOIN asset.copy cp ON (cp.id = pr.target_copy)
233                       WHERE NOT cp.deleted
234                             AND cp.location IN ( SELECT * FROM unnest( param_locations ) )
235                             AND pr.peer_record IN ( SELECT * FROM unnest( core_result.records ) )
236                             AND cp.circ_lib IN ( SELECT * FROM unnest( search_org_list ) )
237                       LIMIT 1;
238
239                     IF NOT FOUND THEN
240                         -- RAISE NOTICE ' % and multi-home linked records were all copy_location-excluded ... ', core_result.records;
241                         excluded_count := excluded_count + 1;
242                         CONTINUE;
243                     END IF;
244                 END IF;
245
246             END IF;
247
248             IF staff IS NULL OR NOT staff THEN
249
250                 PERFORM 1
251                   FROM  asset.opac_visible_copies
252                   WHERE circ_lib IN ( SELECT * FROM unnest( search_org_list ) )
253                         AND record IN ( SELECT * FROM unnest( core_result.records ) )
254                   LIMIT 1;
255
256                 IF NOT FOUND THEN
257                     PERFORM 1
258                       FROM  biblio.peer_bib_copy_map pr
259                             JOIN asset.opac_visible_copies cp ON (cp.copy_id = pr.target_copy)
260                       WHERE cp.circ_lib IN ( SELECT * FROM unnest( search_org_list ) )
261                             AND pr.peer_record IN ( SELECT * FROM unnest( core_result.records ) )
262                       LIMIT 1;
263
264                     IF NOT FOUND THEN
265
266                         -- RAISE NOTICE ' % and multi-home linked records were all visibility-excluded ... ', core_result.records;
267                         excluded_count := excluded_count + 1;
268                         CONTINUE;
269                     END IF;
270                 END IF;
271
272             ELSE
273
274                 PERFORM 1
275                   FROM  asset.call_number cn
276                         JOIN asset.copy cp ON (cp.call_number = cn.id)
277                   WHERE NOT cn.deleted
278                         AND NOT cp.deleted
279                         AND cp.circ_lib IN ( SELECT * FROM unnest( search_org_list ) )
280                         AND cn.record IN ( SELECT * FROM unnest( core_result.records ) )
281                   LIMIT 1;
282
283                 IF NOT FOUND THEN
284
285                     PERFORM 1
286                       FROM  biblio.peer_bib_copy_map pr
287                             JOIN asset.copy cp ON (cp.id = pr.target_copy)
288                       WHERE NOT cp.deleted
289                             AND cp.circ_lib IN ( SELECT * FROM unnest( search_org_list ) )
290                             AND pr.peer_record IN ( SELECT * FROM unnest( core_result.records ) )
291                       LIMIT 1;
292
293                     IF NOT FOUND THEN
294
295                         PERFORM 1
296                           FROM  asset.call_number cn
297                                 JOIN asset.copy cp ON (cp.call_number = cn.id)
298                           WHERE cn.record IN ( SELECT * FROM unnest( core_result.records ) )
299                                 AND NOT cp.deleted
300                           LIMIT 1;
301
302                         IF NOT FOUND THEN
303                             -- Recheck Located URI visibility in the case of no "foreign" copies
304                             PERFORM 1
305                               FROM  asset.call_number cn
306                                     JOIN asset.uri_call_number_map map ON (map.call_number = cn.id)
307                                     JOIN asset.uri uri ON (map.uri = uri.id)
308                               WHERE NOT cn.deleted
309                                     AND cn.label = '##URI##'
310                                     AND uri.active
311                                     AND cn.record IN ( SELECT * FROM unnest( core_result.records ) )
312                                     AND cn.owning_lib NOT IN ( SELECT * FROM unnest( luri_org_list ) )
313                               LIMIT 1;
314
315                             IF FOUND THEN
316                                 -- RAISE NOTICE ' % were excluded for foreign located URIs... ', core_result.records;
317                                 excluded_count := excluded_count + 1;
318                                 CONTINUE;
319                             END IF;
320                         ELSE
321                             -- RAISE NOTICE ' % and multi-home linked records were all visibility-excluded ... ', core_result.records;
322                             excluded_count := excluded_count + 1;
323                             CONTINUE;
324                         END IF;
325                     END IF;
326
327                 END IF;
328
329             END IF;
330
331         END IF;
332
333         visible_count := visible_count + 1;
334
335         current_res.id = core_result.id;
336         current_res.rel = core_result.rel;
337
338         tmp_int := 1;
339         IF metarecord THEN
340             SELECT COUNT(DISTINCT s.source) INTO tmp_int FROM metabib.metarecord_source_map s WHERE s.metarecord = core_result.id;
341         END IF;
342
343         IF tmp_int = 1 THEN
344             current_res.record = core_result.records[1];
345         ELSE
346             current_res.record = NULL;
347         END IF;
348
349         RETURN NEXT current_res;
350
351         IF visible_count % 1000 = 0 THEN
352             -- RAISE NOTICE ' % visible so far ... ', visible_count;
353         END IF;
354
355     END LOOP;
356
357     current_res.id = NULL;
358     current_res.rel = NULL;
359     current_res.record = NULL;
360     current_res.total = total_count;
361     current_res.checked = check_count;
362     current_res.deleted = deleted_count;
363     current_res.visible = visible_count;
364     current_res.excluded = excluded_count;
365
366     CLOSE core_cursor;
367
368     RETURN NEXT current_res;
369
370 END;
371 $func$ LANGUAGE PLPGSQL;
372
373
374 SELECT evergreen.upgrade_deps_block_check('0883', :eg_version);
375
376 -- This is a placeholder for 0883 which will be a backported version of the
377 -- staff URI visibility function for rel_2_5. This script does nothing for
378 -- rel_2_6 and later.
379
380 COMMIT;