This adds a flag to control the updating of the bib source on a vandelay operation.
Signed-off-by: Dan Pearl <dpearl@cwmars.org>
Signed-off-by: Kathy Lussier <klussier@masslnc.org>
<field reporter:label="Remove Specification" name="strip_spec" reporter:datatype="text"/>
<field reporter:label="Preserve Specification" name="preserve_spec" reporter:datatype="text"/>
<field reporter:label="Min. Quality Ratio" name="lwm_ratio" reporter:datatype="float"/>
+ <field reporter:label="Update Bib. Source" name="update_bib_source" reporter:datatype="bool"/>
</fields>
<links>
<link field="owner" reltype="has_a" key="id" map="" class="aou"/>
replace_spec TEXT,
strip_spec TEXT,
preserve_spec TEXT,
+ update_bib_source BOOLEAN NOT NULL DEFAULT FALSE,
lwm_ratio NUMERIC,
CONSTRAINT vand_merge_prof_owner_name_idx UNIQUE (owner,name),
CONSTRAINT add_replace_strip_or_preserve CHECK ((preserve_spec IS NOT NULL OR replace_spec IS NOT NULL) OR (preserve_spec IS NULL AND replace_spec IS NULL))
v_bib_source INT;
update_fields TEXT[];
update_query TEXT;
+ update_bib BOOL;
BEGIN
SELECT q.marc, q.bib_source INTO v_marc, v_bib_source
import_time = NOW()
WHERE id = import_id;
- editor_string := (oils_xpath('//*[@tag="905"]/*[@code="u"]/text()',v_marc))[1];
+ SELECT q.update_bib_source INTO update_bib FROM vandelay.merge_profile q where q.id = merge_profile_Id;
- IF editor_string IS NOT NULL AND editor_string <> '' THEN
- SELECT usr INTO editor_id FROM actor.card WHERE barcode = editor_string;
+ IF update_bib THEN
+ editor_string := (oils_xpath('//*[@tag="905"]/*[@code="u"]/text()',v_marc))[1];
- IF editor_id IS NULL THEN
- SELECT id INTO editor_id FROM actor.usr WHERE usrname = editor_string;
- END IF;
+ IF editor_string IS NOT NULL AND editor_string <> '' THEN
+ SELECT usr INTO editor_id FROM actor.card WHERE barcode = editor_string;
- IF editor_id IS NOT NULL THEN
- --only update the edit date if we have a valid editor
- update_fields := ARRAY_APPEND(update_fields, 'editor = ' || editor_id || ', edit_date = NOW()');
- END IF;
- END IF;
+ IF editor_id IS NULL THEN
+ SELECT id INTO editor_id FROM actor.usr WHERE usrname = editor_string;
+ END IF;
- IF v_bib_source IS NOT NULL THEN
- update_fields := ARRAY_APPEND(update_fields, 'source = ' || v_bib_source);
- END IF;
+ IF editor_id IS NOT NULL THEN
+ --only update the edit date if we have a valid editor
+ update_fields := ARRAY_APPEND(update_fields, 'editor = ' || editor_id || ', edit_date = NOW()');
+ END IF;
+ END IF;
+
+ IF v_bib_source IS NOT NULL THEN
+ update_fields := ARRAY_APPEND(update_fields, 'source = ' || v_bib_source);
+ END IF;
- IF ARRAY_LENGTH(update_fields, 1) > 0 THEN
- update_query := 'UPDATE biblio.record_entry SET ' || ARRAY_TO_STRING(update_fields, ',') || ' WHERE id = ' || eg_id || ';';
- --RAISE NOTICE 'query: %', update_query;
- EXECUTE update_query;
+ IF ARRAY_LENGTH(update_fields, 1) > 0 THEN
+ update_query := 'UPDATE biblio.record_entry SET ' || ARRAY_TO_STRING(update_fields, ',') || ' WHERE id = ' || eg_id || ';';
+ --RAISE NOTICE 'query: %', update_query;
+ EXECUTE update_query;
+ END IF;
END IF;
RETURN TRUE;
'owning_lib.billing_address'
);
-INSERT INTO vandelay.merge_profile (id, owner, name, replace_spec)
- VALUES (1, 1, oils_i18n_gettext(1, 'Match-Only Merge', 'vmp', 'name'), '901c');
+INSERT INTO vandelay.merge_profile (id, owner, name, replace_spec, update_bib_source)
+ VALUES (1, 1, oils_i18n_gettext(1, 'Match-Only Merge', 'vmp', 'name'), '901c', false);
-INSERT INTO vandelay.merge_profile (id, owner, name, preserve_spec)
- VALUES (2, 1, oils_i18n_gettext(2, 'Full Overlay', 'vmp', 'name'), '901c');
+INSERT INTO vandelay.merge_profile (id, owner, name, replace_spec, update_bib_source)
+ VALUES (2, 1, oils_i18n_gettext(2, 'Full Overlay', 'vmp', 'name'), '901c', true);
SELECT SETVAL('vandelay.merge_profile_id_seq'::TEXT, 100);
--- /dev/null
+-- Load the TAP functions.
+BEGIN;
+
+-- Plan the tests.
+SELECT plan(1);
+
+-- Run the tests.
+
+SELECT has_column('vandelay', 'merge_profile', 'update_bib_source',
+ 'Column "update_bib_source" on vandelay.merge_profile should exist');
+
+-- Finish the tests and clean up.
+SELECT * FROM finish();
+ROLLBACK;
--- /dev/null
+BEGIN;
+
+SELECT evergreen.upgrade_deps_block_check('XXXX', :eg_version);
+
+ALTER TABLE vandelay.merge_profile ADD COLUMN update_bib_source BOOLEAN NOT NULL DEFAULT false;
+UPDATE vandelay.merge_profile SET update_bib_source = true WHERE id=2;
+
+CREATE OR REPLACE FUNCTION vandelay.overlay_bib_record ( import_id BIGINT, eg_id BIGINT, merge_profile_id INT ) RETURNS BOOL AS $$
+DECLARE
+ editor_string TEXT;
+ editor_id INT;
+ v_marc TEXT;
+ v_bib_source INT;
+ update_fields TEXT[];
+ update_query TEXT;
+ update_bib BOOL;
+BEGIN
+
+ SELECT q.marc, q.bib_source INTO v_marc, v_bib_source
+ FROM vandelay.queued_bib_record q
+ JOIN vandelay.bib_match m ON (m.queued_record = q.id AND q.id = import_id)
+ LIMIT 1;
+
+ IF v_marc IS NULL THEN
+ -- RAISE NOTICE 'no marc for vandelay or bib record';
+ RETURN FALSE;
+ END IF;
+
+ IF vandelay.template_overlay_bib_record( v_marc, eg_id, merge_profile_id) THEN
+ UPDATE vandelay.queued_bib_record
+ SET imported_as = eg_id,
+ import_time = NOW()
+ WHERE id = import_id;
+
+ SELECT q.update_bib_source INTO update_bib FROM vandelay.merge_profile q where q.id = merge_profile_id;
+
+ IF update_bib THEN
+ editor_string := (oils_xpath('//*[@tag="905"]/*[@code="u"]/text()',v_marc))[1];
+
+ IF editor_string IS NOT NULL AND editor_string <> '' THEN
+ SELECT usr INTO editor_id FROM actor.card WHERE barcode = editor_string;
+
+ IF editor_id IS NULL THEN
+ SELECT id INTO editor_id FROM actor.usr WHERE usrname = editor_string;
+ END IF;
+
+ IF editor_id IS NOT NULL THEN
+ --only update the edit date if we have a valid editor
+ update_fields := ARRAY_APPEND(update_fields, 'editor = ' || editor_id || ', edit_date = NOW()');
+ END IF;
+ END IF;
+
+ IF v_bib_source IS NOT NULL THEN
+ update_fields := ARRAY_APPEND(update_fields, 'source = ' || v_bib_source);
+ END IF;
+
+ IF ARRAY_LENGTH(update_fields, 1) > 0 THEN
+ update_query := 'UPDATE biblio.record_entry SET ' || ARRAY_TO_STRING(update_fields, ',') || ' WHERE id = ' || eg_id || ';';
+ --RAISE NOTICE 'query: %', update_query;
+ EXECUTE update_query;
+ END IF;
+ END IF;
+
+ RETURN TRUE;
+ END IF;
+
+ -- RAISE NOTICE 'update of biblio.record_entry failed';
+
+ RETURN FALSE;
+
+END;
+$$ LANGUAGE PLPGSQL;
+
+COMMIT;
</div>
<table jsId="pGrid"
dojoType="openils.widget.AutoGrid"
- fieldOrder="['name', 'owner', 'preserve_spec', 'replace_spec', 'add_spec', 'strip_spec', 'lwm_ratio']"
+ fieldOrder="['name', 'owner', 'update_bib_source', 'preserve_spec', 'replace_spec', 'add_spec', 'strip_spec', 'lwm_ratio']"
query="{id: '*'}"
defaultCellWidth='"14%"'
fmClass='vmp'
--- /dev/null
+Selectable Bibliographic Source Update
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+During vandelay, the bib source has always recorded the record source,
+the time of the update and the identity of the user associated with the
+operation. This is not really desired for match-only merges.
+
+This feature provides a way to control whether the bib source data
+is updated or not.
+
+In MARC Import, select the "Merge / Overlay" tab. Each entry in the table has
+a value in the new "Update bib. source" column. If that value is "true", then
+the bib source data will be updated.
+
+The two system-defined entries have been pre-set to appropriate values (Full Overlay = true;
+Match-Only Merge = false).