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
Branches
Tags
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) => { ...@@ -298,21 +298,6 @@ classCountApp.get('/source', (req, res, next) => {
next(); next();
}, query, response('source')); }, 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 // 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. // 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) { function addNullFields(result) {
...@@ -339,10 +324,13 @@ function addNullFields(result) { ...@@ -339,10 +324,13 @@ function addNullFields(result) {
classCountApp.get('/', rqf.parse(), rqf.build(), (req, res, next) => { classCountApp.get('/', rqf.parse(), rqf.build(), (req, res, next) => {
// Faz a consulta do número de alunos pelas dimensões // Faz a consulta do número de alunos pelas dimensões
if(("education_level_mod" in req.dims) || ("education_level_mod" in req.filter)) { if(("education_level_mod" in req.dims) || ("education_level_mod" in req.filter)) {
req.sql.field('COUNT(turma.id)', 'total_classes') req.sql.field("'Brasil'", 'name')
.field('SUM(turma.num_matricula)', 'total_enrollment')
.field("'Brasil'", 'name')
.field('turma.ano_censo', 'year') .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') .from('turma')
.group('turma.ano_censo') .group('turma.ano_censo')
.order('turma.ano_censo') .order('turma.ano_censo')
...@@ -358,7 +346,7 @@ classCountApp.get('/', rqf.parse(), rqf.build(), (req, res, next) => { ...@@ -358,7 +346,7 @@ classCountApp.get('/', rqf.parse(), rqf.build(), (req, res, next) => {
}, rqf.build(), query, id2str.transform(), (req, res, next) => { }, rqf.build(), query, id2str.transform(), (req, res, next) => {
req.partial = []; 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)) { if((req.dims) && (req.dims.size == 1)) {
req.partial = req.result; req.partial = req.result;
...@@ -373,10 +361,13 @@ classCountApp.get('/', rqf.parse(), rqf.build(), (req, res, next) => { ...@@ -373,10 +361,13 @@ classCountApp.get('/', rqf.parse(), rqf.build(), (req, res, next) => {
req.resetSql(); req.resetSql();
req.dims = {}; req.dims = {};
req.filter = yearFilter; req.filter = yearFilter;
req.sql.field('COUNT(turma.id)', 'total_classes') req.sql.field("'Brasil'", 'name')
.field('SUM(turma.num_matricula)', 'total_enrollment')
.field("'Brasil'", 'name')
.field('turma.ano_censo', 'year') .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') .from('turma')
.group('turma.ano_censo') .group('turma.ano_censo')
.order('turma.ano_censo') .order('turma.ano_censo')
...@@ -384,10 +375,10 @@ classCountApp.get('/', rqf.parse(), rqf.build(), (req, res, next) => { ...@@ -384,10 +375,10 @@ classCountApp.get('/', rqf.parse(), rqf.build(), (req, res, next) => {
} }
next(); next();
}, rqf.build(), query, addMissing(rqf), id2str.transform(), (req, res, next) => { }, rqf.build(), query, addMissing(rqf), id2str.transform(), (req, res, next) => {
// Se tem apenas uma dimensão
if(req.partial.length > 0) { if(req.partial.length > 0) {
const classCount = averageCalc(req.partial); const yearClassCount = req.result;
const yearClassCount = averageCalc(req.result); req.result = req.partial;
req.result = classCount;
// Como a linha de total deve aparecer em um caso específico, ela é adicionada junto com a dimensão obrigatória // Como a linha de total deve aparecer em um caso específico, ela é adicionada junto com a dimensão obrigatória
yearClassCount.forEach((result) => { yearClassCount.forEach((result) => {
...@@ -398,20 +389,21 @@ classCountApp.get('/', rqf.parse(), rqf.build(), (req, res, next) => { ...@@ -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 // Caso tenha mais de uma dimensão, retorna a consulta só pelas dimensões, sem linha de total
else { else
const classCount = averageCalc(req.result);
req.result = classCount;
addNullFields(req.result); addNullFields(req.result);
}
next(); next();
}, response('class_count')); }, response('class_count'));
// SimCAQ // SimCAQ
classCountApp.get('/count', rqf.parse(), rqf.build(), (req, res, next) => { classCountApp.get('/count', rqf.parse(), rqf.build(), (req, res, next) => {
req.sql.field('COUNT(turma.id)', 'total_classes') req.sql.field("'Brasil'", 'name')
.field('SUM(turma.num_matricula)', 'total_enrollment')
.field("'Brasil'", 'name')
.field('turma.ano_censo', 'year') .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') .from('turma')
.group('turma.ano_censo') .group('turma.ano_censo')
.order('turma.ano_censo') .order('turma.ano_censo')
...@@ -433,10 +425,13 @@ classCountApp.get('/count', rqf.parse(), rqf.build(), (req, res, next) => { ...@@ -433,10 +425,13 @@ classCountApp.get('/count', rqf.parse(), rqf.build(), (req, res, next) => {
req.resetSql(); req.resetSql();
req.dims = {}; req.dims = {};
req.filter = yearFilter; req.filter = yearFilter;
req.sql.field('COUNT(turma.id)', 'total_classes') req.sql.field("'Brasil'", 'name')
.field('SUM(turma.num_matricula)', 'total_enrollment')
.field("'Brasil'", 'name')
.field('turma.ano_censo', 'year') .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') .from('turma')
.group('turma.ano_censo') .group('turma.ano_censo')
.order('turma.ano_censo') .order('turma.ano_censo')
...@@ -444,10 +439,10 @@ classCountApp.get('/count', rqf.parse(), rqf.build(), (req, res, next) => { ...@@ -444,10 +439,10 @@ classCountApp.get('/count', rqf.parse(), rqf.build(), (req, res, next) => {
} }
next(); next();
}, rqf.build(), query, addMissing(rqf), id2str.transform(), (req, res, next) => { }, rqf.build(), query, addMissing(rqf), id2str.transform(), (req, res, next) => {
// Se possui apenas uma dimensão
if(req.partial.length > 0) { if(req.partial.length > 0) {
const classCount = averageCalc(req.partial); const yearClassCount = req.result;
const yearClassCount = averageCalc(req.result); req.result = req.partial;
req.result = classCount;
// Adiciona os totais por anos ao fim da consulta // Adiciona os totais por anos ao fim da consulta
// Como esse tipo de total é específico desse indicador, um label foi adicionado para indicar // 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) => { ...@@ -458,10 +453,7 @@ classCountApp.get('/count', rqf.parse(), rqf.build(), (req, res, next) => {
req.result.push(obj); req.result.push(obj);
}) })
} }
else { // Caso tenha mais de uma dimensão, retorna a consulta só pelas dimensões, sem linha de total (req.result)
const classCount = averageCalc(req.result);
req.result = classCount;
}
next(); next();
}, response('class_count')); }, response('class_count'));
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment