@natlibfi/melinda-record-matching 4.3.5 → 5.0.0-alpha.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.github/workflows/melinda-node-tests.yml +11 -7
- package/eslint.config.js +52 -0
- package/example.env +4 -0
- package/package.json +22 -90
- package/src/candidate-search/choose-queries.js +1 -3
- package/src/candidate-search/index.js +63 -89
- package/src/candidate-search/{index.spec.js → index.test.js} +19 -18
- package/src/candidate-search/query-list/bib.js +10 -4
- package/src/candidate-search/query-list/{bib.spec.js → bib.test.js} +8 -7
- package/src/candidate-search/query-list/component.js +127 -0
- package/src/candidate-search/query-list/index.js +23 -9
- package/src/cli.js +177 -0
- package/src/index.js +22 -37
- package/src/{index.spec.js → index.test.js} +11 -14
- package/src/match-detection/features/bib/all-source-ids.js +2 -2
- package/src/match-detection/features/bib/authors.js +3 -2
- package/src/match-detection/features/bib/index.js +16 -16
- package/src/match-detection/features/bib/{index.spec.js → index.test.js} +7 -6
- package/src/match-detection/features/bib/isbn.js +2 -2
- package/src/match-detection/features/bib/issn.js +1 -1
- package/src/match-detection/features/bib/language.js +5 -5
- package/src/match-detection/features/bib/media-type.js +1 -1
- package/src/match-detection/features/bib/melinda-id.js +1 -1
- package/src/match-detection/features/bib/melinda-identifier-factory.js +5 -5
- package/src/match-detection/features/bib/other-standard-identifier.js +1 -1
- package/src/match-detection/features/bib/publication-time-allow-cons-years-multi.js +6 -6
- package/src/match-detection/features/bib/publication-time-allow-cons-years.js +1 -1
- package/src/match-detection/features/bib/publication-time.js +1 -1
- package/src/match-detection/features/bib/standard-identifier-factory.js +1 -2
- package/src/match-detection/features/bib/title-version-original.js +2 -1
- package/src/match-detection/features/bib/title.js +6 -5
- package/src/match-detection/features/index.js +1 -1
- package/src/match-detection/index.js +1 -1
- package/src/match-detection/{index.spec.js → index.test.js} +9 -8
- package/src/matching-utils.js +8 -9
- package/dist/candidate-search/candidate-search-utils.js +0 -29
- package/dist/candidate-search/candidate-search-utils.js.map +0 -1
- package/dist/candidate-search/choose-queries.js +0 -122
- package/dist/candidate-search/choose-queries.js.map +0 -1
- package/dist/candidate-search/index.js +0 -260
- package/dist/candidate-search/index.js.map +0 -1
- package/dist/candidate-search/index.spec.js +0 -133
- package/dist/candidate-search/index.spec.js.map +0 -1
- package/dist/candidate-search/query-list/bib.js +0 -458
- package/dist/candidate-search/query-list/bib.js.map +0 -1
- package/dist/candidate-search/query-list/bib.spec.js +0 -46
- package/dist/candidate-search/query-list/bib.spec.js.map +0 -1
- package/dist/candidate-search/query-list/index.js +0 -47
- package/dist/candidate-search/query-list/index.js.map +0 -1
- package/dist/index.js +0 -555
- package/dist/index.js.map +0 -1
- package/dist/index.spec.js +0 -99
- package/dist/index.spec.js.map +0 -1
- package/dist/match-detection/features/bib/all-source-ids.js +0 -91
- package/dist/match-detection/features/bib/all-source-ids.js.map +0 -1
- package/dist/match-detection/features/bib/authors.js +0 -86
- package/dist/match-detection/features/bib/authors.js.map +0 -1
- package/dist/match-detection/features/bib/bibliographic-level.js +0 -15
- package/dist/match-detection/features/bib/bibliographic-level.js.map +0 -1
- package/dist/match-detection/features/bib/host-component.js +0 -15
- package/dist/match-detection/features/bib/host-component.js.map +0 -1
- package/dist/match-detection/features/bib/index.js +0 -119
- package/dist/match-detection/features/bib/index.js.map +0 -1
- package/dist/match-detection/features/bib/index.spec.js +0 -65
- package/dist/match-detection/features/bib/index.spec.js.map +0 -1
- package/dist/match-detection/features/bib/isbn.js +0 -49
- package/dist/match-detection/features/bib/isbn.js.map +0 -1
- package/dist/match-detection/features/bib/issn.js +0 -24
- package/dist/match-detection/features/bib/issn.js.map +0 -1
- package/dist/match-detection/features/bib/language.js +0 -113
- package/dist/match-detection/features/bib/language.js.map +0 -1
- package/dist/match-detection/features/bib/media-type.js +0 -56
- package/dist/match-detection/features/bib/media-type.js.map +0 -1
- package/dist/match-detection/features/bib/melinda-id.js +0 -21
- package/dist/match-detection/features/bib/melinda-id.js.map +0 -1
- package/dist/match-detection/features/bib/melinda-identifier-factory.js +0 -62
- package/dist/match-detection/features/bib/melinda-identifier-factory.js.map +0 -1
- package/dist/match-detection/features/bib/other-standard-identifier.js +0 -25
- package/dist/match-detection/features/bib/other-standard-identifier.js.map +0 -1
- package/dist/match-detection/features/bib/publication-time-allow-cons-years-multi.js +0 -229
- package/dist/match-detection/features/bib/publication-time-allow-cons-years-multi.js.map +0 -1
- package/dist/match-detection/features/bib/publication-time-allow-cons-years.js +0 -44
- package/dist/match-detection/features/bib/publication-time-allow-cons-years.js.map +0 -1
- package/dist/match-detection/features/bib/publication-time.js +0 -21
- package/dist/match-detection/features/bib/publication-time.js.map +0 -1
- package/dist/match-detection/features/bib/record-type.js +0 -18
- package/dist/match-detection/features/bib/record-type.js.map +0 -1
- package/dist/match-detection/features/bib/standard-identifier-factory.js +0 -188
- package/dist/match-detection/features/bib/standard-identifier-factory.js.map +0 -1
- package/dist/match-detection/features/bib/title-version-original.js +0 -52
- package/dist/match-detection/features/bib/title-version-original.js.map +0 -1
- package/dist/match-detection/features/bib/title.js +0 -70
- package/dist/match-detection/features/bib/title.js.map +0 -1
- package/dist/match-detection/features/index.js +0 -11
- package/dist/match-detection/features/index.js.map +0 -1
- package/dist/match-detection/index.js +0 -174
- package/dist/match-detection/index.js.map +0 -1
- package/dist/match-detection/index.spec.js +0 -63
- package/dist/match-detection/index.spec.js.map +0 -1
- package/dist/matching-utils.js +0 -115
- package/dist/matching-utils.js.map +0 -1
package/dist/index.spec.js
DELETED
|
@@ -1,99 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
|
|
3
|
-
var _chai = require("chai");
|
|
4
|
-
var _fixura = require("@natlibfi/fixura");
|
|
5
|
-
var _fixugenHttpClient = _interopRequireDefault(require("@natlibfi/fixugen-http-client"));
|
|
6
|
-
var _marcRecord = require("@natlibfi/marc-record");
|
|
7
|
-
var _ = _interopRequireWildcard(require("."));
|
|
8
|
-
var _debug = _interopRequireDefault(require("debug"));
|
|
9
|
-
function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function (e) { return e ? t : r; })(e); }
|
|
10
|
-
function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != typeof e && "function" != typeof e) return { default: e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && {}.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n.default = e, t && t.set(e, n), n; }
|
|
11
|
-
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
|
|
12
|
-
const debug = (0, _debug.default)('@natlibfi/melinda-record-matching:index:test');
|
|
13
|
-
const debugData = debug.extend('data');
|
|
14
|
-
describe('INDEX', () => {
|
|
15
|
-
(0, _fixugenHttpClient.default)({
|
|
16
|
-
callback,
|
|
17
|
-
path: [__dirname, '..', 'test-fixtures', 'index'],
|
|
18
|
-
recurse: false,
|
|
19
|
-
fixura: {
|
|
20
|
-
reader: _fixura.READERS.JSON
|
|
21
|
-
}
|
|
22
|
-
});
|
|
23
|
-
|
|
24
|
-
// eslint-disable-next-line max-statements
|
|
25
|
-
async function callback({
|
|
26
|
-
getFixture,
|
|
27
|
-
options,
|
|
28
|
-
expectedMatchStatus,
|
|
29
|
-
expectedStopReason,
|
|
30
|
-
expectedFailures,
|
|
31
|
-
expectedCandidateCount
|
|
32
|
-
}) {
|
|
33
|
-
const record = new _marcRecord.MarcRecord(getFixture('inputRecord.json'), {
|
|
34
|
-
subfieldValues: false
|
|
35
|
-
});
|
|
36
|
-
const expectedMatches = getFixture('expectedMatches.json');
|
|
37
|
-
const expectedNonMatches = getFixture('expectedNonMatches.json') || [];
|
|
38
|
-
const match = (0, _.default)(formatOptions());
|
|
39
|
-
const {
|
|
40
|
-
matches,
|
|
41
|
-
matchStatus,
|
|
42
|
-
nonMatches,
|
|
43
|
-
conversionFailures,
|
|
44
|
-
candidateCount
|
|
45
|
-
} = await match({
|
|
46
|
-
record
|
|
47
|
-
});
|
|
48
|
-
debugData(`Matches: ${matches.length}, Status: ${matchStatus.status}/${matchStatus.stopReason}, NonMatches: ${nonMatches ? nonMatches.length : 'not returned'}, ConversionFailures: ${conversionFailures ? conversionFailures.length : 'not returned'}`);
|
|
49
|
-
(0, _chai.expect)(matchStatus.status).to.eql(expectedMatchStatus);
|
|
50
|
-
(0, _chai.expect)(matchStatus.stopReason).to.eql(expectedStopReason);
|
|
51
|
-
(0, _chai.expect)(candidateCount).to.eql(expectedCandidateCount);
|
|
52
|
-
const formattedMatchResult = formatRecordResults(matches);
|
|
53
|
-
(0, _chai.expect)(formattedMatchResult).to.eql(expectedMatches);
|
|
54
|
-
const formattedNonMatchResult = formatRecordResults(nonMatches);
|
|
55
|
-
(0, _chai.expect)(formattedNonMatchResult).to.eql(expectedNonMatches);
|
|
56
|
-
|
|
57
|
-
// eslint-disable-next-line functional/no-conditional-statements
|
|
58
|
-
if (expectedFailures) {
|
|
59
|
-
(0, _chai.expect)(conversionFailures).to.eql(expectedFailures);
|
|
60
|
-
}
|
|
61
|
-
function formatOptions() {
|
|
62
|
-
const contextFeatures = _.matchDetection.features[options.detection.strategy.type];
|
|
63
|
-
return {
|
|
64
|
-
...options,
|
|
65
|
-
search: {
|
|
66
|
-
...options.search
|
|
67
|
-
},
|
|
68
|
-
detection: {
|
|
69
|
-
...options.detect,
|
|
70
|
-
strategy: options.detection.strategy.features.map(v => contextFeatures[v]())
|
|
71
|
-
}
|
|
72
|
-
};
|
|
73
|
-
}
|
|
74
|
-
function formatRecordResults(matches) {
|
|
75
|
-
if (matches) {
|
|
76
|
-
debugData(JSON.stringify(matches));
|
|
77
|
-
return matches.map(match => ({
|
|
78
|
-
...match,
|
|
79
|
-
candidate: formatCandidate(match.candidate)
|
|
80
|
-
}));
|
|
81
|
-
}
|
|
82
|
-
return [];
|
|
83
|
-
}
|
|
84
|
-
|
|
85
|
-
// Format candidate to remove validationOptions from record
|
|
86
|
-
function formatCandidate({
|
|
87
|
-
id,
|
|
88
|
-
record
|
|
89
|
-
}) {
|
|
90
|
-
const newId = id;
|
|
91
|
-
const newRecord = record;
|
|
92
|
-
return {
|
|
93
|
-
id: newId,
|
|
94
|
-
record: newRecord.toObject()
|
|
95
|
-
};
|
|
96
|
-
}
|
|
97
|
-
}
|
|
98
|
-
});
|
|
99
|
-
//# sourceMappingURL=index.spec.js.map
|
package/dist/index.spec.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.spec.js","names":["_chai","require","_fixura","_fixugenHttpClient","_interopRequireDefault","_marcRecord","_","_interopRequireWildcard","_debug","_getRequireWildcardCache","e","WeakMap","r","t","__esModule","default","has","get","n","__proto__","a","Object","defineProperty","getOwnPropertyDescriptor","u","hasOwnProperty","call","i","set","debug","createDebugLogger","debugData","extend","describe","generateTests","callback","path","__dirname","recurse","fixura","reader","READERS","JSON","getFixture","options","expectedMatchStatus","expectedStopReason","expectedFailures","expectedCandidateCount","record","MarcRecord","subfieldValues","expectedMatches","expectedNonMatches","match","createMatchInterface","formatOptions","matches","matchStatus","nonMatches","conversionFailures","candidateCount","length","status","stopReason","expect","to","eql","formattedMatchResult","formatRecordResults","formattedNonMatchResult","contextFeatures","matchDetection","features","detection","strategy","type","search","detect","map","v","stringify","candidate","formatCandidate","id","newId","newRecord","toObject"],"sources":["../src/index.spec.js"],"sourcesContent":["import {expect} from 'chai';\nimport {READERS} from '@natlibfi/fixura';\nimport generateTests from '@natlibfi/fixugen-http-client';\nimport {MarcRecord} from '@natlibfi/marc-record';\nimport createMatchInterface, {matchDetection} from '.';\nimport createDebugLogger from 'debug';\n\nconst debug = createDebugLogger('@natlibfi/melinda-record-matching:index:test');\nconst debugData = debug.extend('data');\n\ndescribe('INDEX', () => {\n generateTests({\n callback,\n path: [__dirname, '..', 'test-fixtures', 'index'],\n recurse: false,\n fixura: {\n reader: READERS.JSON\n }\n });\n\n // eslint-disable-next-line max-statements\n async function callback({getFixture, options, expectedMatchStatus, expectedStopReason, expectedFailures, expectedCandidateCount}) {\n\n const record = new MarcRecord(getFixture('inputRecord.json'), {subfieldValues: false});\n const expectedMatches = getFixture('expectedMatches.json');\n const expectedNonMatches = getFixture('expectedNonMatches.json') || [];\n\n\n const match = createMatchInterface(formatOptions());\n const {matches, matchStatus, nonMatches, conversionFailures, candidateCount} = await match({record});\n debugData(`Matches: ${matches.length}, Status: ${matchStatus.status}/${matchStatus.stopReason}, NonMatches: ${nonMatches ? nonMatches.length : 'not returned'}, ConversionFailures: ${conversionFailures ? conversionFailures.length : 'not returned'}`);\n\n expect(matchStatus.status).to.eql(expectedMatchStatus);\n expect(matchStatus.stopReason).to.eql(expectedStopReason);\n expect(candidateCount).to.eql(expectedCandidateCount);\n\n const formattedMatchResult = formatRecordResults(matches);\n expect(formattedMatchResult).to.eql(expectedMatches);\n\n const formattedNonMatchResult = formatRecordResults(nonMatches);\n expect(formattedNonMatchResult).to.eql(expectedNonMatches);\n\n // eslint-disable-next-line functional/no-conditional-statements\n if (expectedFailures) {\n expect(conversionFailures).to.eql(expectedFailures);\n }\n\n function formatOptions() {\n const contextFeatures = matchDetection.features[options.detection.strategy.type];\n\n return {\n ...options,\n search: {\n ...options.search\n },\n detection: {\n ...options.detect,\n strategy: options.detection.strategy.features.map(v => contextFeatures[v]())\n }\n };\n }\n\n function formatRecordResults(matches) {\n if (matches) {\n debugData(JSON.stringify(matches));\n return matches.map((match) => ({\n ...match,\n candidate: formatCandidate(match.candidate)\n }));\n }\n return [];\n }\n\n // Format candidate to remove validationOptions from record\n function formatCandidate({id, record}) {\n const newId = id;\n const newRecord = record;\n return {\n id: newId,\n record: newRecord.toObject()\n };\n }\n\n\n }\n\n});\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -1,91 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
|
|
3
|
-
Object.defineProperty(exports, "__esModule", {
|
|
4
|
-
value: true
|
|
5
|
-
});
|
|
6
|
-
exports.default = void 0;
|
|
7
|
-
var _debug = _interopRequireDefault(require("debug"));
|
|
8
|
-
var _matchingUtils = require("../../../matching-utils");
|
|
9
|
-
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
|
|
10
|
-
const debug = (0, _debug.default)('@natlibfi/melinda-record-matching:match-detection:features:all-source-ids');
|
|
11
|
-
const debugData = debug.extend('data');
|
|
12
|
-
|
|
13
|
-
/*
|
|
14
|
-
|
|
15
|
-
SID-fields in Melinda have sf $c with local id and sf $b with a code for the local db:
|
|
16
|
-
|
|
17
|
-
SID__ $c 123457 $b helka
|
|
18
|
-
SID__ $c (ANDL100020)1077305 $b sata
|
|
19
|
-
SID__ $c VER999999 $ FI-KV
|
|
20
|
-
|
|
21
|
-
allSourceIds matching feature is formatted as [{sourceDb: "helka", sourceId: "123457"}, {sourceDb: "sata", sourceId: "(ANDL100020)1077305"}, {sourceDb: "FI-KV", sourceId: "VER999999"}]
|
|
22
|
-
- no normalization / prefix deletions etc. in the feature
|
|
23
|
-
|
|
24
|
-
Note: All Melinda records that have a matching records in a local db do NOT have SID for that local records,
|
|
25
|
-
existence of a SID field depends on how the record has been added to Melinda and how it has been handled
|
|
26
|
-
afterwards. SIDs are also not reliably maintained. A record might or might not have a SID for a local db
|
|
27
|
-
after the matching record is removed from the local db.
|
|
28
|
-
|
|
29
|
-
Records with mismatching local ids for matching local db are a strong mismatch.
|
|
30
|
-
Records with matching local ids for matching local db are a very good match.
|
|
31
|
-
|
|
32
|
-
*/
|
|
33
|
-
var _default = () => ({
|
|
34
|
-
name: 'All source IDs',
|
|
35
|
-
extract: ({
|
|
36
|
-
record,
|
|
37
|
-
recordExternal
|
|
38
|
-
}) => {
|
|
39
|
-
const label = recordExternal && recordExternal.label ? recordExternal.label : 'record';
|
|
40
|
-
debug(`Creating match detection features for all local source id's for ${label}`);
|
|
41
|
-
const fSids = record.get('SID');
|
|
42
|
-
debugData(`SID-fields (${fSids.length}): ${JSON.stringify(fSids)}`);
|
|
43
|
-
const sidFeatures = getSidFeatures(fSids);
|
|
44
|
-
debugData(`SID-features (${sidFeatures.length}): ${JSON.stringify(sidFeatures)}`);
|
|
45
|
-
return sidFeatures;
|
|
46
|
-
function getSidFeatures(fSids) {
|
|
47
|
-
debug(`Getting Sid strings from SID fields`);
|
|
48
|
-
|
|
49
|
-
// Map SID fields to sidFeatures, filter out empty strings
|
|
50
|
-
const sidFeatures = fSids.map(toSidFeature).filter(nonEmptySid => nonEmptySid);
|
|
51
|
-
return sidFeatures;
|
|
52
|
-
function toSidFeature(field) {
|
|
53
|
-
debug(`Getting feature from a field`);
|
|
54
|
-
return (0, _matchingUtils.validateSidFieldSubfieldCounts)(field) ? createSidFeature(field) : '';
|
|
55
|
-
function createSidFeature(field) {
|
|
56
|
-
debug(`Creating feature from a field`);
|
|
57
|
-
const [sfC] = (0, _matchingUtils.getSubfieldValues)(field, 'c');
|
|
58
|
-
const [sfB] = (0, _matchingUtils.getSubfieldValues)(field, 'b');
|
|
59
|
-
debugData(`${JSON.stringify(sfC)} + ${JSON.stringify(sfB)}`);
|
|
60
|
-
debugData(`sourceDb: ${sfB}, sourceId: ${sfC}`);
|
|
61
|
-
return {
|
|
62
|
-
'sourceDb': sfB,
|
|
63
|
-
'sourceId': sfC
|
|
64
|
-
};
|
|
65
|
-
}
|
|
66
|
-
}
|
|
67
|
-
}
|
|
68
|
-
},
|
|
69
|
-
compare: (a, b) => {
|
|
70
|
-
debugData(`Comparing ${JSON.stringify(a)} and ${JSON.stringify(b)}`);
|
|
71
|
-
const matches = a.filter(sidA => b.some(sidB => sidA.sourceDb === sidB.sourceDb && sidA.sourceId === sidB.sourceId));
|
|
72
|
-
debugData(`Matches (${matches.length}): ${JSON.stringify(matches)}`);
|
|
73
|
-
const mismatches = a.filter(sidA => b.some(sidB => sidA.sourceDb === sidB.sourceDb && sidA.sourceId !== sidB.sourceId));
|
|
74
|
-
debugData(`Mismatches (${mismatches.length}): ${JSON.stringify(mismatches)}`);
|
|
75
|
-
|
|
76
|
-
// If there's at least one mismatching source ID from matching source db
|
|
77
|
-
if (mismatches.length > 0) {
|
|
78
|
-
return -1;
|
|
79
|
-
}
|
|
80
|
-
|
|
81
|
-
// If there's at least one matching source ID from matching source db
|
|
82
|
-
if (matches.length > 0) {
|
|
83
|
-
return 1;
|
|
84
|
-
}
|
|
85
|
-
|
|
86
|
-
// If there are no source IDs with matching sources
|
|
87
|
-
return 0;
|
|
88
|
-
}
|
|
89
|
-
});
|
|
90
|
-
exports.default = _default;
|
|
91
|
-
//# sourceMappingURL=all-source-ids.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"all-source-ids.js","names":["_debug","_interopRequireDefault","require","_matchingUtils","e","__esModule","default","debug","createDebugLogger","debugData","extend","_default","name","extract","record","recordExternal","label","fSids","get","length","JSON","stringify","sidFeatures","getSidFeatures","map","toSidFeature","filter","nonEmptySid","field","validateSidFieldSubfieldCounts","createSidFeature","sfC","getSubfieldValues","sfB","compare","a","b","matches","sidA","some","sidB","sourceDb","sourceId","mismatches","exports"],"sources":["../../../../src/match-detection/features/bib/all-source-ids.js"],"sourcesContent":["\nimport createDebugLogger from 'debug';\nimport {validateSidFieldSubfieldCounts, getSubfieldValues} from '../../../matching-utils';\n\nconst debug = createDebugLogger('@natlibfi/melinda-record-matching:match-detection:features:all-source-ids');\nconst debugData = debug.extend('data');\n\n/*\n\nSID-fields in Melinda have sf $c with local id and sf $b with a code for the local db:\n\n SID__ $c 123457 $b helka\n SID__ $c (ANDL100020)1077305 $b sata\n SID__ $c VER999999 $ FI-KV\n\nallSourceIds matching feature is formatted as [{sourceDb: \"helka\", sourceId: \"123457\"}, {sourceDb: \"sata\", sourceId: \"(ANDL100020)1077305\"}, {sourceDb: \"FI-KV\", sourceId: \"VER999999\"}]\n- no normalization / prefix deletions etc. in the feature\n\nNote: All Melinda records that have a matching records in a local db do NOT have SID for that local records,\n existence of a SID field depends on how the record has been added to Melinda and how it has been handled\n afterwards. SIDs are also not reliably maintained. A record might or might not have a SID for a local db\n after the matching record is removed from the local db.\n\nRecords with mismatching local ids for matching local db are a strong mismatch.\nRecords with matching local ids for matching local db are a very good match.\n\n*/\n\nexport default () => ({\n name: 'All source IDs',\n extract: ({record, recordExternal}) => {\n const label = recordExternal && recordExternal.label ? recordExternal.label : 'record';\n debug(`Creating match detection features for all local source id's for ${label}`);\n\n const fSids = record.get('SID');\n debugData(`SID-fields (${fSids.length}): ${JSON.stringify(fSids)}`);\n\n const sidFeatures = getSidFeatures(fSids);\n debugData(`SID-features (${sidFeatures.length}): ${JSON.stringify(sidFeatures)}`);\n\n return sidFeatures;\n\n function getSidFeatures(fSids) {\n debug(`Getting Sid strings from SID fields`);\n\n // Map SID fields to sidFeatures, filter out empty strings\n const sidFeatures = fSids.map(toSidFeature).filter(nonEmptySid => nonEmptySid);\n return sidFeatures;\n\n function toSidFeature(field) {\n debug(`Getting feature from a field`);\n\n return validateSidFieldSubfieldCounts(field) ? createSidFeature(field) : '';\n\n function createSidFeature(field) {\n debug(`Creating feature from a field`);\n const [sfC] = getSubfieldValues(field, 'c');\n const [sfB] = getSubfieldValues(field, 'b');\n\n debugData(`${JSON.stringify(sfC)} + ${JSON.stringify(sfB)}`);\n debugData(`sourceDb: ${sfB}, sourceId: ${sfC}`);\n return {'sourceDb': sfB, 'sourceId': sfC};\n }\n }\n\n }\n\n },\n compare: (a, b) => {\n\n debugData(`Comparing ${JSON.stringify(a)} and ${JSON.stringify(b)}`);\n\n const matches = a.filter(sidA => b.some(sidB => sidA.sourceDb === sidB.sourceDb &&\n sidA.sourceId === sidB.sourceId));\n debugData(`Matches (${matches.length}): ${JSON.stringify(matches)}`);\n\n const mismatches = a.filter(sidA => b.some(sidB => sidA.sourceDb === sidB.sourceDb &&\n sidA.sourceId !== sidB.sourceId));\n debugData(`Mismatches (${mismatches.length}): ${JSON.stringify(mismatches)}`);\n\n // If there's at least one mismatching source ID from matching source db\n if (mismatches.length > 0) {\n return -1;\n }\n\n // If there's at least one matching source ID from matching source db\n if (matches.length > 0) {\n return 1;\n }\n\n // If there are no source IDs with matching sources\n return 0;\n\n }\n});\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -1,86 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
|
|
3
|
-
Object.defineProperty(exports, "__esModule", {
|
|
4
|
-
value: true
|
|
5
|
-
});
|
|
6
|
-
exports.default = void 0;
|
|
7
|
-
var _natural = require("natural");
|
|
8
|
-
var _matchingUtils = require("../../../matching-utils");
|
|
9
|
-
// We should extract also organisational authors (110/710)
|
|
10
|
-
var _default = ({
|
|
11
|
-
nameTreshold = 10
|
|
12
|
-
} = {}) => ({
|
|
13
|
-
name: 'Authors',
|
|
14
|
-
extract: ({
|
|
15
|
-
record
|
|
16
|
-
}) => {
|
|
17
|
-
//const label = recordExternal && recordExternal.label ? recordExternal.label : 'record';
|
|
18
|
-
const authors = record.get(/^(?<def>100|700)$/u).map(({
|
|
19
|
-
subfields
|
|
20
|
-
}) => {
|
|
21
|
-
return subfields.filter(({
|
|
22
|
-
code,
|
|
23
|
-
value
|
|
24
|
-
}) => code && value).filter(({
|
|
25
|
-
code
|
|
26
|
-
}) => ['a', '0'].includes(code)).map(toObj).reduce((acc, v) => ({
|
|
27
|
-
...acc,
|
|
28
|
-
...v
|
|
29
|
-
}), {});
|
|
30
|
-
function toObj({
|
|
31
|
-
code,
|
|
32
|
-
value
|
|
33
|
-
}) {
|
|
34
|
-
if (code === 'a') {
|
|
35
|
-
return {
|
|
36
|
-
name: (0, _matchingUtils.testStringOrNumber)(value) ? String(value).replace(/[^\p{Letter}\p{Number}]/gu, '').toLowerCase() : ''
|
|
37
|
-
};
|
|
38
|
-
}
|
|
39
|
-
return {
|
|
40
|
-
id: value
|
|
41
|
-
};
|
|
42
|
-
}
|
|
43
|
-
});
|
|
44
|
-
return authors;
|
|
45
|
-
},
|
|
46
|
-
compare: (a, b) => {
|
|
47
|
-
const maxAuthors = a.length > b.length ? a.length : b.length;
|
|
48
|
-
const matchingIds = findMatchingIds();
|
|
49
|
-
if (maxAuthors >= 3 && matchingIds >= 3) {
|
|
50
|
-
return 0.3;
|
|
51
|
-
}
|
|
52
|
-
const matchingNames = findMatchingNames();
|
|
53
|
-
const idPoints = matchingIds / maxAuthors * 0.3;
|
|
54
|
-
const namePoints = matchingNames / maxAuthors * 0.2;
|
|
55
|
-
const totalPoints = idPoints + namePoints;
|
|
56
|
-
return totalPoints <= 0.2 ? totalPoints : 0.2;
|
|
57
|
-
function findMatchingIds() {
|
|
58
|
-
return findMatches('id', (a, b) => a === b);
|
|
59
|
-
}
|
|
60
|
-
function findMatchingNames() {
|
|
61
|
-
return findMatches('name', (a, b) => {
|
|
62
|
-
const distance = (0, _natural.LevenshteinDistance)(a, b);
|
|
63
|
-
if (distance === 0) {
|
|
64
|
-
return true;
|
|
65
|
-
}
|
|
66
|
-
const maxLength = getMaxLength();
|
|
67
|
-
const percentage = distance / maxLength * 100;
|
|
68
|
-
return percentage <= nameTreshold;
|
|
69
|
-
function getMaxLength() {
|
|
70
|
-
return a.length > b.length ? a.length : b.length;
|
|
71
|
-
}
|
|
72
|
-
});
|
|
73
|
-
}
|
|
74
|
-
function findMatches(key, cb) {
|
|
75
|
-
const valuesA = a.filter(o => o[key]).map(o => o[key]);
|
|
76
|
-
const valuesB = b.filter(o => o[key]).map(o => o[key]);
|
|
77
|
-
const allValues = valuesA.concat(valuesB);
|
|
78
|
-
return allValues.reduce((acc, value) => {
|
|
79
|
-
const occurrance = allValues.filter(otherValue => cb(value, otherValue)).length;
|
|
80
|
-
return occurrance >= 2 ? acc + 1 : acc;
|
|
81
|
-
}, 0);
|
|
82
|
-
}
|
|
83
|
-
}
|
|
84
|
-
});
|
|
85
|
-
exports.default = _default;
|
|
86
|
-
//# sourceMappingURL=authors.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"authors.js","names":["_natural","require","_matchingUtils","_default","nameTreshold","name","extract","record","authors","get","map","subfields","filter","code","value","includes","toObj","reduce","acc","v","testStringOrNumber","String","replace","toLowerCase","id","compare","a","b","maxAuthors","length","matchingIds","findMatchingIds","matchingNames","findMatchingNames","idPoints","namePoints","totalPoints","findMatches","distance","leven","maxLength","getMaxLength","percentage","key","cb","valuesA","o","valuesB","allValues","concat","occurrance","otherValue","exports","default"],"sources":["../../../../src/match-detection/features/bib/authors.js"],"sourcesContent":["\n\nimport {LevenshteinDistance as leven} from 'natural';\nimport {testStringOrNumber} from '../../../matching-utils';\n\n// We should extract also organisational authors (110/710)\n\nexport default ({nameTreshold = 10} = {}) => ({\n name: 'Authors',\n extract: ({record}) => {\n //const label = recordExternal && recordExternal.label ? recordExternal.label : 'record';\n const authors = record.get(/^(?<def>100|700)$/u)\n .map(({subfields}) => {\n return subfields\n .filter(({code, value}) => code && value)\n .filter(({code}) => ['a', '0'].includes(code))\n .map(toObj)\n .reduce((acc, v) => ({...acc, ...v}), {});\n\n function toObj({code, value}) {\n if (code === 'a') {\n return {name: testStringOrNumber(value) ? String(value).replace(/[^\\p{Letter}\\p{Number}]/gu, '').toLowerCase() : ''};\n }\n\n return {id: value};\n }\n });\n return authors;\n },\n compare: (a, b) => {\n const maxAuthors = a.length > b.length ? a.length : b.length;\n const matchingIds = findMatchingIds();\n\n if (maxAuthors >= 3 && matchingIds >= 3) {\n return 0.3;\n }\n\n const matchingNames = findMatchingNames();\n const idPoints = matchingIds / maxAuthors * 0.3;\n const namePoints = matchingNames / maxAuthors * 0.2;\n const totalPoints = idPoints + namePoints;\n\n return totalPoints <= 0.2 ? totalPoints : 0.2;\n\n function findMatchingIds() {\n return findMatches('id', (a, b) => a === b);\n }\n\n function findMatchingNames() {\n return findMatches('name', (a, b) => {\n const distance = leven(a, b);\n\n if (distance === 0) {\n return true;\n }\n\n const maxLength = getMaxLength();\n const percentage = distance / maxLength * 100;\n\n return percentage <= nameTreshold;\n\n function getMaxLength() {\n return a.length > b.length ? a.length : b.length;\n }\n });\n }\n\n function findMatches(key, cb) {\n const valuesA = a.filter(o => o[key]).map(o => o[key]);\n const valuesB = b.filter(o => o[key]).map(o => o[key]);\n const allValues = valuesA.concat(valuesB);\n\n return allValues.reduce((acc, value) => {\n const occurrance = allValues.filter(otherValue => cb(value, otherValue)).length;\n return occurrance >= 2 ? acc + 1 : acc;\n }, 0);\n }\n }\n});\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -1,15 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
|
|
3
|
-
Object.defineProperty(exports, "__esModule", {
|
|
4
|
-
value: true
|
|
5
|
-
});
|
|
6
|
-
exports.default = void 0;
|
|
7
|
-
var _default = () => ({
|
|
8
|
-
name: 'Bibliographic level',
|
|
9
|
-
extract: ({
|
|
10
|
-
record
|
|
11
|
-
}) => record.leader[7] ? [record.leader[7]] : [],
|
|
12
|
-
compare: (a, b) => a[0] === b[0] ? 0.1 : -0.2
|
|
13
|
-
});
|
|
14
|
-
exports.default = _default;
|
|
15
|
-
//# sourceMappingURL=bibliographic-level.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"bibliographic-level.js","names":["_default","name","extract","record","leader","compare","a","b","exports","default"],"sources":["../../../../src/match-detection/features/bib/bibliographic-level.js"],"sourcesContent":["\nexport default () => ({\n name: 'Bibliographic level',\n extract: ({record}) => record.leader[7] ? [record.leader[7]] : [],\n compare: (a, b) => a[0] === b[0] ? 0.1 : -0.2\n});\n"],"mappings":";;;;;;eACeA,CAAA,MAAO;EACpBC,IAAI,EAAE,qBAAqB;EAC3BC,OAAO,EAAEA,CAAC;IAACC;EAAM,CAAC,KAAKA,MAAM,CAACC,MAAM,CAAC,CAAC,CAAC,GAAG,CAACD,MAAM,CAACC,MAAM,CAAC,CAAC,CAAC,CAAC,GAAG,EAAE;EACjEC,OAAO,EAAEA,CAACC,CAAC,EAAEC,CAAC,KAAKD,CAAC,CAAC,CAAC,CAAC,KAAKC,CAAC,CAAC,CAAC,CAAC,GAAG,GAAG,GAAG,CAAC;AAC5C,CAAC,CAAC;AAAAC,OAAA,CAAAC,OAAA,GAAAT,QAAA","ignoreList":[]}
|
|
@@ -1,15 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
|
|
3
|
-
Object.defineProperty(exports, "__esModule", {
|
|
4
|
-
value: true
|
|
5
|
-
});
|
|
6
|
-
exports.default = void 0;
|
|
7
|
-
var _default = () => ({
|
|
8
|
-
name: 'Host/Component record',
|
|
9
|
-
extract: ({
|
|
10
|
-
record
|
|
11
|
-
}) => record.get(/^773$/u).length > 0 ? ['component'] : ['host'],
|
|
12
|
-
compare: (a, b) => a[0] === b[0] ? 0.0 : -1.0
|
|
13
|
-
});
|
|
14
|
-
exports.default = _default;
|
|
15
|
-
//# sourceMappingURL=host-component.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"host-component.js","names":["_default","name","extract","record","get","length","compare","a","b","exports","default"],"sources":["../../../../src/match-detection/features/bib/host-component.js"],"sourcesContent":["\nexport default () => ({\n name: 'Host/Component record',\n extract: ({record}) => record.get(/^773$/u).length > 0 ? ['component'] : ['host'],\n compare: (a, b) => a[0] === b[0] ? 0.0 : -1.0\n});\n"],"mappings":";;;;;;eACeA,CAAA,MAAO;EACpBC,IAAI,EAAE,uBAAuB;EAC7BC,OAAO,EAAEA,CAAC;IAACC;EAAM,CAAC,KAAKA,MAAM,CAACC,GAAG,CAAC,QAAQ,CAAC,CAACC,MAAM,GAAG,CAAC,GAAG,CAAC,WAAW,CAAC,GAAG,CAAC,MAAM,CAAC;EACjFC,OAAO,EAAEA,CAACC,CAAC,EAAEC,CAAC,KAAKD,CAAC,CAAC,CAAC,CAAC,KAAKC,CAAC,CAAC,CAAC,CAAC,GAAG,GAAG,GAAG,CAAC;AAC5C,CAAC,CAAC;AAAAC,OAAA,CAAAC,OAAA,GAAAV,QAAA","ignoreList":[]}
|
|
@@ -1,119 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
|
|
3
|
-
Object.defineProperty(exports, "__esModule", {
|
|
4
|
-
value: true
|
|
5
|
-
});
|
|
6
|
-
Object.defineProperty(exports, "allSourceIds", {
|
|
7
|
-
enumerable: true,
|
|
8
|
-
get: function () {
|
|
9
|
-
return _allSourceIds.default;
|
|
10
|
-
}
|
|
11
|
-
});
|
|
12
|
-
Object.defineProperty(exports, "authors", {
|
|
13
|
-
enumerable: true,
|
|
14
|
-
get: function () {
|
|
15
|
-
return _authors.default;
|
|
16
|
-
}
|
|
17
|
-
});
|
|
18
|
-
Object.defineProperty(exports, "bibliographicLevel", {
|
|
19
|
-
enumerable: true,
|
|
20
|
-
get: function () {
|
|
21
|
-
return _bibliographicLevel.default;
|
|
22
|
-
}
|
|
23
|
-
});
|
|
24
|
-
Object.defineProperty(exports, "hostComponent", {
|
|
25
|
-
enumerable: true,
|
|
26
|
-
get: function () {
|
|
27
|
-
return _hostComponent.default;
|
|
28
|
-
}
|
|
29
|
-
});
|
|
30
|
-
Object.defineProperty(exports, "isbn", {
|
|
31
|
-
enumerable: true,
|
|
32
|
-
get: function () {
|
|
33
|
-
return _isbn.default;
|
|
34
|
-
}
|
|
35
|
-
});
|
|
36
|
-
Object.defineProperty(exports, "issn", {
|
|
37
|
-
enumerable: true,
|
|
38
|
-
get: function () {
|
|
39
|
-
return _issn.default;
|
|
40
|
-
}
|
|
41
|
-
});
|
|
42
|
-
Object.defineProperty(exports, "language", {
|
|
43
|
-
enumerable: true,
|
|
44
|
-
get: function () {
|
|
45
|
-
return _language.default;
|
|
46
|
-
}
|
|
47
|
-
});
|
|
48
|
-
Object.defineProperty(exports, "mediaType", {
|
|
49
|
-
enumerable: true,
|
|
50
|
-
get: function () {
|
|
51
|
-
return _mediaType.default;
|
|
52
|
-
}
|
|
53
|
-
});
|
|
54
|
-
Object.defineProperty(exports, "melindaId", {
|
|
55
|
-
enumerable: true,
|
|
56
|
-
get: function () {
|
|
57
|
-
return _melindaId.default;
|
|
58
|
-
}
|
|
59
|
-
});
|
|
60
|
-
Object.defineProperty(exports, "otherStandardIdentifier", {
|
|
61
|
-
enumerable: true,
|
|
62
|
-
get: function () {
|
|
63
|
-
return _otherStandardIdentifier.default;
|
|
64
|
-
}
|
|
65
|
-
});
|
|
66
|
-
Object.defineProperty(exports, "publicationTime", {
|
|
67
|
-
enumerable: true,
|
|
68
|
-
get: function () {
|
|
69
|
-
return _publicationTime.default;
|
|
70
|
-
}
|
|
71
|
-
});
|
|
72
|
-
Object.defineProperty(exports, "publicationTimeAllowConsYears", {
|
|
73
|
-
enumerable: true,
|
|
74
|
-
get: function () {
|
|
75
|
-
return _publicationTimeAllowConsYears.default;
|
|
76
|
-
}
|
|
77
|
-
});
|
|
78
|
-
Object.defineProperty(exports, "publicationTimeAllowConsYearsMulti", {
|
|
79
|
-
enumerable: true,
|
|
80
|
-
get: function () {
|
|
81
|
-
return _publicationTimeAllowConsYearsMulti.default;
|
|
82
|
-
}
|
|
83
|
-
});
|
|
84
|
-
Object.defineProperty(exports, "recordType", {
|
|
85
|
-
enumerable: true,
|
|
86
|
-
get: function () {
|
|
87
|
-
return _recordType.default;
|
|
88
|
-
}
|
|
89
|
-
});
|
|
90
|
-
Object.defineProperty(exports, "title", {
|
|
91
|
-
enumerable: true,
|
|
92
|
-
get: function () {
|
|
93
|
-
return _title.default;
|
|
94
|
-
}
|
|
95
|
-
});
|
|
96
|
-
Object.defineProperty(exports, "titleVersionOriginal", {
|
|
97
|
-
enumerable: true,
|
|
98
|
-
get: function () {
|
|
99
|
-
return _titleVersionOriginal.default;
|
|
100
|
-
}
|
|
101
|
-
});
|
|
102
|
-
var _hostComponent = _interopRequireDefault(require("./host-component"));
|
|
103
|
-
var _isbn = _interopRequireDefault(require("./isbn"));
|
|
104
|
-
var _issn = _interopRequireDefault(require("./issn"));
|
|
105
|
-
var _otherStandardIdentifier = _interopRequireDefault(require("./other-standard-identifier"));
|
|
106
|
-
var _title = _interopRequireDefault(require("./title"));
|
|
107
|
-
var _titleVersionOriginal = _interopRequireDefault(require("./title-version-original"));
|
|
108
|
-
var _authors = _interopRequireDefault(require("./authors"));
|
|
109
|
-
var _recordType = _interopRequireDefault(require("./record-type"));
|
|
110
|
-
var _publicationTime = _interopRequireDefault(require("./publication-time"));
|
|
111
|
-
var _publicationTimeAllowConsYears = _interopRequireDefault(require("./publication-time-allow-cons-years"));
|
|
112
|
-
var _publicationTimeAllowConsYearsMulti = _interopRequireDefault(require("./publication-time-allow-cons-years-multi"));
|
|
113
|
-
var _language = _interopRequireDefault(require("./language"));
|
|
114
|
-
var _bibliographicLevel = _interopRequireDefault(require("./bibliographic-level"));
|
|
115
|
-
var _melindaId = _interopRequireDefault(require("./melinda-id"));
|
|
116
|
-
var _allSourceIds = _interopRequireDefault(require("./all-source-ids"));
|
|
117
|
-
var _mediaType = _interopRequireDefault(require("./media-type"));
|
|
118
|
-
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
|
|
119
|
-
//# sourceMappingURL=index.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":["_hostComponent","_interopRequireDefault","require","_isbn","_issn","_otherStandardIdentifier","_title","_titleVersionOriginal","_authors","_recordType","_publicationTime","_publicationTimeAllowConsYears","_publicationTimeAllowConsYearsMulti","_language","_bibliographicLevel","_melindaId","_allSourceIds","_mediaType","e","__esModule","default"],"sources":["../../../../src/match-detection/features/bib/index.js"],"sourcesContent":["\nexport {default as hostComponent} from './host-component';\nexport {default as isbn} from './isbn';\nexport {default as issn} from './issn';\nexport {default as otherStandardIdentifier} from './other-standard-identifier';\nexport {default as title} from './title';\nexport {default as titleVersionOriginal} from './title-version-original';\nexport {default as authors} from './authors';\nexport {default as recordType} from './record-type';\nexport {default as publicationTime} from './publication-time';\nexport {default as publicationTimeAllowConsYears} from './publication-time-allow-cons-years';\nexport {default as publicationTimeAllowConsYearsMulti} from './publication-time-allow-cons-years-multi';\nexport {default as language} from './language';\nexport {default as bibliographicLevel} from './bibliographic-level';\nexport {default as melindaId} from './melinda-id';\nexport {default as allSourceIds} from './all-source-ids';\nexport {default as mediaType} from './media-type';\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AACA,IAAAA,cAAA,GAAAC,sBAAA,CAAAC,OAAA;AACA,IAAAC,KAAA,GAAAF,sBAAA,CAAAC,OAAA;AACA,IAAAE,KAAA,GAAAH,sBAAA,CAAAC,OAAA;AACA,IAAAG,wBAAA,GAAAJ,sBAAA,CAAAC,OAAA;AACA,IAAAI,MAAA,GAAAL,sBAAA,CAAAC,OAAA;AACA,IAAAK,qBAAA,GAAAN,sBAAA,CAAAC,OAAA;AACA,IAAAM,QAAA,GAAAP,sBAAA,CAAAC,OAAA;AACA,IAAAO,WAAA,GAAAR,sBAAA,CAAAC,OAAA;AACA,IAAAQ,gBAAA,GAAAT,sBAAA,CAAAC,OAAA;AACA,IAAAS,8BAAA,GAAAV,sBAAA,CAAAC,OAAA;AACA,IAAAU,mCAAA,GAAAX,sBAAA,CAAAC,OAAA;AACA,IAAAW,SAAA,GAAAZ,sBAAA,CAAAC,OAAA;AACA,IAAAY,mBAAA,GAAAb,sBAAA,CAAAC,OAAA;AACA,IAAAa,UAAA,GAAAd,sBAAA,CAAAC,OAAA;AACA,IAAAc,aAAA,GAAAf,sBAAA,CAAAC,OAAA;AACA,IAAAe,UAAA,GAAAhB,sBAAA,CAAAC,OAAA;AAAkD,SAAAD,uBAAAiB,CAAA,WAAAA,CAAA,IAAAA,CAAA,CAAAC,UAAA,GAAAD,CAAA,KAAAE,OAAA,EAAAF,CAAA","ignoreList":[]}
|
|
@@ -1,65 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
|
|
3
|
-
var _fixugen = _interopRequireDefault(require("@natlibfi/fixugen"));
|
|
4
|
-
var _fixura = require("@natlibfi/fixura");
|
|
5
|
-
var _chai = require("chai");
|
|
6
|
-
var _marcRecord = require("@natlibfi/marc-record");
|
|
7
|
-
var features = _interopRequireWildcard(require("."));
|
|
8
|
-
var _debug = _interopRequireDefault(require("debug"));
|
|
9
|
-
function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function (e) { return e ? t : r; })(e); }
|
|
10
|
-
function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != typeof e && "function" != typeof e) return { default: e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && {}.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n.default = e, t && t.set(e, n), n; }
|
|
11
|
-
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
|
|
12
|
-
const debug = (0, _debug.default)('@natlibfi/melinda-record-matching:match-detection:features/bib:test');
|
|
13
|
-
const debugData = debug.extend('data');
|
|
14
|
-
describe('match-detection/features/bib/', () => {
|
|
15
|
-
(0, _fixugen.default)({
|
|
16
|
-
path: [__dirname, '..', '..', '..', '..', 'test-fixtures', 'match-detection', 'features', 'bib'],
|
|
17
|
-
useMetadataFile: true,
|
|
18
|
-
fixura: {
|
|
19
|
-
reader: _fixura.READERS.JSON
|
|
20
|
-
},
|
|
21
|
-
callback: ({
|
|
22
|
-
enabled = true,
|
|
23
|
-
feature,
|
|
24
|
-
options,
|
|
25
|
-
type,
|
|
26
|
-
...expectations
|
|
27
|
-
}) => {
|
|
28
|
-
if (!enabled) {
|
|
29
|
-
return;
|
|
30
|
-
}
|
|
31
|
-
debug(`Testing: ${feature} ${type}`);
|
|
32
|
-
if (type === 'extract') {
|
|
33
|
-
const {
|
|
34
|
-
expectedFeatures,
|
|
35
|
-
inputRecord
|
|
36
|
-
} = expectations;
|
|
37
|
-
const record = new _marcRecord.MarcRecord(inputRecord, {
|
|
38
|
-
subfieldValues: false
|
|
39
|
-
});
|
|
40
|
-
debugData(`Record: ${record}`);
|
|
41
|
-
const {
|
|
42
|
-
extract
|
|
43
|
-
} = features[feature](options);
|
|
44
|
-
(0, _chai.expect)(extract({
|
|
45
|
-
record
|
|
46
|
-
})).to.eql(expectedFeatures);
|
|
47
|
-
return;
|
|
48
|
-
}
|
|
49
|
-
if (type === 'compare') {
|
|
50
|
-
const {
|
|
51
|
-
featuresA,
|
|
52
|
-
featuresB,
|
|
53
|
-
expectedPoints
|
|
54
|
-
} = expectations;
|
|
55
|
-
const {
|
|
56
|
-
compare
|
|
57
|
-
} = features[feature](options);
|
|
58
|
-
(0, _chai.expect)(compare(featuresA, featuresB)).to.equal(expectedPoints);
|
|
59
|
-
return;
|
|
60
|
-
}
|
|
61
|
-
throw new Error(`Invalid type ${type}`);
|
|
62
|
-
}
|
|
63
|
-
});
|
|
64
|
-
});
|
|
65
|
-
//# sourceMappingURL=index.spec.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.spec.js","names":["_fixugen","_interopRequireDefault","require","_fixura","_chai","_marcRecord","features","_interopRequireWildcard","_debug","_getRequireWildcardCache","e","WeakMap","r","t","__esModule","default","has","get","n","__proto__","a","Object","defineProperty","getOwnPropertyDescriptor","u","hasOwnProperty","call","i","set","debug","createDebugLogger","debugData","extend","describe","generateTests","path","__dirname","useMetadataFile","fixura","reader","READERS","JSON","callback","enabled","feature","options","type","expectations","expectedFeatures","inputRecord","record","MarcRecord","subfieldValues","extract","expect","to","eql","featuresA","featuresB","expectedPoints","compare","equal","Error"],"sources":["../../../../src/match-detection/features/bib/index.spec.js"],"sourcesContent":["\nimport generateTests from '@natlibfi/fixugen';\nimport {READERS} from '@natlibfi/fixura';\nimport {expect} from 'chai';\nimport {MarcRecord} from '@natlibfi/marc-record';\nimport * as features from '.';\nimport createDebugLogger from 'debug';\n\n\nconst debug = createDebugLogger('@natlibfi/melinda-record-matching:match-detection:features/bib:test');\nconst debugData = debug.extend('data');\n\n\ndescribe('match-detection/features/bib/', () => {\n generateTests({\n path: [__dirname, '..', '..', '..', '..', 'test-fixtures', 'match-detection', 'features', 'bib'],\n useMetadataFile: true,\n fixura: {\n reader: READERS.JSON\n },\n\n callback: ({enabled = true, feature, options, type, ...expectations}) => {\n\n if (!enabled) {\n return;\n }\n\n debug(`Testing: ${feature} ${type}`);\n\n if (type === 'extract') {\n const {expectedFeatures, inputRecord} = expectations;\n const record = new MarcRecord(inputRecord, {subfieldValues: false});\n debugData(`Record: ${record}`);\n const {extract} = features[feature](options);\n\n expect(extract({record})).to.eql(expectedFeatures);\n return;\n }\n\n if (type === 'compare') {\n const {featuresA, featuresB, expectedPoints} = expectations;\n const {compare} = features[feature](options);\n\n expect(compare(featuresA, featuresB)).to.equal(expectedPoints);\n return;\n }\n\n throw new Error(`Invalid type ${type}`);\n }\n });\n});\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -1,49 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
|
|
3
|
-
Object.defineProperty(exports, "__esModule", {
|
|
4
|
-
value: true
|
|
5
|
-
});
|
|
6
|
-
exports.default = void 0;
|
|
7
|
-
var _standardIdentifierFactory = _interopRequireDefault(require("./standard-identifier-factory"));
|
|
8
|
-
var _isbn = require("isbn3");
|
|
9
|
-
var _debug = _interopRequireDefault(require("debug"));
|
|
10
|
-
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
|
|
11
|
-
const debug = (0, _debug.default)(`@natlibfi/melinda-record-matching:match-detection:features:standard-identifiers:ISBN`);
|
|
12
|
-
const debugData = debug.extend('data');
|
|
13
|
-
var _default = () => {
|
|
14
|
-
const IDENTIFIER_NAME = 'ISBN';
|
|
15
|
-
function validatorAndNormalizer(string) {
|
|
16
|
-
const isbnParseResult = (0, _isbn.parse)(string);
|
|
17
|
-
debugData(`isbnParseResult: ${JSON.stringify(isbnParseResult)}`);
|
|
18
|
-
if (isbnParseResult === null) {
|
|
19
|
-
debug(`Not parseable ISBN, just removing hyphens`);
|
|
20
|
-
return {
|
|
21
|
-
valid: false,
|
|
22
|
-
value: string.replace(/-/ug, '')
|
|
23
|
-
};
|
|
24
|
-
}
|
|
25
|
-
debug(`Parseable ISBN, normalizing to ISBN-13`);
|
|
26
|
-
return {
|
|
27
|
-
valid: true,
|
|
28
|
-
value: isbnParseResult.isbn13
|
|
29
|
-
};
|
|
30
|
-
}
|
|
31
|
-
const {
|
|
32
|
-
extract,
|
|
33
|
-
compare
|
|
34
|
-
} = (0, _standardIdentifierFactory.default)({
|
|
35
|
-
identifier: IDENTIFIER_NAME,
|
|
36
|
-
pattern: /^020$/u,
|
|
37
|
-
subfieldCodes: ['a', 'z'],
|
|
38
|
-
validIdentifierSubfieldCodes: ['a'],
|
|
39
|
-
invalidIdentifierSubfieldCodes: ['z'],
|
|
40
|
-
validatorAndNormalizer
|
|
41
|
-
});
|
|
42
|
-
return {
|
|
43
|
-
extract,
|
|
44
|
-
compare,
|
|
45
|
-
name: IDENTIFIER_NAME
|
|
46
|
-
};
|
|
47
|
-
};
|
|
48
|
-
exports.default = _default;
|
|
49
|
-
//# sourceMappingURL=isbn.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"isbn.js","names":["_standardIdentifierFactory","_interopRequireDefault","require","_isbn","_debug","e","__esModule","default","debug","createDebugLogger","debugData","extend","_default","IDENTIFIER_NAME","validatorAndNormalizer","string","isbnParseResult","isbnParse","JSON","stringify","valid","value","replace","isbn13","extract","compare","createInterface","identifier","pattern","subfieldCodes","validIdentifierSubfieldCodes","invalidIdentifierSubfieldCodes","name","exports"],"sources":["../../../../src/match-detection/features/bib/isbn.js"],"sourcesContent":["\nimport createInterface from './standard-identifier-factory';\nimport {parse as isbnParse} from 'isbn3';\nimport createDebugLogger from 'debug';\n\nconst debug = createDebugLogger(`@natlibfi/melinda-record-matching:match-detection:features:standard-identifiers:ISBN`);\nconst debugData = debug.extend('data');\n\nexport default () => {\n const IDENTIFIER_NAME = 'ISBN';\n\n function validatorAndNormalizer(string) {\n const isbnParseResult = isbnParse(string);\n debugData(`isbnParseResult: ${JSON.stringify(isbnParseResult)}`);\n if (isbnParseResult === null) {\n debug(`Not parseable ISBN, just removing hyphens`);\n return {valid: false, value: string.replace(/-/ug, '')};\n }\n debug(`Parseable ISBN, normalizing to ISBN-13`);\n return {valid: true, value: isbnParseResult.isbn13};\n }\n\n const {extract, compare} = createInterface({identifier: IDENTIFIER_NAME, pattern: /^020$/u, subfieldCodes: ['a', 'z'], validIdentifierSubfieldCodes: ['a'], invalidIdentifierSubfieldCodes: ['z'], validatorAndNormalizer});\n return {extract, compare, name: IDENTIFIER_NAME};\n};\n\n"],"mappings":";;;;;;AACA,IAAAA,0BAAA,GAAAC,sBAAA,CAAAC,OAAA;AACA,IAAAC,KAAA,GAAAD,OAAA;AACA,IAAAE,MAAA,GAAAH,sBAAA,CAAAC,OAAA;AAAsC,SAAAD,uBAAAI,CAAA,WAAAA,CAAA,IAAAA,CAAA,CAAAC,UAAA,GAAAD,CAAA,KAAAE,OAAA,EAAAF,CAAA;AAEtC,MAAMG,KAAK,GAAG,IAAAC,cAAiB,EAAC,sFAAsF,CAAC;AACvH,MAAMC,SAAS,GAAGF,KAAK,CAACG,MAAM,CAAC,MAAM,CAAC;AAAC,IAAAC,QAAA,GAExBA,CAAA,KAAM;EACnB,MAAMC,eAAe,GAAG,MAAM;EAE9B,SAASC,sBAAsBA,CAACC,MAAM,EAAE;IACtC,MAAMC,eAAe,GAAG,IAAAC,WAAS,EAACF,MAAM,CAAC;IACzCL,SAAS,CAAC,oBAAoBQ,IAAI,CAACC,SAAS,CAACH,eAAe,CAAC,EAAE,CAAC;IAChE,IAAIA,eAAe,KAAK,IAAI,EAAE;MAC5BR,KAAK,CAAC,2CAA2C,CAAC;MAClD,OAAO;QAACY,KAAK,EAAE,KAAK;QAAEC,KAAK,EAAEN,MAAM,CAACO,OAAO,CAAC,KAAK,EAAE,EAAE;MAAC,CAAC;IACzD;IACAd,KAAK,CAAC,wCAAwC,CAAC;IAC/C,OAAO;MAACY,KAAK,EAAE,IAAI;MAAEC,KAAK,EAAEL,eAAe,CAACO;IAAM,CAAC;EACrD;EAEA,MAAM;IAACC,OAAO;IAAEC;EAAO,CAAC,GAAG,IAAAC,kCAAe,EAAC;IAACC,UAAU,EAAEd,eAAe;IAAEe,OAAO,EAAE,QAAQ;IAAEC,aAAa,EAAE,CAAC,GAAG,EAAE,GAAG,CAAC;IAAEC,4BAA4B,EAAE,CAAC,GAAG,CAAC;IAAEC,8BAA8B,EAAE,CAAC,GAAG,CAAC;IAAEjB;EAAsB,CAAC,CAAC;EAC3N,OAAO;IAACU,OAAO;IAAEC,OAAO;IAAEO,IAAI,EAAEnB;EAAe,CAAC;AAClD,CAAC;AAAAoB,OAAA,CAAA1B,OAAA,GAAAK,QAAA","ignoreList":[]}
|