From 71db7dcc88edf9dc283f07ba50ea22ad0d07d7fc Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Jo=C3=A3o=20Victor=20Tozatti=20Risso?= <jvtr12@inf.ufpr.br>
Date: Mon, 7 Nov 2016 16:57:57 -0200
Subject: [PATCH] Add ordering to educational route queries in location module
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

Signed-off-by: João Victor Tozatti Risso <jvtr12@inf.ufpr.br>
---
 src/libs/routes/location.js | 167 +++++++++++++++++++++++++++++++++---
 1 file changed, 153 insertions(+), 14 deletions(-)

diff --git a/src/libs/routes/location.js b/src/libs/routes/location.js
index 3db23d54..68ca03be 100644
--- a/src/libs/routes/location.js
+++ b/src/libs/routes/location.js
@@ -34,6 +34,79 @@ function locationIdToStr(locationId) {
     return locationStr;
 }
 
+function schoolYearIdToStr(schoolYearId)
+{
+    let schoolYearStr;
+    switch(schoolYearId) {
+        case 11:
+            schoolYearStr = 'Creche';
+            break;
+        case 21:
+            schoolYearStr = 'Pré-escola';
+            break;
+        case 31:
+            schoolYearStr = 'EF-AI 1 Ano';
+            break;
+        case 32:
+            schoolYearStr = 'EF-AI 2 Ano - 1 Serie';
+            break;
+        case 33:
+            schoolYearStr = 'EF-AI 3 Ano - 2 Serie';
+            break;
+        case 34:
+            schoolYearStr = 'EF-AI 4 Ano - 3 Serie';
+            break;
+        case 35:
+            schoolYearStr = 'EF-AI 5 Ano - 4 Serie';
+            break;
+        case 41:
+            schoolYearStr = 'EF-AF 6 Ano - 5 Serie';
+            break;
+        case 42:
+            schoolYearStr = 'EF-AF 7 Ano - 6 Serie';
+            break;
+        case 43:
+            schoolYearStr = 'EF-AF 8 Ano - 7 Serie';
+            break;
+        case 44:
+            schoolYearStr = 'EF-AF 9 Ano - 8 Serie';
+            break;
+        case 51:
+            schoolYearStr = 'EM 1 Série';
+            break;
+        case 52:
+            schoolYearStr = 'EM 2 Série';
+            break;
+        case 53:
+            schoolYearStr = 'EM 3 Série';
+            break;
+        case 54:
+            schoolYearStr = 'EM 4 Série';
+            break;
+        case 61:
+            schoolYearStr = 'EJA AI';
+            break;
+        case 62:
+            schoolYearStr = 'EJA AF';
+            break;
+        case 63:
+            schoolYearStr = 'EJA EM';
+            break;
+        case 64:
+            schoolYearStr = 'EJA semi-presencial';
+            break;
+        case 71:
+            schoolYearStr = 'EP';
+            break;
+        case 81:
+            schoolYearStr = 'Atividades complementares e AEE';
+            break;
+        default:
+            schoolYearStr = 'Não classificado';
+    }
+    return schoolYearStr;
+}
+
 function processResultSet(querySet, querySetLabels = ["result"], singleResult = false) {
     const resultMap = new Map();
     let resultIdx = 0;
@@ -490,7 +563,8 @@ locationApp.get('/educational', (req, res, next) => {
         .where(`escola.ano_censo IN (${censusYearQry})`)
         .where('escola.id_tipo_turma = 0')
         .group('escola.tipo_localizacao')
-        .group('escola.ano_censo');
+        .group('escola.ano_censo')
+        .order('escola.tipo_localizacao');
 
     const schoolClassYearQry = squel.select()
         .field('MAX(turma.ano_censo)')
@@ -517,7 +591,8 @@ locationApp.get('/educational', (req, res, next) => {
         .where('turma.fk_tipo_turma_id <= 3')
         .where(`turma.ano_censo IN (${schoolClassYearQry})`)
         .group('turma.ano_censo')
-        .group('dependencia_adm.nome');
+        .group('dependencia_adm.nome')
+        .order('dependencia_adm.nome');
 
     const enrollmentsPerSchoolLevelQry = squel.select()
         .field('\'Brasil\'', 'name')
@@ -576,7 +651,8 @@ locationApp.get('/educational/region/:id', (req, res, next) => {
         .where(`escola.ano_censo IN (${censusYearQry})`)
         .where('escola.id_tipo_turma = 0')
         .group('regiao.nome')
-        .group('escola.ano_censo');
+        .group('escola.ano_censo')
+        .order('regiao.nome');
 
     const schoolsPerLocationQry = squel.select()
         .field('regiao.nome', 'name')
@@ -593,7 +669,9 @@ locationApp.get('/educational/region/:id', (req, res, next) => {
         .where('escola.id_tipo_turma = 0')
         .group('regiao.nome')
         .group('escola.tipo_localizacao')
-        .group('escola.ano_censo');
+        .group('escola.ano_censo')
+        .order('regiao.nome')
+        .order('escola.tipo_localizacao');
 
     const schoolClassYearQry = squel.select()
         .field('MAX(turma.ano_censo)')
@@ -611,7 +689,8 @@ locationApp.get('/educational/region/:id', (req, res, next) => {
         .where(`turma.ano_censo IN (${schoolClassYearQry})`)
         .where('turma.fk_tipo_turma_id <= 3')
         .group('turma.ano_censo')
-        .group('regiao.nome');
+        .group('regiao.nome')
+        .order('regiao.nome');
 
     const enrollmentsPerAdmDepQry = squel.select()
         .field('regiao.nome', 'name')
@@ -628,7 +707,9 @@ locationApp.get('/educational/region/:id', (req, res, next) => {
         .where(`turma.ano_censo IN (${schoolClassYearQry})`)
         .group('turma.ano_censo')
         .group('dependencia_adm.nome')
-        .group('regiao.nome');
+        .group('regiao.nome')
+        .order('regiao.nome')
+        .order('dependencia_adm.nome');
 
     const enrollmentsPerSchoolLevelQry = squel.select()
         .field('regiao.nome', 'name')
@@ -690,7 +771,8 @@ locationApp.get('/educational/state/:id', (req, res, next) => {
         .where(`escola.ano_censo IN (${censusYearQry})`)
         .where('escola.id_tipo_turma = 0')
         .group('estado.nome')
-        .group('escola.ano_censo');
+        .group('escola.ano_censo')
+        .order('estado.nome');
 
     const schoolsPerLocationQry = squel.select()
         .field('estado.nome', 'name')
@@ -705,7 +787,9 @@ locationApp.get('/educational/state/:id', (req, res, next) => {
         .where('escola.id_tipo_turma = 0')
         .group('estado.nome')
         .group('escola.tipo_localizacao')
-        .group('escola.ano_censo');
+        .group('escola.ano_censo')
+        .order('estado.nome')
+        .order('escola.tipo_localizacao');
 
     const schoolClassYearQry = squel.select()
         .field('MAX(turma.ano_censo)')
@@ -723,7 +807,8 @@ locationApp.get('/educational/state/:id', (req, res, next) => {
         .where(`turma.ano_censo IN (${schoolClassYearQry})`)
         .where('turma.fk_tipo_turma_id <= 3')
         .group('turma.ano_censo')
-        .group('estado.nome');
+        .group('estado.nome')
+        .order('estado.nome');
 
     const enrollmentsPerAdmDepQry = squel.select()
         .field('estado.nome', 'name')
@@ -740,7 +825,9 @@ locationApp.get('/educational/state/:id', (req, res, next) => {
         .where(`turma.ano_censo IN (${schoolClassYearQry})`)
         .group('turma.ano_censo')
         .group('dependencia_adm.nome')
-        .group('estado.nome');
+        .group('estado.nome')
+        .order('estado.nome')
+        .order('dependencia_adm.nome');
 
     const enrollmentsPerSchoolLevelQry = squel.select()
         .field('estado.nome', 'name')
@@ -802,7 +889,8 @@ locationApp.get('/educational/city/:id', (req, res, next) => {
         .where(`escola.ano_censo IN (${censusYearQry})`)
         .where('escola.id_tipo_turma = 0')
         .group('municipio.nome')
-        .group('escola.ano_censo');
+        .group('escola.ano_censo')
+        .order('municipio.nome');
 
     const schoolsPerLocationQry = squel.select()
         .field('municipio.nome', 'name')
@@ -817,7 +905,9 @@ locationApp.get('/educational/city/:id', (req, res, next) => {
         .where('escola.id_tipo_turma = 0')
         .group('municipio.nome')
         .group('escola.tipo_localizacao')
-        .group('escola.ano_censo');
+        .group('escola.ano_censo')
+        .order('municipio.nome')
+        .order('escola.tipo_localizacao');
 
     const schoolClassYearQry = squel.select()
         .field('MAX(turma.ano_censo)')
@@ -835,7 +925,8 @@ locationApp.get('/educational/city/:id', (req, res, next) => {
         .where(`turma.ano_censo IN (${schoolClassYearQry})`)
         .where('turma.fk_tipo_turma_id <= 3')
         .group('turma.ano_censo')
-        .group('municipio.nome');
+        .group('municipio.nome')
+        .order('municipio.nome');
 
     const enrollmentsPerAdmDepQry = squel.select()
         .field('municipio.nome', 'name')
@@ -852,7 +943,9 @@ locationApp.get('/educational/city/:id', (req, res, next) => {
         .where(`turma.ano_censo IN (${schoolClassYearQry})`)
         .group('turma.ano_censo')
         .group('dependencia_adm.nome')
-        .group('municipio.nome');
+        .group('municipio.nome')
+        .order('municipio.nome')
+        .order('dependencia_adm.nome');
 
     const enrollmentsPerSchoolLevelQry = squel.select()
         .field('municipio.nome', 'name')
@@ -894,4 +987,50 @@ locationApp.get('/educational/city/:id', (req, res, next) => {
     });
 }, response('location'));
 
+/* TODO: fix response format to nest objects by year
+locationApp.get('/educational/per_year', (req, res, next) => {
+    const enrollmentsPerSchoolLevelQry = squel.select()
+        .field('COALESCE(SUM(turma.num_matriculas), 0)', 'total')
+        .field('turma.ano_censo', 'census_year')
+        .field('turma.serie_ano', 'school_year')
+        .field('etapa_ensino.desc_etapa', 'school_level')
+        .from('turma')
+        .from('etapa_ensino')
+        .where('turma.fk_etapa_ensino_id = etapa_ensino.pk_etapa_ensino_id')
+        .where('turma.fk_tipo_turma_id <= 3')
+        .group('etapa_ensino.desc_etapa')
+        .group('turma.serie_ano')
+        .group('turma.ano_censo')
+        .order('etapa_ensino.desc_etapa')
+        .order('turma.serie_ano')
+        .order('turma.ano_censo');
+
+    const queryLabels = [ "enrollment_per_school_level" ];
+    const querySet = [ enrollmentsPerSchoolLevelQry ];
+    // wait until all queries finish or one of them fail
+    Promise.all(dbExecAll(querySet)).then((queryResults) => {
+        const result = queryResults[0];
+        let response = {};
+        for(let i = 0; i < result.length; ++i) {
+            log.debug(result[i]);
+            const school_year  = schoolYearIdToStr(result[i].school_year);
+            const school_level = result[i].school_level;
+            const census_year = result[i].census_year;
+            if (typeof response[school_level] === "undefined") {
+                response[school_level] = {};
+            }
+            if (typeof response[school_level][school_year] === "undefined") {
+                response[school_level][school_year] = {};
+            }
+            response[school_level][school_year] = parseInt(result[i].total, 10);
+        }
+        req.result = response;
+        next();
+    }).catch((error) => {
+        log.error(`[SQL query error] ${error}`);
+        next(error);
+    });
+}, response('location'));
+*/
+
 module.exports = locationApp;
-- 
GitLab