@natlibfi/marc-record-validators-melinda 11.5.2 → 11.5.4-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.
@@ -782,7 +782,9 @@ const mergeConstraints = [{
782
782
  'tag': '588',
783
783
  'required': 'a',
784
784
  'key': 'a'
785
- }, {
785
+ },
786
+ // NB! Currently we never merge 59X fields (see mergableTags.js). Doublish removals such as MELKEHITYS-3147 are handled by postprocessor.
787
+ {
786
788
  'tag': '590',
787
789
  'required': ''
788
790
  }, {
@@ -1 +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":[]}
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 // NB! Currently we never merge 59X fields (see mergableTags.js). Doublish removals such as MELKEHITYS-3147 are handled by postprocessor.\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":[]}
@@ -192,7 +192,7 @@ function isEnnakkotietoSubfield(subfield) {
192
192
  // Length <= 13 allows punctuation, but does not require it:
193
193
  if (subfield.value.length <= 13) {
194
194
  const coreString = subfield.value.substr(0, 12);
195
- if (coreString === 'ENNAKKOTIETO' || coreString === 'ennakkotieto') {
195
+ if (coreString.toLowerCase() === 'ennakkotieto') {
196
196
  // Lowercase term first seen in MET-575
197
197
  return true;
198
198
  }
@@ -1 +1 @@
1
- {"version":3,"file":"prepublicationUtils.js","names":["_utils","require","_debug","_interopRequireDefault","e","__esModule","default","debug","createDebugLogger","debugDev","extend","KONEELLISESTI_TUOTETTU_TIETUE","TARKISTETTU_ENNAKKOTIETO","ENNAKKOTIETO","encodingLevelPreferenceArray","prepublicationLevelIndex","indexOf","prepublicationLevelIsKoneellisestiTuotettuTietueOrTarkistettuEnnakkotieto","prepublicationLevel","encodingLevelIsBetterThanPrepublication","encodingLevel","index","fieldRefersToKoneellisestiTuotettuTietue","field","subfields","some","sf","code","value","match","fieldRefersToTarkistettuEnnakkotieto","fieldRefersToEnnakkotieto","firstFieldHasBetterPrepubEncodingLevel","field1","field2","getRelevant5XXFields","record","f500","f594","cands","actualGetFields","filtered","filter","hasRelevantPrepubData","tag","every","includes","get","getPrepublicationLevel","fields","f","baseHasEqualOrHigherEncodingLevel","baseEncodingLevel","sourceEncodingLevel","baseIndex","sourceIndex","hasFikkaLOW","fieldHasSubfield","hasNatLibFi042","isFikkaRecord","getEncodingLevel","leader","substring","deleteAllPrepublicationNotesFromField500InNonPubRecord","length","nvdebug","forEach","removeField","removeWorsePrepubField500s","nvdebugFieldArray","nonBest","removeWorsePrepubField594s","fields594","isEnnakkotietoSubfield","subfield","coreString","substr","isEnnakkotietoField","isKingOfTheHill","opposingFields","opposingField"],"sources":["../src/prepublicationUtils.js"],"sourcesContent":["import {fieldHasSubfield, nvdebug, nvdebugFieldArray} from './utils';\nimport createDebugLogger from 'debug';\n\nconst debug = createDebugLogger('@natlibfi/marc-record-validators-melinda:prepublicationUtils');\n//const debugData = debug.extend('data');\nconst debugDev = debug.extend('dev');\n\nconst KONEELLISESTI_TUOTETTU_TIETUE = 1; // Best\nconst TARKISTETTU_ENNAKKOTIETO = 2;\nconst ENNAKKOTIETO = 3;\n//const EI_TASOA = 4;\n\nconst encodingLevelPreferenceArray = [' ', '1', '3', '4', '5', '2', '7', 'u', 'z', '8']; // MET-145\nconst prepublicationLevelIndex = encodingLevelPreferenceArray.indexOf('8');\n\nexport function prepublicationLevelIsKoneellisestiTuotettuTietueOrTarkistettuEnnakkotieto(prepublicationLevel) {\n return prepublicationLevel === KONEELLISESTI_TUOTETTU_TIETUE || prepublicationLevel === TARKISTETTU_ENNAKKOTIETO;\n}\n\n\nexport function encodingLevelIsBetterThanPrepublication(encodingLevel) {\n const index = encodingLevelPreferenceArray.indexOf(encodingLevel);\n return index > -1 && index < prepublicationLevelIndex;\n}\n\n// These three functions below all refer to field 500:\nexport function fieldRefersToKoneellisestiTuotettuTietue(field) {\n return field.subfields?.some(sf => sf.code === 'a' && sf.value.match(/^Koneellisesti tuotettu tietue/u));\n}\n\n\nexport function fieldRefersToTarkistettuEnnakkotieto(field) {\n return field.subfields?.some(sf => sf.code === 'a' && sf.value.match(/^tarkistettu ennakkotieto/ui));\n}\n\n\nexport function fieldRefersToEnnakkotieto(field) {\n // NB! This no longer matches 'TARKISTETTU ENNAKKOTIETO' case! Bug or Feature?\n if (field.subfields?.some(sf => sf.code === 'a' && sf.value.match(/^ennakkotieto(?:$|[. ])/ui))) {\n return true;\n }\n\n // MRA-420: \"EI VIELÄ ILMESTYNYT\" is a Helmet note, that is semantically similar to ENNAKKOTIETO:\n return field.subfields?.some(sf => sf.code === 'a' && sf.value.match(/^EI VIELÄ ILMESTYNYT/u));\n}\n\n\nexport function firstFieldHasBetterPrepubEncodingLevel(field1, field2) {\n if (fieldRefersToKoneellisestiTuotettuTietue(field2)) {\n return false;\n }\n if (fieldRefersToKoneellisestiTuotettuTietue(field1)) {\n return true;\n }\n if (fieldRefersToTarkistettuEnnakkotieto(field2)) {\n return false;\n }\n if (fieldRefersToTarkistettuEnnakkotieto(field1)) {\n return true;\n }\n if (fieldRefersToEnnakkotieto(field2)) {\n return false;\n }\n if (fieldRefersToEnnakkotieto(field1)) {\n return true;\n }\n return false;\n}\n\nexport function getRelevant5XXFields(record, f500 = false, f594 = false) {\n const cands = actualGetFields();\n //nvdebugFieldArray(cands, 'gR5XXa: ', debugDev);\n const filtered = cands.filter(field => hasRelevantPrepubData(field));\n //nvdebugFieldArray(filtered, 'gR5XXb: ', debugDev);\n return filtered;\n\n //return actualGetFields().filter(field => hasRelevantPrepubData(field));\n\n function hasRelevantPrepubData(field) {\n // Check prepub ($a):\n if (!fieldRefersToKoneellisestiTuotettuTietue(field) && !fieldRefersToTarkistettuEnnakkotieto(field) && !fieldRefersToEnnakkotieto(field)) {\n return false;\n }\n // Check relevance (594$5):\n if (field.tag === '500') {\n return field.subfields.every(sf => sf.code !== '5'); //true;\n }\n return field.subfields.some(sf => sf.code === '5' && ['FENNI', 'FIKKA', 'VIOLA'].includes(sf.value));\n }\n\n function actualGetFields() {\n if (f500 && f594) {\n return record.get(/^(?:500|594)$/u);\n }\n if (f500) {\n return record.get(/^500$/u);\n }\n if (f594) {\n return record.get(/^594$/u);\n }\n return [];\n }\n\n}\n\n\n// Very similar to getPrepublicationLevel() in melinda-record-match-validator's getPrepublicationLevel()...\n// We should use that and not have a copy here...\nexport function getPrepublicationLevel(record, f500 = false, f594 = false) {\n // Smaller return value is better\n const fields = getRelevant5XXFields(record, f500, f594);\n\n if (!fields) {\n return null;\n }\n if (fields.some(f => fieldRefersToKoneellisestiTuotettuTietue(f))) {\n return KONEELLISESTI_TUOTETTU_TIETUE;\n }\n\n if (fields.some(f => fieldRefersToTarkistettuEnnakkotieto(f))) {\n return TARKISTETTU_ENNAKKOTIETO;\n }\n\n if (fields.some(f => fieldRefersToEnnakkotieto(f))) {\n return ENNAKKOTIETO;\n }\n\n return null;\n}\n\n\nexport function baseHasEqualOrHigherEncodingLevel(baseEncodingLevel, sourceEncodingLevel) {\n const baseIndex = encodingLevelPreferenceArray.indexOf(baseEncodingLevel);\n const sourceIndex = encodingLevelPreferenceArray.indexOf(sourceEncodingLevel);\n\n if (baseIndex === -1) {\n // Base wins if both are bad:\n return sourceIndex === -1;\n }\n return baseIndex <= sourceIndex;\n}\n\n\nfunction hasFikkaLOW(record) {\n return record.fields.some(field => field.tag === 'LOW' && fieldHasSubfield(field, 'a', 'FIKKA'));\n}\n\n\nfunction hasNatLibFi042(record) {\n return record.fields.some(field => field.tag === '042' && (fieldHasSubfield(field, 'a', 'finb') || fieldHasSubfield(field, 'a', 'finbd')));\n}\n\n\nexport function isFikkaRecord(record) {\n // NB! Does not include Humaniora. Pienpainatteet (not that they'd have duplicates)?\n return hasFikkaLOW(record) && hasNatLibFi042(record);\n}\n\n\nexport function getEncodingLevel(record) {\n return record.leader.substring(17, 18);\n}\n\n\nexport function deleteAllPrepublicationNotesFromField500InNonPubRecord(record) {\n const encodingLevel = getEncodingLevel(record);\n // Skip prepublication (or theoretically even worse) records:\n if (!encodingLevelIsBetterThanPrepublication(encodingLevel)) {\n //if (['2', '8'].includes(encodingLevel)) { // MET-306: added '2' here\n return;\n }\n\n // MET-306: keep \"koneellisesti tuotettu tietue\" if encoding level is '2':\n const f500 = getRelevant5XXFields(record, true, false).filter(field => encodingLevel === '2' ? !fieldRefersToKoneellisestiTuotettuTietue(field) : true);\n if (f500.length === 0) {\n return;\n }\n\n\n nvdebug(`Delete all ${f500.length} instance(s) of field 500`, debugDev);\n f500.forEach(field => record.removeField(field));\n}\n\n\nexport function removeWorsePrepubField500s(record) {\n // Remove lower-level entries:\n const fields = getRelevant5XXFields(record, true, false); // 500=false, 594=true\n nvdebugFieldArray(fields, ' Candidates for non-best 500 b4 filtering: ', debugDev);\n const nonBest = fields.filter(field => fields.some(field2 => firstFieldHasBetterPrepubEncodingLevel(field2, field)));\n nvdebugFieldArray(nonBest, ' Remove non-best 500: ', debugDev);\n nonBest.forEach(field => record.removeField(field));\n}\n\n\nexport function removeWorsePrepubField594s(record) {\n // Remove lower-level entries:\n const fields594 = getRelevant5XXFields(record, false, true); // 500=false, 594=true\n nvdebugFieldArray(fields594, ' Candidates for non-best 594 b4 filtering: ', debugDev);\n const nonBest = fields594.filter(field => fields594.some(field2 => firstFieldHasBetterPrepubEncodingLevel(field2, field)));\n nvdebugFieldArray(nonBest, ' Remove non-best 594: ', debugDev);\n nonBest.forEach(field => record.removeField(field));\n}\n\n\nexport function isEnnakkotietoSubfield(subfield) {\n if (subfield.code !== '9' && subfield.code !== 'g') {\n return false;\n }\n // Length <= 13 allows punctuation, but does not require it:\n if (subfield.value.length <= 13) {\n const coreString = subfield.value.substr(0, 12);\n if (coreString === 'ENNAKKOTIETO' || coreString === 'ennakkotieto') { // Lowercase term first seen in MET-575\n return true;\n }\n }\n return false;\n}\n\nexport function isEnnakkotietoField(field) {\n return field.subfields.some(sf => isEnnakkotietoSubfield(sf));\n}\n\nexport function isKingOfTheHill(field, opposingFields) {\n // Field is no better than at least one of the opposing fields\n return opposingFields.every(opposingField => firstFieldHasBetterPrepubEncodingLevel(field, opposingField));\n}\n\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"prepublicationUtils.js","names":["_utils","require","_debug","_interopRequireDefault","e","__esModule","default","debug","createDebugLogger","debugDev","extend","KONEELLISESTI_TUOTETTU_TIETUE","TARKISTETTU_ENNAKKOTIETO","ENNAKKOTIETO","encodingLevelPreferenceArray","prepublicationLevelIndex","indexOf","prepublicationLevelIsKoneellisestiTuotettuTietueOrTarkistettuEnnakkotieto","prepublicationLevel","encodingLevelIsBetterThanPrepublication","encodingLevel","index","fieldRefersToKoneellisestiTuotettuTietue","field","subfields","some","sf","code","value","match","fieldRefersToTarkistettuEnnakkotieto","fieldRefersToEnnakkotieto","firstFieldHasBetterPrepubEncodingLevel","field1","field2","getRelevant5XXFields","record","f500","f594","cands","actualGetFields","filtered","filter","hasRelevantPrepubData","tag","every","includes","get","getPrepublicationLevel","fields","f","baseHasEqualOrHigherEncodingLevel","baseEncodingLevel","sourceEncodingLevel","baseIndex","sourceIndex","hasFikkaLOW","fieldHasSubfield","hasNatLibFi042","isFikkaRecord","getEncodingLevel","leader","substring","deleteAllPrepublicationNotesFromField500InNonPubRecord","length","nvdebug","forEach","removeField","removeWorsePrepubField500s","nvdebugFieldArray","nonBest","removeWorsePrepubField594s","fields594","isEnnakkotietoSubfield","subfield","coreString","substr","toLowerCase","isEnnakkotietoField","isKingOfTheHill","opposingFields","opposingField"],"sources":["../src/prepublicationUtils.js"],"sourcesContent":["import {fieldHasSubfield, nvdebug, nvdebugFieldArray} from './utils';\nimport createDebugLogger from 'debug';\n\nconst debug = createDebugLogger('@natlibfi/marc-record-validators-melinda:prepublicationUtils');\n//const debugData = debug.extend('data');\nconst debugDev = debug.extend('dev');\n\nconst KONEELLISESTI_TUOTETTU_TIETUE = 1; // Best\nconst TARKISTETTU_ENNAKKOTIETO = 2;\nconst ENNAKKOTIETO = 3;\n//const EI_TASOA = 4;\n\nconst encodingLevelPreferenceArray = [' ', '1', '3', '4', '5', '2', '7', 'u', 'z', '8']; // MET-145\nconst prepublicationLevelIndex = encodingLevelPreferenceArray.indexOf('8');\n\nexport function prepublicationLevelIsKoneellisestiTuotettuTietueOrTarkistettuEnnakkotieto(prepublicationLevel) {\n return prepublicationLevel === KONEELLISESTI_TUOTETTU_TIETUE || prepublicationLevel === TARKISTETTU_ENNAKKOTIETO;\n}\n\n\nexport function encodingLevelIsBetterThanPrepublication(encodingLevel) {\n const index = encodingLevelPreferenceArray.indexOf(encodingLevel);\n return index > -1 && index < prepublicationLevelIndex;\n}\n\n// These three functions below all refer to field 500:\nexport function fieldRefersToKoneellisestiTuotettuTietue(field) {\n return field.subfields?.some(sf => sf.code === 'a' && sf.value.match(/^Koneellisesti tuotettu tietue/u));\n}\n\n\nexport function fieldRefersToTarkistettuEnnakkotieto(field) {\n return field.subfields?.some(sf => sf.code === 'a' && sf.value.match(/^tarkistettu ennakkotieto/ui));\n}\n\n\nexport function fieldRefersToEnnakkotieto(field) {\n // NB! This no longer matches 'TARKISTETTU ENNAKKOTIETO' case! Bug or Feature?\n if (field.subfields?.some(sf => sf.code === 'a' && sf.value.match(/^ennakkotieto(?:$|[. ])/ui))) {\n return true;\n }\n\n // MRA-420: \"EI VIELÄ ILMESTYNYT\" is a Helmet note, that is semantically similar to ENNAKKOTIETO:\n return field.subfields?.some(sf => sf.code === 'a' && sf.value.match(/^EI VIELÄ ILMESTYNYT/u));\n}\n\n\nexport function firstFieldHasBetterPrepubEncodingLevel(field1, field2) {\n if (fieldRefersToKoneellisestiTuotettuTietue(field2)) {\n return false;\n }\n if (fieldRefersToKoneellisestiTuotettuTietue(field1)) {\n return true;\n }\n if (fieldRefersToTarkistettuEnnakkotieto(field2)) {\n return false;\n }\n if (fieldRefersToTarkistettuEnnakkotieto(field1)) {\n return true;\n }\n if (fieldRefersToEnnakkotieto(field2)) {\n return false;\n }\n if (fieldRefersToEnnakkotieto(field1)) {\n return true;\n }\n return false;\n}\n\nexport function getRelevant5XXFields(record, f500 = false, f594 = false) {\n const cands = actualGetFields();\n //nvdebugFieldArray(cands, 'gR5XXa: ', debugDev);\n const filtered = cands.filter(field => hasRelevantPrepubData(field));\n //nvdebugFieldArray(filtered, 'gR5XXb: ', debugDev);\n return filtered;\n\n //return actualGetFields().filter(field => hasRelevantPrepubData(field));\n\n function hasRelevantPrepubData(field) {\n // Check prepub ($a):\n if (!fieldRefersToKoneellisestiTuotettuTietue(field) && !fieldRefersToTarkistettuEnnakkotieto(field) && !fieldRefersToEnnakkotieto(field)) {\n return false;\n }\n // Check relevance (594$5):\n if (field.tag === '500') {\n return field.subfields.every(sf => sf.code !== '5'); //true;\n }\n return field.subfields.some(sf => sf.code === '5' && ['FENNI', 'FIKKA', 'VIOLA'].includes(sf.value));\n }\n\n function actualGetFields() {\n if (f500 && f594) {\n return record.get(/^(?:500|594)$/u);\n }\n if (f500) {\n return record.get(/^500$/u);\n }\n if (f594) {\n return record.get(/^594$/u);\n }\n return [];\n }\n\n}\n\n\n// Very similar to getPrepublicationLevel() in melinda-record-match-validator's getPrepublicationLevel()...\n// We should use that and not have a copy here...\nexport function getPrepublicationLevel(record, f500 = false, f594 = false) {\n // Smaller return value is better\n const fields = getRelevant5XXFields(record, f500, f594);\n\n if (!fields) {\n return null;\n }\n if (fields.some(f => fieldRefersToKoneellisestiTuotettuTietue(f))) {\n return KONEELLISESTI_TUOTETTU_TIETUE;\n }\n\n if (fields.some(f => fieldRefersToTarkistettuEnnakkotieto(f))) {\n return TARKISTETTU_ENNAKKOTIETO;\n }\n\n if (fields.some(f => fieldRefersToEnnakkotieto(f))) {\n return ENNAKKOTIETO;\n }\n\n return null;\n}\n\n\nexport function baseHasEqualOrHigherEncodingLevel(baseEncodingLevel, sourceEncodingLevel) {\n const baseIndex = encodingLevelPreferenceArray.indexOf(baseEncodingLevel);\n const sourceIndex = encodingLevelPreferenceArray.indexOf(sourceEncodingLevel);\n\n if (baseIndex === -1) {\n // Base wins if both are bad:\n return sourceIndex === -1;\n }\n return baseIndex <= sourceIndex;\n}\n\n\nfunction hasFikkaLOW(record) {\n return record.fields.some(field => field.tag === 'LOW' && fieldHasSubfield(field, 'a', 'FIKKA'));\n}\n\n\nfunction hasNatLibFi042(record) {\n return record.fields.some(field => field.tag === '042' && (fieldHasSubfield(field, 'a', 'finb') || fieldHasSubfield(field, 'a', 'finbd')));\n}\n\n\nexport function isFikkaRecord(record) {\n // NB! Does not include Humaniora. Pienpainatteet (not that they'd have duplicates)?\n return hasFikkaLOW(record) && hasNatLibFi042(record);\n}\n\n\nexport function getEncodingLevel(record) {\n return record.leader.substring(17, 18);\n}\n\n\nexport function deleteAllPrepublicationNotesFromField500InNonPubRecord(record) {\n const encodingLevel = getEncodingLevel(record);\n // Skip prepublication (or theoretically even worse) records:\n if (!encodingLevelIsBetterThanPrepublication(encodingLevel)) {\n //if (['2', '8'].includes(encodingLevel)) { // MET-306: added '2' here\n return;\n }\n\n // MET-306: keep \"koneellisesti tuotettu tietue\" if encoding level is '2':\n const f500 = getRelevant5XXFields(record, true, false).filter(field => encodingLevel === '2' ? !fieldRefersToKoneellisestiTuotettuTietue(field) : true);\n if (f500.length === 0) {\n return;\n }\n\n\n nvdebug(`Delete all ${f500.length} instance(s) of field 500`, debugDev);\n f500.forEach(field => record.removeField(field));\n}\n\n\nexport function removeWorsePrepubField500s(record) {\n // Remove lower-level entries:\n const fields = getRelevant5XXFields(record, true, false); // 500=false, 594=true\n nvdebugFieldArray(fields, ' Candidates for non-best 500 b4 filtering: ', debugDev);\n const nonBest = fields.filter(field => fields.some(field2 => firstFieldHasBetterPrepubEncodingLevel(field2, field)));\n nvdebugFieldArray(nonBest, ' Remove non-best 500: ', debugDev);\n nonBest.forEach(field => record.removeField(field));\n}\n\n\nexport function removeWorsePrepubField594s(record) {\n // Remove lower-level entries:\n const fields594 = getRelevant5XXFields(record, false, true); // 500=false, 594=true\n nvdebugFieldArray(fields594, ' Candidates for non-best 594 b4 filtering: ', debugDev);\n const nonBest = fields594.filter(field => fields594.some(field2 => firstFieldHasBetterPrepubEncodingLevel(field2, field)));\n nvdebugFieldArray(nonBest, ' Remove non-best 594: ', debugDev);\n nonBest.forEach(field => record.removeField(field));\n}\n\n\nexport function isEnnakkotietoSubfield(subfield) {\n if (subfield.code !== '9' && subfield.code !== 'g') {\n return false;\n }\n // Length <= 13 allows punctuation, but does not require it:\n if (subfield.value.length <= 13) {\n const coreString = subfield.value.substr(0, 12);\n if (coreString.toLowerCase() === 'ennakkotieto') { // Lowercase term first seen in MET-575\n return true;\n }\n }\n return false;\n}\n\nexport function isEnnakkotietoField(field) {\n return field.subfields.some(sf => isEnnakkotietoSubfield(sf));\n}\n\nexport function isKingOfTheHill(field, opposingFields) {\n // Field is no better than at least one of the opposing fields\n return opposingFields.every(opposingField => firstFieldHasBetterPrepubEncodingLevel(field, opposingField));\n}\n\n"],"mappings":"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","ignoreList":[]}
@@ -269,6 +269,14 @@ function deriveIndividualDeletables(record) {
269
269
  return processTodoList([...stillToDo, ...moreToDo], [...deletables, tmp]);
270
270
  }
271
271
  }
272
+ if (currString.match(/^500 ## ‡a Ei vastaanotettu\.$/u)) {
273
+ // MELKEHITYS-3147
274
+ return processTodoList([...stillToDo, ...moreToDo], [...deletables, '500 ## ‡a EI VASTAANOTETTU.']);
275
+ }
276
+ if (currString.match(/^500 ## ‡a Ei ilmesty\.$/u)) {
277
+ // MELKEHITYS-3147
278
+ return processTodoList([...stillToDo, ...moreToDo], [...deletables, '500 ## ‡a EI ILMESTY.']);
279
+ }
272
280
  if (currString.match(/^505 .0.*-- ‡t/u)) {
273
281
  // MRA-413-ish
274
282
  const tmp = currString.replace(/ -- ‡t /gu, ' -- ').
@@ -285,6 +293,14 @@ function deriveIndividualDeletables(record) {
285
293
  //nvdebug(`505 ORIGINAL: '${fieldAsString}'`)
286
294
  //nvdebug(`505 DERIVATE: '${tmp}'`)
287
295
  }
296
+ if (currString.match(/^594 ## ‡a Ei vastaanotettu ‡5 FENNI$/u)) {
297
+ // MELKEHITYS-3147
298
+ return processTodoList([...stillToDo, ...moreToDo], [...deletables, '594 ## ‡a EI VASTAANOTETTU ‡5 FENNI']);
299
+ }
300
+ if (currString.match(/^594 ## ‡a Ei ilmesty ‡5 FENNI$/u)) {
301
+ // MELKEHITYS-3147
302
+ return processTodoList([...stillToDo, ...moreToDo], [...deletables, '594 ## ‡a EI ILMESTY ‡5 FENNI']);
303
+ }
288
304
 
289
305
  // MET-381: remove occurence number TAG-00, if TAG-NN existists
290
306
  if (currString.match(/^880.* ‡6 [0-9][0-9][0-9]-(?:[1-9][0-9]|0[1-9])/u)) {
@@ -325,7 +341,7 @@ function deriveIndividualDeletables(record) {
325
341
  function getPrepublicationTerms(fieldAsString) {
326
342
  if (fieldAsString.match(/^653./u)) {
327
343
  // MET-528 (extented by MET-575)
328
- return [`${fieldAsString} ‡g ENNAKKOTIETO`, `${fieldAsString} ‡g ennakkotieto`, `${fieldAsString} ‡g ENNAKKOTIETO.`, `${fieldAsString} ‡g ennakkotieto.`];
344
+ return [`${fieldAsString} ‡g ENNAKKOTIETO`, `${fieldAsString} ‡g Ennakkotieto`, `${fieldAsString} ‡g ennakkotieto`, `${fieldAsString} ‡g ENNAKKOTIETO.`, `${fieldAsString} ‡g Ennakkotieto.`, `${fieldAsString} ‡g ennakkotieto.`];
329
345
  }
330
346
  return [];
331
347
  }
@@ -1 +1 @@
1
- {"version":3,"file":"removeInferiorDataFields.js","names":["_debug","_interopRequireDefault","require","_removeDuplicateDataFields","_subfield6Utils","_utils","_subfield8Utils","_prepublicationUtils","_normalizeFieldForComparison","_normalizeUtf8Diacritics","e","__esModule","default","debug","createDebugLogger","_default","description","validate","fix","record","nvdebug","res","message","valid","removeInferiorDatafields","duplicates","length","deriveInferiorChains","fields","hash","forEach","f","fieldToChainToDeletables","field","chain","fieldToChain","chainAsString","fieldsToNormalizedString","arr","deriveChainDeletables","val","todoList","deletables","stillToDo","undefined","withoutScriptIdentificationCode","replace","keepless","linked490Ind1","filter","isRelevantChain6","fieldHasValidSubfield6","fieldHasValidSubfield8","some","subfields","sf","code","sameField","removeInferiorChains","deletableChainsAsKeys","nChains","Object","keys","innerRemoveInferiorChains","deletedStringsArray","currField","remainingFields","triggeringField","triggeringChain","chainContains1XX","sevenToOne","deletedString","fieldsToString","removeField","tag","substring","includes","pairs","fieldGetOccurrenceNumberPairs","pairedField","fieldSevenToOneOccurrenceNumber","getIdentifierlessAndKeeplessSubsets","fieldAsString","identifierlessString","keeplessString","deriveIndividualDeletables490","match","sixless","withoutFinalVOrX","xless","xvless","modifiedInd2","deriveIndividualDeletables","map","fieldToString","deletableStringsArray","processTodoList","inferiorTerms","getInferiorTerms","uniqArray","inputFields","result","flatMap","fieldToInferiorFields","aArray","value","thingsToDo","currString","accentless","getAccentlessVersion","d490","subsets","moreToDo","tmp","tmp1","tmp2","getPrepublicationTerms","newDeletables","string","precomposeFinnishLetters","String","fixComposition","fieldToNormalizedString","normalizedField","cloneAndNormalizeFieldForComparison","deriveIndividualNormalizedDeletables","encodingLevel","getEncodingLevel","recordIsFinished","encodingLevelIsBetterThanPrepublication","met495","fieldRefersToKoneellisestiTuotettuTietue","relevantFields","fieldHasSubfield","deriveDeletable946s","results","fieldAsNormalizedString","candArray","removeIndividualInferiorDatafields","deletableFieldsAsStrings","deletableFieldsAsNormalizedStrings","hits","isDeletableField","deletedFieldsAsStrings","removables","removables6","join","removablesAll","concat"],"sources":["../src/removeInferiorDataFields.js"],"sourcesContent":["import createDebugLogger from 'debug';\nimport {fieldToChain, sameField} from './removeDuplicateDataFields';\nimport {fieldGetOccurrenceNumberPairs, fieldHasValidSubfield6, fieldSevenToOneOccurrenceNumber, fieldsToNormalizedString} from './subfield6Utils';\nimport {fieldHasSubfield, fieldsToString, fieldToString, nvdebug, uniqArray} from './utils';\nimport {fieldHasValidSubfield8} from './subfield8Utils';\nimport {encodingLevelIsBetterThanPrepublication, fieldRefersToKoneellisestiTuotettuTietue, getEncodingLevel} from './prepublicationUtils';\nimport {cloneAndNormalizeFieldForComparison} from './normalizeFieldForComparison';\nimport {fixComposition, precomposeFinnishLetters} from './normalize-utf8-diacritics';\n\n// Relocated from melinda-marc-record-merge-reducers (and renamed)\n\n// NB! This validator handles only full fields, and does not support subfield $8 removal.\n// Also, having multiple $8 subfields in same fields is not supported.\n// If this functionality is needed, see removeDuplicateDatafields.js for examples of subfield-only stuff.\nconst debug = createDebugLogger('@natlibfi/marc-record-validators-melinda:removeInferiorDataFields');\n\nexport default function () {\n return {\n description: 'Remove subset data fields. Certain exceptions apply, mainly too complicated for chained fields',\n validate, fix\n };\n\n function fix(record) {\n nvdebug('Fix record: remove inferior (eg. subset) data fields', debug);\n const res = {message: [], fix: [], valid: true};\n removeInferiorDatafields(record, true);\n // This can not really fail...\n return res;\n }\n\n function validate(record) {\n // Check max, and check number of different indexes\n nvdebug('Validate record: remove inferior (eg. subset) data fields', debug);\n\n const duplicates = removeInferiorDatafields(record, false);\n\n const res = {message: duplicates};\n\n res.valid = res.message.length < 1; // eslint-disable-line functional/immutable-data\n return res;\n }\n}\n\n\nfunction deriveInferiorChains(fields, record) {\n //nvdebug(`======= GOT ${fields.length} FIELDS TO CHAINIFY`);\n const hash = {};\n\n fields.forEach(f => fieldToChainToDeletables(f));\n\n return hash;\n\n //nvdebug(`WP1: GOT ${todoList.length} CHAINS`);\n\n\n // here we map deletableStringObject[str] => field. The idea is to help debugging. We don't actually need the field object...\n //return deriveChainDeletables(todoList);\n\n function fieldToChainToDeletables(field) {\n const chain = fieldToChain(field, record);\n if (chain.length < 2) {\n return;\n }\n const chainAsString = fieldsToNormalizedString(chain, 0, true, true);\n const arr = deriveChainDeletables([chainAsString]);\n //nvdebug(`GOT ${arr.length} DELETABLES FOR ${chainAsString}`);\n arr.forEach(val => {\n if (!(val in hash)) { // eslint-disable-line functional/no-conditional-statements\n hash[val] = field; // eslint-disable-line functional/immutable-data\n }\n });\n }\n\n function deriveChainDeletables(todoList, deletables = []) {\n const [chainAsString, ...stillToDo] = todoList;\n if (chainAsString === undefined) {\n return deletables;\n }\n\n // Fix MRA-476 (part 1): one $6 value can be worse than the other\n const withoutScriptIdentificationCode = chainAsString.replace(/( ‡6 [0-9X][0-9][0-9]-(?:XX|[0-9]+))\\/[^ ]+/u, '$1'); // eslint-disable-line prefer-named-capture-group\n\n // Remove keepless versions:\n const keepless = chainAsString.replace(/ ‡9 [A-Z]+<KEEP>/u, '');\n\n // MRA-433: 490 ind1=1 vs ind1=0: remove latter (luckily no 2nd indicator etc)\n const linked490Ind1 = chainAsString.replace(/^490 1/u, '490 0').replace(/\\t880 1/ug, '\\t880 0');\n const arr = [withoutScriptIdentificationCode, keepless, linked490Ind1].filter(val => val !== chainAsString);\n if (arr.length > 0) {\n return deriveChainDeletables([...stillToDo, ...arr], [...deletables, ...arr]);\n }\n\n return deriveChainDeletables(stillToDo, deletables);\n }\n\n}\n\nfunction isRelevantChain6(field, record) {\n //Can't be a chain:\n if (!fieldHasValidSubfield6(field) && !fieldHasValidSubfield8(field)) {\n return false;\n }\n // Too short to be a chain:\n const chain = fieldToChain(field, record);\n if (chain.length < 2) {\n return false;\n }\n // No field can contains no more than one subfield $6\n if (chain.some(f => f.subfields.filter(sf => sf.code === '6').length > 1)) {\n return false;\n }\n\n // Check whether our field is the head of a chain:\n return sameField(field, chain[0]);\n}\n\nexport function removeInferiorChains(record, fix = true) {\n const fields = record.fields.filter(f => isRelevantChain6(f, record));\n //nvdebug(`WP2.0: GOT ${fields.length} chain(s)`);\n\n const deletableChainsAsKeys = deriveInferiorChains(fields, record);\n const nChains = Object.keys(deletableChainsAsKeys).length;\n //nvdebug(`WP2: GOT ${nChains} chain(s)`);\n if (nChains === 0) {\n return [];\n }\n\n //nvdebug(`removeInferiorChains() has ${fields.length} fields-in-chain(s), and a list of ${nChains} deletable(s)`);\n\n return innerRemoveInferiorChains(fields);\n\n function innerRemoveInferiorChains(fields, deletedStringsArray = []) {\n const [currField, ...remainingFields] = fields;\n\n if (currField === undefined) {\n return deletedStringsArray;\n }\n\n const chain = fieldToChain(currField, record);\n if (chain.length === 0 || !sameField(currField, chain[0])) {\n return innerRemoveInferiorChains(remainingFields, deletedStringsArray);\n }\n\n const chainAsString = fieldsToNormalizedString(chain, 0, true, true);\n if (!(chainAsString in deletableChainsAsKeys)) {\n return innerRemoveInferiorChains(remainingFields, deletedStringsArray);\n }\n\n const triggeringField = deletableChainsAsKeys[chainAsString];\n const triggeringChain = fieldToChain(triggeringField, record);\n\n // If the inferior (deletable) chain is 1XX-based, convert the triggering better chain from 7XX to 1XX:\n if (chainContains1XX(chain)) { // eslint-disable-line functional/no-conditional-statements\n triggeringChain.forEach(f => sevenToOne(f, triggeringChain));\n }\n //nvdebug(`iRIS6C: ${chainAsString}`);\n const deletedString = fieldsToString(chain);\n const message = `DEL: '${deletedString}' REASON: '${fieldsToString(triggeringChain)}'`;\n if (fix) { // eslint-disable-line functional/no-conditional-statements\n //nvdebug(`INFERIOR $6 CHAIN REMOVAL: ${message}}`, debug);\n chain.forEach(field => record.removeField(field));\n }\n return innerRemoveInferiorChains(remainingFields, [...deletedStringsArray, message]);\n }\n\n function chainContains1XX(chain) {\n return chain.some(f => f.tag.substring(0, 1) === '1');\n }\n\n function sevenToOne(field, chain) { // Change 7XX field to 1XX field. Also handle the corresponding 880$6 7XX-NN subfields\n // NB! This function should be called only if the original 1XX gets deleted!\n if (!['700', '710', '711', '730'].includes(field.tag)) {\n return;\n }\n // Retag field 7XX as 1XX and fix corresponding occurrence numbers as well:\n const pairs = fieldGetOccurrenceNumberPairs(field, chain);\n field.tag = `1${field.tag.substring(1)}`; // eslint-disable-line functional/immutable-data\n // There should always be one pair, but I'm not sanity-checking this\n pairs.forEach(pairedField => fieldSevenToOneOccurrenceNumber(pairedField));\n }\n\n}\n\n\nfunction getIdentifierlessAndKeeplessSubsets(fieldAsString) {\n // The rules below are not perfect (in complex cases they don't catch all permutations), but good enough:\n // Remove identifier(s) (MELKEHITYS-2383-ish):\n\n const identifierlessString = fieldAsString.replace(/ ‡[01] [^‡]+($| ‡)/u, '$1'); // eslint-disable-line prefer-named-capture-group\n const keeplessString = fieldAsString.replace(/ ‡9 [A-Z]+<KEEP>/u, '');\n\n return [identifierlessString, keeplessString].filter(val => val !== fieldAsString);\n}\n\nfunction deriveIndividualDeletables490(todoList, deletables = []) {\n const [fieldAsString, ...stillToDo] = todoList;\n if (fieldAsString === undefined) {\n return deletables;\n }\n //nvdebug(`PROCESS ${fieldAsString}`);\n if (!fieldAsString.match(/^490/u)) {\n return deriveIndividualDeletables490(stillToDo, deletables);\n }\n\n // $6-less version (keep this first)\n const sixless = fieldAsString.replace(/ ‡6 [^‡]+ ‡/u, ' ‡');\n\n // Without final $v or $x:\n const withoutFinalVOrX = fieldAsString.replace(/ *[;,] ‡[vx] [^‡]+$/u, '');\n // Add intermediate $x-less version\n const xless = fieldAsString.replace(/, ‡x [^‡]+(, ‡x| ; ‡v)/u, '$1'); // eslint-disable-line prefer-named-capture-group\n\n // Add $xv-less version (handled by recursion?)\n const xvless = fieldAsString.replace(/, ‡x [^‡]+ ‡v [^‡]+$/u, '');\n\n // MRA-433-ish (non-chain): 490 ind1=1 vs ind1=0: remove latter\n const modifiedInd2 = fieldAsString.match(/^490 1/u) ? `490 0${fieldAsString.substring(5)}` : fieldAsString;\n\n const arr = [sixless, withoutFinalVOrX, xless, xvless, modifiedInd2].filter(val => val !== fieldAsString);\n\n /*\n if (arr.length) { // eslint-disable-line functional/no-conditional-statements\n nvdebug(`${arr.length} derivation(s) for ${fieldAsString}`);\n nvdebug(arr.join('\\n'));\n }\n */\n return arr;\n}\n\nfunction deriveIndividualDeletables(record) {\n const todoList = record.fields.map(f => fieldToString(f));\n //const finishedRecord = encodingLevelIsBetterThanPrepublication(getEncodingLevel(record));\n\n const deletableStringsArray = processTodoList(todoList);\n\n const inferiorTerms = getInferiorTerms(record);\n\n return uniqArray([...deletableStringsArray, ...inferiorTerms]);\n\n function getInferiorTerms(record) {\n const inputFields = record.fields.filter(f => ['648', '650', '651'].includes(f.tag) && f.subfields);\n const result = inputFields.flatMap(f => fieldToInferiorFields(f));\n\n // console.log(result.join('\\n')); // eslint-disable-line no-console\n return result;\n }\n\n function fieldToInferiorFields(field) {\n const aArray = field.subfields.filter(sf => sf.code === 'a');\n if (field.tag === '650') {\n return aArray.flatMap(sf => [`653 ## ‡a ${sf.value}`, `653 #0 ‡a ${sf.value}`]);\n }\n return aArray.map(sf => `653 ## ‡a ${sf.value}`);\n }\n\n function processTodoList(thingsToDo, deletables = []) {\n const [currString, ...stillToDo] = thingsToDo;\n\n if (currString === undefined) {\n return deletables;\n }\n\n const accentless = getAccentlessVersion(currString);\n const d490 = deriveIndividualDeletables490([currString]);\n const subsets = getIdentifierlessAndKeeplessSubsets(currString); // eslint-disable-line no-param-reassign\n const moreToDo = [...accentless, ...d490, ...subsets];\n\n\n if (currString.match(/^[1678]00/u)) {\n // Proof-of-concept rule. Should be improved eventually...\n if (currString.match(/, ‡e [^‡]+\\.$/u)) {\n const tmp = currString.replace(/, ‡e [^‡]+\\.$/u, '.');\n return processTodoList([tmp, ...stillToDo, ...moreToDo], [...deletables, tmp]);\n }\n }\n\n if (currString.match(/^500 ## ‡a Lisäpainokset: Lisäpainos /u)) { // MET-569\n const tmp1 = currString.replace(' Lisäpainos ', ' [Lisäpainos] ');\n const tmp2 = currString.replace(' Lisäpainos ', ' ');\n if (tmp1 !== currString && tmp2 !== currString) {\n return processTodoList([...stillToDo, ...moreToDo], [...deletables, tmp1, tmp2]);\n }\n }\n\n if (currString.match(/^500 ## ‡a Lisäpainokset: \\[Lisäpainos\\] /u)) { // MET-569\n const tmp = currString.replace(' [Lisäpainos] ', ' ');\n if (tmp !== currString) {\n return processTodoList([...stillToDo, ...moreToDo], [...deletables, tmp]);\n }\n }\n\n if (currString.match(/^505 .0.*-- ‡t/u)) { // MRA-413-ish\n const tmp = currString.replace(/ -- ‡t /gu, ' -- '). // remove non-initial $t subfields\n replace(/ ‡[rg] /gu, ' '). // remove $r and $g subfields\n replace(/ ‡t /u, ' ‡a '). // change first $t to $a\n // ind2: '1' => '#':\n replace(/^505 (.)0/u, '505 $1#'); // eslint-disable-line prefer-named-capture-group\n if (tmp !== currString) {\n return processTodoList([tmp, ...stillToDo, ...moreToDo], [...deletables, tmp]);\n }\n //nvdebug(`505 ORIGINAL: '${fieldAsString}'`)\n //nvdebug(`505 DERIVATE: '${tmp}'`)\n }\n\n // MET-381: remove occurence number TAG-00, if TAG-NN existists\n if (currString.match(/^880.* ‡6 [0-9][0-9][0-9]-(?:[1-9][0-9]|0[1-9])/u)) {\n const tmp = currString.replace(/( ‡6 [0-9][0-9][0-9])-[0-9]+/u, '$1-00'); // eslint-disable-line prefer-named-capture-group\n //nvdebug(`MET-381: ADD TO DELETABLES: '${tmp}'`);\n //deletableStringsArray.push(tmp);\n if (tmp.match(/ ‡6 [0-9][0-9][0-9]-00\\/[^ ]+ /u)) {\n const tmp2 = tmp.replace(/( ‡6 [0-9][0-9][0-9]-00)[^ ]+/u, '$1'); // eslint-disable-line prefer-named-capture-group\n //nvdebug(`MET-381: ADD TO DELETABLES: '${tmp2}'`);\n return processTodoList([...stillToDo, ...moreToDo], [...deletables, tmp, tmp2]);\n }\n return processTodoList([...stillToDo, ...moreToDo], [...deletables, tmp]);\n }\n\n // MET-575 (merge: applies in postprocessing)\n const inferiorTerms = getPrepublicationTerms(currString);\n\n const newDeletables = [...deletables, ...subsets, ...accentless, ...d490, ...inferiorTerms];\n\n if (subsets.length) {\n return processTodoList([...stillToDo, ...moreToDo], newDeletables);\n }\n\n return processTodoList([...stillToDo, ...moreToDo], newDeletables);\n }\n\n function getAccentlessVersion(string) { // MET-527\n //nvdebug(`START: '${string}`);\n // This is a sanity check: if precomposition does something, there's something wrong, and we don't want to proceed..\n if (string !== precomposeFinnishLetters(string)) {\n return [];\n }\n const accentless = String(fixComposition(string)).replace(/\\p{Diacritic}/gu, '');\n //nvdebug(`FROM '${string}'\\n TO '${accentless}'`);\n if (accentless === string) { // Don't self-destruct\n return [];\n }\n return [accentless];\n }\n\n function getPrepublicationTerms(fieldAsString) {\n if (fieldAsString.match(/^653./u)) {\n // MET-528 (extented by MET-575)\n return [`${fieldAsString} ‡g ENNAKKOTIETO`, `${fieldAsString} ‡g ennakkotieto`, `${fieldAsString} ‡g ENNAKKOTIETO.`, `${fieldAsString} ‡g ennakkotieto.`];\n }\n\n return [];\n }\n\n}\n\nfunction fieldToNormalizedString(field) {\n const normalizedField = cloneAndNormalizeFieldForComparison(field);\n return fieldToString(normalizedField);\n}\n\nfunction deriveIndividualNormalizedDeletables(record) { // MET-461:\n const encodingLevel = getEncodingLevel(record);\n const recordIsFinished = encodingLevelIsBetterThanPrepublication(encodingLevel);\n const met495 = encodingLevel === '2' && record.fields.some(f => f.tag === '500' && fieldRefersToKoneellisestiTuotettuTietue(f));\n if (!recordIsFinished || met495) {\n return [];\n }\n const relevantFields = record.fields.filter(f => ['245', '246'].includes(f.tag) && fieldHasSubfield(f, 'a'));\n\n return deriveDeletable946s(relevantFields);\n\n function deriveDeletable946s(fields, results = []) {\n const [currField, ...remainingFields] = fields;\n if (currField === undefined) {\n return results;\n }\n\n const fieldAsNormalizedString = fieldToNormalizedString(currField);\n const tmp = fieldAsNormalizedString.replace(/^(?:...) ../u, '946 ##'). // <= Change tag to 946 and indicators to '##'\n replace(' ‡a ', ' ‡i nimeke onixissa ‡a '). // Add $i before $a. NB! This is added in the normalized lower-cased form!\n replace(/(?: \\/)? ‡c[^‡]+$/u, ''); // Remove $c. (Can $c be non-last?)\n const candArray = [tmp, `${tmp} ‡5 MELINDA`].filter(val => val !== fieldAsNormalizedString);\n if (candArray.length) {\n return deriveDeletable946s(remainingFields, [...results, ...candArray]);\n }\n return deriveDeletable946s(remainingFields, results);\n }\n}\n\nexport function removeIndividualInferiorDatafields(record, fix = true) { // No $6 nor $8 in field\n const deletableFieldsAsStrings = deriveIndividualDeletables(record);\n const deletableFieldsAsNormalizedStrings = deriveIndividualNormalizedDeletables(record);\n\n // nvdebug(`Deletables:\\n ${deletableFieldsAsStrings.join('\\n ')}`);\n // nvdebug(`Normalized deletables:\\n ${deletableFieldsAsNormalizedStrings.join('\\n ')}`);\n\n const hits = record.fields.filter(field => isDeletableField(field));\n\n const deletedFieldsAsStrings = hits.map(f => fieldToString(f));\n\n if (fix) { // eslint-disable-line functional/no-conditional-statements\n hits.forEach(field => {\n //nvdebug(`Remove inferior field: ${fieldToString(field)}`, debug);\n record.removeField(field);\n });\n }\n\n return deletedFieldsAsStrings;\n\n function isDeletableField(field) {\n const fieldAsString = fieldToString(field);\n if (deletableFieldsAsStrings.includes(fieldAsString)) {\n return true;\n }\n const fieldAsNormalizedString = fieldToNormalizedString(field);\n if (deletableFieldsAsNormalizedStrings.includes(fieldAsNormalizedString)) {\n return true;\n }\n\n return false;\n }\n}\n\n\nexport function removeInferiorDatafields(record, fix = true) {\n const removables = removeIndividualInferiorDatafields(record, fix); // Lone fields\n //const removables8 = removeDuplicateSubfield8Chains(record, fix); // Lone subfield $8 chains\n const removables6 = removeInferiorChains(record, fix); // Lone subfield $6 chains\n // HOW TO HANDLE $6+$8 combos? Skipping is relatively OK.\n\n nvdebug(`REMOVABLES:\\n ${removables.join('\\n ')}`, debug);\n nvdebug(`REMOVABLES 6:\\n ${removables6.join('\\n ')}`, debug);\n\n const removablesAll = removables.concat(removables6); //.concat(removables8);\n\n return removablesAll;\n}\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"removeInferiorDataFields.js","names":["_debug","_interopRequireDefault","require","_removeDuplicateDataFields","_subfield6Utils","_utils","_subfield8Utils","_prepublicationUtils","_normalizeFieldForComparison","_normalizeUtf8Diacritics","e","__esModule","default","debug","createDebugLogger","_default","description","validate","fix","record","nvdebug","res","message","valid","removeInferiorDatafields","duplicates","length","deriveInferiorChains","fields","hash","forEach","f","fieldToChainToDeletables","field","chain","fieldToChain","chainAsString","fieldsToNormalizedString","arr","deriveChainDeletables","val","todoList","deletables","stillToDo","undefined","withoutScriptIdentificationCode","replace","keepless","linked490Ind1","filter","isRelevantChain6","fieldHasValidSubfield6","fieldHasValidSubfield8","some","subfields","sf","code","sameField","removeInferiorChains","deletableChainsAsKeys","nChains","Object","keys","innerRemoveInferiorChains","deletedStringsArray","currField","remainingFields","triggeringField","triggeringChain","chainContains1XX","sevenToOne","deletedString","fieldsToString","removeField","tag","substring","includes","pairs","fieldGetOccurrenceNumberPairs","pairedField","fieldSevenToOneOccurrenceNumber","getIdentifierlessAndKeeplessSubsets","fieldAsString","identifierlessString","keeplessString","deriveIndividualDeletables490","match","sixless","withoutFinalVOrX","xless","xvless","modifiedInd2","deriveIndividualDeletables","map","fieldToString","deletableStringsArray","processTodoList","inferiorTerms","getInferiorTerms","uniqArray","inputFields","result","flatMap","fieldToInferiorFields","aArray","value","thingsToDo","currString","accentless","getAccentlessVersion","d490","subsets","moreToDo","tmp","tmp1","tmp2","getPrepublicationTerms","newDeletables","string","precomposeFinnishLetters","String","fixComposition","fieldToNormalizedString","normalizedField","cloneAndNormalizeFieldForComparison","deriveIndividualNormalizedDeletables","encodingLevel","getEncodingLevel","recordIsFinished","encodingLevelIsBetterThanPrepublication","met495","fieldRefersToKoneellisestiTuotettuTietue","relevantFields","fieldHasSubfield","deriveDeletable946s","results","fieldAsNormalizedString","candArray","removeIndividualInferiorDatafields","deletableFieldsAsStrings","deletableFieldsAsNormalizedStrings","hits","isDeletableField","deletedFieldsAsStrings","removables","removables6","join","removablesAll","concat"],"sources":["../src/removeInferiorDataFields.js"],"sourcesContent":["import createDebugLogger from 'debug';\nimport {fieldToChain, sameField} from './removeDuplicateDataFields';\nimport {fieldGetOccurrenceNumberPairs, fieldHasValidSubfield6, fieldSevenToOneOccurrenceNumber, fieldsToNormalizedString} from './subfield6Utils';\nimport {fieldHasSubfield, fieldsToString, fieldToString, nvdebug, uniqArray} from './utils';\nimport {fieldHasValidSubfield8} from './subfield8Utils';\nimport {encodingLevelIsBetterThanPrepublication, fieldRefersToKoneellisestiTuotettuTietue, getEncodingLevel} from './prepublicationUtils';\nimport {cloneAndNormalizeFieldForComparison} from './normalizeFieldForComparison';\nimport {fixComposition, precomposeFinnishLetters} from './normalize-utf8-diacritics';\n\n// Relocated from melinda-marc-record-merge-reducers (and renamed)\n\n// NB! This validator handles only full fields, and does not support subfield $8 removal.\n// Also, having multiple $8 subfields in same fields is not supported.\n// If this functionality is needed, see removeDuplicateDatafields.js for examples of subfield-only stuff.\nconst debug = createDebugLogger('@natlibfi/marc-record-validators-melinda:removeInferiorDataFields');\n\nexport default function () {\n return {\n description: 'Remove subset data fields. Certain exceptions apply, mainly too complicated for chained fields',\n validate, fix\n };\n\n function fix(record) {\n nvdebug('Fix record: remove inferior (eg. subset) data fields', debug);\n const res = {message: [], fix: [], valid: true};\n removeInferiorDatafields(record, true);\n // This can not really fail...\n return res;\n }\n\n function validate(record) {\n // Check max, and check number of different indexes\n nvdebug('Validate record: remove inferior (eg. subset) data fields', debug);\n\n const duplicates = removeInferiorDatafields(record, false);\n\n const res = {message: duplicates};\n\n res.valid = res.message.length < 1; // eslint-disable-line functional/immutable-data\n return res;\n }\n}\n\n\nfunction deriveInferiorChains(fields, record) {\n //nvdebug(`======= GOT ${fields.length} FIELDS TO CHAINIFY`);\n const hash = {};\n\n fields.forEach(f => fieldToChainToDeletables(f));\n\n return hash;\n\n //nvdebug(`WP1: GOT ${todoList.length} CHAINS`);\n\n\n // here we map deletableStringObject[str] => field. The idea is to help debugging. We don't actually need the field object...\n //return deriveChainDeletables(todoList);\n\n function fieldToChainToDeletables(field) {\n const chain = fieldToChain(field, record);\n if (chain.length < 2) {\n return;\n }\n const chainAsString = fieldsToNormalizedString(chain, 0, true, true);\n const arr = deriveChainDeletables([chainAsString]);\n //nvdebug(`GOT ${arr.length} DELETABLES FOR ${chainAsString}`);\n arr.forEach(val => {\n if (!(val in hash)) { // eslint-disable-line functional/no-conditional-statements\n hash[val] = field; // eslint-disable-line functional/immutable-data\n }\n });\n }\n\n function deriveChainDeletables(todoList, deletables = []) {\n const [chainAsString, ...stillToDo] = todoList;\n if (chainAsString === undefined) {\n return deletables;\n }\n\n // Fix MRA-476 (part 1): one $6 value can be worse than the other\n const withoutScriptIdentificationCode = chainAsString.replace(/( ‡6 [0-9X][0-9][0-9]-(?:XX|[0-9]+))\\/[^ ]+/u, '$1'); // eslint-disable-line prefer-named-capture-group\n\n // Remove keepless versions:\n const keepless = chainAsString.replace(/ ‡9 [A-Z]+<KEEP>/u, '');\n\n // MRA-433: 490 ind1=1 vs ind1=0: remove latter (luckily no 2nd indicator etc)\n const linked490Ind1 = chainAsString.replace(/^490 1/u, '490 0').replace(/\\t880 1/ug, '\\t880 0');\n const arr = [withoutScriptIdentificationCode, keepless, linked490Ind1].filter(val => val !== chainAsString);\n if (arr.length > 0) {\n return deriveChainDeletables([...stillToDo, ...arr], [...deletables, ...arr]);\n }\n\n return deriveChainDeletables(stillToDo, deletables);\n }\n\n}\n\nfunction isRelevantChain6(field, record) {\n //Can't be a chain:\n if (!fieldHasValidSubfield6(field) && !fieldHasValidSubfield8(field)) {\n return false;\n }\n // Too short to be a chain:\n const chain = fieldToChain(field, record);\n if (chain.length < 2) {\n return false;\n }\n // No field can contains no more than one subfield $6\n if (chain.some(f => f.subfields.filter(sf => sf.code === '6').length > 1)) {\n return false;\n }\n\n // Check whether our field is the head of a chain:\n return sameField(field, chain[0]);\n}\n\nexport function removeInferiorChains(record, fix = true) {\n const fields = record.fields.filter(f => isRelevantChain6(f, record));\n //nvdebug(`WP2.0: GOT ${fields.length} chain(s)`);\n\n const deletableChainsAsKeys = deriveInferiorChains(fields, record);\n const nChains = Object.keys(deletableChainsAsKeys).length;\n //nvdebug(`WP2: GOT ${nChains} chain(s)`);\n if (nChains === 0) {\n return [];\n }\n\n //nvdebug(`removeInferiorChains() has ${fields.length} fields-in-chain(s), and a list of ${nChains} deletable(s)`);\n\n return innerRemoveInferiorChains(fields);\n\n function innerRemoveInferiorChains(fields, deletedStringsArray = []) {\n const [currField, ...remainingFields] = fields;\n\n if (currField === undefined) {\n return deletedStringsArray;\n }\n\n const chain = fieldToChain(currField, record);\n if (chain.length === 0 || !sameField(currField, chain[0])) {\n return innerRemoveInferiorChains(remainingFields, deletedStringsArray);\n }\n\n const chainAsString = fieldsToNormalizedString(chain, 0, true, true);\n if (!(chainAsString in deletableChainsAsKeys)) {\n return innerRemoveInferiorChains(remainingFields, deletedStringsArray);\n }\n\n const triggeringField = deletableChainsAsKeys[chainAsString];\n const triggeringChain = fieldToChain(triggeringField, record);\n\n // If the inferior (deletable) chain is 1XX-based, convert the triggering better chain from 7XX to 1XX:\n if (chainContains1XX(chain)) { // eslint-disable-line functional/no-conditional-statements\n triggeringChain.forEach(f => sevenToOne(f, triggeringChain));\n }\n //nvdebug(`iRIS6C: ${chainAsString}`);\n const deletedString = fieldsToString(chain);\n const message = `DEL: '${deletedString}' REASON: '${fieldsToString(triggeringChain)}'`;\n if (fix) { // eslint-disable-line functional/no-conditional-statements\n //nvdebug(`INFERIOR $6 CHAIN REMOVAL: ${message}}`, debug);\n chain.forEach(field => record.removeField(field));\n }\n return innerRemoveInferiorChains(remainingFields, [...deletedStringsArray, message]);\n }\n\n function chainContains1XX(chain) {\n return chain.some(f => f.tag.substring(0, 1) === '1');\n }\n\n function sevenToOne(field, chain) { // Change 7XX field to 1XX field. Also handle the corresponding 880$6 7XX-NN subfields\n // NB! This function should be called only if the original 1XX gets deleted!\n if (!['700', '710', '711', '730'].includes(field.tag)) {\n return;\n }\n // Retag field 7XX as 1XX and fix corresponding occurrence numbers as well:\n const pairs = fieldGetOccurrenceNumberPairs(field, chain);\n field.tag = `1${field.tag.substring(1)}`; // eslint-disable-line functional/immutable-data\n // There should always be one pair, but I'm not sanity-checking this\n pairs.forEach(pairedField => fieldSevenToOneOccurrenceNumber(pairedField));\n }\n\n}\n\n\nfunction getIdentifierlessAndKeeplessSubsets(fieldAsString) {\n // The rules below are not perfect (in complex cases they don't catch all permutations), but good enough:\n // Remove identifier(s) (MELKEHITYS-2383-ish):\n\n const identifierlessString = fieldAsString.replace(/ ‡[01] [^‡]+($| ‡)/u, '$1'); // eslint-disable-line prefer-named-capture-group\n const keeplessString = fieldAsString.replace(/ ‡9 [A-Z]+<KEEP>/u, '');\n\n return [identifierlessString, keeplessString].filter(val => val !== fieldAsString);\n}\n\nfunction deriveIndividualDeletables490(todoList, deletables = []) {\n const [fieldAsString, ...stillToDo] = todoList;\n if (fieldAsString === undefined) {\n return deletables;\n }\n //nvdebug(`PROCESS ${fieldAsString}`);\n if (!fieldAsString.match(/^490/u)) {\n return deriveIndividualDeletables490(stillToDo, deletables);\n }\n\n // $6-less version (keep this first)\n const sixless = fieldAsString.replace(/ ‡6 [^‡]+ ‡/u, ' ‡');\n\n // Without final $v or $x:\n const withoutFinalVOrX = fieldAsString.replace(/ *[;,] ‡[vx] [^‡]+$/u, '');\n // Add intermediate $x-less version\n const xless = fieldAsString.replace(/, ‡x [^‡]+(, ‡x| ; ‡v)/u, '$1'); // eslint-disable-line prefer-named-capture-group\n\n // Add $xv-less version (handled by recursion?)\n const xvless = fieldAsString.replace(/, ‡x [^‡]+ ‡v [^‡]+$/u, '');\n\n // MRA-433-ish (non-chain): 490 ind1=1 vs ind1=0: remove latter\n const modifiedInd2 = fieldAsString.match(/^490 1/u) ? `490 0${fieldAsString.substring(5)}` : fieldAsString;\n\n const arr = [sixless, withoutFinalVOrX, xless, xvless, modifiedInd2].filter(val => val !== fieldAsString);\n\n /*\n if (arr.length) { // eslint-disable-line functional/no-conditional-statements\n nvdebug(`${arr.length} derivation(s) for ${fieldAsString}`);\n nvdebug(arr.join('\\n'));\n }\n */\n return arr;\n}\n\nfunction deriveIndividualDeletables(record) {\n const todoList = record.fields.map(f => fieldToString(f));\n //const finishedRecord = encodingLevelIsBetterThanPrepublication(getEncodingLevel(record));\n\n const deletableStringsArray = processTodoList(todoList);\n\n const inferiorTerms = getInferiorTerms(record);\n\n return uniqArray([...deletableStringsArray, ...inferiorTerms]);\n\n function getInferiorTerms(record) {\n const inputFields = record.fields.filter(f => ['648', '650', '651'].includes(f.tag) && f.subfields);\n const result = inputFields.flatMap(f => fieldToInferiorFields(f));\n\n // console.log(result.join('\\n')); // eslint-disable-line no-console\n return result;\n }\n\n function fieldToInferiorFields(field) {\n const aArray = field.subfields.filter(sf => sf.code === 'a');\n if (field.tag === '650') {\n return aArray.flatMap(sf => [`653 ## ‡a ${sf.value}`, `653 #0 ‡a ${sf.value}`]);\n }\n return aArray.map(sf => `653 ## ‡a ${sf.value}`);\n }\n\n function processTodoList(thingsToDo, deletables = []) {\n const [currString, ...stillToDo] = thingsToDo;\n\n if (currString === undefined) {\n return deletables;\n }\n\n const accentless = getAccentlessVersion(currString);\n const d490 = deriveIndividualDeletables490([currString]);\n const subsets = getIdentifierlessAndKeeplessSubsets(currString); // eslint-disable-line no-param-reassign\n const moreToDo = [...accentless, ...d490, ...subsets];\n\n\n if (currString.match(/^[1678]00/u)) {\n // Proof-of-concept rule. Should be improved eventually...\n if (currString.match(/, ‡e [^‡]+\\.$/u)) {\n const tmp = currString.replace(/, ‡e [^‡]+\\.$/u, '.');\n return processTodoList([tmp, ...stillToDo, ...moreToDo], [...deletables, tmp]);\n }\n }\n\n if (currString.match(/^500 ## ‡a Lisäpainokset: Lisäpainos /u)) { // MET-569\n const tmp1 = currString.replace(' Lisäpainos ', ' [Lisäpainos] ');\n const tmp2 = currString.replace(' Lisäpainos ', ' ');\n if (tmp1 !== currString && tmp2 !== currString) {\n return processTodoList([...stillToDo, ...moreToDo], [...deletables, tmp1, tmp2]);\n }\n }\n\n if (currString.match(/^500 ## ‡a Lisäpainokset: \\[Lisäpainos\\] /u)) { // MET-569\n const tmp = currString.replace(' [Lisäpainos] ', ' ');\n if (tmp !== currString) {\n return processTodoList([...stillToDo, ...moreToDo], [...deletables, tmp]);\n }\n }\n\n if (currString.match(/^500 ## ‡a Ei vastaanotettu\\.$/u)) { // MELKEHITYS-3147\n return processTodoList([...stillToDo, ...moreToDo], [...deletables, '500 ## ‡a EI VASTAANOTETTU.']);\n }\n if (currString.match(/^500 ## ‡a Ei ilmesty\\.$/u)) { // MELKEHITYS-3147\n return processTodoList([...stillToDo, ...moreToDo], [...deletables, '500 ## ‡a EI ILMESTY.']);\n }\n\n if (currString.match(/^505 .0.*-- ‡t/u)) { // MRA-413-ish\n const tmp = currString.replace(/ -- ‡t /gu, ' -- '). // remove non-initial $t subfields\n replace(/ ‡[rg] /gu, ' '). // remove $r and $g subfields\n replace(/ ‡t /u, ' ‡a '). // change first $t to $a\n // ind2: '1' => '#':\n replace(/^505 (.)0/u, '505 $1#'); // eslint-disable-line prefer-named-capture-group\n if (tmp !== currString) {\n return processTodoList([tmp, ...stillToDo, ...moreToDo], [...deletables, tmp]);\n }\n //nvdebug(`505 ORIGINAL: '${fieldAsString}'`)\n //nvdebug(`505 DERIVATE: '${tmp}'`)\n }\n\n if (currString.match(/^594 ## ‡a Ei vastaanotettu ‡5 FENNI$/u)) { // MELKEHITYS-3147\n return processTodoList([...stillToDo, ...moreToDo], [...deletables, '594 ## ‡a EI VASTAANOTETTU ‡5 FENNI']);\n }\n if (currString.match(/^594 ## ‡a Ei ilmesty ‡5 FENNI$/u)) { // MELKEHITYS-3147\n return processTodoList([...stillToDo, ...moreToDo], [...deletables, '594 ## ‡a EI ILMESTY ‡5 FENNI']);\n }\n\n // MET-381: remove occurence number TAG-00, if TAG-NN existists\n if (currString.match(/^880.* ‡6 [0-9][0-9][0-9]-(?:[1-9][0-9]|0[1-9])/u)) {\n const tmp = currString.replace(/( ‡6 [0-9][0-9][0-9])-[0-9]+/u, '$1-00'); // eslint-disable-line prefer-named-capture-group\n //nvdebug(`MET-381: ADD TO DELETABLES: '${tmp}'`);\n //deletableStringsArray.push(tmp);\n if (tmp.match(/ ‡6 [0-9][0-9][0-9]-00\\/[^ ]+ /u)) {\n const tmp2 = tmp.replace(/( ‡6 [0-9][0-9][0-9]-00)[^ ]+/u, '$1'); // eslint-disable-line prefer-named-capture-group\n //nvdebug(`MET-381: ADD TO DELETABLES: '${tmp2}'`);\n return processTodoList([...stillToDo, ...moreToDo], [...deletables, tmp, tmp2]);\n }\n return processTodoList([...stillToDo, ...moreToDo], [...deletables, tmp]);\n }\n\n // MET-575 (merge: applies in postprocessing)\n const inferiorTerms = getPrepublicationTerms(currString);\n\n const newDeletables = [...deletables, ...subsets, ...accentless, ...d490, ...inferiorTerms];\n\n if (subsets.length) {\n return processTodoList([...stillToDo, ...moreToDo], newDeletables);\n }\n\n return processTodoList([...stillToDo, ...moreToDo], newDeletables);\n }\n\n function getAccentlessVersion(string) { // MET-527\n //nvdebug(`START: '${string}`);\n // This is a sanity check: if precomposition does something, there's something wrong, and we don't want to proceed..\n if (string !== precomposeFinnishLetters(string)) {\n return [];\n }\n const accentless = String(fixComposition(string)).replace(/\\p{Diacritic}/gu, '');\n //nvdebug(`FROM '${string}'\\n TO '${accentless}'`);\n if (accentless === string) { // Don't self-destruct\n return [];\n }\n return [accentless];\n }\n\n function getPrepublicationTerms(fieldAsString) {\n if (fieldAsString.match(/^653./u)) {\n // MET-528 (extented by MET-575)\n return [`${fieldAsString} ‡g ENNAKKOTIETO`, `${fieldAsString} ‡g Ennakkotieto`, `${fieldAsString} ‡g ennakkotieto`, `${fieldAsString} ‡g ENNAKKOTIETO.`, `${fieldAsString} ‡g Ennakkotieto.`, `${fieldAsString} ‡g ennakkotieto.`];\n }\n\n return [];\n }\n\n}\n\nfunction fieldToNormalizedString(field) {\n const normalizedField = cloneAndNormalizeFieldForComparison(field);\n return fieldToString(normalizedField);\n}\n\nfunction deriveIndividualNormalizedDeletables(record) { // MET-461:\n const encodingLevel = getEncodingLevel(record);\n const recordIsFinished = encodingLevelIsBetterThanPrepublication(encodingLevel);\n const met495 = encodingLevel === '2' && record.fields.some(f => f.tag === '500' && fieldRefersToKoneellisestiTuotettuTietue(f));\n if (!recordIsFinished || met495) {\n return [];\n }\n const relevantFields = record.fields.filter(f => ['245', '246'].includes(f.tag) && fieldHasSubfield(f, 'a'));\n\n return deriveDeletable946s(relevantFields);\n\n function deriveDeletable946s(fields, results = []) {\n const [currField, ...remainingFields] = fields;\n if (currField === undefined) {\n return results;\n }\n\n const fieldAsNormalizedString = fieldToNormalizedString(currField);\n const tmp = fieldAsNormalizedString.replace(/^(?:...) ../u, '946 ##'). // <= Change tag to 946 and indicators to '##'\n replace(' ‡a ', ' ‡i nimeke onixissa ‡a '). // Add $i before $a. NB! This is added in the normalized lower-cased form!\n replace(/(?: \\/)? ‡c[^‡]+$/u, ''); // Remove $c. (Can $c be non-last?)\n const candArray = [tmp, `${tmp} ‡5 MELINDA`].filter(val => val !== fieldAsNormalizedString);\n if (candArray.length) {\n return deriveDeletable946s(remainingFields, [...results, ...candArray]);\n }\n return deriveDeletable946s(remainingFields, results);\n }\n}\n\nexport function removeIndividualInferiorDatafields(record, fix = true) { // No $6 nor $8 in field\n const deletableFieldsAsStrings = deriveIndividualDeletables(record);\n const deletableFieldsAsNormalizedStrings = deriveIndividualNormalizedDeletables(record);\n\n // nvdebug(`Deletables:\\n ${deletableFieldsAsStrings.join('\\n ')}`);\n // nvdebug(`Normalized deletables:\\n ${deletableFieldsAsNormalizedStrings.join('\\n ')}`);\n\n const hits = record.fields.filter(field => isDeletableField(field));\n\n const deletedFieldsAsStrings = hits.map(f => fieldToString(f));\n\n if (fix) { // eslint-disable-line functional/no-conditional-statements\n hits.forEach(field => {\n //nvdebug(`Remove inferior field: ${fieldToString(field)}`, debug);\n record.removeField(field);\n });\n }\n\n return deletedFieldsAsStrings;\n\n function isDeletableField(field) {\n const fieldAsString = fieldToString(field);\n if (deletableFieldsAsStrings.includes(fieldAsString)) {\n return true;\n }\n const fieldAsNormalizedString = fieldToNormalizedString(field);\n if (deletableFieldsAsNormalizedStrings.includes(fieldAsNormalizedString)) {\n return true;\n }\n\n return false;\n }\n}\n\n\nexport function removeInferiorDatafields(record, fix = true) {\n const removables = removeIndividualInferiorDatafields(record, fix); // Lone fields\n //const removables8 = removeDuplicateSubfield8Chains(record, fix); // Lone subfield $8 chains\n const removables6 = removeInferiorChains(record, fix); // Lone subfield $6 chains\n // HOW TO HANDLE $6+$8 combos? Skipping is relatively OK.\n\n nvdebug(`REMOVABLES:\\n ${removables.join('\\n ')}`, debug);\n nvdebug(`REMOVABLES 6:\\n ${removables6.join('\\n ')}`, debug);\n\n const removablesAll = removables.concat(removables6); //.concat(removables8);\n\n return removablesAll;\n}\n"],"mappings":"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","ignoreList":[]}
@@ -70,6 +70,7 @@ const relatorTermScore = {
70
70
  'soitonoppaan tekijä': 100,
71
71
  'kartantekijä': 99,
72
72
  'taiteilija': 98,
73
+ 'designer': 90,
73
74
  'sanoittaja': 90,
74
75
  'käsikirjoittaja': 90,
75
76
  'kuvaaja': 89,
@@ -98,6 +99,7 @@ const relatorTermScore = {
98
99
  'lukija': 61,
99
100
  'kertoja': 61,
100
101
  // Manifestation level: https://finto.fi/mts/fi/page/m491
102
+ 'graafinen suunnittelija': 50,
101
103
  'kustantaja': 41
102
104
  // Item level: https://finto.fi/mts/fi/page/m1157
103
105
  };
@@ -111,13 +113,14 @@ const relatorTermScoreBk = {
111
113
  'kuvaaja': 98,
112
114
  'valokuvaaja': 98,
113
115
  'kokoaja': 86,
116
+ 'designer': 86,
114
117
  'alkuperäisidean luoja': 85,
115
118
  'teoksella kunnioitettu': 84,
116
119
  'gratulaation kohde': 84,
117
- 'julkaisija': 83,
118
- 'säveltäjä': 82,
120
+ 'säveltäjä': 83,
119
121
  // if 300$e has CD etc
120
- 'sanoittaja': 81,
122
+ 'sanoittaja': 82,
123
+ 'julkaisija': 81,
121
124
  // expression: https://finto.fi/mts/fi/page/m153
122
125
  'kuvittaja': 80,
123
126
  'esipuheen kirjoittaja': 79,
@@ -125,7 +128,9 @@ const relatorTermScoreBk = {
125
128
  'loppusanojen kirjoittaja': 78,
126
129
  'kääntäjä': 70,
127
130
  'sovittaja': 50,
128
- // kappale
131
+ // manifestaatio
132
+ 'graafinen suunnittelija': 40,
133
+ // kappale/item
129
134
  'sitoja': 25,
130
135
  'gratulaation kirjoittaja': 24
131
136
  };
@@ -140,7 +145,13 @@ const relatorTermScoreMu = {
140
145
  'johtaja': 78,
141
146
  'esittäjä': 77,
142
147
  'lukija': 76,
143
- 'miksaaja': 75
148
+ 'miksaaja': 75,
149
+ // manifestaatio
150
+ 'esittäjä (manifestaatio)': 69,
151
+ 'graafinen suunnittelija': 50,
152
+ 'valmistaja': 41,
153
+ 'jakaja': 40
154
+ // kappale/item
144
155
  };
145
156
  const relatorTermScoreVm = {
146
157
  // Visual Material
@@ -150,6 +161,7 @@ const relatorTermScoreVm = {
150
161
  'author': 99,
151
162
  // Here we assume that film/whatever is based on author's book
152
163
  'käsikirjoittaja': 98,
164
+ 'designer': 98,
153
165
  'kuvaaja': 89,
154
166
  'säveltäjä': 86,
155
167
  // Volatile. John Williams?
@@ -163,8 +175,13 @@ const relatorTermScoreVm = {
163
175
  'esittäjä': 77,
164
176
  'lukija': 76,
165
177
  'miksaaja': 75,
166
- 'kääntäjä': 70
178
+ 'kääntäjä': 70,
167
179
  // Manifestation
180
+ 'kaivertaja': 60,
181
+ 'graafinen suunnittelija': 59,
182
+ 'kustantaja': 42,
183
+ 'elokuvan jakelija': 41,
184
+ 'jakaja': 41
168
185
 
169
186
  // Item
170
187
  };
@@ -193,7 +210,7 @@ function scoreRelatorTermVm(normalizedValue) {
193
210
  return 0;
194
211
  }
195
212
  function scoreRelatorTerm(value, typeOfMaterial = undefined) {
196
- // NB! We are currently using type of material only for sorting relator terms, not 7XX fields!
213
+ // NB! We are currently using type of material only for sorting relator terms, not 7XX fields!!!
197
214
  const normalizedValue = normalizeValue(value);
198
215
  if (typeOfMaterial === 'BK') {
199
216
  // Books
@@ -326,17 +343,17 @@ function sortByRelatorTerm(fieldA, fieldB) {
326
343
  }
327
344
  function fieldGetMaxRelatorTermScore(field) {
328
345
  if (!field.subfields) {
329
- return -1;
346
+ return -2;
330
347
  }
331
348
  // If field has $t, it's a teos-nimeke-auktoriteetti, and thus meaningless. These should follow all $t-less fields...
332
349
  if ((0, _utils.fieldHasSubfield)(field, 't')) {
333
- return -1;
350
+ return -2;
334
351
  }
335
352
  const relatorSubfieldCode = ['611', '711', '811'].includes(field.tag) ? 'j' : 'e';
336
353
  const e = field.subfields.filter(sf => sf.code === relatorSubfieldCode);
337
354
  if (e.length === 0) {
338
355
  // No $e is still better than having a $t
339
- return 0;
356
+ return -1;
340
357
  }
341
358
  const scores = e.map(sf => scoreRelatorTerm(sf.value));
342
359
  //debugDev(`RELATOR SCORE FOR '${fieldToString(field)}': ${scores.join(', ')}`);
@@ -1 +1 @@
1
- {"version":3,"file":"sortFields.js","names":["_clone","_interopRequireDefault","require","_utils","_marcFieldSort","_subfield8Utils","_subfield6Utils","e","__esModule","default","BIG_BAD_NUMBER","_default","description","validate","fix","record","res","message","valid","fields","sort","fieldOrderComparator","map","f","clone","relocatedFields","filter","i","fieldToString","length","push","relatorTermScore","relatorTermScoreBk","relatorTermScoreMu","relatorTermScoreVm","normalizeValue","value","replace","scoreRelatorTermBk","normalizedValue","scoreRelatorTermMu","scoreRelatorTermVm","scoreRelatorTerm","typeOfMaterial","undefined","fieldA","fieldB","sorterFunctions","sortByTag","sortByIndexTerms","sortAlphabetically","sortByRelatorTerm","sortByOccurrenceNumber","preferFenniKeep","sortByFieldLinkAndSequenceNumber","globalFieldOrderComparator","indexTermFields","scoreInd2","val","ind2Score","tag","includes","ind2","scoreDictionary","dictionary","dictionarySortIndex","dictionaryA","selectFirstValue","dictionaryB","dictScoreA","dictScoreB","preferKeep","keepOwner","hasKeepA","fieldHasSubfield","hasKeepB","fenniPreference","violaPreference","fieldGetMaxRelatorTermScore","field","subfields","relatorSubfieldCode","sf","code","scores","Math","max","scoreA","scoreB","fieldGetMinLinkAndSequenceNumber","relevantSubfields","isValidSubfield8","parseFloat","min","fieldGetOccurrenceNumber","subfield6","find","isValidSubfield6","parseInt","subfield6GetOccurrenceNumber","subcode","subfield","slice"],"sources":["../src/sortFields.js"],"sourcesContent":["// Taken from project marc-record-js, file marcSortFields.js as this contains more and more Melinda-specific rules.\n\nimport clone from 'clone';\n//import createDebugLogger from 'debug';\nimport {fieldHasSubfield, fieldToString} from './utils';\nimport {sortByTag, sortAlphabetically, fieldOrderComparator as globalFieldOrderComparator} from '@natlibfi/marc-record/dist/marcFieldSort';\nimport {isValidSubfield8} from './subfield8Utils';\nimport {isValidSubfield6, subfield6GetOccurrenceNumber} from './subfield6Utils';\n\n//const debug = createDebugLogger('@natlibfi/marc-record-validators-melinda:sortFields');\n//const debugData = debug.extend('data');\n//const debugDev = debug.extend('dev');\n\nconst BIG_BAD_NUMBER = 999999999;\nexport default function () {\n\n return {\n description: 'Sort fields using both generic and Melinda specific rules',\n validate, fix\n };\n\n function fix(record) {\n const res = {message: [], fix: [], valid: true};\n\n record.fields.sort(fieldOrderComparator); // eslint-disable-line functional/immutable-data\n\n return res;\n }\n\n function validate(record) {\n const res = {message: []};\n\n const fields = record.fields.map(f => clone(f));\n fields.sort(fieldOrderComparator); // eslint-disable-line functional/immutable-data\n\n\n const relocatedFields = fields.filter((f, i) => fieldToString(f) !== fieldToString(record.fields[i]));\n\n if (relocatedFields.length > 0) { // eslint-disable-line functional/no-conditional-statements\n res.message.push(`${relocatedFields.length} field(s) in new places`); // eslint-disable-line functional/immutable-data\n }\n\n res.valid = !(res.message.length >= 1); // eslint-disable-line functional/immutable-data\n return res;\n }\n}\n\n\nconst relatorTermScore = { // Here bigger is better\n // NB! This is exportable as field internal $e sorting in marc-record-validators-js uses this.\n // NB! The more abstract, the earlier it appears.\n // Note that terms with same abstraction level might also have order preferences\n // We should 1) check the order of these, and 2) add translations (support Swedish at the very least)\n // work/teos > expression/ekspressio > manifestation/manifestaatin,\n // Work https://finto.fi/mts/fi/page/m1298\n 'säveltäjä': 100, 'composer': 100,\n 'kirjoittaja': 100, 'author': 100,\n 'libretisti': 100,\n 'sarjakuvantekijä': 100, 'soitonoppaan tekijä': 100,\n 'kartantekijä': 99,\n 'taiteilija': 98,\n 'sanoittaja': 90,\n 'käsikirjoittaja': 90,\n\n 'kuvaaja': 89, 'valokuvaaja': 89,\n 'kokoaja': 86,\n 'alkuperäisidean luoja': 85,\n 'teoksella kunnioitettu': 84, 'gratulaation kohde': 84,\n 'julkaisija': 82,\n 'tuottaja': 81,\n // expression: https://finto.fi/mts/fi/page/m153\n 'sovittaja': 79, 'arranger': 79,\n 'kuvittaja': 78,\n 'esipuheen kirjoittaja': 77,\n 'alkusanojen kirjoittaja': 76, 'loppusanojen kirjoittaja': 76,\n 'toimittaja': 75, 'editor': 75,\n 'esittäjä': 74,\n 'johtaja': 73, // orkesterinjohtaja\n 'editointi': 71, // for music, editor/toimittaja is another thing\n 'kääntäjä': 70,\n 'lukija': 61, 'kertoja': 61,\n // Manifestation level: https://finto.fi/mts/fi/page/m491\n 'kustantaja': 41\n // Item level: https://finto.fi/mts/fi/page/m1157\n};\n\nconst relatorTermScoreBk = {\n // https://finto.fi/mts/fi/page/m34 100-81\n 'libretisti': 100, 'sarjakuvantekijä': 100,\n 'kirjoittaja': 99, 'author': 99, 'soitonoppaan tekijä': 99,\n 'kuvaaja': 98, 'valokuvaaja': 98,\n 'kokoaja': 86,\n 'alkuperäisidean luoja': 85,\n 'teoksella kunnioitettu': 84, 'gratulaation kohde': 84,\n 'julkaisija': 83,\n 'säveltäjä': 82, // if 300$e has CD etc\n 'sanoittaja': 81,\n // expression: https://finto.fi/mts/fi/page/m153\n 'kuvittaja': 80,\n 'esipuheen kirjoittaja': 79,\n 'alkusanojen kirjoittaja': 78, 'loppusanojen kirjoittaja': 78,\n 'kääntäjä': 70,\n\n 'sovittaja': 50,\n // kappale\n 'sitoja': 25,\n 'gratulaation kirjoittaja': 24\n};\n\nconst relatorTermScoreMu = {\n 'säveltäjä': 100,\n 'sanoittaja': 99,\n 'soitonoppaan tekijä': 98,\n 'alkuperäisidean luoja': 85,\n 'teoksella kunnioitettu': 81,\n // expression: https://finto.fi/mts/fi/page/m153\n 'sovittaja': 79,\n 'johtaja': 78,\n 'esittäjä': 77,\n 'lukija': 76,\n 'miksaaja': 75\n};\n\nconst relatorTermScoreVm = { // Visual Material\n // Work\n 'ohjaaja': 100,\n 'kirjoittaja': 99, 'author': 99, // Here we assume that film/whatever is based on author's book\n 'käsikirjoittaja': 98,\n 'kuvaaja': 89,\n 'säveltäjä': 86, // Volatile. John Williams?\n 'alkuperäisidean luoja': 85,\n 'julkaisija': 82,\n 'tuottaja': 81,\n // Expression\n 'leikkaaja': 80,\n 'sovittaja': 79,\n 'johtaja': 78,\n 'esittäjä': 77,\n 'lukija': 76,\n 'miksaaja': 75,\n 'kääntäjä': 70\n // Manifestation\n\n // Item\n};\n\nfunction normalizeValue(value) {\n // Removing last punc char is good enough for our purposes.\n // We don't handle abbreviations here etc.\n // Brackets should not happen either, should they?\n return value.replace(/[.,]$/u, '');\n}\n\nfunction scoreRelatorTermBk(normalizedValue) {\n if (normalizedValue in relatorTermScoreBk) {\n return relatorTermScoreBk[normalizedValue];\n }\n return 0;\n}\n\nfunction scoreRelatorTermMu(normalizedValue) {\n if (normalizedValue in relatorTermScoreMu) {\n return relatorTermScoreMu[normalizedValue];\n }\n return 0;\n}\n\nfunction scoreRelatorTermVm(normalizedValue) {\n if (normalizedValue in relatorTermScoreVm) {\n return relatorTermScoreVm[normalizedValue];\n }\n return 0;\n}\n\nexport function scoreRelatorTerm(value, typeOfMaterial = undefined) {\n // NB! We are currently using type of material only for sorting relator terms, not 7XX fields!\n const normalizedValue = normalizeValue(value);\n if (typeOfMaterial === 'BK') { // Books\n return scoreRelatorTermBk(normalizedValue);\n }\n if (typeOfMaterial === 'MU') { // Music (NB: audio books should be BK in this context!)\n return scoreRelatorTermMu(normalizedValue);\n }\n if (typeOfMaterial === 'VM') { // video material\n return scoreRelatorTermVm(normalizedValue);\n }\n if (normalizedValue in relatorTermScore) {\n return relatorTermScore[normalizedValue];\n }\n return 0;\n}\n\nexport function fieldOrderComparator(fieldA, fieldB) {\n\n //const sorterFunctions = [sortByTag, sortByIndexTerms, sortAlphabetically, sortByRelatorTerm, sortByOccurrenceNumber, preferFenniKeep, sortByFieldLinkAndSequenceNumber];\n\n const sorterFunctions = [sortByTag, sortByIndexTerms, sortAlphabetically, sortByRelatorTerm, sortByOccurrenceNumber, preferFenniKeep, sortByFieldLinkAndSequenceNumber];\n //const sorterFunctions = [sortByIndexTerms, sortByRelatorTerm, sortByOccurrenceNumber, preferFenniKeep, sortByFieldLinkAndSequenceNumber];\n\n return globalFieldOrderComparator(fieldA, fieldB, sorterFunctions);\n}\n\nfunction sortByIndexTerms(fieldA, fieldB) { // eslint-disable-line complexity, max-statements\n\n const indexTermFields = ['600', '610', '611', '630', '648', '650', '651', '652', '653', '654', '655', '656', '657', '658', '659', '662'];\n\n function scoreInd2(val) {\n const ind2Score = {'0': 0, '1': 1, '2': 2, '3': 3, '4': 8, '5': 5, '6': 6, '7': 7};\n\n if (val in ind2Score) {\n return ind2Score[val];\n }\n return 9;\n }\n\n // ATM this is not needed.\n // You may need this, if you change compare function order in sorterFunctions\n // istanbul ignore next\n if (fieldA.tag !== fieldB.tag) {\n return 0;\n }\n\n if (!indexTermFields.includes(fieldA.tag)) {\n return 0;\n }\n\n // Puts ind2=4 last\n if (scoreInd2(fieldA.ind2) > scoreInd2(fieldB.ind2)) {\n return 1;\n }\n if (scoreInd2(fieldA.ind2) < scoreInd2(fieldB.ind2)) {\n return -1;\n }\n\n function scoreDictionary(dictionary) {\n const dictionarySortIndex = {\n 'yso/fin': 0,\n 'yso/swe': 1,\n 'yso/eng': 2,\n 'slm/fin': 0.1,\n 'slm/swe': 1.1,\n 'kauno/fin': 2.1,\n 'kauno/swe': 2.2,\n 'kaunokki': 4,\n 'bella': 5\n };\n\n if (dictionary in dictionarySortIndex) {\n return dictionarySortIndex[dictionary];\n }\n return BIG_BAD_NUMBER;\n }\n\n const dictionaryA = selectFirstValue(fieldA, '2');\n const dictionaryB = selectFirstValue(fieldB, '2');\n\n const dictScoreA = scoreDictionary(dictionaryA);\n const dictScoreB = scoreDictionary(dictionaryB);\n // Use priority order for listed dictionaries:\n if (dictScoreA > dictScoreB) {\n return 1;\n }\n if (dictScoreA < dictScoreB) {\n return -1;\n }\n // Unlisted dictionaries: sort $2 value alphabetically:\n //if (dictScoreA === BIG_BAD_NUMBER) {\n if (dictionaryA > dictionaryB) {\n return 1;\n }\n if (dictionaryA < dictionaryB) {\n return -1;\n }\n //}\n return 0;\n}\n\n\nfunction preferKeep(fieldA, fieldB, keepOwner = 'FENNI') {\n const hasKeepA = fieldHasSubfield(fieldA, '9', `${keepOwner}<KEEP>`);\n const hasKeepB = fieldHasSubfield(fieldB, '9', `${keepOwner}<KEEP>`);\n\n if (hasKeepA && !hasKeepB) {\n return -1;\n }\n if (!hasKeepA && hasKeepB) {\n return 1;\n }\n\n return 0;\n}\n\n\nfunction preferFenniKeep(fieldA, fieldB) {\n const fenniPreference = preferKeep(fieldA, fieldB, 'FENNI');\n if (fenniPreference !== 0) {\n return fenniPreference;\n }\n const violaPreference = preferKeep(fieldA, fieldB, 'VIOLA');\n if (violaPreference !== 0) {\n return violaPreference;\n }\n return preferKeep(fieldA, fieldB, 'FIKKA');\n}\n\nfunction sortByRelatorTerm(fieldA, fieldB) {\n //if (!['600', '610', '611', '630', '700', '710', '711', '730', '800', '810', '811', '830'].includes(fieldA.tag)) {\n if (!['700', '710', '711', '730'].includes(fieldA.tag)) {\n return 0;\n }\n\n function fieldGetMaxRelatorTermScore(field) {\n if (!field.subfields) {\n return -1;\n }\n // If field has $t, it's a teos-nimeke-auktoriteetti, and thus meaningless. These should follow all $t-less fields...\n if (fieldHasSubfield(field, 't')) {\n return -1;\n }\n const relatorSubfieldCode = ['611', '711', '811'].includes(field.tag) ? 'j' : 'e';\n const e = field.subfields.filter(sf => sf.code === relatorSubfieldCode);\n if (e.length === 0) { // No $e is still better than having a $t\n return 0;\n }\n const scores = e.map(sf => scoreRelatorTerm(sf.value));\n //debugDev(`RELATOR SCORE FOR '${fieldToString(field)}': ${scores.join(', ')}`);\n return Math.max(...scores);\n }\n\n const scoreA = fieldGetMaxRelatorTermScore(fieldA);\n const scoreB = fieldGetMaxRelatorTermScore(fieldB);\n\n if (scoreA < scoreB) {\n return 1;\n }\n if (scoreA > scoreB) {\n return -1;\n }\n return 0;\n}\n\n\nfunction fieldGetMinLinkAndSequenceNumber(field) {\n if (!field.subfields) {\n return BIG_BAD_NUMBER;\n }\n const relevantSubfields = field.subfields.filter(sf => isValidSubfield8(sf));\n // If val is something like \"1.2\\x\" parseFloat() would give a syntax erro because of hex-like escape sequnce (at least on Chrome). Thus remove tail:\n const scores = relevantSubfields.map(sf => parseFloat(sf.value.replace(/\\\\.*$/u, '')));\n if (scores.length === 0) {\n return BIG_BAD_NUMBER;\n }\n return Math.min(...scores);\n}\n\nfunction sortByFieldLinkAndSequenceNumber(fieldA, fieldB) { // Sort by subfield $8 that is...\n const scoreA = fieldGetMinLinkAndSequenceNumber(fieldA);\n const scoreB = fieldGetMinLinkAndSequenceNumber(fieldB);\n //debugDev(` sf-8-A-score for '${fieldToString(fieldA)}: ${scoreA}`);\n //debugDev(` sf-8-B-score for '${fieldToString(fieldB)}: ${scoreB}`);\n if (scoreA === scoreB) {\n return 0;\n }\n if (scoreB === 0) {\n return 1;\n }\n if (scoreA === 0) {\n return -1;\n }\n if (scoreA > scoreB) { // smaller is better\n return 1;\n }\n return -1;\n}\n\n\nfunction sortByOccurrenceNumber(fieldA, fieldB) { // Sort by subfield $6\n\n function fieldGetOccurrenceNumber(field) { // should this function be exported? (based on validator sortRelatorFields.js)\n if (!field.subfields) {\n return 0;\n }\n const subfield6 = field.subfields.find(sf => isValidSubfield6(sf));\n if (subfield6 === undefined) {\n return 0;\n }\n return parseInt(subfield6GetOccurrenceNumber(subfield6), 10);\n }\n\n if (fieldA.tag !== '880') {\n return 0;\n }\n const scoreA = fieldGetOccurrenceNumber(fieldA);\n const scoreB = fieldGetOccurrenceNumber(fieldB);\n\n //debugDev(`A: '${fieldToString(fieldA)}: ${scoreA}`);\n //debugDev(`B: '${fieldToString(fieldB)}: ${scoreB}`);\n\n if (scoreA === scoreB) {\n return 0;\n }\n if (scoreB === 0) {\n return -1;\n }\n if (scoreA === 0) {\n return 1;\n }\n if (scoreA > scoreB) { // smaller is better\n return 1;\n }\n return -1;\n}\n\n\nfunction selectFirstValue(field, subcode) {\n return field.subfields\n .filter(subfield => subcode === subfield.code)\n .map(subfield => subfield.value)\n .slice(0, 1);\n}\n\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"sortFields.js","names":["_clone","_interopRequireDefault","require","_utils","_marcFieldSort","_subfield8Utils","_subfield6Utils","e","__esModule","default","BIG_BAD_NUMBER","_default","description","validate","fix","record","res","message","valid","fields","sort","fieldOrderComparator","map","f","clone","relocatedFields","filter","i","fieldToString","length","push","relatorTermScore","relatorTermScoreBk","relatorTermScoreMu","relatorTermScoreVm","normalizeValue","value","replace","scoreRelatorTermBk","normalizedValue","scoreRelatorTermMu","scoreRelatorTermVm","scoreRelatorTerm","typeOfMaterial","undefined","fieldA","fieldB","sorterFunctions","sortByTag","sortByIndexTerms","sortAlphabetically","sortByRelatorTerm","sortByOccurrenceNumber","preferFenniKeep","sortByFieldLinkAndSequenceNumber","globalFieldOrderComparator","indexTermFields","scoreInd2","val","ind2Score","tag","includes","ind2","scoreDictionary","dictionary","dictionarySortIndex","dictionaryA","selectFirstValue","dictionaryB","dictScoreA","dictScoreB","preferKeep","keepOwner","hasKeepA","fieldHasSubfield","hasKeepB","fenniPreference","violaPreference","fieldGetMaxRelatorTermScore","field","subfields","relatorSubfieldCode","sf","code","scores","Math","max","scoreA","scoreB","fieldGetMinLinkAndSequenceNumber","relevantSubfields","isValidSubfield8","parseFloat","min","fieldGetOccurrenceNumber","subfield6","find","isValidSubfield6","parseInt","subfield6GetOccurrenceNumber","subcode","subfield","slice"],"sources":["../src/sortFields.js"],"sourcesContent":["// Taken from project marc-record-js, file marcSortFields.js as this contains more and more Melinda-specific rules.\n\nimport clone from 'clone';\n//import createDebugLogger from 'debug';\nimport {fieldHasSubfield, fieldToString} from './utils';\nimport {sortByTag, sortAlphabetically, fieldOrderComparator as globalFieldOrderComparator} from '@natlibfi/marc-record/dist/marcFieldSort';\nimport {isValidSubfield8} from './subfield8Utils';\nimport {isValidSubfield6, subfield6GetOccurrenceNumber} from './subfield6Utils';\n\n//const debug = createDebugLogger('@natlibfi/marc-record-validators-melinda:sortFields');\n//const debugData = debug.extend('data');\n//const debugDev = debug.extend('dev');\n\nconst BIG_BAD_NUMBER = 999999999;\nexport default function () {\n\n return {\n description: 'Sort fields using both generic and Melinda specific rules',\n validate, fix\n };\n\n function fix(record) {\n const res = {message: [], fix: [], valid: true};\n\n record.fields.sort(fieldOrderComparator); // eslint-disable-line functional/immutable-data\n\n return res;\n }\n\n function validate(record) {\n const res = {message: []};\n\n const fields = record.fields.map(f => clone(f));\n fields.sort(fieldOrderComparator); // eslint-disable-line functional/immutable-data\n\n\n const relocatedFields = fields.filter((f, i) => fieldToString(f) !== fieldToString(record.fields[i]));\n\n if (relocatedFields.length > 0) { // eslint-disable-line functional/no-conditional-statements\n res.message.push(`${relocatedFields.length} field(s) in new places`); // eslint-disable-line functional/immutable-data\n }\n\n res.valid = !(res.message.length >= 1); // eslint-disable-line functional/immutable-data\n return res;\n }\n}\n\n\nconst relatorTermScore = { // Here bigger is better\n // NB! This is exportable as field internal $e sorting in marc-record-validators-js uses this.\n // NB! The more abstract, the earlier it appears.\n // Note that terms with same abstraction level might also have order preferences\n // We should 1) check the order of these, and 2) add translations (support Swedish at the very least)\n // work/teos > expression/ekspressio > manifestation/manifestaatin,\n // Work https://finto.fi/mts/fi/page/m1298\n 'säveltäjä': 100, 'composer': 100,\n 'kirjoittaja': 100, 'author': 100,\n 'libretisti': 100,\n 'sarjakuvantekijä': 100, 'soitonoppaan tekijä': 100,\n 'kartantekijä': 99,\n 'taiteilija': 98,\n 'designer': 90,\n 'sanoittaja': 90,\n 'käsikirjoittaja': 90,\n\n 'kuvaaja': 89, 'valokuvaaja': 89,\n 'kokoaja': 86,\n 'alkuperäisidean luoja': 85,\n 'teoksella kunnioitettu': 84, 'gratulaation kohde': 84,\n 'julkaisija': 82,\n 'tuottaja': 81,\n // expression: https://finto.fi/mts/fi/page/m153\n 'sovittaja': 79, 'arranger': 79,\n 'kuvittaja': 78,\n 'esipuheen kirjoittaja': 77,\n 'alkusanojen kirjoittaja': 76, 'loppusanojen kirjoittaja': 76,\n 'toimittaja': 75, 'editor': 75,\n 'esittäjä': 74,\n 'johtaja': 73, // orkesterinjohtaja\n 'editointi': 71, // for music, editor/toimittaja is another thing\n 'kääntäjä': 70,\n 'lukija': 61, 'kertoja': 61,\n // Manifestation level: https://finto.fi/mts/fi/page/m491\n 'graafinen suunnittelija': 50,\n 'kustantaja': 41\n // Item level: https://finto.fi/mts/fi/page/m1157\n};\n\nconst relatorTermScoreBk = {\n // https://finto.fi/mts/fi/page/m34 100-81\n 'libretisti': 100, 'sarjakuvantekijä': 100,\n 'kirjoittaja': 99, 'author': 99, 'soitonoppaan tekijä': 99,\n 'kuvaaja': 98, 'valokuvaaja': 98,\n 'kokoaja': 86, 'designer': 86,\n 'alkuperäisidean luoja': 85,\n 'teoksella kunnioitettu': 84, 'gratulaation kohde': 84,\n 'säveltäjä': 83, // if 300$e has CD etc\n 'sanoittaja': 82,\n 'julkaisija': 81,\n // expression: https://finto.fi/mts/fi/page/m153\n 'kuvittaja': 80,\n 'esipuheen kirjoittaja': 79,\n 'alkusanojen kirjoittaja': 78, 'loppusanojen kirjoittaja': 78,\n 'kääntäjä': 70,\n 'sovittaja': 50,\n // manifestaatio\n 'graafinen suunnittelija': 40,\n // kappale/item\n 'sitoja': 25,\n 'gratulaation kirjoittaja': 24\n};\n\nconst relatorTermScoreMu = {\n 'säveltäjä': 100,\n 'sanoittaja': 99,\n 'soitonoppaan tekijä': 98,\n 'alkuperäisidean luoja': 85,\n 'teoksella kunnioitettu': 81,\n // expression: https://finto.fi/mts/fi/page/m153\n 'sovittaja': 79,\n 'johtaja': 78,\n 'esittäjä': 77,\n 'lukija': 76,\n 'miksaaja': 75,\n // manifestaatio\n 'esittäjä (manifestaatio)': 69,\n\n 'graafinen suunnittelija': 50,\n 'valmistaja': 41,\n 'jakaja': 40\n // kappale/item\n\n};\n\nconst relatorTermScoreVm = { // Visual Material\n // Work\n 'ohjaaja': 100,\n 'kirjoittaja': 99, 'author': 99, // Here we assume that film/whatever is based on author's book\n 'käsikirjoittaja': 98, 'designer': 98,\n 'kuvaaja': 89,\n 'säveltäjä': 86, // Volatile. John Williams?\n 'alkuperäisidean luoja': 85,\n 'julkaisija': 82,\n 'tuottaja': 81,\n // Expression\n 'leikkaaja': 80,\n 'sovittaja': 79,\n 'johtaja': 78,\n 'esittäjä': 77,\n 'lukija': 76,\n 'miksaaja': 75,\n 'kääntäjä': 70,\n // Manifestation\n 'kaivertaja': 60,\n 'graafinen suunnittelija': 59,\n 'kustantaja': 42,\n 'elokuvan jakelija': 41, 'jakaja': 41\n\n // Item\n};\n\nfunction normalizeValue(value) {\n // Removing last punc char is good enough for our purposes.\n // We don't handle abbreviations here etc.\n // Brackets should not happen either, should they?\n return value.replace(/[.,]$/u, '');\n}\n\nfunction scoreRelatorTermBk(normalizedValue) {\n if (normalizedValue in relatorTermScoreBk) {\n return relatorTermScoreBk[normalizedValue];\n }\n return 0;\n}\n\nfunction scoreRelatorTermMu(normalizedValue) {\n if (normalizedValue in relatorTermScoreMu) {\n return relatorTermScoreMu[normalizedValue];\n }\n return 0;\n}\n\nfunction scoreRelatorTermVm(normalizedValue) {\n if (normalizedValue in relatorTermScoreVm) {\n return relatorTermScoreVm[normalizedValue];\n }\n return 0;\n}\n\nexport function scoreRelatorTerm(value, typeOfMaterial = undefined) {\n // NB! We are currently using type of material only for sorting relator terms, not 7XX fields!!!\n const normalizedValue = normalizeValue(value);\n if (typeOfMaterial === 'BK') { // Books\n return scoreRelatorTermBk(normalizedValue);\n }\n if (typeOfMaterial === 'MU') { // Music (NB: audio books should be BK in this context!)\n return scoreRelatorTermMu(normalizedValue);\n }\n if (typeOfMaterial === 'VM') { // video material\n return scoreRelatorTermVm(normalizedValue);\n }\n if (normalizedValue in relatorTermScore) {\n return relatorTermScore[normalizedValue];\n }\n return 0;\n}\n\nexport function fieldOrderComparator(fieldA, fieldB) {\n\n //const sorterFunctions = [sortByTag, sortByIndexTerms, sortAlphabetically, sortByRelatorTerm, sortByOccurrenceNumber, preferFenniKeep, sortByFieldLinkAndSequenceNumber];\n\n const sorterFunctions = [sortByTag, sortByIndexTerms, sortAlphabetically, sortByRelatorTerm, sortByOccurrenceNumber, preferFenniKeep, sortByFieldLinkAndSequenceNumber];\n //const sorterFunctions = [sortByIndexTerms, sortByRelatorTerm, sortByOccurrenceNumber, preferFenniKeep, sortByFieldLinkAndSequenceNumber];\n\n return globalFieldOrderComparator(fieldA, fieldB, sorterFunctions);\n}\n\nfunction sortByIndexTerms(fieldA, fieldB) { // eslint-disable-line complexity, max-statements\n\n const indexTermFields = ['600', '610', '611', '630', '648', '650', '651', '652', '653', '654', '655', '656', '657', '658', '659', '662'];\n\n function scoreInd2(val) {\n const ind2Score = {'0': 0, '1': 1, '2': 2, '3': 3, '4': 8, '5': 5, '6': 6, '7': 7};\n\n if (val in ind2Score) {\n return ind2Score[val];\n }\n return 9;\n }\n\n // ATM this is not needed.\n // You may need this, if you change compare function order in sorterFunctions\n // istanbul ignore next\n if (fieldA.tag !== fieldB.tag) {\n return 0;\n }\n\n if (!indexTermFields.includes(fieldA.tag)) {\n return 0;\n }\n\n // Puts ind2=4 last\n if (scoreInd2(fieldA.ind2) > scoreInd2(fieldB.ind2)) {\n return 1;\n }\n if (scoreInd2(fieldA.ind2) < scoreInd2(fieldB.ind2)) {\n return -1;\n }\n\n function scoreDictionary(dictionary) {\n const dictionarySortIndex = {\n 'yso/fin': 0,\n 'yso/swe': 1,\n 'yso/eng': 2,\n 'slm/fin': 0.1,\n 'slm/swe': 1.1,\n 'kauno/fin': 2.1,\n 'kauno/swe': 2.2,\n 'kaunokki': 4,\n 'bella': 5\n };\n\n if (dictionary in dictionarySortIndex) {\n return dictionarySortIndex[dictionary];\n }\n return BIG_BAD_NUMBER;\n }\n\n const dictionaryA = selectFirstValue(fieldA, '2');\n const dictionaryB = selectFirstValue(fieldB, '2');\n\n const dictScoreA = scoreDictionary(dictionaryA);\n const dictScoreB = scoreDictionary(dictionaryB);\n // Use priority order for listed dictionaries:\n if (dictScoreA > dictScoreB) {\n return 1;\n }\n if (dictScoreA < dictScoreB) {\n return -1;\n }\n // Unlisted dictionaries: sort $2 value alphabetically:\n //if (dictScoreA === BIG_BAD_NUMBER) {\n if (dictionaryA > dictionaryB) {\n return 1;\n }\n if (dictionaryA < dictionaryB) {\n return -1;\n }\n //}\n return 0;\n}\n\n\nfunction preferKeep(fieldA, fieldB, keepOwner = 'FENNI') {\n const hasKeepA = fieldHasSubfield(fieldA, '9', `${keepOwner}<KEEP>`);\n const hasKeepB = fieldHasSubfield(fieldB, '9', `${keepOwner}<KEEP>`);\n\n if (hasKeepA && !hasKeepB) {\n return -1;\n }\n if (!hasKeepA && hasKeepB) {\n return 1;\n }\n\n return 0;\n}\n\n\nfunction preferFenniKeep(fieldA, fieldB) {\n const fenniPreference = preferKeep(fieldA, fieldB, 'FENNI');\n if (fenniPreference !== 0) {\n return fenniPreference;\n }\n const violaPreference = preferKeep(fieldA, fieldB, 'VIOLA');\n if (violaPreference !== 0) {\n return violaPreference;\n }\n return preferKeep(fieldA, fieldB, 'FIKKA');\n}\n\nfunction sortByRelatorTerm(fieldA, fieldB) {\n //if (!['600', '610', '611', '630', '700', '710', '711', '730', '800', '810', '811', '830'].includes(fieldA.tag)) {\n if (!['700', '710', '711', '730'].includes(fieldA.tag)) {\n return 0;\n }\n\n function fieldGetMaxRelatorTermScore(field) {\n if (!field.subfields) {\n return -2;\n }\n // If field has $t, it's a teos-nimeke-auktoriteetti, and thus meaningless. These should follow all $t-less fields...\n if (fieldHasSubfield(field, 't')) {\n return -2;\n }\n const relatorSubfieldCode = ['611', '711', '811'].includes(field.tag) ? 'j' : 'e';\n const e = field.subfields.filter(sf => sf.code === relatorSubfieldCode);\n if (e.length === 0) { // No $e is still better than having a $t\n return -1;\n }\n const scores = e.map(sf => scoreRelatorTerm(sf.value));\n //debugDev(`RELATOR SCORE FOR '${fieldToString(field)}': ${scores.join(', ')}`);\n return Math.max(...scores);\n }\n\n const scoreA = fieldGetMaxRelatorTermScore(fieldA);\n const scoreB = fieldGetMaxRelatorTermScore(fieldB);\n\n if (scoreA < scoreB) {\n return 1;\n }\n if (scoreA > scoreB) {\n return -1;\n }\n return 0;\n}\n\n\nfunction fieldGetMinLinkAndSequenceNumber(field) {\n if (!field.subfields) {\n return BIG_BAD_NUMBER;\n }\n const relevantSubfields = field.subfields.filter(sf => isValidSubfield8(sf));\n // If val is something like \"1.2\\x\" parseFloat() would give a syntax erro because of hex-like escape sequnce (at least on Chrome). Thus remove tail:\n const scores = relevantSubfields.map(sf => parseFloat(sf.value.replace(/\\\\.*$/u, '')));\n if (scores.length === 0) {\n return BIG_BAD_NUMBER;\n }\n return Math.min(...scores);\n}\n\nfunction sortByFieldLinkAndSequenceNumber(fieldA, fieldB) { // Sort by subfield $8 that is...\n const scoreA = fieldGetMinLinkAndSequenceNumber(fieldA);\n const scoreB = fieldGetMinLinkAndSequenceNumber(fieldB);\n //debugDev(` sf-8-A-score for '${fieldToString(fieldA)}: ${scoreA}`);\n //debugDev(` sf-8-B-score for '${fieldToString(fieldB)}: ${scoreB}`);\n if (scoreA === scoreB) {\n return 0;\n }\n if (scoreB === 0) {\n return 1;\n }\n if (scoreA === 0) {\n return -1;\n }\n if (scoreA > scoreB) { // smaller is better\n return 1;\n }\n return -1;\n}\n\n\nfunction sortByOccurrenceNumber(fieldA, fieldB) { // Sort by subfield $6\n\n function fieldGetOccurrenceNumber(field) { // should this function be exported? (based on validator sortRelatorFields.js)\n if (!field.subfields) {\n return 0;\n }\n const subfield6 = field.subfields.find(sf => isValidSubfield6(sf));\n if (subfield6 === undefined) {\n return 0;\n }\n return parseInt(subfield6GetOccurrenceNumber(subfield6), 10);\n }\n\n if (fieldA.tag !== '880') {\n return 0;\n }\n const scoreA = fieldGetOccurrenceNumber(fieldA);\n const scoreB = fieldGetOccurrenceNumber(fieldB);\n\n //debugDev(`A: '${fieldToString(fieldA)}: ${scoreA}`);\n //debugDev(`B: '${fieldToString(fieldB)}: ${scoreB}`);\n\n if (scoreA === scoreB) {\n return 0;\n }\n if (scoreB === 0) {\n return -1;\n }\n if (scoreA === 0) {\n return 1;\n }\n if (scoreA > scoreB) { // smaller is better\n return 1;\n }\n return -1;\n}\n\n\nfunction selectFirstValue(field, subcode) {\n return field.subfields\n .filter(subfield => subcode === subfield.code)\n .map(subfield => subfield.value)\n .slice(0, 1);\n}\n\n"],"mappings":"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","ignoreList":[]}
package/package.json CHANGED
@@ -14,7 +14,7 @@
14
14
  "url": "git@github.com:natlibfi/marc-record-validators-melinda.git"
15
15
  },
16
16
  "license": "MIT",
17
- "version": "11.5.2",
17
+ "version": "11.5.4-alpha.1",
18
18
  "main": "./dist/index.js",
19
19
  "publishConfig": {
20
20
  "access": "public"
@@ -38,16 +38,16 @@
38
38
  },
39
39
  "dependencies": {
40
40
  "@natlibfi/issn-verify": "^1.0.6",
41
- "@natlibfi/marc-record": "^9.1.2",
41
+ "@natlibfi/marc-record": "^9.1.3",
42
42
  "@natlibfi/marc-record-serializers": "^10.1.2",
43
43
  "@natlibfi/marc-record-validate": "^8.0.12",
44
- "@natlibfi/melinda-commons": "^13.0.18",
44
+ "@natlibfi/melinda-commons": "^13.0.19",
45
45
  "@natlibfi/sru-client": "^6.0.17",
46
46
  "@natlibfi/sfs-4900": "github:NatLibFi/sfs-4900",
47
47
  "cld3-asm": "^4.0.0",
48
48
  "clone": "^2.1.2",
49
49
  "debug": "^4.4.0",
50
- "isbn3": "^1.2.6",
50
+ "isbn3": "^1.2.7",
51
51
  "iso9_1995": "^0.0.2",
52
52
  "langs": "^2.0.0",
53
53
  "node-fetch": "^2.7.0",
@@ -59,8 +59,8 @@
59
59
  },
60
60
  "devDependencies": {
61
61
  "@babel/cli": "^7.26.4",
62
- "@babel/core": "^7.26.0",
63
- "@babel/preset-env": "^7.26.0",
62
+ "@babel/core": "^7.26.7",
63
+ "@babel/preset-env": "^7.26.7",
64
64
  "@babel/register": "^7.25.9",
65
65
  "@natlibfi/eslint-config-melinda-backend": "^3.0.5",
66
66
  "@natlibfi/fixugen": "^2.0.12",
@@ -72,7 +72,7 @@
72
72
  "cross-env": "^7.0.3",
73
73
  "eslint": "^8.57.1",
74
74
  "fetch-mock": "^11.1.5",
75
- "mocha": "^11.0.1",
75
+ "mocha": "^11.1.0",
76
76
  "nyc": "^17.1.0"
77
77
  },
78
78
  "overrides": {
@@ -184,6 +184,7 @@ const mergeConstraints = [
184
184
  {'tag': '585', 'required': 'a', 'key': 'a'},
185
185
  {'tag': '586', 'required': 'a', 'key': 'a'},
186
186
  {'tag': '588', 'required': 'a', 'key': 'a'},
187
+ // NB! Currently we never merge 59X fields (see mergableTags.js). Doublish removals such as MELKEHITYS-3147 are handled by postprocessor.
187
188
  {'tag': '590', 'required': ''},
188
189
  {'tag': '591', 'required': ''},
189
190
  {'tag': '592', 'required': ''},
@@ -209,7 +209,7 @@ export function isEnnakkotietoSubfield(subfield) {
209
209
  // Length <= 13 allows punctuation, but does not require it:
210
210
  if (subfield.value.length <= 13) {
211
211
  const coreString = subfield.value.substr(0, 12);
212
- if (coreString === 'ENNAKKOTIETO' || coreString === 'ennakkotieto') { // Lowercase term first seen in MET-575
212
+ if (coreString.toLowerCase() === 'ennakkotieto') { // Lowercase term first seen in MET-575
213
213
  return true;
214
214
  }
215
215
  }
@@ -289,6 +289,13 @@ function deriveIndividualDeletables(record) {
289
289
  }
290
290
  }
291
291
 
292
+ if (currString.match(/^500 ## ‡a Ei vastaanotettu\.$/u)) { // MELKEHITYS-3147
293
+ return processTodoList([...stillToDo, ...moreToDo], [...deletables, '500 ## ‡a EI VASTAANOTETTU.']);
294
+ }
295
+ if (currString.match(/^500 ## ‡a Ei ilmesty\.$/u)) { // MELKEHITYS-3147
296
+ return processTodoList([...stillToDo, ...moreToDo], [...deletables, '500 ## ‡a EI ILMESTY.']);
297
+ }
298
+
292
299
  if (currString.match(/^505 .0.*-- ‡t/u)) { // MRA-413-ish
293
300
  const tmp = currString.replace(/ -- ‡t /gu, ' -- '). // remove non-initial $t subfields
294
301
  replace(/ ‡[rg] /gu, ' '). // remove $r and $g subfields
@@ -302,6 +309,13 @@ function deriveIndividualDeletables(record) {
302
309
  //nvdebug(`505 DERIVATE: '${tmp}'`)
303
310
  }
304
311
 
312
+ if (currString.match(/^594 ## ‡a Ei vastaanotettu ‡5 FENNI$/u)) { // MELKEHITYS-3147
313
+ return processTodoList([...stillToDo, ...moreToDo], [...deletables, '594 ## ‡a EI VASTAANOTETTU ‡5 FENNI']);
314
+ }
315
+ if (currString.match(/^594 ## ‡a Ei ilmesty ‡5 FENNI$/u)) { // MELKEHITYS-3147
316
+ return processTodoList([...stillToDo, ...moreToDo], [...deletables, '594 ## ‡a EI ILMESTY ‡5 FENNI']);
317
+ }
318
+
305
319
  // MET-381: remove occurence number TAG-00, if TAG-NN existists
306
320
  if (currString.match(/^880.* ‡6 [0-9][0-9][0-9]-(?:[1-9][0-9]|0[1-9])/u)) {
307
321
  const tmp = currString.replace(/( ‡6 [0-9][0-9][0-9])-[0-9]+/u, '$1-00'); // eslint-disable-line prefer-named-capture-group
@@ -344,7 +358,7 @@ function deriveIndividualDeletables(record) {
344
358
  function getPrepublicationTerms(fieldAsString) {
345
359
  if (fieldAsString.match(/^653./u)) {
346
360
  // MET-528 (extented by MET-575)
347
- return [`${fieldAsString} ‡g ENNAKKOTIETO`, `${fieldAsString} ‡g ennakkotieto`, `${fieldAsString} ‡g ENNAKKOTIETO.`, `${fieldAsString} ‡g ennakkotieto.`];
361
+ return [`${fieldAsString} ‡g ENNAKKOTIETO`, `${fieldAsString} ‡g Ennakkotieto`, `${fieldAsString} ‡g ennakkotieto`, `${fieldAsString} ‡g ENNAKKOTIETO.`, `${fieldAsString} ‡g Ennakkotieto.`, `${fieldAsString} ‡g ennakkotieto.`];
348
362
  }
349
363
 
350
364
  return [];
package/src/sortFields.js CHANGED
@@ -59,6 +59,7 @@ const relatorTermScore = { // Here bigger is better
59
59
  'sarjakuvantekijä': 100, 'soitonoppaan tekijä': 100,
60
60
  'kartantekijä': 99,
61
61
  'taiteilija': 98,
62
+ 'designer': 90,
62
63
  'sanoittaja': 90,
63
64
  'käsikirjoittaja': 90,
64
65
 
@@ -80,6 +81,7 @@ const relatorTermScore = { // Here bigger is better
80
81
  'kääntäjä': 70,
81
82
  'lukija': 61, 'kertoja': 61,
82
83
  // Manifestation level: https://finto.fi/mts/fi/page/m491
84
+ 'graafinen suunnittelija': 50,
83
85
  'kustantaja': 41
84
86
  // Item level: https://finto.fi/mts/fi/page/m1157
85
87
  };
@@ -89,20 +91,21 @@ const relatorTermScoreBk = {
89
91
  'libretisti': 100, 'sarjakuvantekijä': 100,
90
92
  'kirjoittaja': 99, 'author': 99, 'soitonoppaan tekijä': 99,
91
93
  'kuvaaja': 98, 'valokuvaaja': 98,
92
- 'kokoaja': 86,
94
+ 'kokoaja': 86, 'designer': 86,
93
95
  'alkuperäisidean luoja': 85,
94
96
  'teoksella kunnioitettu': 84, 'gratulaation kohde': 84,
95
- 'julkaisija': 83,
96
- 'säveltäjä': 82, // if 300$e has CD etc
97
- 'sanoittaja': 81,
97
+ 'säveltäjä': 83, // if 300$e has CD etc
98
+ 'sanoittaja': 82,
99
+ 'julkaisija': 81,
98
100
  // expression: https://finto.fi/mts/fi/page/m153
99
101
  'kuvittaja': 80,
100
102
  'esipuheen kirjoittaja': 79,
101
103
  'alkusanojen kirjoittaja': 78, 'loppusanojen kirjoittaja': 78,
102
104
  'kääntäjä': 70,
103
-
104
105
  'sovittaja': 50,
105
- // kappale
106
+ // manifestaatio
107
+ 'graafinen suunnittelija': 40,
108
+ // kappale/item
106
109
  'sitoja': 25,
107
110
  'gratulaation kirjoittaja': 24
108
111
  };
@@ -118,14 +121,22 @@ const relatorTermScoreMu = {
118
121
  'johtaja': 78,
119
122
  'esittäjä': 77,
120
123
  'lukija': 76,
121
- 'miksaaja': 75
124
+ 'miksaaja': 75,
125
+ // manifestaatio
126
+ 'esittäjä (manifestaatio)': 69,
127
+
128
+ 'graafinen suunnittelija': 50,
129
+ 'valmistaja': 41,
130
+ 'jakaja': 40
131
+ // kappale/item
132
+
122
133
  };
123
134
 
124
135
  const relatorTermScoreVm = { // Visual Material
125
136
  // Work
126
137
  'ohjaaja': 100,
127
138
  'kirjoittaja': 99, 'author': 99, // Here we assume that film/whatever is based on author's book
128
- 'käsikirjoittaja': 98,
139
+ 'käsikirjoittaja': 98, 'designer': 98,
129
140
  'kuvaaja': 89,
130
141
  'säveltäjä': 86, // Volatile. John Williams?
131
142
  'alkuperäisidean luoja': 85,
@@ -138,8 +149,12 @@ const relatorTermScoreVm = { // Visual Material
138
149
  'esittäjä': 77,
139
150
  'lukija': 76,
140
151
  'miksaaja': 75,
141
- 'kääntäjä': 70
152
+ 'kääntäjä': 70,
142
153
  // Manifestation
154
+ 'kaivertaja': 60,
155
+ 'graafinen suunnittelija': 59,
156
+ 'kustantaja': 42,
157
+ 'elokuvan jakelija': 41, 'jakaja': 41
143
158
 
144
159
  // Item
145
160
  };
@@ -173,7 +188,7 @@ function scoreRelatorTermVm(normalizedValue) {
173
188
  }
174
189
 
175
190
  export function scoreRelatorTerm(value, typeOfMaterial = undefined) {
176
- // NB! We are currently using type of material only for sorting relator terms, not 7XX fields!
191
+ // NB! We are currently using type of material only for sorting relator terms, not 7XX fields!!!
177
192
  const normalizedValue = normalizeValue(value);
178
193
  if (typeOfMaterial === 'BK') { // Books
179
194
  return scoreRelatorTermBk(normalizedValue);
@@ -311,16 +326,16 @@ function sortByRelatorTerm(fieldA, fieldB) {
311
326
 
312
327
  function fieldGetMaxRelatorTermScore(field) {
313
328
  if (!field.subfields) {
314
- return -1;
329
+ return -2;
315
330
  }
316
331
  // If field has $t, it's a teos-nimeke-auktoriteetti, and thus meaningless. These should follow all $t-less fields...
317
332
  if (fieldHasSubfield(field, 't')) {
318
- return -1;
333
+ return -2;
319
334
  }
320
335
  const relatorSubfieldCode = ['611', '711', '811'].includes(field.tag) ? 'j' : 'e';
321
336
  const e = field.subfields.filter(sf => sf.code === relatorSubfieldCode);
322
337
  if (e.length === 0) { // No $e is still better than having a $t
323
- return 0;
338
+ return -1;
324
339
  }
325
340
  const scores = e.map(sf => scoreRelatorTerm(sf.value));
326
341
  //debugDev(`RELATOR SCORE FOR '${fieldToString(field)}': ${scores.join(', ')}`);
@@ -0,0 +1,21 @@
1
+ {
2
+ "leader": "12345crm a22002417i 4500",
3
+ "fields":
4
+ [
5
+ {"tag": "700", "ind1": "1", "ind2": " ", "subfields": [
6
+ {"code": "a", "value": "Sukunimi, Etunimi1." }
7
+ ]},
8
+ {"tag": "700", "ind1": "1", "ind2": " ", "subfields": [
9
+ {"code": "a", "value": "Sukunimi, Etunimi2," },
10
+ {"code": "e", "value": "graafinen suunnittelija." }
11
+ ]},
12
+ {"tag": "700", "ind1": "1", "ind2": " ", "subfields": [
13
+ {"code": "a", "value": "Sukunimi, Etunimi3," },
14
+ {"code": "e", "value": "kuvittaja." }
15
+ ]},
16
+ {"tag": "700", "ind1": "1", "ind2": " ", "subfields": [
17
+ {"code": "a", "value": "Sukunimi, Etunimi4," },
18
+ {"code": "e", "value": "designer." }
19
+ ]}
20
+ ]
21
+ }
@@ -0,0 +1,5 @@
1
+ {
2
+ "description": "MRA-849: Sort 700 fields based on $e, record type: VM record",
3
+ "skip": false,
4
+ "only": false
5
+ }
@@ -0,0 +1,22 @@
1
+ {
2
+ "leader": "12345crm a22002417i 4500",
3
+ "fields":
4
+ [
5
+ {"tag": "700", "ind1": "1", "ind2": " ", "subfields": [
6
+ {"code": "a", "value": "Sukunimi, Etunimi4," },
7
+ {"code": "e", "value": "designer." }
8
+ ]},
9
+ {"tag": "700", "ind1": "1", "ind2": " ", "subfields": [
10
+ {"code": "a", "value": "Sukunimi, Etunimi3," },
11
+ {"code": "e", "value": "kuvittaja." }
12
+ ]},
13
+ {"tag": "700", "ind1": "1", "ind2": " ", "subfields": [
14
+ {"code": "a", "value": "Sukunimi, Etunimi2," },
15
+ {"code": "e", "value": "graafinen suunnittelija." }
16
+ ]},
17
+ {"tag": "700", "ind1": "1", "ind2": " ", "subfields": [
18
+ {"code": "a", "value": "Sukunimi, Etunimi1." }
19
+ ]}
20
+ ],
21
+ "_validationOptions": {}
22
+ }