UNPKG

@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
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