@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
JavaScript
;
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;