Skip to content
Snippets Groups Projects
Commit c6629a57 authored by Vytor Calixto's avatar Vytor Calixto :space_invader:
Browse files

Generic filters and dimensions in enrollments

Related: simcaq/SCRUM#18
parent eb8c333c
No related branches found
No related tags found
1 merge request!18Issue 18
Pipeline #
......@@ -12,28 +12,10 @@ const query = require(`${libs}/middlewares/query`);
const response = require(`${libs}/middlewares/response`);
// **Temporary** solution to add where clauses that are common to all requests
function filter(req, q) {
if (typeof req.min_year !== 'undefined') {
q.where('ano_censo>=?', req.min_year);
}
const parseParams = require(`${libs}/middlewares/parseParams`);
if (typeof req.max_year !== 'undefined') {
q.where('ano_censo<=?', req.max_year);
}
if (typeof req.adm_dependency_id !== 'undefined') {
q.where('fk_dependencia_adm_id=?', req.adm_dependency_id);
}
if (typeof req.location_id !== 'undefined') {
q.where('id_localizacao=?', req.location_id);
}
// **Temporary** solution to add where clauses that are common to all requests
if (typeof req.education_level_id !== 'undefined') {
q.where('fk_etapa_ensino_id=?', req.education_level_id);
}
}
/**
* Complete range of the enrollments dataset
......@@ -45,7 +27,7 @@ enrollmentApp.get('/year_range', (req, res, next) => {
.from('turmas')
.field('MIN(turmas.ano_censo)', 'start_year')
.field('MAX(turmas.ano_censo)', 'end_year')
.toParam();
;
next();
}, query, response('range'));
......@@ -59,7 +41,7 @@ enrollmentApp.get('/education_level', (req, res, next) => {
.from('etapa_ensino')
.field('pk_etapa_ensino_id', 'id')
.field('desc_etapa', 'name')
.toParam();
;
next();
}, query, response('education_level'));
......@@ -73,170 +55,176 @@ enrollmentApp.get('/adm_dependency', (req, res, next) => {
.from('dependencia_adms')
.field('pk_dependencia_adm_id', 'id')
.field('nome', 'name')
.toParam();
;
next();
}, query, response('adm_dependency'));
enrollmentApp.get('/data', (req, res, next) => {
req.sql = squel.select().from('turmas').toParam();
req.sql = squel.select().from('turmas');
next();
}, query, response('data'));
enrollmentApp.use('/', (req, res, next) => {
const params = req.query;
req.paramCnt = 0;
// Parse the filters and dimensions parameter in the query
enrollmentApp.use('/', parseParams('filter', [
'min_year',
'max_year',
'adm_dependency_id',
'location_id',
'education_level_id',
'region',
'state',
'city',
'school'
]), parseParams('dims', [
'adm_dependency_id',
'location_id',
'education_level_id',
'region',
'state',
'city',
'school'
]), (req, res, next) => {
log.debug(req.filter);
log.debug(req.dims);
if (typeof params.id !== 'undefined') {
req.id = parseInt(params.id, 10);
req.paramCnt += 1;
// Do the joins
if(typeof req.filter.adm_dependency_id !== 'undefined'
|| typeof req.dims.adm_dependency_id !== 'undefined') {
req.sql.join('dependencia_adms', null, 'fk_dependencia_adm_id=dependencia_adms.pk_dependencia_adm_id');
}
if (typeof params.location_id !== 'undefined') {
req.location_id = parseInt(params.location_id, 10);
req.paramCnt += 1;
if(typeof req.filter.education_level_id !== 'undefined'
|| typeof req.dims.education_level_id !== 'undefined') {
req.sql.join('etapa_ensino', null, 'fk_etapa_ensino_id=etapa_ensino.pk_etapa_ensino_id');
}
if (typeof params.adm_dependency_id !== 'undefined') {
req.adm_dependency_id = parseInt(params.adm_dependency_id, 10);
req.paramCnt += 1;
if(typeof req.filter.region !== 'undefined'
|| typeof req.dims.region !== 'undefined') {
req.sql.join('municipios', null, 'fk_municipio_id=municipios.pk_municipio_id')
.join('estados', null, 'municipios.fk_estado_id=estados.pk_estado_id')
.join('regioes', null, 'estados.fk_regiao_id=regioes.pk_regiao_id');
}
if (typeof params.min_year !== 'undefined') {
req.min_year = parseInt(params.min_year, 10);
req.paramCnt += 1;
if((typeof req.filter.state !== 'undefined'
|| typeof req.dims.state !== 'undefined')
&& (typeof req.filter.region === 'undefined'
&& typeof req.dims.region === 'undefined')) {
req.sql.join('municipios', null, 'fk_municipio_id=municipios.pk_municipio_id')
.join('estados', null, 'municipios.fk_estado_id=estados.pk_estado_id');
}
if (typeof params.max_year !== 'undefined') {
req.max_year = parseInt(params.max_year, 10);
req.paramCnt += 1;
if((typeof req.filter.city !== 'undefined'
|| typeof req.dims.city !== 'undefined')
&& (typeof req.filter.state === 'undefined'
&& typeof req.dims.state === 'undefined')
&& (typeof req.filter.region === 'undefined'
&& typeof req.dims.region === 'undefined')) {
req.sql.join('municipios', null, 'fk_municipio_id=municipios.pk_municipio_id');
}
if (typeof params.education_level_id !== 'undefined') {
req.education_level_id = parseInt(params.education_level_id, 10);
req.paramCnt += 1;
if(typeof req.dims.school !== 'undefined') {
req.sql.join('escolas', null, 'fk_escola_id=escolas.pk_escola_id');
}
next();
});
// Dimensions (add fields)
enrollmentApp.use('/', (req, res, next) => {
const params = req.query;
if (typeof params.aggregate !== 'undefined' && params.aggregate === 'region') {
log.debug('Using enrollments query for regions');
const q = squel.select().from('mat_regioes')
.field('name')
.field('SUM(total)', 'total')
.field('ano_censo', 'year');
if(typeof req.dims.education_level_id !== 'undefined') {
req.sql.field('desc_etapa', 'education_level')
.group('desc_etapa')
.order('desc_etapa');
}
filter(req, q);
if(typeof req.dims.region !== 'undefined') {
req.sql.field('regioes.nome', 'region_name')
.group('regioes.nome')
.order('regioes.nome');
}
if (typeof req.id !== 'undefined') {
q.where('pk_regiao_id=?', req.id);
}
req.sql = q.group('name').group('ano_censo').order('ano_censo').toParam();
if(typeof req.dims.state !== 'undefined') {
req.sql.field('estados.nome', 'state_name')
.group('estados.nome')
.order('estados.nome');
}
next();
});
enrollmentApp.use('/', (req, res, next) => {
const params = req.query;
if (typeof params.aggregate !== 'undefined' && params.aggregate === 'state') {
log.debug('Using enrollments query for states');
const q = squel.select().from('mat_estados')
.field('name')
.field('SUM(total)', 'total')
.field('ano_censo', 'year');
if(typeof req.dims.city !== 'undefined') {
req.sql.field('municipios.nome', 'city_name')
.group('municipios.nome')
.order('municipios.nome');
}
filter(req, q);
if(typeof req.dims.school !== 'undefined') {
req.sql.field('escolas.nome_entidade', 'school_name')
.group('escolas.nome_entidade')
.order('escolas.nome_entidade');
}
if (typeof req.id !== 'undefined') {
q.where('pk_estado_id=?', req.id);
}
req.sql = q.group('name').group('ano_censo').order('ano_censo').toParam();
if(typeof req.dims.adm_dependency_id !== 'undefined') {
req.sql.field('dependencia_adms.nome', 'adm_dependency_name')
.group('dependencia_adms.nome')
.order('dependencia_adms.nome');
}
next();
});
enrollmentApp.use('/', (req, res, next) => {
const params = req.query;
if (typeof params.aggregate !== 'undefined' && params.aggregate === 'city') {
log.debug('Using enrollments query for cities');
const q = squel.select().from('mat_municipios')
.field('name')
.field('SUM(total)', 'total')
.field('ano_censo', 'year');
if(typeof req.dims.location_id !== 'undefined') {
req.sql.field('turmas.id_localizacao', 'location')
.group('turmas.id_localizacao')
.order('turmas.id_localizacao');
}
filter(req, q);
if(typeof req.dims.region === 'undefined'
&& typeof req.dims.state === 'undefined'
&& typeof req.dims.city === 'undefined') {
req.sql.field("'Brasil'", 'name');
}
if (typeof req.id !== 'undefined') {
q.where('pk_municipio_id=?', req.id);
}
req.sql = q.group('name').group('ano_censo').order('ano_censo').toParam();
// Filter (add where)
if (typeof req.filter.min_year !== 'undefined') {
req.sql.where('turmas.ano_censo>=?', parseInt(req.filter.min_year, 10));
}
next();
});
enrollmentApp.use('/', (req, res, next) => {
const params = req.query;
if (typeof params.aggregate !== 'undefined' && params.aggregate === 'school') {
log.debug('Using enrollments query for schools');
const q = squel.select().from('mat_escolas')
.field('name')
.field('SUM(total)', 'total')
.field('ano_censo', 'year');
if (typeof req.filter.max_year !== 'undefined') {
req.sql.where('turmas.ano_censo<=?', parseInt(req.filter.max_year, 10));
}
filter(req, q);
if (typeof req.filter.adm_dependency_id !== 'undefined') {
req.sql.where('pk_dependencia_adm_id=?', parseInt(req.filter.adm_dependency_id, 10));
}
if (typeof req.id !== 'undefined') {
q.where('pk_escola_id=?', req.id);
}
req.sql = q.group('name').group('ano_censo').order('ano_censo').toParam();
if (typeof req.filter.location_id !== 'undefined') {
req.sql.where('turmas.id_localizacao=?', parseInt(req.filter.location_id, 10));
}
if (typeof req.filter.education_level_id !== 'undefined') {
req.sql.where('pk_etapa_ensino_id=?', parseInt(req.filter.education_level_id, 10));
}
if (typeof req.filter.region !== 'undefined') {
req.sql.where('pk_regiao_id=?', parseInt(req.filter.region, 10));
}
next();
});
enrollmentApp.use('/', (req, res, next) => {
const params = req.query;
if (typeof params.aggregate === 'undefined') {
log.debug('Using enrollments query for the whole country');
const q = squel.select().from('turmas').field("'Brasil'", 'name')
.field('COALESCE(SUM(num_matriculas),0)', 'total')
.field('ano_censo', 'year');
if (typeof req.filter.state !== 'undefined') {
req.sql.where('pk_estado_id=?', parseInt(req.filter.state, 10));
}
filter(req, q);
if (typeof req.filter.city !== 'undefined') {
req.sql.where('turmas.fk_municipio_id=?', parseInt(req.filter.city, 10));
}
req.sql = q.group('ano_censo').order('ano_censo').toParam();
if (typeof req.filter.school !== 'undefined') {
req.sql.where('turmas.fk_escola_id=?', parseInt(req.filter.school, 10));
}
log.debug(req.sql.toParam());
next();
});
enrollmentApp.get('/', (req, res, next) => {
log.debug(`Request parameters: ${req}`);
req.sql.field('COALESCE(SUM(num_matriculas), 0)', 'total')
.field('turmas.ano_censo', 'year')
.from('turmas')
.group('turmas.ano_censo')
.order('turmas.ano_censo');
next();
}, query, response('enrollments'));
// enrollmentApp.get('/', (req, res, next) => {
// log.debug(`Request parameters: ${req}`);
// if (typeof req.sqlQuery === 'undefined') {
// // Should only happen if there is a bug in the chaining of the
// // '/enrollments' route, since when no +aggregate+ parameter is given,
// // it defaults to use the query for the whole country.
// log.error('BUG -- No SQL query was found to be executed!');
// next('Internal error, request could not be satisfied at this moment. Please, '
// + 'try again later');
// } else {
// log.debug('SQL query: ${ req.sqlQuery }?');
// log.debug(req.sqlQuery);
// dbQuery(req.sqlQuery).then((result) => {
// req.result = result;
// return response(req, res);
// }, (error) => {
// log.error(`[${req.originalUrl}] SQL query error: ${error}`);
// next('Internal error, request could not be satisfied at this moment. Please, '
// + 'try again later');
// });
// }
// });
}, query, response('test'));
module.exports = enrollmentApp;
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