Skip to content
Snippets Groups Projects
Commit 9d50575e authored by Fernando Erd's avatar Fernando Erd :ok_hand:
Browse files

Merge branch 'enrollment_liquid' into development

parents 41af3a4b 03de2702
No related branches found
No related tags found
1 merge request!116Release v1.0.0
Pipeline #
module.exports = function educationLevelBasic(id) {
switch (id) {
case 1:
return 'Creche';
case 2:
return 'Pré-Escola';
case 4:
return 'Ensino Fundamental - anos iniciais';
case 5:
return 'Ensino Fundamental - anos finais';
case 6:
return 'Ensino Médio';
default:
return 'Não classificada';
}
};
...@@ -23,12 +23,14 @@ const ageRange = require(`${libs}/convert/ageRange`); ...@@ -23,12 +23,14 @@ const ageRange = require(`${libs}/convert/ageRange`);
const genderPnad = require(`${libs}/convert/genderPnad`); const genderPnad = require(`${libs}/convert/genderPnad`);
const fifthHouseholdIncome = require(`${libs}/convert/fifthHouseholdIncome`); const fifthHouseholdIncome = require(`${libs}/convert/fifthHouseholdIncome`);
const extremesHouseholdIncome = require(`${libs}/convert/extremesHouseholdIncome`); const extremesHouseholdIncome = require(`${libs}/convert/extremesHouseholdIncome`);
const educationLevelBasic = require(`${libs}/convert/educationLevelBasic`);
const ids = { const ids = {
gender_id: gender, gender_id: gender,
period_id: period, period_id: period,
school_year_id: schoolYear, school_year_id: schoolYear,
education_level_id: educationLevel, education_level_id: educationLevel,
education_level_basic_id: educationLevelBasic,
education_level_mod_id: educationLevelMod, education_level_mod_id: educationLevelMod,
education_level_short_id: educationLevelShort, education_level_short_id: educationLevelShort,
adm_dependency_id: admDependency, adm_dependency_id: admDependency,
...@@ -102,6 +104,7 @@ module.exports = { ...@@ -102,6 +104,7 @@ module.exports = {
period, period,
schoolYear, schoolYear,
educationLevel, educationLevel,
educationLevelBasic,
educationLevelMod, educationLevelMod,
educationLevelShort, educationLevelShort,
admDependency, admDependency,
......
...@@ -36,6 +36,8 @@ const rateSchool = require('./rateSchool') ...@@ -36,6 +36,8 @@ const rateSchool = require('./rateSchool')
const glossEnrollmentRatio = require('./glossEnrollmentRatio') const glossEnrollmentRatio = require('./glossEnrollmentRatio')
const liquidEnrollmentRatio = require('./liquidEnrollmentRatio')
const idhm = require('./idhm'); const idhm = require('./idhm');
const idhmr = require('./idhmr'); const idhmr = require('./idhmr');
...@@ -80,6 +82,7 @@ api.use('/pibpercapita', pibpercapita); ...@@ -80,6 +82,7 @@ api.use('/pibpercapita', pibpercapita);
api.use('/population', population); api.use('/population', population);
api.use('/rate_school', rateSchool); api.use('/rate_school', rateSchool);
api.use('/gloss_enrollment_ratio', glossEnrollmentRatio); api.use('/gloss_enrollment_ratio', glossEnrollmentRatio);
api.use('/liquid_enrollment_ratio', liquidEnrollmentRatio);
api.use('/idhml', idhml); api.use('/idhml', idhml);
api.use('/auth/token', oauth2.token); api.use('/auth/token', oauth2.token);
api.use('/verify', verifyToken); api.use('/verify', verifyToken);
......
const express = require('express');
const liquidEnrollmentRatioApp = 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();
liquidEnrollmentRatioApp.use(cache('15 day'));
// Complete range of the enrollments dataset.
// Returns a tuple of start and ending years of the complete enrollments dataset.
liquidEnrollmentRatioApp.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'));
liquidEnrollmentRatioApp.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'));
liquidEnrollmentRatioApp.get('/source', (req, res, next) => {
req.sql.from('fonte')
.field('fonte', 'source')
.where('tabela = \'pnad\'');
next();
}, query, response('source'));
liquidEnrollmentRatioApp.get('/education_level_basic', (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_basic'));
liquidEnrollmentRatioApp.get('/gender', (req, res, next) => {
req.result = [
{id: 1, name: 'Masculino'},
{id: 2, name: 'Feminino'}
];
next();
}, response('gender'));
liquidEnrollmentRatioApp.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'));
liquidEnrollmentRatioApp.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_id'
}
}).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: '@',
tableField: 'sexo',
resultField: 'gender_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_basic',
table: 'matricula',
tableField: 'etapa_resumida',
resultField: 'education_level_basic_id',
where: {
relation: '=',
type: 'integer',
field: 'etapa_resumida'
}
});
function matchQueries(queryTotal, queryPartial) {
let match = [];
queryPartial.forEach((result) => {
let newObj = {};
let keys = Object.keys(result);
keys.forEach((key) => {
newObj[key] = result[key];
});
// console.log('NEW OBJ');
// console.log(newObj);
// remove total
let index = keys.indexOf('total');
if(index > -1) keys.splice(index, 1);
// remove education_level_basic_id
index = keys.indexOf('education_level_basic_id');
if(index > -1) keys.splice(index, 1);
// remove education_level_basic_name
index = keys.indexOf('education_level_basic_name');
if(index > -1) keys.splice(index, 1);
let objMatch = null;
for(let i = 0; i < queryTotal.length; ++i) {
let total = queryTotal[i];
let foundMatch = true;
for(let j = 0; j < keys.length; ++j) {
let key = keys[j];
if(total[key] !== result[key]) {
foundMatch = false;
break;
}
}
if(foundMatch) {
objMatch = total;
break;
}
}
if(objMatch) {
// console.log('MATCH!!!!');
// console.log(objMatch);
newObj.total = (result.total / objMatch.total) * 100;
newObj.partial = result.total;
newObj.denominator = objMatch.total
match.push(newObj);
}
});
// console.log('TAMANHOS');
// console.log(queryTotal.length);
// console.log(queryPartial.length);
// console.log(match.length);
return match;
}
liquidEnrollmentRatioApp.get('/', rqf.parse(),(req, res, next) => {
req.numerator = {};
req.denominator = {};
let liquidEnrollmentRatioApp = {};
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_basic" in req.filter) {
if (Array.isArray(req.filter.education_level_basic))
var string_query_enrollment = '';
for(let i = 0; i < req.filter.education_level_basic.length - 1; i++) {
string_query_enrollment = string_query_enrollment + ConvertMatricula(req.filter.education_level_basic[i]) + ' OR ';
}
string_query_enrollment = string_query_enrollment + ConvertMatricula(req.filter.education_level_basic[req.filter.education_level_basic.length - 1]);
req.sql.where(string_query_enrollment);
} else {
res.status(400);
next({
status: 400,
message: 'Wrong/No filter specified'
});
}
next();
}, rqf.build(), query, id2str.transform(), (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.faixa_etaria_31_03 = 1'
} else if (result == 2) {
return 'pnad.faixa_etaria_31_03 = 2'
} else if (result == 4) {
return 'pnad.faixa_etaria_31_03 = 3'
} else if (result == 5) {
return 'pnad.faixa_etaria_31_03 = 4'
} else if (result == 6) {
return 'pnad.faixa_etaria_31_03 = 5'
}
}
//remove education_level_basic how filter and add faixa_etaria_31_03 in filter
if ("education_level_basic" in req.filter) {
if (Array.isArray(req.filter.education_level_basic))
var string_query = '';
for(let i = 0; i < req.filter.education_level_basic.length - 1; i++) {
string_query = string_query + convertPnad(req.filter.education_level_basic[i]) + ' OR ';
}
string_query = string_query + convertPnad(req.filter.education_level_basic[req.filter.education_level_basic.length - 1]);
req.sql.where(string_query);
} else {
req.sql.where(convertPnad(req.filter.education_level_basic));
}
next();
}, rqf.parse(), (req, res, next) => {
if ("education_level_basic" in req.filter) {
delete req.filter.education_level_basic;
}
if ("education_level_basic" in req.dims) {
delete req.dims.education_level_basic;
}
next();
}, rqf.build(), query, id2str.transform(), (req, res, next) => {
req.denominator = req.result;
log.debug(req.numerator);
log.debug(req.denominator);
//division to generate req.result final
req.result = []
log.debug(Object.keys(req.dims))
let liquidEnrollment = matchQueries(req.denominator, req.numerator);
req.result = liquidEnrollment;
next();
}, response('liquuidEnrollmentRatio'));
module.exports = liquidEnrollmentRatioApp;
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment