improved concurrency detection
[Evergreen.git] / Open-ILS / src / sql / Pg / upgrade_simple_record.sql
1
2 BEGIN;
3
4 CREATE TABLE reporter.materialized_simple_record AS SELECT * FROM reporter.super_simple_record WHERE 1=0;
5
6 INSERT INTO reporter.materialized_simple_record
7     (id,fingerprint,quality,tcn_source,tcn_value,title,author,publisher,pubdate,isbn,issn)
8     SELECT DISTINCT ON (id) * FROM reporter.super_simple_record;
9
10 ALTER TABLE reporter.materialized_simple_record ADD PRIMARY KEY (id);
11
12 CREATE OR REPLACE VIEW reporter.super_simple_record AS SELECT * FROM reporter.materialized_simple_record;
13
14 CREATE OR REPLACE VIEW reporter.old_super_simple_record AS
15 SELECT  r.id,
16     r.fingerprint,
17     r.quality,
18     r.tcn_source,
19     r.tcn_value,
20     title.value AS title,
21     FIRST(author.value) AS author,
22     publisher.value AS publisher,
23     SUBSTRING(pubdate.value FROM $$\d+$$) AS pubdate,
24     ARRAY_ACCUM( SUBSTRING(isbn.value FROM $$^\S+$$) ) AS isbn,
25     ARRAY_ACCUM( SUBSTRING(issn.value FROM $$^\S+$$) ) AS issn
26   FROM  biblio.record_entry r
27     LEFT JOIN metabib.full_rec title ON (r.id = title.record AND title.tag = '245' AND title.subfield = 'a')
28     LEFT JOIN metabib.full_rec author ON (r.id = author.record AND author.tag IN ('100','110','111') AND author.subfield = 'a')
29     LEFT JOIN metabib.full_rec publisher ON (r.id = publisher.record AND publisher.tag = '260' AND publisher.subfield = 'b')
30     LEFT JOIN metabib.full_rec pubdate ON (r.id = pubdate.record AND pubdate.tag = '260' AND pubdate.subfield = 'c')
31     LEFT JOIN metabib.full_rec isbn ON (r.id = isbn.record AND isbn.tag IN ('024', '020') AND isbn.subfield IN ('a','z'))
32     LEFT JOIN metabib.full_rec issn ON (r.id = issn.record AND issn.tag = '022' AND issn.subfield = 'a')
33   GROUP BY 1,2,3,4,5,6,8,9;
34
35 CREATE OR REPLACE FUNCTION reporter.simple_rec_sync () RETURNS TRIGGER AS $$
36 DECLARE
37     r_id        BIGINT;
38     new_data    RECORD;
39 BEGIN
40     IF TG_OP IN ('DELETE') THEN
41         r_id := OLD.record;
42     ELSE
43         r_id := NEW.record;
44     END IF;
45
46     SELECT * INTO new_data FROM reporter.materialized_simple_record WHERE id = r_id FOR UPDATE;
47     DELETE FROM reporter.materialized_simple_record WHERE id = r_id;
48
49     IF TG_OP IN ('DELETE') THEN
50         RETURN OLD;
51     ELSE
52         INSERT INTO reporter.materialized_simple_record SELECT DISTINCT ON (id) * FROM reporter.old_super_simple_record WHERE id = NEW.record;
53         RETURN NEW;
54     END IF;
55
56 END;
57 $$ LANGUAGE PLPGSQL;
58
59 CREATE TRIGGER zzz_update_materialized_simple_record_tgr
60     AFTER INSERT OR UPDATE OR DELETE ON metabib.full_rec
61     FOR EACH ROW EXECUTE PROCEDURE reporter.simple_rec_sync();
62
63 COMMIT;
64