diff --git a/question_generator/cities/citiesQuestions.js b/question_generator/cities/citiesQuestions.js index 41fd2e13..144a264d 100644 --- a/question_generator/cities/citiesQuestions.js +++ b/question_generator/cities/citiesQuestions.js @@ -10,7 +10,7 @@ class CitiesQuestions{ constructor(){ this.cities={}; } - async getRandomCities(numberOfCities){ + async loadData(){ if (Object.keys(this.cities).length === 0) {//Se obtienen 100 ciudades relevantes const query=` SELECT ?city ?cityLabel ?population ?countryLabel ?elevation_above_sea_level @@ -56,10 +56,13 @@ class CitiesQuestions{ }; } - this.cities[cityId].elevation_above_sea_level.push(elevationAboveSeaLevel); + this.cities[cityId].elevation_above_sea_level.push(parseFloat(elevationAboveSeaLevel)); }); } + } + async getRandomCities(numberOfCities){ + await this.loadData(); const citiesArray = Object.values(this.cities); const randomResults = citiesArray.sort(() => Math.random() - 0.5).slice(0, numberOfCities); return randomResults diff --git a/question_generator/cities/citiesTemplates.js b/question_generator/cities/citiesTemplates.js index 4528081c..399eeb4a 100644 --- a/question_generator/cities/citiesTemplates.js +++ b/question_generator/cities/citiesTemplates.js @@ -1,5 +1,8 @@ const cities=require('./citiesQuestions'); const citiesQuery=cities.getInstance(); +function loadData(){ + citiesQuery.loadData(); +} const templates=[ async ()=> { @@ -31,4 +34,5 @@ const templates=[ ] -module.exports = () => templates[Math.floor(Math.random()*templates.length)]() //se obtiene una pregunta aleatoria de los templates \ No newline at end of file +module.exports.getRandomQuestion = () => templates[Math.floor(Math.random()*templates.length)](); +module.exports.loadData = () =>loadData(); \ No newline at end of file diff --git a/question_generator/planets/planetsQuestions.js b/question_generator/planets/planetsQuestions.js index 80175868..f77ba6b7 100644 --- a/question_generator/planets/planetsQuestions.js +++ b/question_generator/planets/planetsQuestions.js @@ -7,9 +7,12 @@ class PlanetsQuestions{ } return this.planetsQuestions; } - async getBiggestPlanet(){ - //Se obtiene el id del planeta, su nombre y su radio - const query= ` + constructor(){ + this.planets={} + } + async loadData(){ + if(Object.keys(this.planets).length==0){ + const query= ` SELECT ?planet ?planetLabel (SAMPLE(?radius) AS ?radius) WHERE { ?categ wdt:P361 wd:Q337768. @@ -25,24 +28,42 @@ class PlanetsQuestions{ GROUP BY ?planet ?planetLabel `; const results=await queryExecutor.execute(query) - //Escoge cuatro planetas aleatorios - const randomResults = results.sort(() => Math.random() - 0.5).slice(0,4); - const formattedResults = await randomResults.map(result => { - return { - item: result.planetLabel.value, - value:parseFloat(result.radius.value), - }; - }).sort((a, b) => b.value - a.value); + results.forEach(planet => { + const planetId = planet.planet.value; + const planetName = planet.planetLabel.value; + const radius = planet.radius.value; + + if (!this.planets[planetId]) { + this.planets[planetId] = { + planetId: planetId, + planetName: planetName, + radius: [] + }; + } + + this.planets[planetId].radius.push(parseFloat(radius)); + }); + } + } + async getRandomPlanets(number) { + await this.loadData(); + const array = Object.values(this.planets); + const randomResults = array.sort(() => Math.random() - 0.5).slice(0, number); + return randomResults + } + async getBiggestPlanet(){ + const results=await this.getRandomPlanets(4); + const formattedResults = await results.sort((a, b) => b.radius[0] - a.radius[0]); var finalResults={ correct: null, incorrects:[] } for(let i = 0; i < Math.min(formattedResults.length,4); i++) { if(i==0){ - finalResults.correct=formattedResults[i].item; + finalResults.correct=formattedResults[i].planetName; } else{ - finalResults.incorrects.push(formattedResults[i].item); + finalResults.incorrects.push(formattedResults[i].planetName); } } return finalResults; diff --git a/question_generator/planets/planetsTemplates.js b/question_generator/planets/planetsTemplates.js index 034f17e2..31b10fd5 100644 --- a/question_generator/planets/planetsTemplates.js +++ b/question_generator/planets/planetsTemplates.js @@ -1,5 +1,8 @@ const planetsQuestions=require('./planetsQuestions'); const planetsQuery=planetsQuestions.getInstance(); +function loadData(){ + planetsQuery.loadData(); +} const templates=[ async ()=> { @@ -13,4 +16,5 @@ const templates=[ ] -module.exports = () => templates[Math.floor(Math.random()*templates.length)]() //se obtiene una pregunta aleatoria de los templates \ No newline at end of file +module.exports.getRandomQuestion = () => templates[Math.floor(Math.random()*templates.length)](); +module.exports.loadData = ()=>loadData(); \ No newline at end of file diff --git a/question_generator/questionService.js b/question_generator/questionService.js index 9d32430e..85c6cc74 100644 --- a/question_generator/questionService.js +++ b/question_generator/questionService.js @@ -10,16 +10,19 @@ const port = 8002; app.use(bodyParser.json()); + app.get('/api/questions/create', async (req, res) => { - res.status(200).json(await generalTemplate()) + res.status(200).json(await generalTemplate.getRandomQuestion()) }); app.get('/api/questions/planets/create', async (req, res) => { - res.status(200).json(await planetTemplate()) + res.status(200).json(await planetTemplate.getRandomQuestion()) }); app.get('/api/questions/cities/create', async (req, res) => { - res.status(200).json(await citiesTemplate()) + res.status(200).json(await citiesTemplate.getRandomQuestion()) }); +generalTemplate.loadData(); + const server = app.listen(port, () => { console.log(`Listening at http://localhost:${port}`); }); \ No newline at end of file diff --git a/question_generator/questionTemplate.js b/question_generator/questionTemplate.js index ce30fcba..a9a4bf46 100644 --- a/question_generator/questionTemplate.js +++ b/question_generator/questionTemplate.js @@ -1,8 +1,13 @@ const planetsTemplates=require('./planets/planetsTemplates'); const citiesTemplates=require('./cities/citiesTemplates') +function loadData(){ + citiesTemplates.loadData() + planetsTemplates.loadData() +} const templates=[ - planetsTemplates, - citiesTemplates + planetsTemplates.getRandomQuestion, + citiesTemplates.getRandomQuestion ] -module.exports = () => templates[Math.floor(Math.random()*templates.length)]() //se obtiene una pregunta aleatoria de los templates \ No newline at end of file +module.exports.getRandomQuestion = () => templates[Math.floor(Math.random()*templates.length)](); +module.exports.loadData = ()=>loadData(); \ No newline at end of file