]> git.evergreen-ils.org Git - working/Evergreen.git/blob - Open-ILS/src/sql/Pg/upgrade/0193.schema.vandelay.authority_merge_functions.sql
LP#1155329: better enforce cat.bib.use_id_for_tcn
[working/Evergreen.git] / Open-ILS / src / sql / Pg / upgrade / 0193.schema.vandelay.authority_merge_functions.sql
1 BEGIN;
2
3 INSERT INTO config.upgrade_log (version) VALUES ('0193'); -- miker
4
5 CREATE OR REPLACE FUNCTION vandelay.overlay_authority_record ( import_id BIGINT, eg_id BIGINT, merge_profile_id INT ) RETURNS BOOL AS $$
6 DECLARE
7     merge_profile   vandelay.merge_profile%ROWTYPE;
8     dyn_profile     vandelay.compile_profile%ROWTYPE;
9     source_marc     TEXT;
10     target_marc     TEXT;
11     eg_marc         TEXT;
12     v_marc          TEXT;
13     replace_rule    TEXT;
14     match_count     INT;
15 BEGIN
16
17     SELECT  b.marc INTO eg_marc
18       FROM  authority.record_entry b
19             JOIN vandelay.authority_match m ON (m.eg_record = b.id AND m.queued_record = import_id)
20       LIMIT 1;
21
22     SELECT  q.marc INTO v_marc
23       FROM  vandelay.queued_record q
24             JOIN vandelay.authority_match m ON (m.queued_record = q.id AND q.id = import_id)
25       LIMIT 1;
26
27     IF eg_marc IS NULL OR v_marc IS NULL THEN
28         -- RAISE NOTICE 'no marc for vandelay or authority record';
29         RETURN FALSE;
30     END IF;
31
32     dyn_profile := vandelay.compile_profile( v_marc );
33
34     IF merge_profile_id IS NOT NULL THEN
35         SELECT * INTO merge_profile FROM vandelay.merge_profile WHERE id = merge_profile_id;
36         IF FOUND THEN
37             dyn_profile.add_rule := BTRIM( dyn_profile.add_rule || ',' || COALESCE(merge_profile.add_spec,''), ',');
38             dyn_profile.strip_rule := BTRIM( dyn_profile.strip_rule || ',' || COALESCE(merge_profile.strip_spec,''), ',');
39             dyn_profile.replace_rule := BTRIM( dyn_profile.replace_rule || ',' || COALESCE(merge_profile.replace_spec,''), ',');
40             dyn_profile.preserve_rule := BTRIM( dyn_profile.preserve_rule || ',' || COALESCE(merge_profile.preserve_spec,''), ',');
41         END IF;
42     END IF;
43
44     IF dyn_profile.replace_rule <> '' AND dyn_profile.preserve_rule <> '' THEN
45         -- RAISE NOTICE 'both replace [%] and preserve [%] specified', dyn_profile.replace_rule, dyn_profile.preserve_rule;
46         RETURN FALSE;
47     END IF;
48
49     IF dyn_profile.replace_rule <> '' THEN
50         source_marc = v_marc;
51         target_marc = eg_marc;
52         replace_rule = dyn_profile.replace_rule;
53     ELSE
54         source_marc = eg_marc;
55         target_marc = v_marc;
56         replace_rule = dyn_profile.preserve_rule;
57     END IF;
58
59     UPDATE  authority.record_entry
60       SET   marc = vandelay.merge_record_xml( target_marc, source_marc, dyn_profile.add_rule, replace_rule, dyn_profile.strip_rule )
61       WHERE id = eg_id;
62
63     IF FOUND THEN
64         UPDATE  vandelay.queued_authority_record
65           SET   imported_as = eg_id,
66                 import_time = NOW()
67           WHERE id = import_id;
68         RETURN TRUE;
69     END IF;
70
71     -- RAISE NOTICE 'update of authority.record_entry failed';
72
73     RETURN FALSE;
74
75 END;
76 $$ LANGUAGE PLPGSQL;
77
78 CREATE OR REPLACE FUNCTION vandelay.auto_overlay_authority_record ( import_id BIGINT, merge_profile_id INT ) RETURNS BOOL AS $$
79 DECLARE
80     eg_id           BIGINT;
81     match_count     INT;
82 BEGIN
83     SELECT COUNT(*) INTO match_count FROM vandelay.authority_match WHERE queued_record = import_id;
84
85     IF match_count <> 1 THEN
86         -- RAISE NOTICE 'not an exact match';
87         RETURN FALSE;
88     END IF;
89
90     SELECT  m.eg_record INTO eg_id
91       FROM  vandelay.authority_match m
92       WHERE m.queued_record = import_id
93       LIMIT 1;
94
95     IF eg_id IS NULL THEN
96         RETURN FALSE;
97     END IF;
98
99     RETURN vandelay.overlay_authority_record( import_id, eg_id, merge_profile_id );
100 END;
101 $$ LANGUAGE PLPGSQL;
102
103 CREATE OR REPLACE FUNCTION vandelay.auto_overlay_authority_queue ( queue_id BIGINT, merge_profile_id INT ) RETURNS SETOF BIGINT AS $$
104 DECLARE
105     queued_record   vandelay.queued_authority_record%ROWTYPE;
106     success         BOOL;
107 BEGIN
108
109     FOR queued_record IN SELECT * FROM vandelay.queued_authority_record WHERE queue = queue_id AND import_time IS NULL LOOP
110         success := vandelay.auto_overlay_authority_record( queued_record.id, merge_profile_id );
111
112         IF success THEN
113             RETURN NEXT queued_record.id;
114         END IF;
115
116     END LOOP;
117
118     RETURN;
119     
120 END;
121 $$ LANGUAGE PLPGSQL;
122
123 CREATE OR REPLACE FUNCTION vandelay.auto_overlay_authority_queue ( queue_id BIGINT ) RETURNS SETOF BIGINT AS $$
124     SELECT * FROM vandelay.auto_overlay_authority_queue( $1, NULL );
125 $$ LANGUAGE SQL;
126
127
128 COMMIT;
129