From 020e2e74c9f336fab7bcecca78ff7d3315279c43 Mon Sep 17 00:00:00 2001 From: Rogan Hamby Date: Fri, 23 Mar 2018 10:54:05 -0400 Subject: [PATCH] LP#1091885: make sure bibs get reingested on undelete Signed-off-by: Rogan Hamby Signed-off-by: Cesar Velez Signed-off-by: Ben Shum --- Open-ILS/src/sql/Pg/030.schema.metabib.sql | 2 +- .../Pg/t/lp1091885_reingest_on_undelete.pg | 36 ++++++++ ...schema.lp_1091885_reingest_on_undelete.sql | 83 +++++++++++++++++++ 3 files changed, 120 insertions(+), 1 deletion(-) create mode 100644 Open-ILS/src/sql/Pg/t/lp1091885_reingest_on_undelete.pg create mode 100644 Open-ILS/src/sql/Pg/upgrade/xxxx.schema.lp_1091885_reingest_on_undelete.sql diff --git a/Open-ILS/src/sql/Pg/030.schema.metabib.sql b/Open-ILS/src/sql/Pg/030.schema.metabib.sql index bc72c89601..dab8316f78 100644 --- a/Open-ILS/src/sql/Pg/030.schema.metabib.sql +++ b/Open-ILS/src/sql/Pg/030.schema.metabib.sql @@ -1870,7 +1870,7 @@ BEGIN RETURN NEW; -- and we're done END IF; - IF TG_OP = 'UPDATE' THEN -- re-ingest? + IF TG_OP = 'UPDATE' AND OLD.deleted IS FALSE THEN -- re-ingest? PERFORM * FROM config.internal_flag WHERE name = 'ingest.reingest.force_on_same_marc' AND enabled; IF NOT FOUND AND OLD.marc = NEW.marc THEN -- don't do anything if the MARC didn't change diff --git a/Open-ILS/src/sql/Pg/t/lp1091885_reingest_on_undelete.pg b/Open-ILS/src/sql/Pg/t/lp1091885_reingest_on_undelete.pg new file mode 100644 index 0000000000..cc45a62cda --- /dev/null +++ b/Open-ILS/src/sql/Pg/t/lp1091885_reingest_on_undelete.pg @@ -0,0 +1,36 @@ +BEGIN; + +SELECT plan(3); + +---------------------------------- +-- Setup Test environment and data +---------------------------------- + +-- create bib 71,000 +INSERT into biblio.record_entry (id, marc, last_xact_id) + VALUES (71000, + $$ + 00934|jm a2200241 a 450003-000374519991118131708.0971016n nyuuuu eng 4539Bartók, Béla,1881-1945.Concertos,piano,no. 1,Sz. 83(1926) Concertos,piano,no. 1,Sz. 83,(1926)Piano concerto no. 1 (1926) ; Rhapsody, op. 1 (1904)New York, NY :Vox + $$, + 'PGTAP' + ); + +----------------------------------------- +-- Test biblio.indexing_ingest_or_delete +----------------------------------------- + +-- initially record attributes should exist since the record is inserted +SELECT is((SELECT EXISTS(SELECT 1 FROM metabib.record_attr WHERE id = 71000)), TRUE, 'Entries exist.'); + +-- check to see if record attributes are removed when the record is deleted +UPDATE biblio.record_entry SET deleted = TRUE WHERE id = 71000; +SELECT is((SELECT EXISTS(SELECT 1 FROM metabib.record_attr WHERE id = 71000)), FALSE, 'Entries should not exist.'); + +-- check to see if record attributes are restored when the record is undeleted +UPDATE biblio.record_entry SET deleted = FALSE WHERE id = 71000; +SELECT is((SELECT EXISTS(SELECT 1 FROM metabib.record_attr WHERE id = 71000)), TRUE, 'Entries exist.'); + +SELECT * FROM finish(); + +ROLLBACK; + diff --git a/Open-ILS/src/sql/Pg/upgrade/xxxx.schema.lp_1091885_reingest_on_undelete.sql b/Open-ILS/src/sql/Pg/upgrade/xxxx.schema.lp_1091885_reingest_on_undelete.sql new file mode 100644 index 0000000000..b5db947ba2 --- /dev/null +++ b/Open-ILS/src/sql/Pg/upgrade/xxxx.schema.lp_1091885_reingest_on_undelete.sql @@ -0,0 +1,83 @@ +BEGIN; + +SELECT evergreen.upgrade_deps_block_check('xxxx', :eg_version); + +CREATE OR REPLACE FUNCTION biblio.indexing_ingest_or_delete () RETURNS TRIGGER AS $func$ +DECLARE + tmp_bool BOOL; +BEGIN + + IF NEW.deleted THEN -- If this bib is deleted + + PERFORM * FROM config.internal_flag WHERE + name = 'ingest.metarecord_mapping.preserve_on_delete' AND enabled; + + tmp_bool := FOUND; -- Just in case this is changed by some other statement + + PERFORM metabib.remap_metarecord_for_bib( NEW.id, NEW.fingerprint, TRUE, tmp_bool ); + + IF NOT tmp_bool THEN + -- One needs to keep these around to support searches + -- with the #deleted modifier, so one should turn on the named + -- internal flag for that functionality. + DELETE FROM metabib.record_attr_vector_list WHERE source = NEW.id; + END IF; + + DELETE FROM authority.bib_linking WHERE bib = NEW.id; -- Avoid updating fields in bibs that are no longer visible + DELETE FROM biblio.peer_bib_copy_map WHERE peer_record = NEW.id; -- Separate any multi-homed items + DELETE FROM metabib.browse_entry_def_map WHERE source = NEW.id; -- Don't auto-suggest deleted bibs + RETURN NEW; -- and we're done + END IF; + + IF TG_OP = 'UPDATE' AND OLD.deleted IS FALSE THEN -- re-ingest? + PERFORM * FROM config.internal_flag WHERE name = 'ingest.reingest.force_on_same_marc' AND enabled; + + IF NOT FOUND AND OLD.marc = NEW.marc THEN -- don't do anything if the MARC didn't change + RETURN NEW; + END IF; + END IF; + + -- Record authority linking + PERFORM * FROM config.internal_flag WHERE name = 'ingest.disable_authority_linking' AND enabled; + IF NOT FOUND THEN + PERFORM biblio.map_authority_linking( NEW.id, NEW.marc ); + END IF; + + -- Flatten and insert the mfr data + PERFORM * FROM config.internal_flag WHERE name = 'ingest.disable_metabib_full_rec' AND enabled; + IF NOT FOUND THEN + PERFORM metabib.reingest_metabib_full_rec(NEW.id); + + -- Now we pull out attribute data, which is dependent on the mfr for all but XPath-based fields + PERFORM * FROM config.internal_flag WHERE name = 'ingest.disable_metabib_rec_descriptor' AND enabled; + IF NOT FOUND THEN + PERFORM metabib.reingest_record_attributes(NEW.id, NULL, NEW.marc, TG_OP = 'INSERT' OR OLD.deleted); + END IF; + END IF; + + -- Gather and insert the field entry data + PERFORM metabib.reingest_metabib_field_entries(NEW.id); + + -- Located URI magic + PERFORM * FROM config.internal_flag WHERE name = 'ingest.disable_located_uri' AND enabled; + IF NOT FOUND THEN PERFORM biblio.extract_located_uris( NEW.id, NEW.marc, NEW.editor ); END IF; + + -- (re)map metarecord-bib linking + IF TG_OP = 'INSERT' THEN -- if not deleted and performing an insert, check for the flag + PERFORM * FROM config.internal_flag WHERE name = 'ingest.metarecord_mapping.skip_on_insert' AND enabled; + IF NOT FOUND THEN + PERFORM metabib.remap_metarecord_for_bib( NEW.id, NEW.fingerprint ); + END IF; + ELSE -- we're doing an update, and we're not deleted, remap + PERFORM * FROM config.internal_flag WHERE name = 'ingest.metarecord_mapping.skip_on_update' AND enabled; + IF NOT FOUND THEN + PERFORM metabib.remap_metarecord_for_bib( NEW.id, NEW.fingerprint ); + END IF; + END IF; + + RETURN NEW; +END; +$func$ LANGUAGE PLPGSQL; + + +COMMIT; -- 2.43.2