@natlibfi/melinda-record-match-validator
Version:
Validates if two records matched by melinda-record-matching can be merged and sets merge priority
156 lines (155 loc) • 4.25 kB
JavaScript
import createDebugLogger from "debug";
import moment from "moment";
import { compareValueContent } from "./compareUtils.js";
import { get005, get008 } from "../collectFunctions/collectControlFields.js";
import { nvdebug } from "../utils.js";
const debug = createDebugLogger("@natlibfi/melinda-record-match-validator:collectFunctions:collectControlFields");
const debugDev = debug.extend("dev");
export function compare001(recordValuesA, recordValuesB) {
const f001A = recordValuesA["001"];
const f001B = recordValuesB["001"];
return {
"value": compareValueContent(f001A.value, f001B.value),
"isMelindaId": compareIsMelindaId()
};
function compareIsMelindaId() {
debugDev("%o vs %o", f001A, f001B);
if (f001A.isMelindaId && f001B.isMelindaId) {
debugDev("Both are Melinda ids");
return true;
}
if (f001A.isMelindaId && !f001B.isMelindaId) {
debugDev("Only A is Melinda id");
return "A";
}
if (!f001A.isMelindaId && f001B.isMelindaId) {
debugDev("Only B is Melinda id");
return "B";
}
debugDev("Both are non Melinda ids");
return false;
}
}
export function compare005(recordValuesA, recordValuesB) {
const f005A = recordValuesA["005"];
const f005B = recordValuesB["005"];
return ratef005();
function ratef005() {
debugDev("%o vs %o", f005A, f005B);
if (moment(f005A).isSame(f005B)) {
debugDev("Both have same last modified time");
return true;
}
if (moment(f005A).isAfter(f005B)) {
debugDev("A has been modified more recently");
return "A";
}
debugDev("B has been modified more recently");
return "B";
}
}
function innerCompare008(f008A, f008B) {
nvdebug(`A 008: ${JSON.stringify(f008A)}`);
nvdebug(`B 008: ${JSON.stringify(f008B)}`);
if (!isPairableFormOfItem(f008A.formOfItem.code, f008B.formOfItem.code)) {
return false;
}
const mp06Result = mp06Comparison(f008A.publicationStatus.code, f008B.publicationStatus.code);
if (mp06Result !== true) {
return mp06Result;
}
return true;
function isPairableFormOfItem(formOfItemA, formOfItemB) {
if (formOfItemA === "o" && formOfItemB === "q") {
return false;
}
if (formOfItemA === "q" && formOfItemB === "o") {
return false;
}
return true;
}
function mp06Comparison(mp06A, mp06B) {
if (mp06A === mp06B) {
return true;
}
if (mp06A === "b") {
return "B";
}
if (mp06B === "b") {
return "A";
}
if (mp06A === "|") {
return "B";
}
if (mp06B === "|") {
return "A";
}
const continuingResource = compareContinuingResources(mp06A, mp06B);
if (continuingResource !== false) {
return continuingResource;
}
const scoreA = scoreSinglePart(mp06A);
const scoreB = scoreSinglePart(mp06B);
if (scoreA > -1 && scoreB > -1) {
if (scoreA > scoreB) {
return "A";
}
if (scoreA < scoreB) {
return "B";
}
}
return true;
}
function isUnknownOrContinuingResource(mp06) {
return ["|", "c", "d", "u"].includes(mp06);
}
function compareContinuingResources(mp06A, mp06B) {
if (!isUnknownOrContinuingResource(mp06A) || !isUnknownOrContinuingResource(mp06B)) {
return false;
}
if (mp06A === "d" || mp06B === "|") {
return "A";
}
if (mp06B === "d" || mp06A === "|") {
return "B";
}
return true;
}
}
function scoreSinglePart(mp06) {
if (mp06 === "e" || mp06 === "r" || mp06 === "t") {
return 4;
}
if (mp06 === "p" || mp06 === "s") {
return 3;
}
if (mp06 === "q") {
return 2;
}
if (mp06 === "n") {
return 1;
}
return -1;
}
export function check005({ record1, record2 }) {
const data1 = get005(record1);
const data2 = get005(record2);
const val1 = getYear(data1);
const val2 = getYear(data2);
if (val1 > val2) {
return "A";
}
if (val2 > val1) {
return "B";
}
return true;
function getYear(value) {
return parseInt(value.substr(0, 4), 10);
}
}
export function check008({ record1, record2 }) {
const data1 = get008(record1);
const data2 = get008(record2);
return innerCompare008(data1, data2);
}
//# sourceMappingURL=compareControlFields.js.map