UNPKG

@gouvfr-anct/mednum

Version:

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

45 lines (44 loc) 2.83 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.duplicationComparisons = void 0; const find_duplicates_1 = require("../find-duplicates"); const toDuplicationComparison = ({ lieu1, lieu2, duplicate }) => ({ id1: lieu1.id, id2: lieu2.id, score: Math.trunc((duplicate.voieFuzzyScore + duplicate.nomFuzzyScore + duplicate.distanceScore) / 3), adresseScore: duplicate.voieFuzzyScore, adresse1: `${lieu1.adresse} ${lieu1.code_postal} ${lieu1.commune}`, adresse2: `${lieu2.adresse} ${lieu2.code_postal} ${lieu2.commune}`, nomScore: duplicate.nomFuzzyScore, nom1: lieu1.nom, nom2: lieu2.nom, distanceScore: duplicate.distanceScore, localisation1: `${lieu1.latitude} : ${lieu1.longitude}`, localisation2: `${lieu2.latitude} : ${lieu2.longitude}`, source1: lieu1.source, source2: lieu2.source, ...(lieu1.typologie == null ? {} : { typologie1: lieu1.typologie }), ...(lieu2.typologie == null ? {} : { typologie2: lieu2.typologie }) }); const onlyValidScore = (duplication) => !isNaN(duplication.score); const byScore = ({ score: scoreA }, { score: scoreB }) => scoreB - scoreA; const lieuFor = (duplicate) => (lieu) => lieu.id === duplicate.id; const isAlreadyProcessed = (lieu1, lieu2, readyToProcessDuplicationComparison) => readyToProcessDuplicationComparison.some(({ lieu1: duplicationForlieu1, lieu2: duplicationForlieu2 }) => duplicationForlieu1.id === lieu2.id && duplicationForlieu2.id === lieu1.id); const toDuplicationsForLieu = (lieux, alreadyRegistredDuplicationComparisons, lieuDuplications) => (readyToProcessDuplicationComparisons, duplicate) => { const lieu1 = lieux.find(lieuFor(lieuDuplications)); const lieu2 = lieux.find(lieuFor(duplicate)); return lieu1 == null || lieu2 == null || isAlreadyProcessed(lieu1, lieu2, alreadyRegistredDuplicationComparisons) ? readyToProcessDuplicationComparisons : [...readyToProcessDuplicationComparisons, { duplicate, lieu1, lieu2 }]; }; const getReadyProcessDuplicationComparison = (lieux, allowInternalMerge, lieuxToDeduplicate) => (0, find_duplicates_1.findDuplicates)(lieux, allowInternalMerge, lieuxToDeduplicate) .flatMap((communeDuplications) => communeDuplications.lieux) .reduce((readyToProcessDuplicationComparisons, lieuDuplication) => [ ...readyToProcessDuplicationComparisons, ...lieuDuplication.duplicates.reduce(toDuplicationsForLieu(lieux, readyToProcessDuplicationComparisons, lieuDuplication), []) ], []); const duplicationComparisons = (lieux, allowInternalMerge, lieuxToDeduplicate = lieux) => getReadyProcessDuplicationComparison(lieux, allowInternalMerge, lieuxToDeduplicate) .map(toDuplicationComparison) .filter(onlyValidScore) .sort(byScore); exports.duplicationComparisons = duplicationComparisons;