Newer
Older
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();
// 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'));
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();
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) => {
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
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',
}
}).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',
where: {
relation: '=',
type: 'integer',
field: 'sexo'
}
}).addValue({
name: 'location',
table: '@',
tableField: 'localizacao_id',
resultField: 'location_id',
where: {
relation: '=',
type: 'integer',
field: 'localizacao_id'
}
}).addValue({
tableField: 'etapas_mod_ensino_segmento_id',
where: {
relation: '=',
type: 'integer',
function matchQueries(queryTotal, queryPartial) {
let match = [];
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);
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];
foundMatch = false;
break;
}
}
if(foundMatch) {
// console.log('MATCH!!!!');
// console.log(objMatch);
newObj.total = (result.total / objMatch.total) * 100;
newObj.partial = result.total;
newObj.denominator = objMatch.total
// console.log('TAMANHOS');
// console.log(queryTotal.length);
// console.log(queryPartial.length);
// console.log(match.length);
liquidEnrollmentRatioApp.get('/', rqf.parse(),(req, res, next) => {
req.numerator = {};
req.denominator = {};
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 AND matricula.etapas_mod_ensino_segmento_id = 1)'
return '(matricula.faixa_etaria_31_03 = 2 AND matricula.etapas_mod_ensino_segmento_id = 2)'
return '(matricula.faixa_etaria_31_03 = 3 AND matricula.etapas_mod_ensino_segmento_id = 4)'
return '(matricula.faixa_etaria_31_03 = 4 AND matricula.etapas_mod_ensino_segmento_id = 5)'
return '(matricula.faixa_etaria_31_03 = 5 AND matricula.etapas_mod_ensino_segmento_id = 6)'
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]);
delete req.filter.education_level_basic;
req.sql.where(string_query_enrollment);
req.sql.field('matricula.faixa_etaria_31_03', 'age_range')
req.sql.group('matricula.faixa_etaria_31_03', 'age_range');
} else if ( "education_level_basic" in req.dims ) {
req.sql.field('matricula.faixa_etaria_31_03', 'age_range')
req.sql.where('(matricula.etapas_mod_ensino_segmento_id = 1 AND matricula.faixa_etaria_31_03 = 1) OR (matricula.etapas_mod_ensino_segmento_id = 2 AND matricula.faixa_etaria_31_03 = 2) OR (matricula.etapas_mod_ensino_segmento_id = 4 AND matricula.faixa_etaria_31_03 = 3) OR (matricula.etapas_mod_ensino_segmento_id = 5 AND matricula.faixa_etaria_31_03 = 4) OR (matricula.etapas_mod_ensino_segmento_id = 6 AND matricula.faixa_etaria_31_03 = 5)');
req.sql.group('matricula.faixa_etaria_31_03', 'age_range');
} 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();
.field('pnad.ano_censo','year')
.from('pnad')
.group('pnad.ano_censo')
.order('pnad.ano_censo')
function convertPnad(result) {
if (result == 1) {
//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);
req.sql.field('pnad.faixa_etaria_31_03', 'age_range')
req.sql.group('pnad.faixa_etaria_31_03', 'age_range');
} else if ( "education_level_basic" in req.dims ) {
req.sql.field('pnad.faixa_etaria_31_03','age_range')
req.sql.where('pnad.faixa_etaria_31_03 = 1 OR pnad.faixa_etaria_31_03 = 2 OR pnad.faixa_etaria_31_03 = 3 OR pnad.faixa_etaria_31_03 = 4 OR pnad.faixa_etaria_31_03 = 5')
req.sql.group('pnad.faixa_etaria_31_03', 'age_range');
} else {
res.status(400);
next({
status: 400,
message: 'Wrong/No filter specified'
});
}
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;
}, rqf.build(), query, id2str.transform(), (req, res, next) => {
//division to generate req.result final
req.result = []
let liquidEnrollment = matchQueries(req.denominator, req.numerator);
req.result = liquidEnrollment;