From cc816eef9cab4d7427894a28d5eed089d088adf6 Mon Sep 17 00:00:00 2001 From: Fernando Erd <fce15@inf.ufpr.br> Date: Mon, 5 Mar 2018 11:22:42 -0300 Subject: [PATCH] Add Liquid Enrollment Ratio --- src/libs/routes/liquidEnrollmentRatio.js | 342 +++++++++++++++++++++++ 1 file changed, 342 insertions(+) create mode 100644 src/libs/routes/liquidEnrollmentRatio.js diff --git a/src/libs/routes/liquidEnrollmentRatio.js b/src/libs/routes/liquidEnrollmentRatio.js new file mode 100644 index 00000000..3d734495 --- /dev/null +++ b/src/libs/routes/liquidEnrollmentRatio.js @@ -0,0 +1,342 @@ +const express = require('express'); + +const glossEnrollmentRatioApp = express.Router(); + +const libs = `${process.cwd()}/libs`; + +const log = require(`${libs}/log`)(module); + +const squel = require('squel'); + +const query = require(`${libs}/middlewares/query`).query; + +const multiQuery = require(`${libs}/middlewares/multiQuery`); + +const response = require(`${libs}/middlewares/response`); + +const ReqQueryFields = require(`${libs}/middlewares/reqQueryFields`); + +const id2str = require(`${libs}/middlewares/id2str`); + +const addMissing = require(`${libs}/middlewares/addMissing`); + +const config = require(`${libs}/config`); + +const download = require(`${libs}/middlewares/downloadDatabase`); + +const passport = require('passport'); + +const cache = require('apicache').options({ debug: config.debug, statusCodes: {include: [200]} }).middleware; + +let rqf = new ReqQueryFields(); + +glossEnrollmentRatioApp.use(cache('15 day')); + +// Complete range of the enrollments dataset. +// Returns a tuple of start and ending years of the complete enrollments dataset. +glossEnrollmentRatioApp.get('/year_range', (req, res, next) => { + req.sql.from('pnad') + .field('DISTINCT pnad.ano_censo', 'year'); + next(); +}, query, (req, res, next) => { + req.oldResult = req.result; + + req.sql = squel.select(); + + req.sql.from('matricula') + .field('DISTINCT matricula.ano_censo', 'year'); + next(); +}, query, (req, res, next) => { + let distinct_years = []; + let new_result = []; + for (let i = 0; i < req.oldResult.length; i++) { + for (let j = 0; j < req.result.length; j++) { + if(req.oldResult[i].year == req.result[j].year) { + distinct_years.push(req.oldResult[i]); + } + } + } + new_result.push({start_year: distinct_years[distinct_years.length -1].year, end_year: distinct_years[0].year}); + req.result = new_result; + next(); +}, response('range')); + +glossEnrollmentRatioApp.get('/years', (req, res, next) => { + req.sql.from('pnad') + .field('DISTINCT pnad.ano_censo', 'year'); + next(); +}, query, (req, res, next) => { + req.oldResult = req.result; + + req.sql = squel.select(); + + req.sql.from('matricula') + .field('DISTINCT matricula.ano_censo', 'year'); + next(); +}, query, (req, res, next) => { + let new_result = [] + for (let i = 0; i < req.oldResult.length; i++) { + for (let j = 0; j < req.result.length; j++) { + if(req.oldResult[i].year == req.result[j].year) { + new_result.push(req.oldResult[i]); + } + } + } + req.result = new_result; + next(); +}, response('years')); + +glossEnrollmentRatioApp.get('/source', (req, res, next) => { + req.sql.from('fonte') + .field('fonte', 'source') + .where('tabela = \'pnad\''); + next(); +}, query, response('source')); + +glossEnrollmentRatioApp.get('/education_level_short', (req, res, next) => { + req.result = [ + {id: null, name: 'Não classificada'}, + {id: 1, name: 'Creche'}, + {id: 2, name: 'Pré-Escola'}, + {id: 4, name: 'Ensino Fundamental - anos iniciais'}, + {id: 5, name: 'Ensino Fundamental - anos finais'}, + {id: 6, name: 'Ensino Médio'} + ]; + next(); +}, response('education_level_short')); + +glossEnrollmentRatioApp.get('/gender', (req, res, next) => { + req.result = [ + {id: 1, name: 'Masculino'}, + {id: 2, name: 'Feminino'} + ]; + next(); +}, response('gender')); + +glossEnrollmentRatioApp.get('/ethnic_group', (req, res, next) => { + req.result = [ + {id: 0, name: 'Sem declaração'}, + {id: 1, name: 'Branca'}, + {id: 2, name: 'Preta'}, + {id: 3, name: 'Parda'}, + {id: 4, name: 'Amarela'}, + {id: 5, name: 'IndÃgena'} + ]; + next(); +}, response('ethnic_group')); + +glossEnrollmentRatioApp.get('/location', (req, res, next) => { + req.result = [ + {id: 1, name: 'Urbana'}, + {id: 2, name: 'Rural'} + ]; + next(); +}, response('location')); + +rqf.addField({ + name: 'filter', + field: false, + where: true +}).addField({ + name: 'dims', + field: true, + where: false +}).addValue({ + name: 'region', + table: 'regiao', + tableField: 'nome', + resultField: 'region_name', + where: { + relation: '=', + type: 'integer', + field: 'id' + }, + join: { + primary: 'id', + foreign: 'regiao_id', + foreignTable: '@' + } +}).addValue({ + name: 'state', + table: 'estado', + tableField: 'nome', + resultField: 'state_name', + where: { + relation: '=', + type: 'integer', + field: 'id' + }, + join: { + primary: 'id', + foreign: 'estado_id', + foreignTable: '@' + } +}).addValue({ + name: 'ethnic_group', + table: '@', + tableField: 'cor_raca_id', + resultField: 'ethnic_group_id', + where: { + relation: '=', + type: 'integer', + field: 'cor_raca' + } +}).addValue({ + name: 'min_year', + table: '@', + tableField: 'ano_censo', + resultField: 'year', + where: { + relation: '>=', + type: 'integer', + table: '@', + field: 'ano_censo' + } +}).addValue({ + name: 'max_year', + table: '@', + tableField: 'ano_censo', + resultField: 'year', + where: { + relation: '<=', + type: 'integer', + table: '@', + field: 'ano_censo' + } +}).addValue({ + name: 'gender', + table: 'pnad', + tableField: 'sexo', + resultField: 'gender_pnad_id', + where: { + relation: '=', + type: 'integer', + field: 'sexo' + } +}).addValue({ + name: 'location', + table: '@', + tableField: 'localizacao_id', + resultField: 'location_id', + where: { + relation: '=', + type: 'integer', + field: 'localizacao_id' + } +}).addValue({ + name: 'education_level_short', + table: 'matricula', + tableField: 'etapa_resumida', + resultField: 'education_level_short_id', + where: { + relation: '=', + type: 'integer', + field: 'etapa_resumida' + } +}); + +glossEnrollmentRatioApp.get('/', rqf.parse(),(req, res, next) => { + req.numerator = {}; + req.denominator = {}; + let glossEnrollmentRatioApp = {}; + + log.debug(req.sql.toParam()); + req.sql.from('matricula') + .field('count(*)', 'total') + .field('matricula.ano_censo', 'year') + .group('matricula.ano_censo') + .order('matricula.ano_censo') + + function ConvertMatricula(result) { + if (result == 1) { + return 'matricula.faixa_etaria_31_03 = 1' + } else if (result == 2) { + return 'matricula.faixa_etaria_31_03 = 2' + } else if (result == 4) { + return 'matricula.faixa_etaria_31_03 = 3' + } else if (result == 5) { + return 'matricula.faixa_etaria_31_03 = 4' + } else if (result == 6) { + return 'matricula.faixa_etaria_31_03 = 5' + } + } + if ("education_level_short" in req.filter) { + if (Array.isArray(req.filter.education_level_short)) + var string_query_enrollment = ''; + for(let i = 0; i < req.filter.education_level_short.length - 1; i++) { + string_query_enrollment = string_query_enrollment + ConvertMatricula(req.filter.education_level_short[i]) + ' OR '; + } + string_query_enrollment = string_query_enrollment + ConvertMatricula(req.filter.education_level_short[req.filter.education_level_short.length - 1]); + req.sql.where(string_query_enrollment); + } else { + res.status(400); + next({ + status: 400, + message: 'Wrong/No filter specified' + }); + } + + next(); +}, rqf.build(), query, (req, res, next) => { + req.numerator = req.result; + req.resetSql(); + log.debug(req.sql.toParam()); + req.sql.field('count(*)', 'total') + .field('pnad.ano_censo','year') + .from('pnad') + .group('pnad.ano_censo') + .order('pnad.ano_censo') + + function convertPnad(result) { + if (result == 1) { + return 'pnad.idade_31_03 = 1' + } else if (result == 2) { + return 'pnad.idade_31_03 = 2' + } else if (result == 4) { + return 'pnad.idade_31_03= 3' + } else if (result == 5) { + return 'pnad.idade_31_03 = 4' + } else if (result == 6) { + return 'pnad.idade_31_03 = 5' + } + } + + //remove education_level_short how filter and add faixa_etaria_31_03 in filter + if ("education_level_short" in req.filter) { + if (Array.isArray(req.filter.education_level_short)) + var string_query = ''; + for(let i = 0; i < req.filter.education_level_short.length - 1; i++) { + string_query = string_query + convertPnad(req.filter.education_level_short[i]) + ' OR '; + } + string_query = string_query + convertPnad(req.filter.education_level_short[req.filter.education_level_short.length - 1]); + req.sql.where(string_query); + } else { + req.sql.where(convertPnad(req.filter.education_level_short)); + } + + next(); +}, rqf.parse(), (req, res, next) => { + if ("education_level_short" in req.filter) { + delete req.filter.education_level_short; + } + next(); +}, rqf.build(), query, (req, res, next) => { + req.denominator = req.result; + log.debug(req.numerator); + log.debug(req.denominator); + + //division to generate req.result final + req.result = [] + for (let i = 0; i < req.numerator.length; i++) { + for (let j = 0; j < req.denominator.length; j++) { + if (req.numerator[i].year == req.denominator[j].year) { + req.numerator[i].total = req.numerator[i].total/req.denominator[j].total; + req.result.push(req.numerator[i]); + } + } + } + + next(); +}, response('glossEnrollmentRatio')); + +module.exports = glossEnrollmentRatioApp; -- GitLab