Skip to content
Snippets Groups Projects
Commit c093afde authored by Glenda Train's avatar Glenda Train
Browse files

classCount: add median, stddev, firstQt and thirdQt

parent a7543538
No related branches found
No related tags found
2 merge requests!155Release v1.7.0,!154classCount: add median, stddev, firstQt and thirdQt
Pipeline #17497 failed
......@@ -298,21 +298,6 @@ classCountApp.get('/source', (req, res, next) => {
next();
}, query, response('source'));
function averageCalc(response) {
let obj = [];
response.forEach((result) => {
let newObj = {};
let keys = Object.keys(result);
keys.forEach((key) => {
if(key !== "total_classes" && key !== "total_enrollment")
newObj[key] = result[key]
})
newObj.average = result.total_enrollment / result.total_classes;
obj.push(newObj);
});
return(obj);
}
// Se a dimensão obrigatória do LDE (etapa de ensino) possui alguma etapa sem nenhum valor, então é criado um objeto
// com média 0.0 e é inserido no resultado. Usada para não quebrar a sequência de etapas na tabela do LDE.
function addNullFields(result) {
......@@ -339,10 +324,13 @@ function addNullFields(result) {
classCountApp.get('/', rqf.parse(), rqf.build(), (req, res, next) => {
// Faz a consulta do número de alunos pelas dimensões
if(("education_level_mod" in req.dims) || ("education_level_mod" in req.filter)) {
req.sql.field('COUNT(turma.id)', 'total_classes')
.field('SUM(turma.num_matricula)', 'total_enrollment')
.field("'Brasil'", 'name')
req.sql.field("'Brasil'", 'name')
.field('turma.ano_censo', 'year')
.field('AVG(turma.num_matricula)', 'average')
.field('MEDIAN(turma.num_matricula)', 'median')
.field('STDDEV_POP(turma.num_matricula)', 'stddev')
.field('QUANTILE(turma.num_matricula, 0.25)', 'first_qt')
.field('QUANTILE(turma.num_matricula, 0.75)', 'third_qt')
.from('turma')
.group('turma.ano_censo')
.order('turma.ano_censo')
......@@ -358,7 +346,7 @@ classCountApp.get('/', rqf.parse(), rqf.build(), (req, res, next) => {
}, rqf.build(), query, id2str.transform(), (req, res, next) => {
req.partial = [];
// Caso tenha apenas uma dimensão, a indicador possuirá uma linha de total
// Caso tenha apenas uma dimensão, o indicador possuirá uma linha de total
if((req.dims) && (req.dims.size == 1)) {
req.partial = req.result;
......@@ -373,10 +361,13 @@ classCountApp.get('/', rqf.parse(), rqf.build(), (req, res, next) => {
req.resetSql();
req.dims = {};
req.filter = yearFilter;
req.sql.field('COUNT(turma.id)', 'total_classes')
.field('SUM(turma.num_matricula)', 'total_enrollment')
.field("'Brasil'", 'name')
req.sql.field("'Brasil'", 'name')
.field('turma.ano_censo', 'year')
.field('AVG(turma.num_matricula)', 'average')
.field('MEDIAN(turma.num_matricula)', 'median')
.field('STDDEV_POP(turma.num_matricula)', 'stddev')
.field('QUANTILE(turma.num_matricula, 0.25)', 'first_qt')
.field('QUANTILE(turma.num_matricula, 0.75)', 'third_qt')
.from('turma')
.group('turma.ano_censo')
.order('turma.ano_censo')
......@@ -384,10 +375,10 @@ classCountApp.get('/', rqf.parse(), rqf.build(), (req, res, next) => {
}
next();
}, rqf.build(), query, addMissing(rqf), id2str.transform(), (req, res, next) => {
// Se tem apenas uma dimensão
if(req.partial.length > 0) {
const classCount = averageCalc(req.partial);
const yearClassCount = averageCalc(req.result);
req.result = classCount;
const yearClassCount = req.result;
req.result = req.partial;
// Como a linha de total deve aparecer em um caso específico, ela é adicionada junto com a dimensão obrigatória
yearClassCount.forEach((result) => {
......@@ -398,20 +389,21 @@ classCountApp.get('/', rqf.parse(), rqf.build(), (req, res, next) => {
})
}
// Caso tenha mais de uma dimensão, retorna a consulta só pelas dimensões, sem linha de total
else {
const classCount = averageCalc(req.result);
req.result = classCount;
else
addNullFields(req.result);
}
next();
}, response('class_count'));
// SimCAQ
classCountApp.get('/count', rqf.parse(), rqf.build(), (req, res, next) => {
req.sql.field('COUNT(turma.id)', 'total_classes')
.field('SUM(turma.num_matricula)', 'total_enrollment')
.field("'Brasil'", 'name')
req.sql.field("'Brasil'", 'name')
.field('turma.ano_censo', 'year')
.field('AVG(turma.num_matricula)', 'average')
.field('MEDIAN(turma.num_matricula)', 'median')
.field('STDDEV_POP(turma.num_matricula)', 'stddev')
.field('QUANTILE(turma.num_matricula, 0.25)', 'first_qt')
.field('QUANTILE(turma.num_matricula, 0.75)', 'third_qt')
.from('turma')
.group('turma.ano_censo')
.order('turma.ano_censo')
......@@ -433,10 +425,13 @@ classCountApp.get('/count', rqf.parse(), rqf.build(), (req, res, next) => {
req.resetSql();
req.dims = {};
req.filter = yearFilter;
req.sql.field('COUNT(turma.id)', 'total_classes')
.field('SUM(turma.num_matricula)', 'total_enrollment')
.field("'Brasil'", 'name')
req.sql.field("'Brasil'", 'name')
.field('turma.ano_censo', 'year')
.field('AVG(turma.num_matricula)', 'average')
.field('MEDIAN(turma.num_matricula)', 'median')
.field('STDDEV_POP(turma.num_matricula)', 'stddev')
.field('QUANTILE(turma.num_matricula, 0.25)', 'first_qt')
.field('QUANTILE(turma.num_matricula, 0.75)', 'third_qt')
.from('turma')
.group('turma.ano_censo')
.order('turma.ano_censo')
......@@ -444,10 +439,10 @@ classCountApp.get('/count', rqf.parse(), rqf.build(), (req, res, next) => {
}
next();
}, rqf.build(), query, addMissing(rqf), id2str.transform(), (req, res, next) => {
// Se possui apenas uma dimensão
if(req.partial.length > 0) {
const classCount = averageCalc(req.partial);
const yearClassCount = averageCalc(req.result);
req.result = classCount;
const yearClassCount = req.result;
req.result = req.partial;
// Adiciona os totais por anos ao fim da consulta
// Como esse tipo de total é específico desse indicador, um label foi adicionado para indicar
......@@ -458,10 +453,7 @@ classCountApp.get('/count', rqf.parse(), rqf.build(), (req, res, next) => {
req.result.push(obj);
})
}
else {
const classCount = averageCalc(req.result);
req.result = classCount;
}
// Caso tenha mais de uma dimensão, retorna a consulta só pelas dimensões, sem linha de total (req.result)
next();
}, response('class_count'));
......
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