]> git.evergreen-ils.org Git - working/Evergreen.git/blob - Open-ILS/src/sql/Pg/upgrade/0342.schema.authority_ingest_triggers.sql
LP#1638299: Stamping upgrade scripts for authority infrastructure work
[working/Evergreen.git] / Open-ILS / src / sql / Pg / upgrade / 0342.schema.authority_ingest_triggers.sql
1 -- Enable automated ingest of authority records; just insert the row into
2 -- authority.record_entry and authority.full_rec will automatically be populated
3 BEGIN;
4
5 INSERT INTO config.upgrade_log (version) VALUES ('0342'); -- dbs 
6
7 CREATE OR REPLACE FUNCTION authority.propagate_changes (aid BIGINT, bid BIGINT) RETURNS BIGINT AS $func$
8     UPDATE  biblio.record_entry
9       SET   marc = vandelay.merge_record_xml( marc, authority.generate_overlay_template( $1 ) )
10       WHERE id = $2;
11     SELECT $1;
12 $func$ LANGUAGE SQL;
13
14 CREATE OR REPLACE FUNCTION authority.propagate_changes (aid BIGINT) RETURNS SETOF BIGINT AS $func$
15     SELECT authority.propagate_changes( authority, bib ) FROM authority.bib_linking WHERE authority = $1;
16 $func$ LANGUAGE SQL;
17
18 CREATE OR REPLACE FUNCTION authority.flatten_marc ( TEXT ) RETURNS SETOF authority.full_rec AS $func$
19
20 use MARC::Record;
21 use MARC::File::XML (BinaryEncoding => 'UTF-8');
22
23 my $xml = shift;
24 my $r = MARC::Record->new_from_xml( $xml );
25
26 return_next( { tag => 'LDR', value => $r->leader } );
27
28 for my $f ( $r->fields ) {
29     if ($f->is_control_field) {
30         return_next({ tag => $f->tag, value => $f->data });
31     } else {
32         for my $s ($f->subfields) {
33             return_next({
34                 tag      => $f->tag,
35                 ind1     => $f->indicator(1),
36                 ind2     => $f->indicator(2),
37                 subfield => $s->[0],
38                 value    => $s->[1]
39             });
40
41         }
42     }
43 }
44
45 return undef;
46
47 $func$ LANGUAGE PLPERLU;
48
49 CREATE OR REPLACE FUNCTION authority.flatten_marc ( rid BIGINT ) RETURNS SETOF authority.full_rec AS $func$
50 DECLARE
51     auth    authority.record_entry%ROWTYPE;
52     output    authority.full_rec%ROWTYPE;
53     field    RECORD;
54 BEGIN
55     SELECT INTO auth * FROM authority.record_entry WHERE id = rid;
56
57     FOR field IN SELECT * FROM authority.flatten_marc( auth.marc ) LOOP
58         output.record := rid;
59         output.ind1 := field.ind1;
60         output.ind2 := field.ind2;
61         output.tag := field.tag;
62         output.subfield := field.subfield;
63         IF field.subfield IS NOT NULL THEN
64             output.value := naco_normalize(field.value, field.subfield);
65         ELSE
66             output.value := field.value;
67         END IF;
68
69         CONTINUE WHEN output.value IS NULL;
70
71         RETURN NEXT output;
72     END LOOP;
73 END;
74 $func$ LANGUAGE PLPGSQL;
75
76 -- authority.rec_descriptor appears to be unused currently
77 CREATE OR REPLACE FUNCTION authority.reingest_authority_rec_descriptor( auth_id BIGINT ) RETURNS VOID AS $func$
78 BEGIN
79     DELETE FROM authority.rec_descriptor WHERE record = auth_id;
80 --    INSERT INTO authority.rec_descriptor (record, record_status, char_encoding)
81 --        SELECT  auth_id, ;
82
83     RETURN;
84 END;
85 $func$ LANGUAGE PLPGSQL;
86
87 CREATE OR REPLACE FUNCTION authority.reingest_authority_full_rec( auth_id BIGINT ) RETURNS VOID AS $func$
88 BEGIN
89     DELETE FROM authority.full_rec WHERE record = auth_id;
90     INSERT INTO authority.full_rec (record, tag, ind1, ind2, subfield, value)
91         SELECT record, tag, ind1, ind2, subfield, value FROM authority.flatten_marc( auth_id );
92
93     RETURN;
94 END;
95 $func$ LANGUAGE PLPGSQL;
96
97 -- AFTER UPDATE OR INSERT trigger for authority.record_entry
98 CREATE OR REPLACE FUNCTION authority.indexing_ingest_or_delete () RETURNS TRIGGER AS $func$
99 BEGIN
100
101     IF NEW.deleted IS TRUE THEN -- If this authority is deleted
102         DELETE FROM authority.bib_linking WHERE authority = NEW.id; -- Avoid updating fields in bibs that are no longer visible
103           -- Should remove matching $0 from controlled fields at the same time?
104         RETURN NEW; -- and we're done
105     END IF;
106
107     IF TG_OP = 'UPDATE' THEN -- re-ingest?
108         PERFORM * FROM config.internal_flag WHERE name = 'ingest.reingest.force_on_same_marc' AND enabled;
109
110         IF NOT FOUND AND OLD.marc = NEW.marc THEN -- don't do anything if the MARC didn't change
111             RETURN NEW;
112         END IF;
113     END IF;
114
115     -- Flatten and insert the afr data
116     PERFORM * FROM config.internal_flag WHERE name = 'ingest.disable_authority_full_rec' AND enabled;
117     IF NOT FOUND THEN
118         PERFORM authority.reingest_authority_full_rec(NEW.id);
119 -- authority.rec_descriptor is not currently used
120 --        PERFORM * FROM config.internal_flag WHERE name = 'ingest.disable_authority_rec_descriptor' AND enabled;
121 --        IF NOT FOUND THEN
122 --            PERFORM authority.reingest_authority_rec_descriptor(NEW.id);
123 --        END IF;
124     END IF;
125
126     RETURN NEW;
127 END;
128 $func$ LANGUAGE PLPGSQL;
129
130 COMMIT;