From 22a79ace72d9d3499797769fb1b2a870326ddbed Mon Sep 17 00:00:00 2001 From: Vytor Calixto <vytorcalixto@gmail.com> Date: Mon, 12 Sep 2016 10:53:24 -0300 Subject: [PATCH] Update enrollments routes. Using squel now. All routes now use squel and the sql, query, response chain --- src/libs/routes/enrollment.js | 238 +++++++++++----------------------- 1 file changed, 75 insertions(+), 163 deletions(-) diff --git a/src/libs/routes/enrollment.js b/src/libs/routes/enrollment.js index a9feb711..facc6c9a 100644 --- a/src/libs/routes/enrollment.js +++ b/src/libs/routes/enrollment.js @@ -12,7 +12,24 @@ const query = require(`${libs}/middlewares/query`); const response = require(`${libs}/middlewares/response`); -const dbQuery = require('../db/query_exec'); +// **Temporary** solution to add where clauses that are common to all requests +function filter(req, q) { + if (typeof req.census_year !== 'undefined') { + q.where('ano_censo=?', req.census_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); + } + + if (typeof req.education_level_id !== 'undefined') { + q.where('fk_etapa_ensino_id=?', req.education_level_id); + } +} /** * Complete range of the enrollments dataset @@ -20,12 +37,26 @@ const dbQuery = require('../db/query_exec'); * Returns a tuple of start and ending years of the complete enrollments dataset. */ enrollmentApp.get('/year_range', (req, res, next) => { - req.sql = squel.select().from('turmas').field('MIN(turmas.ano_censo)', 'start_year').field('MAX(turmas.ano_censo)', 'end_year').toParam(); + req.sql = squel.select() + .from('turmas') + .field('MIN(turmas.ano_censo)', 'start_year') + .field('MAX(turmas.ano_censo)', 'end_year') + .toParam(); + next(); }, query, response('range')); +/** + * Returns all educational levels avaible + * + */ enrollmentApp.get('/education_level', (req, res, next) => { - req.sql = squel.select().from('etapa_ensino').field('pk_etapa_ensino_id', 'id').field('desc_etapa', 'name').toParam(); + req.sql = squel.select() + .from('etapa_ensino') + .field('pk_etapa_ensino_id', 'id') + .field('desc_etapa', 'name') + .toParam(); + next(); }, query, response('education_level')); @@ -70,45 +101,14 @@ enrollmentApp.use('/', (req, res, next) => { const params = req.query; if (typeof params.aggregate !== 'undefined' && params.aggregate === 'region') { log.debug('Using enrollments query for regions'); - req.sqlQuery = 'SELECT r.nome AS name, COALESCE(SUM(t.num_matriculas), 0) AS total ' - + 'FROM regioes AS r ' - + 'INNER JOIN estados AS e ON r.pk_regiao_id = e.fk_regiao_id ' - + 'INNER JOIN municipios AS m ON e.pk_estado_id = m.fk_estado_id ' - + 'LEFT OUTER JOIN turmas AS t ON ( ' - + 'm.pk_municipio_id = t.fk_municipio_id '; - req.sqlQueryParams = []; - - if (typeof req.census_year !== 'undefined') { - req.sqlQuery += ' AND '; - req.sqlQuery += 't.ano_censo = ?'; - req.sqlQueryParams.push(req.census_year); - } - - if (typeof req.adm_dependency_id !== 'undefined') { - req.sqlQuery += ' AND '; - req.sqlQuery += 't.fk_dependencia_adm_id = ?'; - req.sqlQueryParams.push(req.adm_dependency_id); - } + const q = squel.select().from('mat_regioes').field('name').field('SUM(total)', 'total'); - if (typeof req.location_id !== 'undefined') { - req.sqlQuery += ' AND '; - req.sqlQuery += 't.id_localizacao = ?'; - req.sqlQueryParams.push(req.location_id); - } - - if (typeof req.education_level_id !== 'undefined') { - req.sqlQuery += ' AND '; - req.sqlQuery += 't.fk_etapa_ensino_id = ?'; - req.sqlQueryParams.push(req.education_level_id); - } + filter(q); - req.sqlQuery += ')'; if (typeof req.id !== 'undefined') { - req.sqlQuery += ' WHERE '; - req.sqlQuery += 'r.pk_regiao_id = ?'; - req.sqlQueryParams.push(req.id); + q.where('pk_regiao_id=?', req.id); } - req.sqlQuery += ' GROUP BY r.nome'; + req.sql = q.group('name').toParam(); } next(); }); @@ -117,46 +117,14 @@ enrollmentApp.use('/', (req, res, next) => { const params = req.query; if (typeof params.aggregate !== 'undefined' && params.aggregate === 'state') { log.debug('Using enrollments query for states'); - req.sqlQuery = 'SELECT e.nome AS name, COALESCE(SUM(t.num_matriculas), 0) as total ' - + 'FROM estados AS e ' - + 'INNER JOIN municipios AS m ON m.fk_estado_id = e.pk_estado_id ' - + 'LEFT OUTER JOIN turmas AS t ON (' - + 'm.pk_municipio_id = t.fk_municipio_id '; - req.sqlQueryParams = []; - - if (typeof req.census_year !== 'undefined') { - req.sqlQuery += ' AND '; - req.sqlQuery += 't.ano_censo = ?'; - req.sqlQueryParams.push(req.census_year); - } + const q = squel.select().from('mat_estados').field('name').field('SUM(total)', 'total'); - if (typeof req.adm_dependency_id !== 'undefined') { - req.sqlQuery += ' AND '; - req.sqlQuery += 't.fk_dependencia_adm_id = ?'; - req.sqlQueryParams.push(req.adm_dependency_id); - } - - if (typeof req.location_id !== 'undefined') { - req.sqlQuery += ' AND '; - req.sqlQuery += 't.id_localizacao = ?'; - req.sqlQueryParams.push(req.location_id); - } - - if (typeof req.education_level_id !== 'undefined') { - req.sqlQuery += ' AND '; - req.sqlQuery += 't.fk_etapa_ensino_id = ?'; - req.sqlQueryParams.push(req.education_level_id); - } - - req.sqlQuery += ')'; + filter(req, q); if (typeof req.id !== 'undefined') { - req.sqlQuery += ' WHERE '; - req.sqlQuery += 'e.pk_estado_id = ?'; - req.sqlQueryParams.push(req.id); + q.where('pk_estado_id=?', req.id); } - - req.sqlQuery += ' GROUP BY e.nome'; + req.sql = q.group('name').toParam(); } next(); }); @@ -165,45 +133,14 @@ enrollmentApp.use('/', (req, res, next) => { const params = req.query; if (typeof params.aggregate !== 'undefined' && params.aggregate === 'city') { log.debug('Using enrollments query for cities'); - req.sqlQuery = 'SELECT m.nome AS name, COALESCE(SUM(t.num_matriculas), 0) as total ' - + 'FROM municipios AS m ' - + 'LEFT OUTER JOIN turmas AS t ON ( ' - + 'm.pk_municipio_id = t.fk_municipio_id'; - req.sqlQueryParams = []; - - if (typeof req.census_year !== 'undefined') { - req.sqlQuery += ' AND '; - req.sqlQuery += 't.ano_censo = ?'; - req.sqlQueryParams.push(req.census_year); - } + const q = squel.select().from('mat_estados').field('name').field('SUM(total)', 'total'); - if (typeof req.adm_dependency_id !== 'undefined') { - req.sqlQuery += ' AND '; - req.sqlQuery += 't.fk_dependencia_adm_id = ?'; - req.sqlQueryParams.push(req.adm_dependency_id); - } - - if (typeof req.location_id !== 'undefined') { - req.sqlQuery += ' AND '; - req.sqlQuery += 't.id_localizacao = ?'; - req.sqlQueryParams.push(req.location_id); - } - - if (typeof req.education_level_id !== 'undefined') { - req.sqlQuery += ' AND '; - req.sqlQuery += 't.fk_etapa_ensino_id = ?'; - req.sqlQueryParams.push(req.education_level_id); - } - - req.sqlQuery += ')'; + filter(req, q); if (typeof req.id !== 'undefined') { - req.sqlQuery += ' WHERE '; - req.sqlQuery += 'm.pk_municipio_id = ?'; - req.sqlQueryParams.push(req.id); + q.where('pk_municipio_id=?', req.id); } - - req.sqlQuery += 'GROUP BY m.nome'; + req.sql = q.group('name').toParam(); } next(); }); @@ -212,67 +149,42 @@ enrollmentApp.use('/', (req, res, next) => { const params = req.query; if (typeof params.aggregate === 'undefined') { log.debug('Using enrollments query for the whole country'); - req.sqlQuery = 'SELECT \'Brasil\' AS name, COALESCE(SUM(t.num_matriculas),0) AS total ' - + 'FROM turmas AS t'; - req.sqlQueryParams = []; + const q = squel.select().from('turmas').field("'Brasil'", 'name') + .field('COALESCE(SUM(num_matriculas),0)', 'total'); - if (req.paramCnt > 0) { - req.sqlQuery += ' WHERE '; - } - - if (typeof req.census_year !== 'undefined') { - req.sqlQuery += 't.ano_censo = ?'; - req.sqlQueryParams.push(req.census_year); - } + filter(req, q); - if (typeof req.adm_dependency_id !== 'undefined') { - if (req.sqlQueryParams.length > 0) { - req.sqlQuery += ' AND '; - } - req.sqlQuery += 't.fk_dependencia_adm_id = ?'; - req.sqlQueryParams.push(req.adm_dependency_id); - } - - if (typeof req.location_id !== 'undefined') { - if (req.sqlQueryParams.length > 0) { - req.sqlQuery += ' AND '; - } - req.sqlQuery += 't.id_localizacao = ?'; - req.sqlQueryParams.push(req.location_id); - } - - if (typeof req.education_level_id !== 'undefined') { - if (req.sqlQueryParams.length > 0) { - req.sqlQuery += ' AND '; - } - req.sqlQuery += 't.fk_etapa_ensino_id = ?'; - req.sqlQueryParams.push(req.education_level_id); - } + req.sql = q.toParam(); } next(); }); 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'); - }); - } -}); + 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'); +// }); +// } +// }); module.exports = enrollmentApp; -- GitLab