@natlibfi/melinda-record-match-validator
Version:
Validates if two records matched by melinda-record-matching can be merged and sets merge priority
94 lines (93 loc) • 5.43 kB
JavaScript
import createDebugLogger from "debug";
import { hasFields, getSubfield, getSubfieldValues, getDefaultMissValue } from "../collectFunctions/collectUtils.js";
import { hasIdMismatch, normalizeMelindaId, nvdebug } from "../utils.js";
const debug = createDebugLogger("@natlibfi/melinda-record-match-validator:field773");
const debugDev = debug.extend("dev");
function getX73(record, paramTag) {
const F773s = hasFields(paramTag, record, f773ToJSON);
debugDev("Field %ss: %o", paramTag, F773s);
return F773s;
function f773ToJSON(f773) {
const tag = paramTag;
const recordControlNumbers = getRecordControlNumbers(f773);
const relatedParts = getSubfield(f773, "g");
const enumerationAndFirstPage = getSubfield(f773, "q");
return { tag, recordControlNumbers, relatedParts, enumerationAndFirstPage };
}
function getRecordControlNumbers(field) {
const wSubfields = getSubfieldValues(field, "w").map((value) => normalizeMelindaId(value)).filter((value) => !/^[0-9]+$/u.test(value));
return wSubfields;
}
}
export function get773(record) {
const f773 = getX73(record, "773");
const f973 = getX73(record, "973");
return [...f773, ...f973];
}
export function check773({ record1, record2, failMultipleHostLinks = true, failF973 = true, requireHostIdMatch = false, failHostIdMatch = false }) {
const data1 = get773(record1);
const data2 = get773(record2);
return compare773values({ f773sA: data1, f773sB: data2, failMultipleHostLinks, failF973, requireHostIdMatch, failHostIdMatch });
}
export function check773Internal({ record1, record2, failMultipleHostLinks = false, failF973 = false, requireHostIdMatch = false, failHostIdMatch = true }) {
const data1 = get773(record1);
const data2 = get773(record2);
return compare773values({ f773sA: data1, f773sB: data2, failMultipleHostLinks, failF973, requireHostIdMatch, failHostIdMatch });
}
function compare773values({ f773sA, f773sB, failMultipleHostLinks = true, failF973 = true, requireHostIdMatch = false, failHostIdMatch = false }) {
debugDev("Collected f773s: %o vs %o", f773sA, f773sB);
nvdebug("compare773values() in...", debugDev);
nvdebug(JSON.stringify(f773sA), debugDev);
nvdebug(JSON.stringify(f773sB), debugDev);
if (failMultipleHostLinks && (f773sA.length > 1 || f773sB.length > 1)) {
return false;
}
if (failF973 && (f773sA.some((val) => val.tag === "973") || f773sB.some((val) => val.tag === "973"))) {
return false;
}
if (f773sA.length === 0 || f773sB.length === 0) {
return true;
}
const undefinedHack = getDefaultMissValue();
return innerCompare({ data1: f773sA[0], data2: f773sB[0], requireHostIdMatch, failHostIdMatch });
function noMultivals(val1, val2) {
nvdebug(`compare '${val1}' vs '${val2}' (default: '${undefinedHack}')`, debugDev);
return val1 === val2 || !val1 || !val2 || val1 === undefinedHack || val2 === undefinedHack;
}
function acceptControlNumbers({ nums1, nums2, requireHostIdMatch: requireHostIdMatch2, failHostIdMatch: failHostIdMatch2 }) {
debugDev(`Comparing host controlnumbers: ${JSON.stringify(nums1)} to ${JSON.stringify(nums2)}}`);
debugDev(`Settings: requireHostIdMatch: ${requireHostIdMatch2}, failHostIdMatch: ${failHostIdMatch2}`);
if (requireHostIdMatch2 || failHostIdMatch2) {
const { internalIds: internalIds1, otherIds: otherIds1 } = splitIds(nums1);
const { internalIds: internalIds2, otherIds: otherIds2 } = splitIds(nums2);
const internalHostIdMatch = internalIds1.some((val) => hasIdMatch(val, internalIds2)) || internalIds2.some((val) => hasIdMatch(val, internalIds1));
const internalHostIdMismatch = internalIds1.some((val) => hasIdMismatch(val, internalIds2)) || internalIds2.some((val) => hasIdMismatch(val, internalIds1));
if (failHostIdMatch2 && internalHostIdMatch) {
return false;
}
if (requireHostIdMatch2 && !internalHostIdMatch) {
return false;
}
if (internalHostIdMismatch) {
return false;
}
return !(otherIds1.some((val) => hasIdMismatch(val, otherIds2)) || otherIds2.some((val2) => hasIdMismatch(val2, otherIds1)));
}
return !(nums1.some((val) => hasIdMismatch(val, nums2)) || nums2.some((val2) => hasIdMismatch(val2, nums1)));
}
function innerCompare({ data1, data2, requireHostIdMatch: requireHostIdMatch2, failHostIdMatch: failHostIdMatch2 }) {
const recordControlNumbers = acceptControlNumbers({ nums1: data1.recordControlNumbers, nums2: data2.recordControlNumbers, requireHostIdMatch: requireHostIdMatch2, failHostIdMatch: failHostIdMatch2 });
nvdebug(`RECORD CONTROL NUMBERS ${recordControlNumbers}`, debugDev);
const relatedParts = noMultivals(data1.relatedParts, data2.relatedParts);
const enumerationAndFirstPage = noMultivals(data1.enumerationAndFirstPage, data2.enumerationAndFirstPage);
nvdebug(`RCN ${recordControlNumbers} RP ${relatedParts ? "true" : "false"} EAFP ${enumerationAndFirstPage ? "true" : "false"}`, debugDev);
nvdebug(`SOME RESULT: ${enumerationAndFirstPage && recordControlNumbers && relatedParts ? "true" : "false"}`, debugDev);
return enumerationAndFirstPage && recordControlNumbers && relatedParts;
}
}
export function compare773(recordValuesA = [], recordValuesB = []) {
const f773sA = recordValuesA["773"];
const f773sB = recordValuesB["773"];
return compare773values({ f773sA, f773sB });
}
//# sourceMappingURL=field773.js.map