]> git.evergreen-ils.org Git - Evergreen.git/blob - Open-ILS/src/sql/Pg/upgrade/1003.schema.fix_metarecord_remapping.sql
LP#1772955: Only include xacts with balance in summary
[Evergreen.git] / Open-ILS / src / sql / Pg / upgrade / 1003.schema.fix_metarecord_remapping.sql
1 BEGIN;
2
3 SELECT evergreen.upgrade_deps_block_check('1003', :eg_version); -- gmcharlt/rhamby/csharp
4
5 CREATE OR REPLACE FUNCTION metabib.remap_metarecord_for_bib( bib_id BIGINT, fp TEXT, bib_is_deleted BOOL DEFAULT FALSE, retain_deleted BOOL DEFAULT FALSE ) RETURNS BIGINT AS $func$
6 DECLARE
7     new_mapping     BOOL := TRUE;
8     source_count    INT;
9     old_mr          BIGINT;
10     tmp_mr          metabib.metarecord%ROWTYPE;
11     deleted_mrs     BIGINT[];
12 BEGIN
13
14     -- We need to make sure we're not a deleted master record of an MR
15     IF bib_is_deleted THEN
16         FOR old_mr IN SELECT id FROM metabib.metarecord WHERE master_record = bib_id LOOP
17
18             IF NOT retain_deleted THEN -- Go away for any MR that we're master of, unless retained
19                 DELETE FROM metabib.metarecord_source_map WHERE source = bib_id;
20             END IF;
21
22             -- Now, are there any more sources on this MR?
23             SELECT COUNT(*) INTO source_count FROM metabib.metarecord_source_map WHERE metarecord = old_mr;
24
25             IF source_count = 0 AND NOT retain_deleted THEN -- No other records
26                 deleted_mrs := ARRAY_APPEND(deleted_mrs, old_mr); -- Just in case...
27                 DELETE FROM metabib.metarecord WHERE id = old_mr;
28
29             ELSE -- indeed there are. Update it with a null cache and recalcualated master record
30                 UPDATE  metabib.metarecord
31                   SET   mods = NULL,
32                         master_record = ( SELECT id FROM biblio.record_entry WHERE fingerprint = fp AND NOT deleted ORDER BY quality DESC LIMIT 1)
33                   WHERE id = old_mr;
34             END IF;
35         END LOOP;
36
37     ELSE -- insert or update
38
39         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
40
41             -- Find the first fingerprint-matching
42             IF old_mr IS NULL AND fp = tmp_mr.fingerprint THEN
43                 old_mr := tmp_mr.id;
44                 new_mapping := FALSE;
45
46             ELSE -- Our fingerprint changed ... maybe remove the old MR
47                 DELETE FROM metabib.metarecord_source_map WHERE metarecord = tmp_mr.id AND source = bib_id; -- remove the old source mapping
48                 SELECT COUNT(*) INTO source_count FROM metabib.metarecord_source_map WHERE metarecord = tmp_mr.id;
49                 IF source_count = 0 THEN -- No other records
50                     deleted_mrs := ARRAY_APPEND(deleted_mrs, tmp_mr.id);
51                     DELETE FROM metabib.metarecord WHERE id = tmp_mr.id;
52                 END IF;
53             END IF;
54
55         END LOOP;
56
57         -- we found no suitable, preexisting MR based on old source maps
58         IF old_mr IS NULL THEN
59             SELECT id INTO old_mr FROM metabib.metarecord WHERE fingerprint = fp; -- is there one for our current fingerprint?
60
61             IF old_mr IS NULL THEN -- nope, create one and grab its id
62                 INSERT INTO metabib.metarecord ( fingerprint, master_record ) VALUES ( fp, bib_id );
63                 SELECT id INTO old_mr FROM metabib.metarecord WHERE fingerprint = fp;
64
65             ELSE -- indeed there is. update it with a null cache and recalcualated master record
66                 UPDATE  metabib.metarecord
67                   SET   mods = NULL,
68                         master_record = ( SELECT id FROM biblio.record_entry WHERE fingerprint = fp AND NOT deleted ORDER BY quality DESC LIMIT 1)
69                   WHERE id = old_mr;
70             END IF;
71
72         ELSE -- there was one we already attached to, update its mods cache and master_record
73             UPDATE  metabib.metarecord
74               SET   mods = NULL,
75                     master_record = ( SELECT id FROM biblio.record_entry WHERE fingerprint = fp AND NOT deleted ORDER BY quality DESC LIMIT 1)
76               WHERE id = old_mr;
77         END IF;
78
79         IF new_mapping THEN
80             INSERT INTO metabib.metarecord_source_map (metarecord, source) VALUES (old_mr, bib_id); -- new source mapping
81         END IF;
82
83     END IF;
84
85     IF ARRAY_UPPER(deleted_mrs,1) > 0 THEN
86         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
87     END IF;
88
89     RETURN old_mr;
90
91 END;
92 $func$ LANGUAGE PLPGSQL;
93
94 COMMIT;