]> git.evergreen-ils.org Git - working/Evergreen.git/blob - Open-ILS/src/sql/Pg/upgrade/0551.unnest_metabib_remap_metarecord_for_bib.sql
LP1615805 No inputs after submit in patron search (AngularJS)
[working/Evergreen.git] / Open-ILS / src / sql / Pg / upgrade / 0551.unnest_metabib_remap_metarecord_for_bib.sql
1 -- Evergreen DB patch 0551.unnest_metabib_remap_metarecord_for_bib.sql
2 --
3 -- Replace usage of custom explode_array() function with native unnest()
4 --
5 BEGIN;
6
7 -- check whether patch can be applied
8 SELECT evergreen.upgrade_deps_block_check('0551', :eg_version);
9
10 CREATE OR REPLACE FUNCTION metabib.remap_metarecord_for_bib( bib_id BIGINT, fp TEXT ) RETURNS BIGINT AS $func$
11 DECLARE
12     source_count    INT;
13     old_mr          BIGINT;
14     tmp_mr          metabib.metarecord%ROWTYPE;
15     deleted_mrs     BIGINT[];
16 BEGIN
17
18     DELETE FROM metabib.metarecord_source_map WHERE source = bib_id; -- Rid ourselves of the search-estimate-killing linkage
19
20     FOR tmp_mr IN SELECT  m.* FROM  metabib.metarecord m JOIN metabib.metarecord_source_map s ON (s.metarecord = m.id) WHERE s.source = bib_id LOOP
21
22         IF old_mr IS NULL AND fp = tmp_mr.fingerprint THEN -- Find the first fingerprint-matching
23             old_mr := tmp_mr.id;
24         ELSE
25             SELECT COUNT(*) INTO source_count FROM metabib.metarecord_source_map WHERE metarecord = tmp_mr.id;
26             IF source_count = 0 THEN -- No other records
27                 deleted_mrs := ARRAY_APPEND(deleted_mrs, tmp_mr.id);
28                 DELETE FROM metabib.metarecord WHERE id = tmp_mr.id;
29             END IF;
30         END IF;
31
32     END LOOP;
33
34     IF old_mr IS NULL THEN -- we found no suitable, preexisting MR based on old source maps
35         SELECT id INTO old_mr FROM metabib.metarecord WHERE fingerprint = fp; -- is there one for our current fingerprint?
36         IF old_mr IS NULL THEN -- nope, create one and grab its id
37             INSERT INTO metabib.metarecord ( fingerprint, master_record ) VALUES ( fp, bib_id );
38             SELECT id INTO old_mr FROM metabib.metarecord WHERE fingerprint = fp;
39         ELSE -- indeed there is. update it with a null cache and recalcualated master record
40             UPDATE  metabib.metarecord
41               SET   mods = NULL,
42                     master_record = ( SELECT id FROM biblio.record_entry WHERE fingerprint = fp ORDER BY quality DESC LIMIT 1)
43               WHERE id = old_mr;
44         END IF;
45     ELSE -- there was one we already attached to, update its mods cache and master_record
46         UPDATE  metabib.metarecord
47           SET   mods = NULL,
48                 master_record = ( SELECT id FROM biblio.record_entry WHERE fingerprint = fp ORDER BY quality DESC LIMIT 1)
49           WHERE id = old_mr;
50     END IF;
51
52     INSERT INTO metabib.metarecord_source_map (metarecord, source) VALUES (old_mr, bib_id); -- new source mapping
53
54     IF ARRAY_UPPER(deleted_mrs,1) > 0 THEN
55         UPDATE action.hold_request SET target = old_mr WHERE target IN ( SELECT unnest(deleted_mrs) ) AND hold_type = 'M'; -- if we had to delete any MRs above, make sure their holds are moved
56     END IF;
57
58     RETURN old_mr;
59
60 END;
61 $func$ LANGUAGE PLPGSQL;
62
63 COMMIT;