LP#957466: Update editor/edit_date/source on overlay
authorRemington Steed <rjs7@calvin.edu>
Mon, 13 Oct 2014 16:22:32 +0000 (12:22 -0400)
committerJason Stephenson <jstephenson@mvlc.org>
Wed, 18 Feb 2015 15:02:57 +0000 (10:02 -0500)
This commit does three things.

1. It removes some declared variables that are never used in this
function.

2. It updates the bib record edit_date field (along with the editor) if
an editor is found in the MARC. If an editor is not found (or doesn't
match an Evergreen user), it seems best to leave the edit_date
unchanged so as not to imply that the previous editor is responsible for
the newest edit.

3. If a bib source is chosen in the vandelay importer UI, it updates the
bib record with the source. To access this field, the reference to table
"queued_record" is replaced by its child table "queued_bib_record".
Since the new table is a child of the other, all of the other needed
values are still available.

Signed-off-by: Remington Steed <rjs7@calvin.edu>
Signed-off-by: Jason Stephenson <jstephenson@mvlc.org>
Signed-off-by: Martha Driscoll <driscoll@noblenet.org>
Open-ILS/src/sql/Pg/012.schema.vandelay.sql
Open-ILS/src/sql/Pg/upgrade/XXXX.function.vandelay-overlay_bib_record.sql [new file with mode: 0644]

index 2ca0fcc..67aab22 100644 (file)
@@ -1415,19 +1415,16 @@ $$ LANGUAGE SQL;
 
 CREATE OR REPLACE FUNCTION vandelay.overlay_bib_record ( import_id BIGINT, eg_id BIGINT, merge_profile_id INT ) RETURNS BOOL AS $$
 DECLARE
-    merge_profile   vandelay.merge_profile%ROWTYPE;
-    dyn_profile     vandelay.compile_profile%ROWTYPE;
     editor_string   TEXT;
     editor_id       INT;
-    source_marc     TEXT;
-    target_marc     TEXT;
-    eg_marc         TEXT;
     v_marc          TEXT;
-    replace_rule    TEXT;
+    v_bib_source    INT;
+    update_fields   TEXT[];
+    update_query    TEXT;
 BEGIN
 
-    SELECT  q.marc INTO v_marc
-      FROM  vandelay.queued_record q
+    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;
 
@@ -1452,10 +1449,21 @@ BEGIN
             END IF;
 
             IF editor_id IS NOT NULL THEN
-                UPDATE biblio.record_entry SET editor = editor_id WHERE id = eg_id;
+                --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;
+
         RETURN TRUE;
     END IF;
 
diff --git a/Open-ILS/src/sql/Pg/upgrade/XXXX.function.vandelay-overlay_bib_record.sql b/Open-ILS/src/sql/Pg/upgrade/XXXX.function.vandelay-overlay_bib_record.sql
new file mode 100644 (file)
index 0000000..82dda29
--- /dev/null
@@ -0,0 +1,66 @@
+BEGIN;
+
+--SELECT evergreen.upgrade_deps_block_check('XXXX', :eg_version);
+
+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;
+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;
+
+        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;
+
+        RETURN TRUE;
+    END IF;
+
+    -- RAISE NOTICE 'update of biblio.record_entry failed';
+
+    RETURN FALSE;
+
+END;
+$$ LANGUAGE PLPGSQL;
+
+COMMIT;