Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

...

 if 999 ff s UUID is different from matched_id and status ACTUAL - get highest generation for matched_id and overwrite matched_id to be the same as 999 ff s with incremented generation and also If more than 1 ACTUAL record with the same matched_id - then to those records status will be set as 'OLD'.

Warning

The outlined scripts are aimed at fixing records on the Orchid version. 
The scripts implementation aimed at the Poppy version is currently in the testing stage and will be described later.


1. Update records containing inconsistent matched_id with generation and state1.  Script to update multiple ACTUAL records containing the same generation

Code Block
languagesql
titleUpdate unmatched matched_id and generation and update status
DO
$$
    DECLARE
    
   rec record;
        updated_generation numeric := 0;
    BEGIN
 --  temporary table is designated to hold records when matched_id and 999 ff $s values are mismatched
        CREATE TEMP TABLE value_matched_id_inconsistencyexternal_id_max_created_date_table ON COMMIT DROP         AS
        SELECT rl.external_id, MAX(rl.matchedcreated_id, rl.generation, mi.value, mi.versiondate) AS last_creation_date
         FROM {tenantId}_mod_source_record_storage.records_lb rl,
             {tenantId}_mod_source_record_storage.marc_indexers mi,
             (
                 SELECT mi.value, max(mi.version) AS max_versionexternal_id
                 FROM {tenantId}_mod_source_record_storage.records_lb rl,
                      {tenantId}_mod_source_record_storage.marc_indexers mi
                 WHERE rl.idstate = mi.marc_id AND rl.state='ACTUAL'
                   AND mi.field_no='999'
AND mi.ind1='f' AND mi.ind2='f' AND mi.subfield_no='s' AND rl.matched_id::text != mi.value                  GROUP BY  mi.value
             ) AS nested_query
        WHERE rl.id = mi.marc_id AND rl.state='ACTUAL' AND mi.value = nested_query.value AND mi.field_no='999' AND mi.ind1='f' AND mi.ind2='f' AND mi.subfield_no='s' AND rl.matched_id::text != mi.value AND mi.version = nested_query.max_version;

--  temporary table (matched_id_generation_table) is for holding pair matched_id, generationexternal_id, generation
                 HAVING COUNT(external_id) > 1
            CREATE TEMP TABLE matched_id_generation_table ON COMMIT DROP AS
        SELECT rl.matched_id, MAX(rl.generation)+1 AS max_gen
        FROM {tenantId}_mod_source_record_storage.records_lb rl,
      ) AS external_id_of_duplicates_with_same_generation
       value_matched_id_inconsistency val_match
        WHERE rl.matchedexternal_id::text = val_match.value
        GROUP by rl.matched_id;

-- iteration through records with mismatched matched_id and value
        FOR rec IN SELECT * FROM value_matched_id_inconsistency
            LOOP
                updated_generation := (SELECT max_gen
                                       FROM matched_id_generation_table matched_genexternal_id_of_duplicates_with_same_generation.external_id
        GROUP                                WHERE matched_gen.matched_id = rec.value::uuid);

                if updated_generation is null then
                    updated_generation := 0;
     by rl.external_id;

         end if;

                UPDATE {tenantId}_mod_source_record_storage.records_lb rl
  r
             SET
                    generation = updated_generation,
                    matched_id = rec.value::uuid,
                    state = 'OLD'
                WHERE rl.id = rec.id;

                UPDATE matchedFROM external_id_generationmax_table matched_gen
                SET max_gen = updated_generation + 1created_date_table
                   WHERE matched_genr.matchedexternal_id = rec.value::uuid;
            END LOOP;

-- update records with greatest generation to 'ACTUAL' state
        UPDATE {tenantId}_mod_source_record_storage.records_lb rlexternal_id_max_created_date_table.external_id
         SET state='ACTUAL'
        FROM matched_id_generation_table
        WHERE rl.matched_id = matched_id_generation_table.matched_id AND rl.generation = matched_id_generation_table.max_gen - 1AND r.created_date < external_id_max_created_date_table.last_creation_date;

    END;
$$
LANGUAGE plpgsql;


2. Update  Script to update multiple ACTUAL records containing the same generation

Code Block
languagesql
DO
$$
    BEGIN
        CREATE TEMP TABLE external_id_max_createdgeneration_date_table ON COMMIT DROP AS
        SELECT rlr.external_id, MAX(rlr.created_dategeneration) AS lastmax_creation_dategeneration
        FROM {tenantId}_mod_source_record_storage.records_lb rlr,
             (
                 SELECT external_id
                 FROM {tenantId}_mod_source_record_storage.records_lb
                 WHERE state = 'ACTUAL'
                 GROUP BY external_id, generation
                 HAVING COUNT(external_id) > 1
             ) AS external_id_of_duplicates_with_same_generation
        WHERE rlr.external_id = external_id_of_duplicates_with_same_generation.external_id
        GROUP byBY rlr.external_id;

        UPDATE {tenantId}_mod_source_record_storage.records_lb r
        SET state = 'OLD'
        FROM external_id_max_createdgeneration_date_table
        WHERE r.external_id = external_id_max_created_dategeneration_table.external_id
          AND r.created_dategeneration < external_id_max_created_dategeneration_table.lastmax_creation_dategeneration;

    END;
$$;


3. Update the remaining multiple ACTUAL recordsScript to update records containing inconsistent matched_id with consistent matched_id value and generation

Code Block
languagesql
DO
$$
    BEGIN
        CREATE TEMP TABLE externalvalue_matched_id_max_generation_tableinconsistency ON COMMIT DROP AS
        SELECT r.externalrl.id, rl.matched_id, MAX(r.generation) AS max_generationmi.value
          FROM {tenantId}_mod_source_record_storage.records_lb rrl,
             {tenantId}_mod_source_record_storage.marc_indexers mi,
(             {tenantId}_mod_source_record_storage.marc_records_tracking rt
     SELECT external   WHERE rt.marc_id = mi.marc_id and rt.version = mi.version
          AND rl.id FROM {tenantId}_mod_source_record_storage.records_lb
 = mi.marc_id AND rl.state='ACTUAL'
          AND mi.field_no='999' AND mi.ind1='f'  WHERE state = 'ACTUAL'
   AND mi.ind2='f' AND mi.subfield_no='s' AND rl.matched_id::text != mi.value;

        CREATE TEMP TABLE  GROUP BY external_idmatched_id_max_generation_table ON COMMIT DROP AS
        SELECT rl.matched_id, MAX(rl.generation) AS max_gen
     HAVING COUNT(external_id) > 1
 FROM {tenantId}_mod_source_record_storage.records_lb rl,
           ) AS externalvalue_matched_id_ofinconsistency val_duplicatesmatch
        WHERE rrl.externalmatched_id = external_id_of_duplicates.external_idval_match.value::uuid
        GROUP BY rrl.externalmatched_id;

        UPDATE {tenantId}_mod_source_record_storage.records_lb r
        SET statematched_id = 'OLD' val_match.value::uuid,
            generation FROM= externalmatched_id_max_generation_table.max_gen + 1
       WHERE r.external FROM value_matched_id = external_inconsistency val_match, matched_id_max_generation_table.external_id
        WHERE r.id = val_match.id AND r.generation < externalval_match.value::uuid = matched_id_max_generation_table.maxmatched_generationid;
    END;
$$;