@natlibfi/marc-record-validators-melinda 11.3.1 → 11.3.2-alpha.2
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/dist/index.js +7 -0
- package/dist/index.js.map +1 -1
- package/dist/melindaCustomMergeFields.json +5120 -0
- package/dist/merge-fields/config.json +83 -0
- package/dist/merge-fields/controlSubfields.js +278 -0
- package/dist/merge-fields/controlSubfields.js.map +1 -0
- package/dist/merge-fields/counterpartField.js +674 -0
- package/dist/merge-fields/counterpartField.js.map +1 -0
- package/dist/merge-fields/index.js +76 -0
- package/dist/merge-fields/index.js.map +1 -0
- package/dist/merge-fields/mergableIndicator.js +95 -0
- package/dist/merge-fields/mergableIndicator.js.map +1 -0
- package/dist/merge-fields/mergableTag.js +33 -0
- package/dist/merge-fields/mergableTag.js.map +1 -0
- package/dist/merge-fields/mergeConstraints.js +1225 -0
- package/dist/merge-fields/mergeConstraints.js.map +1 -0
- package/dist/merge-fields/mergeField.js +190 -0
- package/dist/merge-fields/mergeField.js.map +1 -0
- package/dist/merge-fields/mergeIndicator.js +171 -0
- package/dist/merge-fields/mergeIndicator.js.map +1 -0
- package/dist/merge-fields/mergeOrAddPostprocess.js +57 -0
- package/dist/merge-fields/mergeOrAddPostprocess.js.map +1 -0
- package/dist/merge-fields/mergeOrAddSubfield.js +203 -0
- package/dist/merge-fields/mergeOrAddSubfield.js.map +1 -0
- package/dist/merge-fields/mergeSubfield.js +277 -0
- package/dist/merge-fields/mergeSubfield.js.map +1 -0
- package/dist/merge-fields/removeDuplicateSubfields.js +48 -0
- package/dist/merge-fields/removeDuplicateSubfields.js.map +1 -0
- package/dist/merge-fields/worldKnowledge.js +98 -0
- package/dist/merge-fields/worldKnowledge.js.map +1 -0
- package/dist/merge-fields.spec.js +51 -0
- package/dist/merge-fields.spec.js.map +1 -0
- package/dist/subfield6Utils.js +16 -1
- package/dist/subfield6Utils.js.map +1 -1
- package/dist/utils.js +108 -0
- package/dist/utils.js.map +1 -1
- package/package.json +6 -6
- package/src/index.js +3 -1
- package/src/melindaCustomMergeFields.json +5120 -0
- package/src/merge-fields/config.json +83 -0
- package/src/merge-fields/controlSubfields.js +307 -0
- package/src/merge-fields/counterpartField.js +736 -0
- package/src/merge-fields/index.js +69 -0
- package/src/merge-fields/mergableIndicator.js +90 -0
- package/src/merge-fields/mergableTag.js +89 -0
- package/src/merge-fields/mergeConstraints.js +309 -0
- package/src/merge-fields/mergeField.js +187 -0
- package/src/merge-fields/mergeIndicator.js +185 -0
- package/src/merge-fields/mergeOrAddPostprocess.js +56 -0
- package/src/merge-fields/mergeOrAddSubfield.js +218 -0
- package/src/merge-fields/mergeSubfield.js +306 -0
- package/src/merge-fields/removeDuplicateSubfields.js +50 -0
- package/src/merge-fields/worldKnowledge.js +104 -0
- package/src/merge-fields.spec.js +52 -0
- package/src/subfield6Utils.js +14 -1
- package/src/utils.js +119 -0
- package/test-fixtures/merge-fields/f01/expectedResult.json +11 -0
- package/test-fixtures/merge-fields/f01/metadata.json +5 -0
- package/test-fixtures/merge-fields/f01/record.json +13 -0
- package/test-fixtures/merge-fields/f02/expectedResult.json +14 -0
- package/test-fixtures/merge-fields/f02/metadata.json +6 -0
- package/test-fixtures/merge-fields/f02/record.json +16 -0
- package/test-fixtures/merge-fields/f03/expectedResult.json +17 -0
- package/test-fixtures/merge-fields/f03/metadata.json +7 -0
- package/test-fixtures/merge-fields/f03/record.json +23 -0
- package/test-fixtures/merge-fields/f04/expectedResult.json +14 -0
- package/test-fixtures/merge-fields/f04/metadata.json +5 -0
- package/test-fixtures/merge-fields/f04/record.json +19 -0
- package/test-fixtures/merge-fields/v01/expectedResult.json +6 -0
- package/test-fixtures/merge-fields/v01/metadata.json +5 -0
- package/test-fixtures/merge-fields/v01/record.json +13 -0
- package/test-fixtures/merge-fields/v02/expectedResult.json +4 -0
- package/test-fixtures/merge-fields/v02/metadata.json +5 -0
- package/test-fixtures/merge-fields/v02/record.json +13 -0
- package/test-fixtures/merge-fields/v03/expectedResult.json +6 -0
- package/test-fixtures/merge-fields/v03/metadata.json +6 -0
- package/test-fixtures/merge-fields/v03/record.json +16 -0
- package/test-fixtures/merge-fields/v04/expectedResult.json +4 -0
- package/test-fixtures/merge-fields/v04/metadata.json +6 -0
- package/test-fixtures/merge-fields/v04/record.json +16 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mergeConstraints.js","names":["_debug","_interopRequireDefault","require","e","__esModule","default","debug","createDebugLogger","debugDev","extend","keyX00","keyX10","keyX11","keyX30","mergeConstraints","key","constraintToValue","tagsConstraints","constraintName","getMergeConstraintsForTag","tag","tagsConstraintsArray","filter","entry","length"],"sources":["../../src/merge-fields/mergeConstraints.js"],"sourcesContent":["import createDebugLogger from 'debug';\nconst debug = createDebugLogger('@natlibfi/melinda-marc-record-merge-reducers:mergeConstraints');\n//const debugData = debug.extend('data');\nconst debugDev = debug.extend('dev');\n\n// Specs: https://workgroups.helsinki.fi/x/K1ohCw (though we occasionally differ from them)...\n\n// \"key\" is an unique key that must match (be absent or exist+be identical) in both.\n// \"paired\" refers to a field that must either exist in both or be absent in both (negative XOR). Typically it's not defined.\n// NB: key+paired with identical values is an attempt to prevent copy for (ET) fields, and to force separate fields on (T) fields.\n// NB! If base has eg. no 264, two+ 264 fields can be copied from the source.\n\n// NB! not all X00 fields have, say, $x subfield. However, we can still share them...\n// $h is non-1XX?, $i is 7XX only, $w is 8XX only...\nconst keyX00 = 'abcjloqrtuwx'; // Shared: $abcdefg...\nconst keyX10 = 'abcdfghlnoprstuwx';\nconst keyX11 = 'acdefghlnpqstuwx';\nconst keyX30 = 'adfghklmnoprstvwxyz';\n\nconst mergeConstraints = [\n {'tag': '010', 'required': 'a', 'key': 'a'},\n {'tag': '013', 'required': 'a', 'key': 'a'}, // We have 2 instances in Melinda...\n {'tag': '015', 'required': 'a', 'key': 'a'},\n {'tag': '016', 'required': 'a', 'key': 'a2'},\n {'tag': '017', 'required': 'a', 'key': 'a'},\n {'tag': '018', 'required': 'a', 'key': 'a'},\n {'tag': '020', 'required': '', 'paired': 'a', 'key': 'a'}, // NB! how to handle $z-only cases? 'required-fallback'='z'?\n {'tag': '022', 'required': '', 'paired': 'a', 'key': 'alz'},\n {'tag': '024', 'required': '', 'paired': 'a', 'key': 'ad'},\n {'tag': '025', 'required': 'a', 'key': 'a'},\n {'tag': '026', 'required': 'a', 'key': 'a'},\n {'tag': '027', 'required': 'a', 'key': 'a'}, // on tuolla pari $z:ää\n {'tag': '028', 'required': 'a', 'key': 'ab'},\n {'tag': '030', 'required': 'a', 'key': 'a'},\n {'tag': '031', 'required': '', 'key': 'abcegmnopr2'}, // mites tämmöisen käytännössä avaimettoman klaarais? TODO: tests\n {'tag': '032', 'required': 'a', 'key': 'ab'},\n {'tag': '033', 'required': 'a', 'key': 'abcp0123'}, // 0,1% are without $a. Ignore them for now.\n {'tag': '034', 'required': 'ab', 'key': 'abcdefghjkmnprstxyz0123'},\n {'tag': '035', 'required': '', 'key': 'az'},\n {'tag': '036', 'required': 'a', 'key': 'a'},\n {'tag': '037', 'required': 'b', 'key': 'ab'},\n {'tag': '039', 'required': 'a'},\n {'tag': '040', 'required': '', 'key': ''},\n {'tag': '041', 'required': '', 'paired': '2', 'key': ''}, // Don't put $2 in 'key'! hasCommonNominator() would get into trouble with it...\n {'tag': '042', 'required': 'a', 'key': ''}, // NB: preprocessor hacks applied\n {'tag': '043', 'required': 'a', 'key': 'abc'},\n {'tag': '044', 'required': '', 'key': 'abc', 'paired': 'abc'},\n {'tag': '045', 'required': '', 'key': 'abc', 'paired': 'abc'}, // (ET) // 045 is problematic either-$a or $b or $c...\n {'tag': '046', 'required': 'a', 'key': 'abcdejklmnop', 'paired': 'abcdejklmnop'},\n {'tag': '047', 'required': 'a', 'key': 'a2'},\n {'tag': '048', 'required': '', 'paired': 'ab', 'key': 'ba'},\n {'tag': '049', 'required': '', 'key': 'abcd'},\n {'tag': '050', 'required': 'a', 'key': 'ab13'},\n {'tag': '051', 'required': 'a', 'key': 'abc'}, // 2021-08-27: only one field in the whole Melinda\n {'tag': '052', 'required': 'a', 'key': 'abd'},\n {'tag': '055', 'required': 'a', 'key': 'ab'},\n {'tag': '060', 'required': 'a', 'key': 'ab'},\n {'tag': '061', 'required': 'a', 'paired': 'b', 'key': 'abc'},\n {'tag': '066', 'required': 'c'},\n {'tag': '070', 'required': 'a', 'key': 'ab'},\n {'tag': '071', 'required': 'a', 'paired': 'abc', 'key': 'abc'}, // N=3\n {'tag': '072', 'required': 'a', 'key': 'ax'},\n {'tag': '074', 'required': '', 'paired': 'a', 'key': 'az'},\n {'tag': '080', 'required': 'a', 'paired': 'bx', 'key': 'abx'},\n {'tag': '082', 'required': 'a', 'paired': 'b', 'key': 'abmq2'},\n {'tag': '083', 'required': 'a', 'paired': 'b', 'key': 'abmqy'},\n {'tag': '084', 'required': 'a', 'paired': 'b2', 'key': 'abq2'},\n {'tag': '085', 'required': '', 'paired': 'abcfrstuvwyz', 'key': 'abcfrstuvwxyz'},\n {'tag': '086', 'required': '', 'paired': 'a', 'key': 'a'},\n {'tag': '088', 'required': '', 'paired': 'a', 'key': 'a'},\n // NB! 100, 110 and 111 may have title parts that are handled elsewhere\n {'tag': '100', 'required': 'a', 'paired': 't', 'key': keyX00},\n {'tag': '110', 'required': 'a', 'paired': 'bt', 'key': keyX10},\n {'tag': '111', 'required': 'a', 'paired': 't', 'key': keyX11},\n // NB! 130 has no name part, key is used for title part\n {'tag': '130', 'required': 'a', 'key': keyX30},\n {'tag': '210', 'required': 'a', 'key': 'ab'},\n {'tag': '222', 'required': 'a', 'key': 'ab'},\n {'tag': '240', 'required': 'a', 'key': 'adfghklmnoprs'},\n {'tag': '242', 'required': 'a', 'key': 'abchnpy'},\n {'tag': '243', 'required': 'a', 'key': 'adfghklmnoprs'},\n {'tag': '245', 'required': 'a', 'key': 'abcghnps', 'paired': 'abnps'},\n {'tag': '246', 'required': 'a', 'key': 'abfnp'},\n {'tag': '247', 'required': 'a', 'key': 'abfnpx'},\n {'tag': '250', 'required': 'a', 'key': 'ab'},\n {'tag': '251', 'required': 'a', 'key': 'a'},\n {'tag': '254', 'required': 'a', 'key': 'a'},\n {'tag': '255', 'required': 'a', 'key': 'abcdefg', 'paired': 'abcdefg'},\n {'tag': '256', 'required': 'a', 'key': 'a'},\n {'tag': '257', 'required': 'a', 'key': 'a'},\n {'tag': '258', 'required': 'a', 'key': 'a'}, // Melinda: N=1\n //{'tag': '260', 'required': '', 'paired': 'abcefg', 'key': 'abcefg'},\n {'tag': '260', 'required': '', 'key': 'abcefg'},\n {'tag': '263', 'required': 'a', 'key': 'a'},\n //{'tag': '264', 'required': '', 'paired': 'abc', 'key': 'abc'}, // NB \"S.l.\" normalizations?\" not implemented\n {'tag': '264', 'required': '', 'key': 'abc'}, // NB \"S.l.\" normalizations?\" not implemented\n // SKIP TAG 270 ON PURPOSE! Melinda's N=43.\n {'tag': '300', 'required': 'a', 'key': 'abcefg'},\n {'tag': '306', 'required': 'a', 'key': 'a'},\n // SKIP TAG 307 ON PURPOSE! N=0\n {'tag': '310', 'required': 'a', 'key': 'ab'},\n {'tag': '321', 'required': 'a', 'key': 'ab'},\n {'tag': '335', 'required': 'a', 'key': 'ab'}, // Melinda N=1 (a test field). M might increase?\n {'tag': '336', 'required': 'b2', 'key': 'ab2'}, // MET-88: don't merge different $a subfields\n {'tag': '337', 'required': 'b2', 'key': 'ab2'}, // MET-88: don't merge different $a subfields\n {'tag': '338', 'required': 'b2', 'key': 'ab2'}, // / MET-88: don't merge different $a subfields\n {'tag': '340', 'required': '', 'paired': 'abcdefghijkmnop', 'key': 'abcdefghijkmnop'},\n {'tag': '341', 'required': '', 'paired': 'abcde', 'key': 'abcde'}, // NEW! Starting to appear!\n {'tag': '342', 'required': '', 'paired': 'abcdefghijklmnopqrstuvw', 'key': 'abcdefghijklmnopqrstuvw'}, // SKIP 342. NOT SEEN!\n {'tag': '343', 'required': '', 'paired': 'abcdefghi', 'key': 'abcdefghi'}, // SKIP 343.\n {'tag': '344', 'required': '', 'paired': 'abcdefgh', 'key': 'abcdefgh'},\n {'tag': '345', 'required': '', 'paired': 'abcd', 'key': 'abcd'},\n {'tag': '346', 'required': '', 'paired': 'ab', 'key': 'ab'},\n {'tag': '347', 'required': '', 'paired': 'abcdef', 'key': 'abcdef'},\n {'tag': '348', 'required': '', 'paired': 'ab', 'key': 'ab'},\n {'tag': '348', 'required': '', 'paired': 'abc', 'key': 'abc'},\n {'tag': '351', 'required': '', 'paired': 'abc', 'key': 'abc'},\n {'tag': '352', 'required': '', 'paired': 'abcdefgiq', 'key': 'abcdefgiq'},\n {'tag': '355', 'required': '', 'paired': 'abcdefghj', 'key': 'abcdefghj'},\n {'tag': '357', 'required': 'a', 'key': 'abcg'},\n {'tag': '362', 'required': 'a', 'key': 'az'},\n {'tag': '363', 'required': '', 'paired': 'abcdefghijklmuv', 'key': 'abcdefghijklmuv'},\n {'tag': '365', 'required': 'b', 'paired': 'abcdefghijkm', 'key': 'abcdefghijkm'}, // N=0\n {'tag': '366', 'required': '', 'paired': 'abcdefgjkm', 'key': 'abcdefgjkm'},\n {'tag': '370', 'required': '', 'paired': 'cfgistuv', 'key': 'cfgistuv'},\n {'tag': '377', 'required': '', 'paired': 'al', 'key': 'al'},\n {'tag': '380', 'required': 'a', 'key': 'a'},\n {'tag': '381', 'required': 'auv', 'key': 'auv'},\n {'tag': '382', 'required': ''},\n {'tag': '383', 'required': 'abcde', 'key': 'abcde'},\n {'tag': '384', 'required': 'a', 'key': 'a'},\n {'tag': '385', 'required': 'a', 'paired': 'abmn', 'key': 'abmn'},\n {'tag': '386', 'required': 'a', 'paired': 'abmn', 'key': 'abmn'},\n {'tag': '388', 'required': 'a', 'key': 'a'},\n {'tag': '490', 'required': 'a', 'key': 'axvl'},\n {'tag': '500', 'required': 'a', 'key': 'a'},\n {'tag': '501', 'required': 'a', 'key': 'a'},\n {'tag': '502', 'required': 'a', 'key': 'abcdgo'},\n {'tag': '504', 'required': 'a', 'paired': 'ab', 'key': 'ab'},\n {'tag': '505', 'required': '', 'paired': 'agrtu', 'key': 'agrtu'},\n {'tag': '506', 'required': 'a', 'paired': '', 'key': 'abcdefgqu'},\n {'tag': '507', 'required': 'a', 'paired': 'ab', 'key': 'ab'},\n {'tag': '508', 'required': 'a', 'key': 'a'},\n {'tag': '509', 'required': 'a', 'key': 'acd'},\n {'tag': '510', 'required': 'a', 'key': 'abcx'},\n {'tag': '511', 'required': 'a', 'key': 'a'},\n {'tag': '513', 'required': '', 'paired': 'ab', 'key': 'ab'},\n {'tag': '514', 'required': '', 'paired': 'abcdefghijkmuz', 'key': 'abcdefghijkmuz'},\n {'tag': '515', 'required': 'a', 'key': 'a'},\n {'tag': '518', 'required': '', 'paired': 'adop', 'key': 'adop'},\n {'tag': '520', 'required': 'a', 'paired': 'abc', 'key': 'abc'},\n {'tag': '521', 'required': 'a', 'paired': 'ab', 'key': 'ab'},\n {'tag': '522', 'required': 'a', 'key': 'a'},\n {'tag': '524', 'required': 'a', 'key': 'a'},\n {'tag': '525', 'required': 'a', 'key': 'a'},\n {'tag': '526', 'required': 'a', 'paired': 'abcdi', 'key': 'abcdi'},\n {'tag': '530', 'required': 'a', 'paired': 'abcd', 'key': 'abcd'},\n {'tag': '532', 'required': 'a', 'key': 'a'},\n {'tag': '533', 'required': 'a', 'paired': 'abcdefmn7', 'key': 'abcdefmn7'},\n {'tag': '534', 'required': '', 'paired': 'abcempt', 'key': 'abcempt'},\n {'tag': '535', 'required': '', 'paired': 'abcdg', 'key': 'abcdg'},\n {'tag': '536', 'required': '', 'paired': 'abcdefgh', 'key': 'abcdefgh'},\n {'tag': '538', 'required': 'a', 'paired': 'aiu', 'key': 'aiu'},\n {'tag': '540', 'required': '', 'paired': 'abcdfgqu', 'key': 'abcdfgqu'},\n {'tag': '541', 'required': '', 'paired': 'abcdefhno', 'key': 'abcdefhno'},\n {'tag': '542', 'required': '', 'paired': 'abcdfghijklmopqrsu', 'key': 'abcdfghijklmopqrsu'},\n {'tag': '544', 'required': '', 'paired': 'abcden', 'key': 'abcden'},\n {'tag': '545', 'required': '', 'paired': 'abu', 'key': 'abu'},\n {'tag': '546', 'required': '', 'paired': 'ab', 'key': 'ab'},\n {'tag': '547', 'required': 'a', 'key': 'a'},\n {'tag': '550', 'required': 'a', 'key': 'a'},\n {'tag': '552', 'required': '', 'paired': 'abcdefghijklmnopuz', 'key': 'abcdefghijklmnopuz'},\n {'tag': '555', 'required': 'a', 'paired': 'abcdu', 'key': 'abcdu'},\n {'tag': '556', 'required': 'a', 'key': 'az'},\n {'tag': '561', 'required': 'a', 'key': 'au'},\n {'tag': '562', 'required': '', 'paired': 'abcde', 'key': 'abcde'},\n {'tag': '563', 'required': 'a', 'key': 'au'},\n {'tag': '565', 'required': '', 'paired': 'abc', 'key': 'abc'},\n {'tag': '567', 'required': '', 'paired': 'ab', 'key': 'ab'},\n {'tag': '580', 'required': 'a', 'key': 'a'},\n {'tag': '581', 'required': 'a', 'key': 'a'},\n {'tag': '583', 'required': '', 'paired': 'abcdefhijklnou', 'key': 'abcdefhijklnou'},\n {'tag': '584', 'required': '', 'paired': 'ab', 'key': 'ab'},\n {'tag': '585', 'required': 'a', 'key': 'a'},\n {'tag': '586', 'required': 'a', 'key': 'a'},\n {'tag': '588', 'required': 'a', 'key': 'a'},\n {'tag': '590', 'required': ''},\n {'tag': '591', 'required': ''},\n {'tag': '592', 'required': ''},\n {'tag': '593', 'required': ''},\n {'tag': '594', 'required': ''},\n {'tag': '595', 'required': ''},\n {'tag': '596', 'required': ''},\n {'tag': '597', 'required': ''},\n {'tag': '598', 'required': ''},\n {'tag': '599', 'required': ''},\n {'tag': '600', 'required': 'a', 'paired': 'tvxyz', 'key': keyX00},\n {'tag': '610', 'required': 'a', 'paired': 'btvxyz', 'key': keyX10},\n {'tag': '611', 'required': 'a', 'paired': 'tvxyz', 'key': keyX11},\n {'tag': '630', 'required': 'a', 'paired': 'atvxyz', 'key': keyX30},\n // NB! 700, 710 and 711 may have title parts that are handled elsewhere\n {'tag': '647', 'required': 'a', 'paired': 'avxyz', 'key': 'acdgvxyz02'},\n {'tag': '648', 'required': 'a', 'paired': 'avxyz', 'key': 'avxyz02'},\n {'tag': '650', 'required': 'a', 'paired': 'abcdegvxyz', 'key': 'abcdegvxyz20'},\n {'tag': '651', 'required': 'a', 'paired': 'aegvxyz', 'key': 'aegvxyz20'},\n {'tag': '653', 'required': 'a', 'paired': 'a', 'key': 'a'}, // this is interesting as a can be repeated\n {'tag': '654', 'required': '', 'paired': 'abcevxyz'},\n {'tag': '655', 'required': 'a', 'paired': 'abcvxyz', 'key': 'avxyz20'},\n {'tag': '656', 'required': 'a', 'paired': 'akvxyz'}, // N=0\n {'tag': '657', 'required': 'a', 'paired': 'avxyz'}, // N=0\n {'tag': '658', 'required': 'a', 'paired': 'abcd'}, // N=0\n {'tag': '662', 'required': '', 'paired': 'abcdefgh'}, // N=0\n {'tag': '688', 'required': 'a'}, // N=0\n {'tag': '700', 'required': 'a', 'paired': 't', 'key': keyX00}, // h/i/m/o/r/s/x are missing from 100\n {'tag': '710', 'required': 'a', 'paired': 'bt', 'key': keyX10}, // h/j/m/o/r/s/x are missing from 110\n {'tag': '711', 'required': 'a', 'paired': 'cdeflns', 'key': keyX11}, // h/i/s/x are missing from 711\n {'tag': '720', 'required': 'a', 'key': 'a'},\n // NB! 730 has no name part, key is used for title part\n {'tag': '730', 'required': 'a', 'key': keyX30}, // NB: 130->730 magic subfields might not agree...\n {'tag': '740', 'required': 'a', 'key': 'ahnp'},\n {'tag': '751', 'required': 'a', 'key': 'a'}, // N=11, kaikissa pelkkä $a\n {'tag': '752', 'required': '', 'key': 'abcdefgh'}, // N=12234\n {'tag': '753', 'required': '', 'key': 'abc'},\n {'tag': '754', 'required': '', 'key': 'acdxz'}, // N=3\n {'tag': '758', 'required': 'a', 'key': 'ai'}, // N=1\n\n {'tag': '760', 'required': 'tw', key: 'twxy'},\n {'tag': '762', 'required': 't', key: 'abcdhmstxy'},\n {'tag': '765', 'required': 't', key: 'abcdhmrstuwxyz'},\n {'tag': '767', 'required': 't', key: 'abcdhmrstuwxyz'},\n {'tag': '770', 'required': 't', 'paired': 'ruxyz', key: 'abcdhmrstuwxyz'},\n {'tag': '772', 'required': 't', key: 'abcdhmrstuwxyz'},\n {'tag': '773', 'required': 'w', key: 'wgq'}, // Kirjavälitys should not have any component parts. However, this need to be re-thought...\n // Currently we (appently) drop fields that don't contain 773$w...\n {'tag': '774', 'required': '', 'paired': 'nruxyz', 'key': 'npqrstrxyz'},\n {'tag': '775', 'required': '', 'paired': 'ruxyz', 'key': 'abcdefhmstuxyz'},\n {'tag': '776', 'required': '', 'paired': 'ruxyz', 'key': 'abcdhmsuwxyz'},\n {'tag': '777', 'required': '', 'paired': 'ruxyz', 'key': 'abcdhmstuxyz'},\n {'tag': '780', 'required': '', 'paired': 'ruxyz', 'key': 'abcdhmstuxyz'},\n {'tag': '785', 'required': '', 'paired': 'uxyz', 'key': 'abcdhmstuxyz'},\n {'tag': '786', 'required': '', 'paired': 'abcrstuxyz', 'key': 'abcdhijmprstuxyz4'},\n {'tag': '787', 'required': '', 'paired': 'abcdhmstuxyz4'},\n {'tag': '788', 'required': '', 'paired': 'stx', 'key': 'abdestx'},\n {'tag': '800', 'required': 'a', 'paired': 't', 'key': keyX00},\n {'tag': '810', 'required': 'a', 'paired': 'bt', 'key': keyX10},\n {'tag': '811', 'required': 'a', 'paired': 't', 'key': keyX11},\n {'tag': '830', 'required': 'a', 'key': keyX30},\n {'tag': '840', 'required': 'a'},\n {'tag': '841', 'required': 'a'},\n {'tag': '842', 'required': 'a'},\n {'tag': '843', 'required': 'a'},\n {'tag': '844', 'required': 'a'},\n {'tag': '845', 'required': 'a'},\n {'tag': '850', 'required': 'a', 'key': 'a'},\n {'tag': '852', 'required': 'a'}, // HMM... we might want to reconsider this...\n {'tag': '853', 'required': 'a'},\n {'tag': '854', 'required': 'a'},\n {'tag': '855', 'required': 'a'},\n {'tag': '856', 'required': 'u', 'paired': 'u', 'key': 'opuw23'}, // 856 is built around $u...\n {'tag': '863', 'required': 'a'},\n {'tag': '864', 'required': 'a'},\n {'tag': '865', 'required': 'a'},\n {'tag': '866', 'required': 'a'},\n {'tag': '867', 'required': 'a'},\n {'tag': '868', 'required': 'a'},\n {'tag': '876', 'required': 'a'},\n {'tag': '877', 'required': 'a'},\n {'tag': '878', 'required': 'a'},\n {'tag': '880', 'required': '', 'paired': 'a', 'key': 'abcdefghijklmnopqrstuvwxyz'},\n {'tag': '881', 'required': ''},\n {'tag': '882', 'required': ''},\n {'tag': '883', 'required': ''},\n {'tag': '884', 'required': '', 'paired': 'agkq'},\n {'tag': '885', 'required': ''},\n {'tag': '886', 'required': ''},\n {'tag': '887', 'required': ''},\n {'tag': '900', 'required': ''},\n {'tag': '901', 'required': ''},\n {'tag': '910', 'required': ''},\n {'tag': '935', 'required': 'a', 'key': 'az'}, // Fono information at least\n {'tag': '940', 'required': ''},\n {'tag': '946', 'required': 'a', 'key': 'abfnp'}, // Copied from 246. However, final version might contain some elements from field 245 as well\n {'tag': '960', 'required': ''},\n {'tag': '973', 'required': 'w', 'key': 'w'}, // Viola multi-hosts\n {'tag': '995', 'required': ''},\n {'tag': 'CAT', 'required': ''},\n {'tag': 'LOW', 'required': ''},\n {'tag': 'SID', 'required': ''}\n];\n\nfunction constraintToValue(tagsConstraints, constraintName) {\n if (constraintName in tagsConstraints) {\n return tagsConstraints[constraintName];\n }\n return null; // NB! \"\" might mean \"apply to everything\" (eg. 040.key) while null means that it is not applied.\n}\n\nexport function getMergeConstraintsForTag(tag, constraintName) {\n const tagsConstraintsArray = mergeConstraints.filter(entry => tag === entry.tag);\n if (tagsConstraintsArray.length === 0) {\n debugDev(`WARNING\\tNo key found for ${tag}. Returning NULL!`);\n return null;\n }\n // NB! should we support multiple contains for a field? Eg. 505$a vs 505($tg)+\n if (tagsConstraintsArray.length > 1) { // eslint-disable-line functional/no-conditional-statements\n debugDev(`WARNING\\tMultiple values for '${constraintName}' (N=${tagsConstraintsArray.length}) found in ${tag}. Using first values.`);\n }\n return constraintToValue(tagsConstraintsArray[0], constraintName);\n}\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -0,0 +1,190 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.mergeField = mergeField;
|
|
7
|
+
var _debug = _interopRequireDefault(require("debug"));
|
|
8
|
+
var _utils = require("../utils");
|
|
9
|
+
var _subfield6Utils = require("../subfield6Utils.js");
|
|
10
|
+
var _normalizeFieldForComparison = require("../normalizeFieldForComparison");
|
|
11
|
+
var _mergeOrAddSubfield = require("./mergeOrAddSubfield");
|
|
12
|
+
var _mergeIndicator = require("./mergeIndicator");
|
|
13
|
+
var _mergableTag = require("./mergableTag");
|
|
14
|
+
var _counterpartField = require("./counterpartField");
|
|
15
|
+
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
|
|
16
|
+
//import {MarcRecord} from '@natlibfi/marc-record';
|
|
17
|
+
|
|
18
|
+
//import {default as normalizeEncoding} from '@natlibfi/marc-record-validators-melinda/dist/normalize-utf8-diacritics';
|
|
19
|
+
//import {postprocessRecords} from './mergeOrAddPostprocess.js';
|
|
20
|
+
//import {preprocessBeforeAdd} from './processFilter.js';
|
|
21
|
+
|
|
22
|
+
//import fs from 'fs';
|
|
23
|
+
//import path from 'path';
|
|
24
|
+
|
|
25
|
+
//const defaultConfig = JSON.parse(fs.readFileSync(path.join(__dirname, '..', '..', 'src', 'reducers', 'config.json'), 'utf8'));
|
|
26
|
+
|
|
27
|
+
// Specs: https://workgroups.helsinki.fi/x/K1ohCw (though we occasionally differ from them)...
|
|
28
|
+
|
|
29
|
+
const debug = (0, _debug.default)('@natlibfi/melinda-marc-record-merge-reducers:mergeField');
|
|
30
|
+
//const debugData = debug.extend('data');
|
|
31
|
+
const debugDev = debug.extend('dev');
|
|
32
|
+
|
|
33
|
+
// NB! Can be do this via config.json?
|
|
34
|
+
function removeEnnakkotieto(field) {
|
|
35
|
+
const tmp = field.subfields.filter(subfield => subfield.code !== 'g' || subfield.value !== 'ENNAKKOTIETO.');
|
|
36
|
+
// remove only iff some other subfield remains
|
|
37
|
+
if (tmp.length > 0) {
|
|
38
|
+
// eslint-disable-line functional/no-conditional-statements
|
|
39
|
+
field.subfields = tmp; // eslint-disable-line functional/immutable-data
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
function copyrightYearHack(baseRecord, baseField, sourceField) {
|
|
43
|
+
if (baseField.tag !== '264' || sourceField.tag !== '260') {
|
|
44
|
+
return;
|
|
45
|
+
}
|
|
46
|
+
const relevantSubfields = sourceField.subfields.filter(sf => sf.code === 'c' && (0, _utils.hasCopyright)(sf.value));
|
|
47
|
+
relevantSubfields.forEach(sf => {
|
|
48
|
+
// Add new:
|
|
49
|
+
const value = sf.value.replace(/\.$/u, '');
|
|
50
|
+
baseRecord.insertField({
|
|
51
|
+
'tag': '264',
|
|
52
|
+
'ind1': ' ',
|
|
53
|
+
'ind2': '4',
|
|
54
|
+
'subfields': [{
|
|
55
|
+
'code': 'c',
|
|
56
|
+
value
|
|
57
|
+
}]
|
|
58
|
+
});
|
|
59
|
+
// Modify original subfield:
|
|
60
|
+
sf.value = (0, _utils.removeCopyright)(sf.value); // eslint-disable-line functional/immutable-data
|
|
61
|
+
});
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
// eslint-disable-next-line max-params
|
|
65
|
+
function mergeField2(baseRecord, baseField, sourceField, config, candFieldPairs880 = []) {
|
|
66
|
+
//// Identical fields
|
|
67
|
+
// No need to check every subfield separately.
|
|
68
|
+
// Also no need to postprocess the resulting field.
|
|
69
|
+
if ((0, _utils.fieldToString)(baseField) === (0, _utils.fieldToString)(sourceField)) {
|
|
70
|
+
return baseRecord;
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
// If a base ennakkotieto is merged with real data, remove ennakkotieto subfield:
|
|
74
|
+
// (If our prepub normalizations are ok, this should not be needed.
|
|
75
|
+
// However, it's simple and works well enough, so let's keep it here.)
|
|
76
|
+
if ((0, _utils.fieldHasSubfield)(baseField, 'g', 'ENNAKKOTIETO.') && !(0, _utils.fieldHasSubfield)(sourceField, 'g', 'ENNAKKOTIETO.')) {
|
|
77
|
+
// eslint-disable-line functional/no-conditional-statements
|
|
78
|
+
removeEnnakkotieto(baseField);
|
|
79
|
+
baseField.merged = 1; // eslint-disable-line functional/immutable-data
|
|
80
|
+
}
|
|
81
|
+
copyrightYearHack(baseRecord, baseField, sourceField);
|
|
82
|
+
(0, _mergeIndicator.mergeIndicators)(baseField, sourceField, config);
|
|
83
|
+
|
|
84
|
+
// We want to add the incoming subfields without punctuation, and add puctuation later on.
|
|
85
|
+
// (Cloning is harmless, but probably not needed.)
|
|
86
|
+
// NEW: we also drag the normalized version along. It is needed for the merge-or-add decision
|
|
87
|
+
const normalizedSourceField = (0, _normalizeFieldForComparison.cloneAndNormalizeFieldForComparison)(sourceField); // This is for comparison
|
|
88
|
+
const strippedSourceField = (0, _normalizeFieldForComparison.cloneAndRemovePunctuation)(sourceField); // This is for adding subfields
|
|
89
|
+
|
|
90
|
+
//nvdebug(` MERGING SUBFIELDS OF '${fieldToString(sourceField)}' (original)`, debugDev);
|
|
91
|
+
//nvdebug(` MERGING SUBFIELDS OF '${fieldToString(normalizedSourceField)}' (comparison)`, debugDev);
|
|
92
|
+
(0, _utils.nvdebug)(` MERGING SUBFIELDS OF '${(0, _utils.fieldToString)(strippedSourceField)}' (merge/add)`, debugDev);
|
|
93
|
+
sourceField.subfields.forEach((originalSubfield, index) => {
|
|
94
|
+
//strippedSourceField.subfields.forEach((subfieldForMergeOrAdd, index) => {
|
|
95
|
+
const normalizedSubfield = normalizedSourceField.subfields[index];
|
|
96
|
+
const punctlessSubfield = strippedSourceField.subfields[index];
|
|
97
|
+
const originalBaseValue = (0, _utils.fieldToString)(baseField);
|
|
98
|
+
(0, _utils.nvdebug)(` TRYING TO MERGE SUBFIELD '${(0, _utils.subfieldToString)(originalSubfield)}' TO '${originalBaseValue}'`, debugDev);
|
|
99
|
+
const subfieldData = {
|
|
100
|
+
'tag': sourceField.tag,
|
|
101
|
+
'code': originalSubfield.code,
|
|
102
|
+
'originalValue': originalSubfield.value,
|
|
103
|
+
'normalizedValue': normalizedSubfield.value,
|
|
104
|
+
'punctuationlessValue': punctlessSubfield.value
|
|
105
|
+
};
|
|
106
|
+
(0, _mergeOrAddSubfield.mergeOrAddSubfield)(baseField, subfieldData, candFieldPairs880); // candSubfield);
|
|
107
|
+
const newValue = (0, _utils.fieldToString)(baseField);
|
|
108
|
+
if (originalBaseValue !== newValue) {
|
|
109
|
+
// eslint-disable-line functional/no-conditional-statements
|
|
110
|
+
(0, _utils.nvdebug)(` SUBFIELD MERGE RESULT: '${newValue}'`, debugDev);
|
|
111
|
+
//debug(` TODO: sort subfields, handle punctuation...`);
|
|
112
|
+
}
|
|
113
|
+
//else { debugDev(` mergeOrAddSubfield() did not add '‡${fieldToString(subfieldForMergeOrAdd)}' to '${originalValue}'`); }
|
|
114
|
+
});
|
|
115
|
+
}
|
|
116
|
+
function skipMergeField(baseRecord, sourceField, config) {
|
|
117
|
+
if (!(0, _mergableTag.mergableTag)(sourceField.tag, config)) {
|
|
118
|
+
(0, _utils.nvdebug)(`skipMergeField(): field '${(0, _utils.fieldToString)(sourceField)}' listed as skippable!`, debugDev);
|
|
119
|
+
return true;
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
// Skip duplicate field:
|
|
123
|
+
if (baseRecord.fields.some(baseField => !baseField.mergeCandidate && (0, _utils.fieldsAreIdentical)(sourceField, baseField))) {
|
|
124
|
+
(0, _utils.nvdebug)(`skipMergeField(): field '${(0, _utils.fieldToString)(sourceField)}' already exists! No merge required!`, debugDev);
|
|
125
|
+
sourceField.deleted = 1; // eslint-disable-line functional/immutable-data
|
|
126
|
+
return true;
|
|
127
|
+
}
|
|
128
|
+
return false;
|
|
129
|
+
}
|
|
130
|
+
function sourceRecordIsBetter(baseField, sourceField) {
|
|
131
|
+
if (!baseField.subfields) {
|
|
132
|
+
return;
|
|
133
|
+
}
|
|
134
|
+
// MELINDA-8978: prefer Asteri version
|
|
135
|
+
if (isAsteriField(sourceField) && !isAsteriField(baseField)) {
|
|
136
|
+
return 1;
|
|
137
|
+
}
|
|
138
|
+
function isAsteriField(field) {
|
|
139
|
+
if (field.subfields.some(sf => sf.code === '0' && sf.value.match(/^\((?:FI-ASTERI-[NW]|FIN1[13])\)[0-9]{9}$/u))) {
|
|
140
|
+
return true;
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
return false;
|
|
144
|
+
}
|
|
145
|
+
function swapDataBetweenFields(field1, field2) {
|
|
146
|
+
// NB! Does not support controlfields yet! Add support if the need arises.
|
|
147
|
+
if (field1.subfields) {
|
|
148
|
+
// If field1 has subfields, then also field2 has them. No need to check the other field here.
|
|
149
|
+
swapNamedData('ind1');
|
|
150
|
+
swapNamedData('ind2');
|
|
151
|
+
swapNamedData('subfields');
|
|
152
|
+
return;
|
|
153
|
+
}
|
|
154
|
+
return;
|
|
155
|
+
function swapNamedData(name) {
|
|
156
|
+
const data = field1[name]; // eslint-disable-line functional/immutable-data
|
|
157
|
+
field1[name] = field2[name]; // eslint-disable-line functional/immutable-data
|
|
158
|
+
field2[name] = data; // eslint-disable-line functional/immutable-data
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
function mergeField(baseRecord, sourceRecord, sourceField, config) {
|
|
162
|
+
(0, _utils.nvdebug)(`SELF: ${(0, _utils.fieldToString)(sourceField)}`, debugDev);
|
|
163
|
+
sourceField.mergeCandidate = true; // eslint-disable-line functional/immutable-data
|
|
164
|
+
// skip duplicates and special cases:
|
|
165
|
+
if (skipMergeField(baseRecord, sourceField, config)) {
|
|
166
|
+
(0, _utils.nvdebug)(`mergeField(): don't merge '${(0, _utils.fieldToString)(sourceField)}'`, debugDev);
|
|
167
|
+
delete sourceField.mergeCandidate; // eslint-disable-line functional/immutable-data
|
|
168
|
+
return false;
|
|
169
|
+
}
|
|
170
|
+
(0, _utils.nvdebug)(`mergeField(): Try to merge '${(0, _utils.fieldToString)(sourceField)}'.`, debugDev);
|
|
171
|
+
const counterpartField = (0, _counterpartField.getCounterpart)(baseRecord, sourceRecord, sourceField, config);
|
|
172
|
+
if (counterpartField) {
|
|
173
|
+
if (sourceRecordIsBetter(counterpartField, sourceField)) {
|
|
174
|
+
// eslint-disable-line functional/no-conditional-statements
|
|
175
|
+
swapDataBetweenFields(counterpartField, sourceField);
|
|
176
|
+
}
|
|
177
|
+
const candFieldPairs880 = sourceField.tag === '880' ? undefined : (0, _subfield6Utils.fieldGetOccurrenceNumberPairs)(sourceField, sourceRecord.fields);
|
|
178
|
+
(0, _utils.nvdebug)(`mergeField(): Got counterpart: '${(0, _utils.fieldToString)(counterpartField)}'. Thus try merge...`, debugDev);
|
|
179
|
+
(0, _utils.nvdebug)(`PAIR: ${candFieldPairs880 ? (0, _utils.fieldsToString)(candFieldPairs880) : 'NADA'}`, debugDev);
|
|
180
|
+
mergeField2(baseRecord, counterpartField, sourceField, config, candFieldPairs880);
|
|
181
|
+
sourceField.deleted = 1; // eslint-disable-line functional/immutable-data
|
|
182
|
+
delete sourceField.mergeCandidate; // eslint-disable-line functional/immutable-data
|
|
183
|
+
return true;
|
|
184
|
+
}
|
|
185
|
+
// NB! Counterpartless field is inserted to 7XX even if field.tag says 1XX:
|
|
186
|
+
debugDev(`mergeField(): No mergable counterpart found for '${(0, _utils.fieldToString)(sourceField)}'.`);
|
|
187
|
+
delete sourceField.mergeCandidate; // eslint-disable-line functional/immutable-data
|
|
188
|
+
return false;
|
|
189
|
+
}
|
|
190
|
+
//# sourceMappingURL=mergeField.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mergeField.js","names":["_debug","_interopRequireDefault","require","_utils","_subfield6Utils","_normalizeFieldForComparison","_mergeOrAddSubfield","_mergeIndicator","_mergableTag","_counterpartField","e","__esModule","default","debug","createDebugLogger","debugDev","extend","removeEnnakkotieto","field","tmp","subfields","filter","subfield","code","value","length","copyrightYearHack","baseRecord","baseField","sourceField","tag","relevantSubfields","sf","hasCopyright","forEach","replace","insertField","removeCopyright","mergeField2","config","candFieldPairs880","fieldToString","fieldHasSubfield","merged","mergeIndicators","normalizedSourceField","cloneAndNormalizeFieldForComparison","strippedSourceField","cloneAndRemovePunctuation","nvdebug","originalSubfield","index","normalizedSubfield","punctlessSubfield","originalBaseValue","subfieldToString","subfieldData","mergeOrAddSubfield","newValue","skipMergeField","mergableTag","fields","some","mergeCandidate","fieldsAreIdentical","deleted","sourceRecordIsBetter","isAsteriField","match","swapDataBetweenFields","field1","field2","swapNamedData","name","data","mergeField","sourceRecord","counterpartField","getCounterpart","undefined","fieldGetOccurrenceNumberPairs","fieldsToString"],"sources":["../../src/merge-fields/mergeField.js"],"sourcesContent":["//import {MarcRecord} from '@natlibfi/marc-record';\nimport createDebugLogger from 'debug';\nimport {fieldHasSubfield, fieldToString, fieldsToString, fieldsAreIdentical, nvdebug, hasCopyright, removeCopyright, subfieldToString} from '../utils';\nimport {fieldGetOccurrenceNumberPairs} from '../subfield6Utils.js';\nimport {cloneAndNormalizeFieldForComparison, cloneAndRemovePunctuation} from '../normalizeFieldForComparison';\nimport {mergeOrAddSubfield} from './mergeOrAddSubfield';\nimport {mergeIndicators} from './mergeIndicator';\nimport {mergableTag} from './mergableTag';\nimport {getCounterpart} from './counterpartField';\n//import {default as normalizeEncoding} from '@natlibfi/marc-record-validators-melinda/dist/normalize-utf8-diacritics';\n//import {postprocessRecords} from './mergeOrAddPostprocess.js';\n//import {preprocessBeforeAdd} from './processFilter.js';\n\n//import fs from 'fs';\n//import path from 'path';\n\n\n//const defaultConfig = JSON.parse(fs.readFileSync(path.join(__dirname, '..', '..', 'src', 'reducers', 'config.json'), 'utf8'));\n\n// Specs: https://workgroups.helsinki.fi/x/K1ohCw (though we occasionally differ from them)...\n\nconst debug = createDebugLogger('@natlibfi/melinda-marc-record-merge-reducers:mergeField');\n//const debugData = debug.extend('data');\nconst debugDev = debug.extend('dev');\n\n// NB! Can be do this via config.json?\nfunction removeEnnakkotieto(field) {\n const tmp = field.subfields.filter(subfield => subfield.code !== 'g' || subfield.value !== 'ENNAKKOTIETO.');\n // remove only iff some other subfield remains\n if (tmp.length > 0) { // eslint-disable-line functional/no-conditional-statements\n field.subfields = tmp; // eslint-disable-line functional/immutable-data\n }\n}\n\n\nfunction copyrightYearHack(baseRecord, baseField, sourceField) {\n if (baseField.tag !== '264' || sourceField.tag !== '260') {\n return;\n }\n const relevantSubfields = sourceField.subfields.filter(sf => sf.code === 'c' && hasCopyright(sf.value));\n\n relevantSubfields.forEach(sf => {\n // Add new:\n const value = sf.value.replace(/\\.$/u, '');\n baseRecord.insertField({'tag': '264', 'ind1': ' ', 'ind2': '4', 'subfields': [{'code': 'c', value}]});\n // Modify original subfield:\n sf.value = removeCopyright(sf.value); // eslint-disable-line functional/immutable-data\n });\n}\n\n// eslint-disable-next-line max-params\nfunction mergeField2(baseRecord, baseField, sourceField, config, candFieldPairs880 = []) {\n //// Identical fields\n // No need to check every subfield separately.\n // Also no need to postprocess the resulting field.\n if (fieldToString(baseField) === fieldToString(sourceField)) {\n return baseRecord;\n }\n\n // If a base ennakkotieto is merged with real data, remove ennakkotieto subfield:\n // (If our prepub normalizations are ok, this should not be needed.\n // However, it's simple and works well enough, so let's keep it here.)\n if (fieldHasSubfield(baseField, 'g', 'ENNAKKOTIETO.') && !fieldHasSubfield(sourceField, 'g', 'ENNAKKOTIETO.')) { // eslint-disable-line functional/no-conditional-statements\n removeEnnakkotieto(baseField);\n baseField.merged = 1; // eslint-disable-line functional/immutable-data\n }\n\n copyrightYearHack(baseRecord, baseField, sourceField);\n\n mergeIndicators(baseField, sourceField, config);\n\n\n // We want to add the incoming subfields without punctuation, and add puctuation later on.\n // (Cloning is harmless, but probably not needed.)\n // NEW: we also drag the normalized version along. It is needed for the merge-or-add decision\n const normalizedSourceField = cloneAndNormalizeFieldForComparison(sourceField); // This is for comparison\n const strippedSourceField = cloneAndRemovePunctuation(sourceField); // This is for adding subfields\n\n //nvdebug(` MERGING SUBFIELDS OF '${fieldToString(sourceField)}' (original)`, debugDev);\n //nvdebug(` MERGING SUBFIELDS OF '${fieldToString(normalizedSourceField)}' (comparison)`, debugDev);\n nvdebug(` MERGING SUBFIELDS OF '${fieldToString(strippedSourceField)}' (merge/add)`, debugDev);\n\n sourceField.subfields.forEach((originalSubfield, index) => {\n //strippedSourceField.subfields.forEach((subfieldForMergeOrAdd, index) => {\n const normalizedSubfield = normalizedSourceField.subfields[index];\n const punctlessSubfield = strippedSourceField.subfields[index];\n const originalBaseValue = fieldToString(baseField);\n nvdebug(` TRYING TO MERGE SUBFIELD '${subfieldToString(originalSubfield)}' TO '${originalBaseValue}'`, debugDev);\n\n const subfieldData = {'tag': sourceField.tag, 'code': originalSubfield.code, 'originalValue': originalSubfield.value, 'normalizedValue': normalizedSubfield.value, 'punctuationlessValue': punctlessSubfield.value};\n\n mergeOrAddSubfield(baseField, subfieldData, candFieldPairs880); // candSubfield);\n const newValue = fieldToString(baseField);\n if (originalBaseValue !== newValue) { // eslint-disable-line functional/no-conditional-statements\n nvdebug(` SUBFIELD MERGE RESULT: '${newValue}'`, debugDev);\n //debug(` TODO: sort subfields, handle punctuation...`);\n }\n //else { debugDev(` mergeOrAddSubfield() did not add '‡${fieldToString(subfieldForMergeOrAdd)}' to '${originalValue}'`); }\n\n });\n}\n\n\nfunction skipMergeField(baseRecord, sourceField, config) {\n if (!mergableTag(sourceField.tag, config)) {\n nvdebug(`skipMergeField(): field '${fieldToString(sourceField)}' listed as skippable!`, debugDev);\n return true;\n }\n\n // Skip duplicate field:\n if (baseRecord.fields.some(baseField => !baseField.mergeCandidate && fieldsAreIdentical(sourceField, baseField))) {\n nvdebug(`skipMergeField(): field '${fieldToString(sourceField)}' already exists! No merge required!`, debugDev);\n sourceField.deleted = 1; // eslint-disable-line functional/immutable-data\n return true;\n }\n\n return false;\n}\n\nfunction sourceRecordIsBetter(baseField, sourceField) {\n if (!baseField.subfields) {\n return;\n }\n // MELINDA-8978: prefer Asteri version\n if (isAsteriField(sourceField) && !isAsteriField(baseField)) {\n return 1;\n }\n\n function isAsteriField(field) {\n if (field.subfields.some(sf => sf.code === '0' && sf.value.match(/^\\((?:FI-ASTERI-[NW]|FIN1[13])\\)[0-9]{9}$/u))) {\n return true;\n }\n }\n return false;\n}\n\nfunction swapDataBetweenFields(field1, field2) {\n // NB! Does not support controlfields yet! Add support if the need arises.\n if (field1.subfields) { // If field1 has subfields, then also field2 has them. No need to check the other field here.\n swapNamedData('ind1');\n swapNamedData('ind2');\n swapNamedData('subfields');\n return;\n }\n return;\n\n function swapNamedData(name) {\n const data = field1[name]; // eslint-disable-line functional/immutable-data\n field1[name] = field2[name]; // eslint-disable-line functional/immutable-data\n field2[name] = data; // eslint-disable-line functional/immutable-data\n }\n\n}\n\nexport function mergeField(baseRecord, sourceRecord, sourceField, config) {\n nvdebug(`SELF: ${fieldToString(sourceField)}`, debugDev);\n\n sourceField.mergeCandidate = true; // eslint-disable-line functional/immutable-data\n // skip duplicates and special cases:\n if (skipMergeField(baseRecord, sourceField, config)) {\n nvdebug(`mergeField(): don't merge '${fieldToString(sourceField)}'`, debugDev);\n delete sourceField.mergeCandidate; // eslint-disable-line functional/immutable-data\n return false;\n }\n\n nvdebug(`mergeField(): Try to merge '${fieldToString(sourceField)}'.`, debugDev);\n const counterpartField = getCounterpart(baseRecord, sourceRecord, sourceField, config);\n\n if (counterpartField) {\n if (sourceRecordIsBetter(counterpartField, sourceField)) { // eslint-disable-line functional/no-conditional-statements\n swapDataBetweenFields(counterpartField, sourceField);\n }\n\n const candFieldPairs880 = sourceField.tag === '880' ? undefined : fieldGetOccurrenceNumberPairs(sourceField, sourceRecord.fields);\n nvdebug(`mergeField(): Got counterpart: '${fieldToString(counterpartField)}'. Thus try merge...`, debugDev);\n nvdebug(`PAIR: ${candFieldPairs880 ? fieldsToString(candFieldPairs880) : 'NADA'}`, debugDev);\n mergeField2(baseRecord, counterpartField, sourceField, config, candFieldPairs880);\n sourceField.deleted = 1; // eslint-disable-line functional/immutable-data\n delete sourceField.mergeCandidate; // eslint-disable-line functional/immutable-data\n return true;\n }\n // NB! Counterpartless field is inserted to 7XX even if field.tag says 1XX:\n debugDev(`mergeField(): No mergable counterpart found for '${fieldToString(sourceField)}'.`);\n delete sourceField.mergeCandidate; // eslint-disable-line functional/immutable-data\n return false;\n}\n\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -0,0 +1,171 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.mergeIndicators = mergeIndicators;
|
|
7
|
+
var _debug = _interopRequireDefault(require("debug"));
|
|
8
|
+
var _utils = require("../utils");
|
|
9
|
+
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
|
|
10
|
+
// Specs: https://workgroups.helsinki.fi/x/K1ohCw (though we occasionally differ from them)...
|
|
11
|
+
|
|
12
|
+
const debug = (0, _debug.default)('@natlibfi/marc-record-validators-melinda:merge-fields:mergeIndicator');
|
|
13
|
+
//const debugData = debug.extend('data');
|
|
14
|
+
const debugDev = debug.extend('dev');
|
|
15
|
+
const ind1NonFilingChars = ['130', '630', '730', '740'];
|
|
16
|
+
const ind2NonFilingChars = ['222', '240', '242', '243', '245', '830'];
|
|
17
|
+
function mergeIndicators(toField, fromField, config) {
|
|
18
|
+
// NB! For non-filing indicators we deem that bigger is better. This is a bit quick'n'dirty, as usual.
|
|
19
|
+
// We could and should checks the relevant article length (using language information whilst doing it).
|
|
20
|
+
// However, this is a task for record internal fixer, not merge.
|
|
21
|
+
//
|
|
22
|
+
// For other indicators the situation is trickier, as we don't know which one is the good value.
|
|
23
|
+
//
|
|
24
|
+
// NB! We could add fixes for various other indicator types as well. However, it gets quickly pretty ad hoc.
|
|
25
|
+
// nvdebug(fieldToString(toField), debugDev);
|
|
26
|
+
// nvdebug(fieldToString(fromField), debugDev);
|
|
27
|
+
|
|
28
|
+
mergeIndicator1(toField, fromField, config);
|
|
29
|
+
mergeIndicator2(toField, fromField, config);
|
|
30
|
+
function getIndicatorPreferredValues(tag, indicatorNumber, config) {
|
|
31
|
+
const cands = getIndicatorPreferredValuesForGivenTag(tag, indicatorNumber, config);
|
|
32
|
+
// More complex systems where multiple indicators have same priority are objects.
|
|
33
|
+
// Example: field 506 might return {"0": 1, "1": 1, " ": 2}
|
|
34
|
+
// Here indicator values '0' and '1' share top priority 1, and '#' is of lesser importance, namely 2.
|
|
35
|
+
if (Array.isArray(cands) || typeof cands === 'object') {
|
|
36
|
+
return cands;
|
|
37
|
+
}
|
|
38
|
+
if (typeof cands === 'string') {
|
|
39
|
+
// single cand as string (seen in json in the past), though now they should all be arrays
|
|
40
|
+
return cands.split('');
|
|
41
|
+
}
|
|
42
|
+
return [];
|
|
43
|
+
function getIndicatorPreferredValuesForGivenTag(tag, indicatorNumber, config) {
|
|
44
|
+
const preferredValues = indicatorNumber === 1 ? config.indicator1PreferredValues : config.indicator2PreferredValues;
|
|
45
|
+
(0, _utils.nvdebug)(`${tag} IND${indicatorNumber}: get preferred values...\nCONFIG: ${JSON.stringify(config)}`, debugDev);
|
|
46
|
+
if (preferredValues) {
|
|
47
|
+
//nvdebug(`${tag} PREF VALS: ${JSON.stringify(preferredValues)}`, debugDev);
|
|
48
|
+
if (tag in preferredValues) {
|
|
49
|
+
return preferredValues[tag];
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
// Easter Egg #1: Use good-ish hard-coded defaults as not defined by user:
|
|
54
|
+
if (indicatorNumber === 1 && ind1NonFilingChars.includes(tag)) {
|
|
55
|
+
return '9876543210 ';
|
|
56
|
+
}
|
|
57
|
+
if (indicatorNumber === 2 && ind2NonFilingChars.includes(tag)) {
|
|
58
|
+
return '9876543210 ';
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
// Easter Egg #2: Marc21 standard has just one value for given indicator, so prefer it:
|
|
62
|
+
const cands = indicatorNumber === 1 ? (0, _utils.marc21GetTagsLegalInd1Value)(tag) : (0, _utils.marc21GetTagsLegalInd2Value)(tag);
|
|
63
|
+
if (cands) {
|
|
64
|
+
if (typeof cands === 'string' && cands.length === 1) {
|
|
65
|
+
// single cand
|
|
66
|
+
return [cands];
|
|
67
|
+
}
|
|
68
|
+
if (Array.isArray(cands) && cands.length === 1) {
|
|
69
|
+
return cands;
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
return [];
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
function getPreferredValue(preferences, val1, val2) {
|
|
76
|
+
const i1 = scoreValue(preferences, val1);
|
|
77
|
+
const i2 = scoreValue(preferences, val2);
|
|
78
|
+
if (i1 === -1) {
|
|
79
|
+
return i2 === -1 ? undefined : val2;
|
|
80
|
+
}
|
|
81
|
+
if (i2 === -1) {
|
|
82
|
+
return val1;
|
|
83
|
+
}
|
|
84
|
+
// The sooner, the better:
|
|
85
|
+
return i1 < i2 ? val1 : val2;
|
|
86
|
+
function scoreValue(preferences, val) {
|
|
87
|
+
if (Array.isArray(preferences)) {
|
|
88
|
+
return preferences.indexOf(val);
|
|
89
|
+
}
|
|
90
|
+
// preferences may be an object, since diffent values can return same score
|
|
91
|
+
// (eg. 506 ind1 values '0' and '1' are equal but better than '#')
|
|
92
|
+
if (!(val in preferences)) {
|
|
93
|
+
return -1;
|
|
94
|
+
}
|
|
95
|
+
return preferences[val];
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
function fieldIsFenniKept(field) {
|
|
99
|
+
return field.subfields && field.subfields.some(sf => sf.code === '9' && sf.value === 'FENNI<KEEP>');
|
|
100
|
+
}
|
|
101
|
+
function mergeIndicator1(toField, fromField, config) {
|
|
102
|
+
if (toField.ind1 === fromField.ind1) {
|
|
103
|
+
return; // Do nothing
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
// MRA-300: If source contains the (un)holy $9 FENNI<KEEP>, we prefer that value regardless of whatever...
|
|
107
|
+
if (!fieldIsFenniKept(toField) && fieldIsFenniKept(fromField)) {
|
|
108
|
+
toField.ind1 = fromField.ind1; // eslint-disable-line functional/immutable-data
|
|
109
|
+
return;
|
|
110
|
+
}
|
|
111
|
+
const preferredValues = getIndicatorPreferredValues(toField.tag, 1, config);
|
|
112
|
+
if (preferredValues) {
|
|
113
|
+
//nvdebug(`Try to merge indicator 1: '${toField.ind1}' vs '${fromField.ind1}'`, debugDev);
|
|
114
|
+
//nvdebug(`PREF VALS: ${preferredValues}`, debugDev);
|
|
115
|
+
const preferredValue = getPreferredValue(preferredValues, fromField.ind1, toField.ind1);
|
|
116
|
+
if (typeof preferredValue !== 'undefined') {
|
|
117
|
+
//nvdebug(`${preferredValue} WINS!`, debugDev);
|
|
118
|
+
toField.ind1 = preferredValue; // eslint-disable-line functional/immutable-data
|
|
119
|
+
return;
|
|
120
|
+
}
|
|
121
|
+
//nvdebug(`No winner found indicator 1: '${toField.ind1}' vs '${fromField.ind1}', keep '${toField.ind1}'`, debugDev);
|
|
122
|
+
//return;
|
|
123
|
+
}
|
|
124
|
+
//nvdebug(`TAG '${toField.tag}': No rule to merge indicator 1: '${toField.ind1}' vs '${fromField.ind1}', keep '${toField.ind1}'`, debugDev);
|
|
125
|
+
}
|
|
126
|
+
function publisherTagSwapHack(toField, fromField) {
|
|
127
|
+
// NB! Note that field 264.ind2==3 maps to $efg in field 260, so it is not relevant *here*:
|
|
128
|
+
// (Not sure whether our ind2 sanity check list should contain '4' (copyright year) as well:)
|
|
129
|
+
if (toField.tag !== '260' || fromField.tag !== '264' || !['0', '1', '2'].includes(fromField.ind2)) {
|
|
130
|
+
return;
|
|
131
|
+
}
|
|
132
|
+
// Field 264 IND2 contains information that can not be coded into field 260.
|
|
133
|
+
|
|
134
|
+
// However, 260 contains data that cannot be converted to 264 as well
|
|
135
|
+
if (toField.subfields.some(sf => ['e', 'f', 'g'].includes(sf.code))) {
|
|
136
|
+
(0, _utils.nvdebug)(`WARNING: can not change base 260 to 264 as it contains $e, $f and/or $g. Source IND2 info lost.`, debugDev);
|
|
137
|
+
(0, _utils.nvdebug)(` ${(0, _utils.fieldToString)(toField)}\n ${(0, _utils.fieldToString)(fromField)}`, debugDev);
|
|
138
|
+
return;
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
// Convert 260 to 264 so that no information is lost:
|
|
142
|
+
(0, _utils.nvdebug)(`Apply base 260->264 tag swap hack`, debugDev);
|
|
143
|
+
(0, _utils.nvdebug)(` ${(0, _utils.fieldToString)(toField)}\n ${(0, _utils.fieldToString)(fromField)}`, debugDev);
|
|
144
|
+
toField.tag = '264'; // eslint-disable-line functional/immutable-data
|
|
145
|
+
toField.ind2 = fromField.ind2; // eslint-disable-line functional/immutable-data
|
|
146
|
+
}
|
|
147
|
+
function mergeIndicator2(toField, fromField, config) {
|
|
148
|
+
if (toField.ind2 === fromField.ind2) {
|
|
149
|
+
return; // Do nothing
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
//nvdebug(`Merge IND2`, debugDev);
|
|
153
|
+
//nvdebug(` ${fieldToString(toField)}\n ${fieldToString(fromField)}`, debugDev);
|
|
154
|
+
|
|
155
|
+
publisherTagSwapHack(toField, fromField); // Easter egg/hack for base-260 vs source-264
|
|
156
|
+
|
|
157
|
+
// If source contains $9 FENNI<KEEP>, we might prefer it?
|
|
158
|
+
|
|
159
|
+
//nvdebug(`Try to merge indicator 2: '${toField.ind2}' vs '${fromField.ind2}'`, debugDev);
|
|
160
|
+
const preferredValues = getIndicatorPreferredValues(toField.tag, 2, config);
|
|
161
|
+
if (preferredValues) {
|
|
162
|
+
//nvdebug(` Try to merge indicator 2. Got preferred values '${preferredValues}'`, debugDev);
|
|
163
|
+
const preferredValue = getPreferredValue(preferredValues, fromField.ind2, toField.ind2);
|
|
164
|
+
if (typeof preferredValue !== 'undefined') {
|
|
165
|
+
toField.ind2 = preferredValue; // eslint-disable-line functional/immutable-data
|
|
166
|
+
return;
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
//# sourceMappingURL=mergeIndicator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mergeIndicator.js","names":["_debug","_interopRequireDefault","require","_utils","e","__esModule","default","debug","createDebugLogger","debugDev","extend","ind1NonFilingChars","ind2NonFilingChars","mergeIndicators","toField","fromField","config","mergeIndicator1","mergeIndicator2","getIndicatorPreferredValues","tag","indicatorNumber","cands","getIndicatorPreferredValuesForGivenTag","Array","isArray","split","preferredValues","indicator1PreferredValues","indicator2PreferredValues","nvdebug","JSON","stringify","includes","marc21GetTagsLegalInd1Value","marc21GetTagsLegalInd2Value","length","getPreferredValue","preferences","val1","val2","i1","scoreValue","i2","undefined","val","indexOf","fieldIsFenniKept","field","subfields","some","sf","code","value","ind1","preferredValue","publisherTagSwapHack","ind2","fieldToString"],"sources":["../../src/merge-fields/mergeIndicator.js"],"sourcesContent":["import createDebugLogger from 'debug';\nimport {fieldToString, marc21GetTagsLegalInd1Value, marc21GetTagsLegalInd2Value, nvdebug} from '../utils';\n\n// Specs: https://workgroups.helsinki.fi/x/K1ohCw (though we occasionally differ from them)...\n\nconst debug = createDebugLogger('@natlibfi/marc-record-validators-melinda:merge-fields:mergeIndicator');\n//const debugData = debug.extend('data');\nconst debugDev = debug.extend('dev');\n\nconst ind1NonFilingChars = ['130', '630', '730', '740'];\nconst ind2NonFilingChars = ['222', '240', '242', '243', '245', '830'];\n\n\nexport function mergeIndicators(toField, fromField, config) {\n // NB! For non-filing indicators we deem that bigger is better. This is a bit quick'n'dirty, as usual.\n // We could and should checks the relevant article length (using language information whilst doing it).\n // However, this is a task for record internal fixer, not merge.\n //\n // For other indicators the situation is trickier, as we don't know which one is the good value.\n //\n // NB! We could add fixes for various other indicator types as well. However, it gets quickly pretty ad hoc.\n // nvdebug(fieldToString(toField), debugDev);\n // nvdebug(fieldToString(fromField), debugDev);\n\n mergeIndicator1(toField, fromField, config);\n mergeIndicator2(toField, fromField, config);\n\n function getIndicatorPreferredValues(tag, indicatorNumber, config) {\n const cands = getIndicatorPreferredValuesForGivenTag(tag, indicatorNumber, config);\n // More complex systems where multiple indicators have same priority are objects.\n // Example: field 506 might return {\"0\": 1, \"1\": 1, \" \": 2}\n // Here indicator values '0' and '1' share top priority 1, and '#' is of lesser importance, namely 2.\n if (Array.isArray(cands) || typeof cands === 'object') {\n return cands;\n }\n if (typeof cands === 'string') { // single cand as string (seen in json in the past), though now they should all be arrays\n return cands.split('');\n }\n\n return [];\n\n function getIndicatorPreferredValuesForGivenTag(tag, indicatorNumber, config) {\n const preferredValues = indicatorNumber === 1 ? config.indicator1PreferredValues : config.indicator2PreferredValues;\n nvdebug(`${tag} IND${indicatorNumber}: get preferred values...\\nCONFIG: ${JSON.stringify(config)}`, debugDev);\n if (preferredValues) {\n //nvdebug(`${tag} PREF VALS: ${JSON.stringify(preferredValues)}`, debugDev);\n if (tag in preferredValues) {\n return preferredValues[tag];\n }\n }\n\n // Easter Egg #1: Use good-ish hard-coded defaults as not defined by user:\n if (indicatorNumber === 1 && ind1NonFilingChars.includes(tag)) {\n return '9876543210 ';\n }\n if (indicatorNumber === 2 && ind2NonFilingChars.includes(tag)) {\n return '9876543210 ';\n }\n\n // Easter Egg #2: Marc21 standard has just one value for given indicator, so prefer it:\n const cands = indicatorNumber === 1 ? marc21GetTagsLegalInd1Value(tag) : marc21GetTagsLegalInd2Value(tag);\n if (cands) {\n if (typeof cands === 'string' && cands.length === 1) { // single cand\n return [cands];\n }\n if (Array.isArray(cands) && cands.length === 1) {\n return cands;\n }\n }\n\n return [];\n }\n }\n\n function getPreferredValue(preferences, val1, val2) {\n const i1 = scoreValue(preferences, val1);\n const i2 = scoreValue(preferences, val2);\n if (i1 === -1) {\n return i2 === -1 ? undefined : val2;\n }\n if (i2 === -1) {\n return val1;\n }\n // The sooner, the better:\n return i1 < i2 ? val1 : val2;\n\n function scoreValue(preferences, val) {\n if (Array.isArray(preferences)) {\n return preferences.indexOf(val);\n }\n // preferences may be an object, since diffent values can return same score\n // (eg. 506 ind1 values '0' and '1' are equal but better than '#')\n if (!(val in preferences)) {\n return -1;\n }\n return preferences[val];\n }\n }\n\n\n function fieldIsFenniKept(field) {\n return field.subfields && field.subfields.some(sf => sf.code === '9' && sf.value === 'FENNI<KEEP>');\n }\n\n function mergeIndicator1(toField, fromField, config) {\n if (toField.ind1 === fromField.ind1) {\n return; // Do nothing\n }\n\n // MRA-300: If source contains the (un)holy $9 FENNI<KEEP>, we prefer that value regardless of whatever...\n if (!fieldIsFenniKept(toField) && fieldIsFenniKept(fromField)) {\n toField.ind1 = fromField.ind1; // eslint-disable-line functional/immutable-data\n return;\n }\n\n\n const preferredValues = getIndicatorPreferredValues(toField.tag, 1, config);\n\n if (preferredValues) {\n //nvdebug(`Try to merge indicator 1: '${toField.ind1}' vs '${fromField.ind1}'`, debugDev);\n //nvdebug(`PREF VALS: ${preferredValues}`, debugDev);\n const preferredValue = getPreferredValue(preferredValues, fromField.ind1, toField.ind1);\n if (typeof preferredValue !== 'undefined') {\n //nvdebug(`${preferredValue} WINS!`, debugDev);\n toField.ind1 = preferredValue; // eslint-disable-line functional/immutable-data\n return;\n }\n //nvdebug(`No winner found indicator 1: '${toField.ind1}' vs '${fromField.ind1}', keep '${toField.ind1}'`, debugDev);\n //return;\n }\n //nvdebug(`TAG '${toField.tag}': No rule to merge indicator 1: '${toField.ind1}' vs '${fromField.ind1}', keep '${toField.ind1}'`, debugDev);\n }\n\n\n function publisherTagSwapHack(toField, fromField) {\n // NB! Note that field 264.ind2==3 maps to $efg in field 260, so it is not relevant *here*:\n // (Not sure whether our ind2 sanity check list should contain '4' (copyright year) as well:)\n if (toField.tag !== '260' || fromField.tag !== '264' || !['0', '1', '2'].includes(fromField.ind2)) {\n return;\n }\n // Field 264 IND2 contains information that can not be coded into field 260.\n\n // However, 260 contains data that cannot be converted to 264 as well\n if (toField.subfields.some(sf => ['e', 'f', 'g'].includes(sf.code))) {\n nvdebug(`WARNING: can not change base 260 to 264 as it contains $e, $f and/or $g. Source IND2 info lost.`, debugDev);\n nvdebug(` ${fieldToString(toField)}\\n ${fieldToString(fromField)}`, debugDev);\n return;\n }\n\n // Convert 260 to 264 so that no information is lost:\n nvdebug(`Apply base 260->264 tag swap hack`, debugDev);\n nvdebug(` ${fieldToString(toField)}\\n ${fieldToString(fromField)}`, debugDev);\n\n toField.tag = '264'; // eslint-disable-line functional/immutable-data\n toField.ind2 = fromField.ind2; // eslint-disable-line functional/immutable-data\n }\n\n function mergeIndicator2(toField, fromField, config) {\n if (toField.ind2 === fromField.ind2) {\n return; // Do nothing\n }\n\n //nvdebug(`Merge IND2`, debugDev);\n //nvdebug(` ${fieldToString(toField)}\\n ${fieldToString(fromField)}`, debugDev);\n\n\n publisherTagSwapHack(toField, fromField); // Easter egg/hack for base-260 vs source-264\n\n // If source contains $9 FENNI<KEEP>, we might prefer it?\n\n //nvdebug(`Try to merge indicator 2: '${toField.ind2}' vs '${fromField.ind2}'`, debugDev);\n const preferredValues = getIndicatorPreferredValues(toField.tag, 2, config);\n\n if (preferredValues) {\n //nvdebug(` Try to merge indicator 2. Got preferred values '${preferredValues}'`, debugDev);\n const preferredValue = getPreferredValue(preferredValues, fromField.ind2, toField.ind2);\n if (typeof preferredValue !== 'undefined') {\n toField.ind2 = preferredValue; // eslint-disable-line functional/immutable-data\n return;\n }\n }\n\n }\n\n}\n"],"mappings":";;;;;;AAAA,IAAAA,MAAA,GAAAC,sBAAA,CAAAC,OAAA;AACA,IAAAC,MAAA,GAAAD,OAAA;AAA0G,SAAAD,uBAAAG,CAAA,WAAAA,CAAA,IAAAA,CAAA,CAAAC,UAAA,GAAAD,CAAA,KAAAE,OAAA,EAAAF,CAAA;AAE1G;;AAEA,MAAMG,KAAK,GAAG,IAAAC,cAAiB,EAAC,sEAAsE,CAAC;AACvG;AACA,MAAMC,QAAQ,GAAGF,KAAK,CAACG,MAAM,CAAC,KAAK,CAAC;AAEpC,MAAMC,kBAAkB,GAAG,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,CAAC;AACvD,MAAMC,kBAAkB,GAAG,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,CAAC;AAG9D,SAASC,eAAeA,CAACC,OAAO,EAAEC,SAAS,EAAEC,MAAM,EAAE;EAC1D;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;EAEAC,eAAe,CAACH,OAAO,EAAEC,SAAS,EAAEC,MAAM,CAAC;EAC3CE,eAAe,CAACJ,OAAO,EAAEC,SAAS,EAAEC,MAAM,CAAC;EAE3C,SAASG,2BAA2BA,CAACC,GAAG,EAAEC,eAAe,EAAEL,MAAM,EAAE;IACjE,MAAMM,KAAK,GAAGC,sCAAsC,CAACH,GAAG,EAAEC,eAAe,EAAEL,MAAM,CAAC;IAClF;IACA;IACA;IACA,IAAIQ,KAAK,CAACC,OAAO,CAACH,KAAK,CAAC,IAAI,OAAOA,KAAK,KAAK,QAAQ,EAAE;MACrD,OAAOA,KAAK;IACd;IACA,IAAI,OAAOA,KAAK,KAAK,QAAQ,EAAE;MAAE;MAC/B,OAAOA,KAAK,CAACI,KAAK,CAAC,EAAE,CAAC;IACxB;IAEA,OAAO,EAAE;IAET,SAASH,sCAAsCA,CAACH,GAAG,EAAEC,eAAe,EAAEL,MAAM,EAAE;MAC5E,MAAMW,eAAe,GAAGN,eAAe,KAAK,CAAC,GAAGL,MAAM,CAACY,yBAAyB,GAAGZ,MAAM,CAACa,yBAAyB;MACnH,IAAAC,cAAO,EAAC,GAAGV,GAAG,OAAOC,eAAe,sCAAsCU,IAAI,CAACC,SAAS,CAAChB,MAAM,CAAC,EAAE,EAAEP,QAAQ,CAAC;MAC7G,IAAIkB,eAAe,EAAE;QACnB;QACA,IAAIP,GAAG,IAAIO,eAAe,EAAE;UAC1B,OAAOA,eAAe,CAACP,GAAG,CAAC;QAC7B;MACF;;MAEA;MACA,IAAIC,eAAe,KAAK,CAAC,IAAIV,kBAAkB,CAACsB,QAAQ,CAACb,GAAG,CAAC,EAAE;QAC7D,OAAO,aAAa;MACtB;MACA,IAAIC,eAAe,KAAK,CAAC,IAAIT,kBAAkB,CAACqB,QAAQ,CAACb,GAAG,CAAC,EAAE;QAC7D,OAAO,aAAa;MACtB;;MAEA;MACA,MAAME,KAAK,GAAGD,eAAe,KAAK,CAAC,GAAG,IAAAa,kCAA2B,EAACd,GAAG,CAAC,GAAG,IAAAe,kCAA2B,EAACf,GAAG,CAAC;MACzG,IAAIE,KAAK,EAAE;QACT,IAAI,OAAOA,KAAK,KAAK,QAAQ,IAAIA,KAAK,CAACc,MAAM,KAAK,CAAC,EAAE;UAAE;UACrD,OAAO,CAACd,KAAK,CAAC;QAChB;QACA,IAAIE,KAAK,CAACC,OAAO,CAACH,KAAK,CAAC,IAAIA,KAAK,CAACc,MAAM,KAAK,CAAC,EAAE;UAC9C,OAAOd,KAAK;QACd;MACF;MAEA,OAAO,EAAE;IACX;EACF;EAEA,SAASe,iBAAiBA,CAACC,WAAW,EAAEC,IAAI,EAAEC,IAAI,EAAE;IAClD,MAAMC,EAAE,GAAGC,UAAU,CAACJ,WAAW,EAAEC,IAAI,CAAC;IACxC,MAAMI,EAAE,GAAGD,UAAU,CAACJ,WAAW,EAAEE,IAAI,CAAC;IACxC,IAAIC,EAAE,KAAK,CAAC,CAAC,EAAE;MACb,OAAOE,EAAE,KAAK,CAAC,CAAC,GAAGC,SAAS,GAAGJ,IAAI;IACrC;IACA,IAAIG,EAAE,KAAK,CAAC,CAAC,EAAE;MACb,OAAOJ,IAAI;IACb;IACA;IACA,OAAOE,EAAE,GAAGE,EAAE,GAAGJ,IAAI,GAAGC,IAAI;IAE5B,SAASE,UAAUA,CAACJ,WAAW,EAAEO,GAAG,EAAE;MACpC,IAAIrB,KAAK,CAACC,OAAO,CAACa,WAAW,CAAC,EAAE;QAC9B,OAAOA,WAAW,CAACQ,OAAO,CAACD,GAAG,CAAC;MACjC;MACA;MACA;MACA,IAAI,EAAEA,GAAG,IAAIP,WAAW,CAAC,EAAE;QACzB,OAAO,CAAC,CAAC;MACX;MACA,OAAOA,WAAW,CAACO,GAAG,CAAC;IACzB;EACF;EAGA,SAASE,gBAAgBA,CAACC,KAAK,EAAE;IAC/B,OAAOA,KAAK,CAACC,SAAS,IAAID,KAAK,CAACC,SAAS,CAACC,IAAI,CAACC,EAAE,IAAIA,EAAE,CAACC,IAAI,KAAK,GAAG,IAAID,EAAE,CAACE,KAAK,KAAK,aAAa,CAAC;EACrG;EAEA,SAASpC,eAAeA,CAACH,OAAO,EAAEC,SAAS,EAAEC,MAAM,EAAE;IACnD,IAAIF,OAAO,CAACwC,IAAI,KAAKvC,SAAS,CAACuC,IAAI,EAAE;MACnC,OAAO,CAAC;IACV;;IAEA;IACA,IAAI,CAACP,gBAAgB,CAACjC,OAAO,CAAC,IAAIiC,gBAAgB,CAAChC,SAAS,CAAC,EAAE;MAC7DD,OAAO,CAACwC,IAAI,GAAGvC,SAAS,CAACuC,IAAI,CAAC,CAAC;MAC/B;IACF;IAGA,MAAM3B,eAAe,GAAGR,2BAA2B,CAACL,OAAO,CAACM,GAAG,EAAE,CAAC,EAAEJ,MAAM,CAAC;IAE3E,IAAIW,eAAe,EAAE;MACnB;MACA;MACA,MAAM4B,cAAc,GAAGlB,iBAAiB,CAACV,eAAe,EAAEZ,SAAS,CAACuC,IAAI,EAAExC,OAAO,CAACwC,IAAI,CAAC;MACvF,IAAI,OAAOC,cAAc,KAAK,WAAW,EAAE;QACzC;QACAzC,OAAO,CAACwC,IAAI,GAAGC,cAAc,CAAC,CAAC;QAC/B;MACF;MACA;MACA;IACF;IACA;EACF;EAGA,SAASC,oBAAoBA,CAAC1C,OAAO,EAAEC,SAAS,EAAE;IAChD;IACA;IACA,IAAID,OAAO,CAACM,GAAG,KAAK,KAAK,IAAIL,SAAS,CAACK,GAAG,KAAK,KAAK,IAAI,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAACa,QAAQ,CAAClB,SAAS,CAAC0C,IAAI,CAAC,EAAE;MACjG;IACF;IACA;;IAEA;IACA,IAAI3C,OAAO,CAACmC,SAAS,CAACC,IAAI,CAACC,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAAClB,QAAQ,CAACkB,EAAE,CAACC,IAAI,CAAC,CAAC,EAAE;MACnE,IAAAtB,cAAO,EAAC,iGAAiG,EAAErB,QAAQ,CAAC;MACpH,IAAAqB,cAAO,EAAC,IAAI,IAAA4B,oBAAa,EAAC5C,OAAO,CAAC,MAAM,IAAA4C,oBAAa,EAAC3C,SAAS,CAAC,EAAE,EAAEN,QAAQ,CAAC;MAC7E;IACF;;IAEA;IACA,IAAAqB,cAAO,EAAC,mCAAmC,EAAErB,QAAQ,CAAC;IACtD,IAAAqB,cAAO,EAAC,IAAI,IAAA4B,oBAAa,EAAC5C,OAAO,CAAC,MAAM,IAAA4C,oBAAa,EAAC3C,SAAS,CAAC,EAAE,EAAEN,QAAQ,CAAC;IAE7EK,OAAO,CAACM,GAAG,GAAG,KAAK,CAAC,CAAC;IACrBN,OAAO,CAAC2C,IAAI,GAAG1C,SAAS,CAAC0C,IAAI,CAAC,CAAC;EACjC;EAEA,SAASvC,eAAeA,CAACJ,OAAO,EAAEC,SAAS,EAAEC,MAAM,EAAE;IACnD,IAAIF,OAAO,CAAC2C,IAAI,KAAK1C,SAAS,CAAC0C,IAAI,EAAE;MACnC,OAAO,CAAC;IACV;;IAEA;IACA;;IAGAD,oBAAoB,CAAC1C,OAAO,EAAEC,SAAS,CAAC,CAAC,CAAC;;IAE1C;;IAEA;IACA,MAAMY,eAAe,GAAGR,2BAA2B,CAACL,OAAO,CAACM,GAAG,EAAE,CAAC,EAAEJ,MAAM,CAAC;IAE3E,IAAIW,eAAe,EAAE;MACnB;MACA,MAAM4B,cAAc,GAAGlB,iBAAiB,CAACV,eAAe,EAAEZ,SAAS,CAAC0C,IAAI,EAAE3C,OAAO,CAAC2C,IAAI,CAAC;MACvF,IAAI,OAAOF,cAAc,KAAK,WAAW,EAAE;QACzCzC,OAAO,CAAC2C,IAAI,GAAGF,cAAc,CAAC,CAAC;QAC/B;MACF;IACF;EAEF;AAEF","ignoreList":[]}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.postprocessRecords = postprocessRecords;
|
|
7
|
+
var _punctuation = require("../punctuation2");
|
|
8
|
+
var _removeDuplicateSubfields = require("./removeDuplicateSubfields");
|
|
9
|
+
var _sortSubfields = require("../sortSubfields");
|
|
10
|
+
var _sortRelatorTerms = require("../sortRelatorTerms");
|
|
11
|
+
// This field should be renamed, as it is called also from outside megre.
|
|
12
|
+
|
|
13
|
+
//import {MarcRecord} from '@natlibfi/marc-record';
|
|
14
|
+
|
|
15
|
+
function postprocessBaseRecord(base) {
|
|
16
|
+
base.fields.forEach(field => {
|
|
17
|
+
// NB! Relator terms are now expanded and translated already at preprocess stage!
|
|
18
|
+
|
|
19
|
+
// remove merge-specific information:
|
|
20
|
+
if (field.merged) {
|
|
21
|
+
// eslint-disable-line functional/no-conditional-statements
|
|
22
|
+
// Field level ideas about things that could be done here:
|
|
23
|
+
// - Fix indicators?
|
|
24
|
+
// Record level fixes should be implemented as validators/fixers
|
|
25
|
+
// in marc-record-validators-melinda and ust called from here.
|
|
26
|
+
(0, _removeDuplicateSubfields.fieldRemoveDuplicateSubfields)(field);
|
|
27
|
+
(0, _punctuation.fieldFixPunctuation)(field); // NB! This will fix only fields with merged content
|
|
28
|
+
(0, _sortSubfields.sortAdjacentSubfields)(field); // Put the added $e subfield to proper places.
|
|
29
|
+
(0, _sortRelatorTerms.sortAdjacentESubfields)(field); // Sort $e subfields with each other
|
|
30
|
+
(0, _punctuation.fieldFixPunctuation)(field);
|
|
31
|
+
delete field.merged; // eslint-disable-line functional/immutable-data
|
|
32
|
+
}
|
|
33
|
+
if (field.useExternalEndPunctuation) {
|
|
34
|
+
// eslint-disable-line functional/no-conditional-statements
|
|
35
|
+
delete field.useExternalEndPunctuation; // eslint-disable-line functional/immutable-data
|
|
36
|
+
}
|
|
37
|
+
if (field.added) {
|
|
38
|
+
// eslint-disable-line functional/no-conditional-statements
|
|
39
|
+
delete field.added; // eslint-disable-line functional/immutable-data
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
/*
|
|
43
|
+
if (field.deleted) { // eslint-disable-line functional/no-conditional-statements
|
|
44
|
+
delete field.deleted; // eslint-disable-line functional/immutable-data
|
|
45
|
+
}
|
|
46
|
+
*/
|
|
47
|
+
});
|
|
48
|
+
}
|
|
49
|
+
function removeDeletedFields(record) {
|
|
50
|
+
// remove fields that are marked as deleted:
|
|
51
|
+
record.fields = record.fields.filter(f => !f.deleted); // eslint-disable-line functional/immutable-data
|
|
52
|
+
}
|
|
53
|
+
function postprocessRecords(base, source) {
|
|
54
|
+
postprocessBaseRecord(base);
|
|
55
|
+
removeDeletedFields(source); // So that we may know what was used, and what not.
|
|
56
|
+
}
|
|
57
|
+
//# sourceMappingURL=mergeOrAddPostprocess.js.map
|