UNPKG

@gouvfr-anct/mednum

Version:

✨ Permet de transformer une source de données vers le schéma des lieux de mediation numerique

49 lines (48 loc) 2.61 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.groupDuplicates = void 0; const node_crypto_1 = require("node:crypto"); const createGroup = ({ mergeGroupsMap, itemGroupMap }) => ({ id1, id2 }, groupId) => ({ mergeGroupsMap: mergeGroupsMap.set(groupId, [id1, id2]), itemGroupMap: itemGroupMap.set(id1, groupId).set(id2, groupId) }); const updateGroup = ({ mergeGroupsMap, itemGroupMap }) => (id1, id2, groupId) => ({ mergeGroupsMap: mergeGroupsMap.set(groupId, Array.from(new Set([...(mergeGroupsMap.get(groupId) ?? []), id1, id2])).sort()), itemGroupMap: itemGroupMap.set(id2, groupId) }); const getMergedGroupsIds = (mergeGroupsMap, groupId2, groupId1) => Array.from(new Set([...(mergeGroupsMap.get(groupId2) ?? []), ...(mergeGroupsMap.get(groupId1) ?? [])])); const mergeGroups = (readyToMerge) => (groupId2, groupId1) => { const mergedGroupsIds = getMergedGroupsIds(readyToMerge.mergeGroupsMap, groupId2, groupId1); readyToMerge.mergeGroupsMap.delete(groupId1); readyToMerge.mergeGroupsMap.set(groupId2, mergedGroupsIds); mergedGroupsIds.forEach((id) => readyToMerge.itemGroupMap.set(id, groupId2)); return readyToMerge; }; const toGroups = (groups, duplicationComparison, index) => { const groupId1 = groups.itemGroupMap.get(duplicationComparison.id1); const groupId2 = groups.itemGroupMap.get(duplicationComparison.id2); if (groupId1 != null && groupId2 != null) return mergeGroups(groups)(groupId2, groupId1); if (groupId1 != null) return updateGroup(groups)(duplicationComparison.id1, duplicationComparison.id2, groupId1); if (groupId2 != null) return updateGroup(groups)(duplicationComparison.id2, duplicationComparison.id1, groupId2); return createGroup(groups)(duplicationComparison, index.toString()); }; const useIdsInGroupsHashesAsGroupIds = (groups) => { const groupsWithHashes = { mergeGroupsMap: new Map(), itemGroupMap: new Map() }; groups.mergeGroupsMap.forEach((ids) => { const idsHash = (0, node_crypto_1.createHash)('sha256').update(ids.toString()).digest('hex'); groupsWithHashes.mergeGroupsMap.set(idsHash, ids); ids.forEach((id) => groupsWithHashes.itemGroupMap.set(id, idsHash)); }); return groupsWithHashes; }; const groupDuplicates = (duplicates) => useIdsInGroupsHashesAsGroupIds(duplicates.reduce((groups, duplicationComparison, index) => toGroups(groups, duplicationComparison, index), { mergeGroupsMap: new Map(), itemGroupMap: new Map() })); exports.groupDuplicates = groupDuplicates;