@natlibfi/melinda-record-match-validator
Version:
Validates if two records matched by melinda-record-matching can be merged and sets merge priority
128 lines (127 loc) • 6.95 kB
JavaScript
import createDebugLogger from "debug";
import { compareValueContent, compareArrayContentRequireAll, compareStringToArray } from "./compareUtils.js";
import { getAllTitleFeatures } from "../collectFunctions/collectTitle.js";
const debug = createDebugLogger("@natlibfi/melinda-record-match-validator:title");
const debugDev = debug.extend("dev");
const debugData = debug.extend("data");
export function compareAllTitleFeatures(recordValuesA, recordValuesB) {
const titleA = recordValuesA.title;
const titleB = recordValuesB.title;
debugData("%o vs %o", titleA, titleB);
const result = compareTitleFeatures(titleA, titleB);
return checkTitleComparisonResult(result);
}
function compareTitleFeatures(titleA, titleB) {
if (titleA.titleFeatures === void 0 || titleB.titleFeatures === void 0) {
return checkUndefinedTitle(titleA.titleFeatures, titleB.titleFeaturesB);
}
const combinedFeaturesA = combineTitleFeatures(titleA.titleFeatures);
const combinedFeaturesB = combineTitleFeatures(titleB.titleFeatures);
const combinedFeaturesResult = compareValueContent(combinedFeaturesA, combinedFeaturesB, "245-combined: ");
debugData(`CombinedFeatures: ${JSON.stringify(combinedFeaturesResult)}`);
if (combinedFeaturesResult === true) {
return {
"combinedFeatures": combinedFeaturesResult
};
}
const combinedTitleResult = compareCombinedTitle(titleA, titleB);
debugData(`CombinedTitle: ${JSON.stringify(combinedFeaturesResult)}`);
const f946Result = compareWith946(titleA, titleB, combinedFeaturesA, combinedFeaturesB);
debugData(`F946: ${JSON.stringify(f946Result)}`);
const seriesResult = compareWith490(titleA, titleB, combinedFeaturesA, combinedFeaturesB);
debugData(`Series: ${JSON.stringify(seriesResult)}`);
const titleFeaturesResult = {
"combinedFeatures": combinedFeaturesResult,
"combinedTitle": combinedTitleResult,
"f946": f946Result,
"series": seriesResult,
"nameOfPartInSectionOfAWork": compareArrayContentRequireAll(titleA.titleFeatures.namesOfPartInSectionOfAWork, titleB.titleFeatures.namesOfPartInSectionOfAWork, "245 name: "),
"numberOfPartInSectionOfAWork": compareArrayContentRequireAll(titleA.titleFeatures.numbersOfPartInSectionOfAWork, titleB.titleFeatures.numbersOfPartInSectionOfAWork, "245 number: "),
// Note: we can also get non-false "A" or "B" if one record's title is a subset of another record's title
"title": compareValueContent(titleA.titleFeatures.title, titleB.titleFeatures.title, "245 title: ")
};
return titleFeaturesResult;
}
function checkUndefinedTitle(titleFeaturesA, titleFeaturesB) {
if (titleFeaturesA === void 0 || titleFeaturesB === void 0) {
return {
"undefinedTitleFeatures": false
};
}
return {
"undefinedTitleFeatures": true
};
}
function combineTitleFeatures(titleFeatures) {
return `${titleFeatures.title}${titleFeatures.remainderOfTitle === "undefined" ? "" : " ".concat(titleFeatures.remainderOfTitle)}${titleFeatures.namesOfPartInSectionOfAWork.length > 0 ? " ".concat(titleFeatures.namesOfPartInSectionOfAWork.join(" ")) : ""}${titleFeatures.numbersOfPartInSectionOfAWork.length > 0 ? " ".concat(titleFeatures.numbersOfPartInSectionOfAWork.join(" ")) : ""}`;
}
function combineTitle(titleFeatures) {
return `${titleFeatures.title}${titleFeatures.remainderOfTitle === "undefined" ? "" : " ".concat(titleFeatures.remainderOfTitle)}`;
}
function compareCombinedTitle(titleA, titleB) {
const combinedTitleA = combineTitle(titleA.titleFeatures);
const combinedTitleB = combineTitle(titleB.titleFeatures);
const combinedTitleResult = compareValueContent(combinedTitleA, combinedTitleB, "245-$a+$b: ");
debugData(`combinedTitleResult: ${JSON.stringify(combinedTitleResult)}`);
return combinedTitleResult;
}
function compareWith946(titleA, titleB, combinedFeaturesA, combinedFeaturesB) {
const combined946FeaturesA = combineF946Features(titleA);
debugData(`F946A: ${JSON.stringify(combined946FeaturesA)}`);
const combined946FeaturesB = combineF946Features(titleB);
debugData(`F946B: ${JSON.stringify(combined946FeaturesB)}`);
const compareToF946Result = compareStringToArray(combinedFeaturesA, combined946FeaturesB, "A:245 to B:946: ") || compareStringToArray(combinedFeaturesB, combined946FeaturesA, "B:245 to A:946: ");
debugData(`F946 comparison result: ${JSON.stringify(compareToF946Result)}`);
return compareToF946Result ? compareToF946Result : void 0;
function combineF946Features(title) {
return title.f946Features.map((f946Features) => combineTitleFeatures(f946Features));
}
}
function compareWith490(titleA, titleB, combinedFeaturesA, combinedFeaturesB) {
const combined490TitlesA = combine490Titles(combinedFeaturesA, titleA.seriesFeatures);
debugData(`F490: ${JSON.stringify(combined490TitlesA)}`);
const combined490TitlesB = combine490Titles(combinedFeaturesB, titleB.seriesFeatures);
debugData(`F490: ${JSON.stringify(combined490TitlesB)}`);
const compareTo490Result = compareStringToArray(combinedFeaturesA, combined490TitlesB, "A:245 to B:245+490: ") || compareStringToArray(combinedFeaturesB, combined490TitlesA, "B:245 to A:245+490: ");
debugData(`F490/series comparison result: ${JSON.stringify(compareTo490Result)}`);
return compareTo490Result ? compareTo490Result : void 0;
function combine490Titles(combinedFeatures, seriesFeatures) {
const combResult = seriesFeatures.map((seriesFeature) => combineSeriesFeature(combinedFeatures, seriesFeature));
return combResult.flat();
}
function combineSeriesFeature(combinedFeatures, seriesFeature) {
const combArray = [
`${combinedFeatures} ${seriesFeature.seriesTitle}`,
`${combinedFeatures} ${seriesFeature.seriesTitle}${seriesFeature.seriesNumber === "undefined" ? "" : " ".concat(seriesFeature.seriesNumber)}`,
`${seriesFeature.seriesTitle} ${combinedFeatures}`,
`${seriesFeature.seriesTitle}${seriesFeature.seriesNumber === "undefined" ? "" : " ".concat(seriesFeature.seriesNumber)} ${combinedFeatures}`
];
return [...new Set(combArray)];
}
}
function checkTitleComparisonResult(result) {
debugDev(`checkTitleComparisonResult: ${JSON.stringify(result)}`);
if (result.undefinedTitleFeatures !== void 0 && result.undefinedTitleFeatures !== true) {
return result.undefinedTitleFeatures;
}
if (result.combinedFeatures === true) {
return true;
}
if (result.title === false || result.numberOfPartInSectionOfAWork === false || result.nameOfPartInSectionOfAWork === false) {
if (result.series === true || result.f946 === true) {
return true;
}
return false;
}
return true;
}
export function checkAllTitleFeatures({ record1, record2 }) {
const recordValuesA = {
title: getAllTitleFeatures(record1)
};
const recordValuesB = {
title: getAllTitleFeatures(record2)
};
return compareAllTitleFeatures(recordValuesA, recordValuesB);
}
//# sourceMappingURL=compareTitle.js.map