]> git.evergreen-ils.org Git - working/Evergreen.git/blob - Open-ILS/src/sql/Pg/upgrade/0645.schema.null_svf_protection.sql
Fix 0752 and 0756 upgrade scripts
[working/Evergreen.git] / Open-ILS / src / sql / Pg / upgrade / 0645.schema.null_svf_protection.sql
1 BEGIN;
2
3 SELECT evergreen.upgrade_deps_block_check('0645', :eg_version);
4
5 CREATE OR REPLACE FUNCTION biblio.indexing_ingest_or_delete () RETURNS TRIGGER AS $func$
6 DECLARE
7     transformed_xml TEXT;
8     prev_xfrm       TEXT;
9     normalizer      RECORD;
10     xfrm            config.xml_transform%ROWTYPE;
11     attr_value      TEXT;
12     new_attrs       HSTORE := ''::HSTORE;
13     attr_def        config.record_attr_definition%ROWTYPE;
14 BEGIN
15
16     IF NEW.deleted IS TRUE THEN -- If this bib is deleted
17         DELETE FROM metabib.metarecord_source_map WHERE source = NEW.id; -- Rid ourselves of the search-estimate-killing linkage
18         DELETE FROM metabib.record_attr WHERE id = NEW.id; -- Kill the attrs hash, useless on deleted records
19         DELETE FROM authority.bib_linking WHERE bib = NEW.id; -- Avoid updating fields in bibs that are no longer visible
20         DELETE FROM biblio.peer_bib_copy_map WHERE peer_record = NEW.id; -- Separate any multi-homed items
21         RETURN NEW; -- and we're done
22     END IF;
23
24     IF TG_OP = 'UPDATE' THEN -- re-ingest?
25         PERFORM * FROM config.internal_flag WHERE name = 'ingest.reingest.force_on_same_marc' AND enabled;
26
27         IF NOT FOUND AND OLD.marc = NEW.marc THEN -- don't do anything if the MARC didn't change
28             RETURN NEW;
29         END IF;
30     END IF;
31
32     -- Record authority linking
33     PERFORM * FROM config.internal_flag WHERE name = 'ingest.disable_authority_linking' AND enabled;
34     IF NOT FOUND THEN
35         PERFORM biblio.map_authority_linking( NEW.id, NEW.marc );
36     END IF;
37
38     -- Flatten and insert the mfr data
39     PERFORM * FROM config.internal_flag WHERE name = 'ingest.disable_metabib_full_rec' AND enabled;
40     IF NOT FOUND THEN
41         PERFORM metabib.reingest_metabib_full_rec(NEW.id);
42
43         -- Now we pull out attribute data, which is dependent on the mfr for all but XPath-based fields
44         PERFORM * FROM config.internal_flag WHERE name = 'ingest.disable_metabib_rec_descriptor' AND enabled;
45         IF NOT FOUND THEN
46             FOR attr_def IN SELECT * FROM config.record_attr_definition ORDER BY format LOOP
47
48                 IF attr_def.tag IS NOT NULL THEN -- tag (and optional subfield list) selection
49                     SELECT  ARRAY_TO_STRING(ARRAY_ACCUM(value), COALESCE(attr_def.joiner,' ')) INTO attr_value
50                       FROM  (SELECT * FROM metabib.full_rec ORDER BY tag, subfield) AS x
51                       WHERE record = NEW.id
52                             AND tag LIKE attr_def.tag
53                             AND CASE
54                                 WHEN attr_def.sf_list IS NOT NULL 
55                                     THEN POSITION(subfield IN attr_def.sf_list) > 0
56                                 ELSE TRUE
57                                 END
58                       GROUP BY tag
59                       ORDER BY tag
60                       LIMIT 1;
61
62                 ELSIF attr_def.fixed_field IS NOT NULL THEN -- a named fixed field, see config.marc21_ff_pos_map.fixed_field
63                     attr_value := biblio.marc21_extract_fixed_field(NEW.id, attr_def.fixed_field);
64
65                 ELSIF attr_def.xpath IS NOT NULL THEN -- and xpath expression
66
67                     SELECT INTO xfrm * FROM config.xml_transform WHERE name = attr_def.format;
68             
69                     -- See if we can skip the XSLT ... it's expensive
70                     IF prev_xfrm IS NULL OR prev_xfrm <> xfrm.name THEN
71                         -- Can't skip the transform
72                         IF xfrm.xslt <> '---' THEN
73                             transformed_xml := oils_xslt_process(NEW.marc,xfrm.xslt);
74                         ELSE
75                             transformed_xml := NEW.marc;
76                         END IF;
77             
78                         prev_xfrm := xfrm.name;
79                     END IF;
80
81                     IF xfrm.name IS NULL THEN
82                         -- just grab the marcxml (empty) transform
83                         SELECT INTO xfrm * FROM config.xml_transform WHERE xslt = '---' LIMIT 1;
84                         prev_xfrm := xfrm.name;
85                     END IF;
86
87                     attr_value := oils_xpath_string(attr_def.xpath, transformed_xml, COALESCE(attr_def.joiner,' '), ARRAY[ARRAY[xfrm.prefix, xfrm.namespace_uri]]);
88
89                 ELSIF attr_def.phys_char_sf IS NOT NULL THEN -- a named Physical Characteristic, see config.marc21_physical_characteristic_*_map
90                     SELECT  m.value INTO attr_value
91                       FROM  biblio.marc21_physical_characteristics(NEW.id) v
92                             JOIN config.marc21_physical_characteristic_value_map m ON (m.id = v.value)
93                       WHERE v.subfield = attr_def.phys_char_sf
94                       LIMIT 1; -- Just in case ...
95
96                 END IF;
97
98                 -- apply index normalizers to attr_value
99                 FOR normalizer IN
100                     SELECT  n.func AS func,
101                             n.param_count AS param_count,
102                             m.params AS params
103                       FROM  config.index_normalizer n
104                             JOIN config.record_attr_index_norm_map m ON (m.norm = n.id)
105                       WHERE attr = attr_def.name
106                       ORDER BY m.pos LOOP
107                         EXECUTE 'SELECT ' || normalizer.func || '(' ||
108                             COALESCE( quote_literal( attr_value ), 'NULL' ) ||
109                             CASE
110                                 WHEN normalizer.param_count > 0
111                                     THEN ',' || REPLACE(REPLACE(BTRIM(normalizer.params,'[]'),E'\'',E'\\\''),E'"',E'\'')
112                                     ELSE ''
113                                 END ||
114                             ')' INTO attr_value;
115         
116                 END LOOP;
117
118                 -- Add the new value to the hstore
119                 new_attrs := new_attrs || hstore( attr_def.name, attr_value );
120
121             END LOOP;
122
123             IF TG_OP = 'INSERT' OR OLD.deleted THEN -- initial insert OR revivication
124                 INSERT INTO metabib.record_attr (id, attrs) VALUES (NEW.id, new_attrs);
125             ELSE
126                 UPDATE metabib.record_attr SET attrs = new_attrs WHERE id = NEW.id;
127             END IF;
128
129         END IF;
130     END IF;
131
132     -- Gather and insert the field entry data
133     PERFORM metabib.reingest_metabib_field_entries(NEW.id);
134
135     -- Located URI magic
136     IF TG_OP = 'INSERT' THEN
137         PERFORM * FROM config.internal_flag WHERE name = 'ingest.disable_located_uri' AND enabled;
138         IF NOT FOUND THEN
139             PERFORM biblio.extract_located_uris( NEW.id, NEW.marc, NEW.editor );
140         END IF;
141     ELSE
142         PERFORM * FROM config.internal_flag WHERE name = 'ingest.disable_located_uri' AND enabled;
143         IF NOT FOUND THEN
144             PERFORM biblio.extract_located_uris( NEW.id, NEW.marc, NEW.editor );
145         END IF;
146     END IF;
147
148     -- (re)map metarecord-bib linking
149     IF TG_OP = 'INSERT' THEN -- if not deleted and performing an insert, check for the flag
150         PERFORM * FROM config.internal_flag WHERE name = 'ingest.metarecord_mapping.skip_on_insert' AND enabled;
151         IF NOT FOUND THEN
152             PERFORM metabib.remap_metarecord_for_bib( NEW.id, NEW.fingerprint );
153         END IF;
154     ELSE -- we're doing an update, and we're not deleted, remap
155         PERFORM * FROM config.internal_flag WHERE name = 'ingest.metarecord_mapping.skip_on_update' AND enabled;
156         IF NOT FOUND THEN
157             PERFORM metabib.remap_metarecord_for_bib( NEW.id, NEW.fingerprint );
158         END IF;
159     END IF;
160
161     RETURN NEW;
162 END;
163 $func$ LANGUAGE PLPGSQL;
164
165 COMMIT;