wikimedica-disease-search/app/src/fetch.js

231 lines
5.5 KiB
JavaScript
Raw Normal View History

const mockNodes = {
Q2840: {
id: 'Q2840',
name: 'Grippe',
types: ['Maladie'],
weight: 0.000035
},
Q154882: {
id: 'Q154882',
name: 'Légionellose',
types: ['Maladie'],
weight: 0.000015
},
Q155098: {
id: 'Q155098',
name: 'Leptospirose',
types: ['Maladie'],
weight: 0.00001
},
Q326663: {
id: 'Q326663',
name: 'Encéphalite à tiques',
types: ['Maladie'],
weight: 0.000001
},
Q133780: {
id: 'Q133780',
name: 'Peste',
types: ['Maladie'],
weight: 0.000032
},
Q38933: {
id: 'Q38933',
name: 'Fièvre',
types: ['Symptôme']
},
Q474959: {
id: 'Q474959',
name: 'Myalgie',
types: ['Symptôme']
},
Q86: {
id: 'Q86',
name: 'Céphalée',
types: ['Signe']
},
Q1115038: {
id: 'Q1115038',
name: 'Rhinorrhée',
types: ['Symptôme']
},
Q9690: {
id: 'Q9690',
name: 'Fatigue',
types: ['Symptôme']
},
Q127076: {
id: 'Q127076',
name: 'Vomissement',
types: ['Symptôme', 'Signe']
},
Q178061: {
id: 'Q178061',
name: 'Choc circulatoire',
types: ['Maladie'],
weight: 0.000038
},
Q35805: {
id: 'Q35805',
name: 'Toux',
types: ['Symptôme', 'Signe']
},
Q647099: {
id: 'Q647099',
name: 'Hémoptysie',
types: ['Symptôme']
},
Q653197: {
id: 'Q653197',
name: 'Rash',
types: ['Symptôme', 'Signe']
},
Q160796: {
id: 'Q160796',
name: 'Syndrome confusionnel',
types: ['Maladie'],
weight: 0.000004
},
Q186235: {
id: 'Q186235',
name: 'Myocardite',
types: ['Maladie'],
weight: 0.0000075
},
Q476921: {
id: 'Q476921',
name: 'Insuffisance rénale',
types: ['Maladie'],
weight: 0.0000046
},
Q281289: {
id: 'Q281289',
name: 'Photophobie',
types: ['Signe']
},
Q159557: {
id: 'Q159557',
name: 'Coma',
types: ['Signe']
}
};
const mockEdges = [
['Q2840', 'Q38933'],
['Q2840', 'Q1115038'],
['Q2840', 'Q474959'],
['Q2840', 'Q86'],
['Q2840', 'Q9690'],
['Q154882', 'Q86'],
['Q154882', 'Q38933'],
['Q154882', 'Q35805'],
['Q154882', 'Q474959'],
['Q155098', 'Q38933'],
['Q155098', 'Q474959'],
['Q155098', 'Q86'],
['Q155098', 'Q476921'],
['Q155098', 'Q186235'],
['Q155098', 'Q653197'],
['Q326663', 'Q86'],
['Q326663', 'Q474959'],
['Q326663', 'Q38933'],
['Q326663', 'Q9690'],
['Q326663', 'Q281289'],
['Q326663', 'Q159557'],
['Q326663', 'Q127076'],
['Q133780', 'Q38933'],
['Q133780', 'Q86'],
['Q133780', 'Q127076'],
['Q133780', 'Q474959'],
['Q133780', 'Q178061'],
['Q133780', 'Q35805'],
['Q133780', 'Q647099'],
['Q133780', 'Q653197'],
['Q133780', 'Q160796']
];
/**
* Vérifie si une liste darêtes contient une arête donnée, dans un sens ou
* dans lautre.
*
* @param list Liste darêtes.
* @param from Premier nœud de larête.
* @param to Second nœud de larête.
* @return Vrai si et seulement si larête existe.
*/
const includesEdge = (list, from, to) =>
list.some(([source, target]) => (
(source === from && target === to)
|| (source === to && target === from)
));
export const searchTerms = terms => new Promise((res, rej) =>
{
// Fait attendre artificiellement pour simuler une requête
setTimeout(() =>
{
const nodes = {};
const edges = [];
// Récupération des identifiants correspondant aux termes de la requête
const termIds = terms.map(term =>
Object.keys(mockNodes)
.find(id => mockNodes[id].name === term)
);
// Si lun des termes est inconnu, aucun résultat
if (!termIds.includes(undefined))
{
// Sélection des termes de la requête
for (let termId of termIds)
{
nodes[termId] = mockNodes[termId];
}
// Sélection des nœuds liés à tous les éléments de la requête
const resultIds = [];
for (let [id, data] of Object.entries(mockNodes))
{
if (termIds.every(
termId => includesEdge(mockEdges, id, termId)
))
{
nodes[id] = data;
resultIds.push(id);
}
}
// Sélection des voisins des résultats de la requête
for (let [id, data] of Object.entries(mockNodes))
{
for (let resultId of resultIds)
{
if (includesEdge(mockEdges, resultId, id))
{
nodes[id] = data;
}
}
}
// Sélection des arêtes liant les nœuds sélectionnés
for (let [from, to] of mockEdges)
{
if (
(from in nodes && to in nodes)
&& !includesEdge(edges, from, to)
)
{
edges.push([from, to]);
}
}
}
res({nodes, edges});
}, 500);
});