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