UNPKG

@natlibfi/melinda-record-match-validator

Version:

Validates if two records matched by melinda-record-matching can be merged and sets merge priority

93 lines (85 loc) 3.14 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.checkSID = checkSID; exports.compareSID = compareSID; exports.getSID = getSID; var _debug = _interopRequireDefault(require("debug")); var _collectUtils = require("./collectFunctions/collectUtils"); function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; } //import {nvdebug} from './utils'; const debug = (0, _debug.default)('@natlibfi/melinda-record-match-validator:alephFunctions'); const debugDev = debug.extend('dev'); //const debugData = debug.extend('data'); // Collect SID function getSID(record) { const SIDs = (0, _collectUtils.hasFields)('SID', record).map(field => sidToJson(field)); debugDev('SIDs: %o', SIDs); return SIDs; function sidToJson(sid) { const [database] = sid.subfields.filter(sub => sub.code === 'b').map(sub => sub.value); const [id] = sid.subfields.filter(sub => sub.code === 'c').map(sub => sub.value); return { id, database }; } } // Compare SID function compareSID(recordValuesA, recordValuesB) { const SIDsA = recordValuesA.SID; const SIDsB = recordValuesB.SID; return compareSIDValues(SIDsA, SIDsB); } function compareSIDValues(SIDsA, SIDsB) { debugDev('A: %o vs B: %o', SIDsA, SIDsB); return compareSIDContent(); // eslint-disable-next-line max-statements function compareSIDContent() { if (SIDsB.length === 0) { if (SIDsA.length > 0) { debugDev('SIDs A contains values and B is empty'); return 'A'; } debugDev('Both SIDS are empty'); return true; } if (SIDsA.length === 0) { debugDev('SIDs B contains values and A is empty'); return 'B'; } // Same database & different id => HARD failure if (SIDsA.some(sidA => SIDsB.some(sidB => sidA.database === sidB.database && sidA.id !== sidB.id))) { debugDev('SIDs: same db but diffent ids: fail'); return false; } const onlyA = SIDsA.filter(SIDA => SIDsB.every(SIDB => SIDA.database !== SIDB.database)); const onlyB = SIDsB.filter(SIDB => SIDsA.every(SIDA => SIDA.database !== SIDB.database)); if (onlyA.length === 0 && onlyB.length === 0) { debugDev('SIDs A and B are same'); return true; } // It's union: same result both ways... And anyway we are interested in the different values, not the same ones. //const SIDsBContainsFromA = SIDsA.filter(SIDA => SIDsB.some(SIDB => SIDA.database === SIDB.database && SIDA.id === SIDB.id)); //const SIDsAContainsFromB = SIDsB.filter(SIDB => SIDsA.some(SIDA => SIDA.database === SIDB.database && SIDA.id === SIDB.id)); if (onlyA.length > 0 && onlyB.length === 0) { debugDev('SIDs A contains all values from B'); return 'A'; } if (onlyB.length > 0 && onlyA.length === 0) { debugDev('SIDs B contains all values from A'); return 'B'; } return true; // default to true } } function checkSID({ record1, record2 }) { const fields1 = getSID(record1); const fields2 = getSID(record2); return compareSIDValues(fields1, fields2); } //# sourceMappingURL=fieldSID.js.map