]> git.evergreen-ils.org Git - working/Evergreen.git/blob - Open-ILS/src/sql/Pg/upgrade/0195.schema.vandelay.bib-merge-crosscheck-bug-fix.sql
LP#1426133: Set merge_profile_id_seq explicitly
[working/Evergreen.git] / Open-ILS / src / sql / Pg / upgrade / 0195.schema.vandelay.bib-merge-crosscheck-bug-fix.sql
1 BEGIN;
2
3 INSERT INTO config.upgrade_log (version) VALUES ('0195'); -- miker
4
5 CREATE OR REPLACE FUNCTION vandelay.auto_overlay_bib_record ( import_id BIGINT, merge_profile_id INT ) RETURNS BOOL AS $$
6 DECLARE
7     eg_id           BIGINT;
8     match_count     INT;
9     match_attr      vandelay.bib_attr_definition%ROWTYPE;
10 BEGIN
11
12     PERFORM * FROM vandelay.queued_bib_record WHERE import_time IS NOT NULL AND id = import_id;
13
14     IF FOUND THEN
15         -- RAISE NOTICE 'already imported, cannot auto-overlay'
16         RETURN FALSE;
17     END IF;
18
19     SELECT COUNT(*) INTO match_count FROM vandelay.bib_match WHERE queued_record = import_id;
20
21     IF match_count <> 1 THEN
22         -- RAISE NOTICE 'not an exact match';
23         RETURN FALSE;
24     END IF;
25
26     SELECT  d.* INTO match_attr
27       FROM  vandelay.bib_attr_definition d
28             JOIN vandelay.queued_bib_record_attr a ON (a.field = d.id)
29             JOIN vandelay.bib_match m ON (m.matched_attr = a.id)
30       WHERE m.queued_record = import_id;
31
32     IF NOT (match_attr.xpath ~ '@tag="901"' AND match_attr.xpath ~ '@code="c"') THEN
33         -- RAISE NOTICE 'not a 901c match: %', match_attr.xpath;
34         RETURN FALSE;
35     END IF;
36
37     SELECT  m.eg_record INTO eg_id
38       FROM  vandelay.bib_match m
39       WHERE m.queued_record = import_id
40       LIMIT 1;
41
42     IF eg_id IS NULL THEN
43         RETURN FALSE;
44     END IF;
45
46     RETURN vandelay.overlay_bib_record( import_id, eg_id, merge_profile_id );
47 END;
48 $$ LANGUAGE PLPGSQL;
49
50 CREATE OR REPLACE FUNCTION vandelay.match_bib_record ( ) RETURNS TRIGGER AS $func$
51 DECLARE
52     attr        RECORD;
53     attr_def    RECORD;
54     eg_rec      RECORD;
55     id_value    TEXT;
56     exact_id    BIGINT;
57 BEGIN
58
59     DELETE FROM vandelay.bib_match WHERE queued_record = NEW.id;
60
61     SELECT * INTO attr_def FROM vandelay.bib_attr_definition WHERE xpath = '//*[@tag="901"]/*[@code="c"]' ORDER BY id LIMIT 1;
62
63     IF attr_def IS NOT NULL AND attr_def.id IS NOT NULL THEN
64         id_value := extract_marc_field('vandelay.queued_bib_record', NEW.id, attr_def.xpath, attr_def.remove);
65
66         IF id_value IS NOT NULL AND id_value <> '' AND id_value ~ $r$^\d+$$r$ THEN
67             SELECT id INTO exact_id FROM biblio.record_entry WHERE id = id_value::BIGINT AND NOT deleted;
68             SELECT * INTO attr FROM vandelay.queued_bib_record_attr WHERE record = NEW.id and field = attr_def.id LIMIT 1;
69             IF exact_id IS NOT NULL THEN
70                 INSERT INTO vandelay.bib_match (field_type, matched_attr, queued_record, eg_record) VALUES ('id', attr.id, NEW.id, exact_id);
71             END IF;
72         END IF;
73     END IF;
74
75     IF exact_id IS NULL THEN
76         FOR attr IN SELECT a.* FROM vandelay.queued_bib_record_attr a JOIN vandelay.bib_attr_definition d ON (d.id = a.field) WHERE record = NEW.id AND d.ident IS TRUE LOOP
77
78             -- All numbers? check for an id match
79             IF (attr.attr_value ~ $r$^\d+$$r$) THEN
80                 FOR eg_rec IN SELECT * FROM biblio.record_entry WHERE id = attr.attr_value::BIGINT AND deleted IS FALSE LOOP
81                     INSERT INTO vandelay.bib_match (field_type, matched_attr, queued_record, eg_record) VALUES ('id', attr.id, NEW.id, eg_rec.id);
82                 END LOOP;
83             END IF;
84
85             -- Looks like an ISBN? check for an isbn match
86             IF (attr.attr_value ~* $r$^[0-9x]+$$r$ AND character_length(attr.attr_value) IN (10,13)) THEN
87                 FOR eg_rec IN EXECUTE $$SELECT * FROM metabib.full_rec fr WHERE fr.value LIKE LOWER('$$ || attr.attr_value || $$%') AND fr.tag = '020' AND fr.subfield = 'a'$$ LOOP
88                     PERFORM id FROM biblio.record_entry WHERE id = eg_rec.record AND deleted IS FALSE;
89                     IF FOUND THEN
90                         INSERT INTO vandelay.bib_match (field_type, matched_attr, queued_record, eg_record) VALUES ('isbn', attr.id, NEW.id, eg_rec.record);
91                     END IF;
92                 END LOOP;
93
94                 -- subcheck for isbn-as-tcn
95                 FOR eg_rec IN SELECT * FROM biblio.record_entry WHERE tcn_value = 'i' || attr.attr_value AND deleted IS FALSE LOOP
96                     INSERT INTO vandelay.bib_match (field_type, matched_attr, queued_record, eg_record) VALUES ('tcn_value', attr.id, NEW.id, eg_rec.id);
97                 END LOOP;
98             END IF;
99
100             -- check for an OCLC tcn_value match
101             IF (attr.attr_value ~ $r$^o\d+$$r$) THEN
102                 FOR eg_rec IN SELECT * FROM biblio.record_entry WHERE tcn_value = regexp_replace(attr.attr_value,'^o','ocm') AND deleted IS FALSE LOOP
103                     INSERT INTO vandelay.bib_match (field_type, matched_attr, queued_record, eg_record) VALUES ('tcn_value', attr.id, NEW.id, eg_rec.id);
104                 END LOOP;
105             END IF;
106
107             -- check for a direct tcn_value match
108             FOR eg_rec IN SELECT * FROM biblio.record_entry WHERE tcn_value = attr.attr_value AND deleted IS FALSE LOOP
109                 INSERT INTO vandelay.bib_match (field_type, matched_attr, queued_record, eg_record) VALUES ('tcn_value', attr.id, NEW.id, eg_rec.id);
110             END LOOP;
111
112             -- check for a direct item barcode match
113             FOR eg_rec IN
114                     SELECT  DISTINCT b.*
115                       FROM  biblio.record_entry b
116                             JOIN asset.call_number cn ON (cn.record = b.id)
117                             JOIN asset.copy cp ON (cp.call_number = cn.id)
118                       WHERE cp.barcode = attr.attr_value AND cp.deleted IS FALSE
119             LOOP
120                 INSERT INTO vandelay.bib_match (field_type, matched_attr, queued_record, eg_record) VALUES ('id', attr.id, NEW.id, eg_rec.id);
121             END LOOP;
122
123         END LOOP;
124     END IF;
125
126     RETURN NULL;
127 END;
128 $func$ LANGUAGE PLPGSQL;
129
130 COMMIT;
131