Skip to content
Snippets Groups Projects

Release v1.7.0

1 file
+ 23
0
Compare changes
  • Side-by-side
  • Inline
+ 110
57
@@ -298,27 +298,39 @@ classCountApp.get('/source', (req, res, next) => {
next();
}, query, response('source'));
function mediaCalc(response) {
let obj = [];
response.forEach((result) => {
// 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) {
const firstYear = result[0].year;
var obj = result.filter(res => res.year == firstYear);
var prevFirstDimId = obj[0];
obj.forEach((d) => {
if((d["education_level_mod_id"] > prevFirstDimId["education_level_mod_id"]) && (prevFirstDimId["education_level_mod_id"] != 10) &&
(d["education_level_mod_id"] != prevFirstDimId["education_level_mod_id"] + 1)) {
let newObj = {};
let keys = Object.keys(result);
keys.forEach((key) => {
if(key !== "total_classes" && key !== "total_enrollment")
newObj[key] = result[key]
})
newObj.total = result.total_enrollment / result.total_classes;
obj.push(newObj);
Object.keys(prevFirstDimId).forEach((key) => {
newObj[key] = prevFirstDimId[key];
});
newObj.education_level_mod_id = d["education_level_mod_id"] - 1;
newObj.education_level_mod_name = id2str.educationLevelMod(d["education_level_mod_id"] - 1);
newObj.average = 0.0;
result.splice(result.indexOf(prevFirstDimId) + 1, 0, newObj);
}
prevFirstDimId = d;
});
return(obj);
}
// LDE
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')
@@ -332,75 +344,116 @@ 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, o indicador possuirá uma linha de total
if((req.dims) && (req.dims.size == 1)) {
req.partial = req.result;
// A linha de total deverá conter o valor total do ano que está no banco de dados, então usa o mesmo filtro de anos da consulta anterior
let yearFilter = {};
if("min_year" in req.filter)
yearFilter.min_year = req.filter.min_year;
if("max_year" in req.filter)
yearFilter.max_year = req.filter.max_year;
// Faz a consulta sem dimensões, do total do(s) ano(s) escolhido(s)
req.resetSql();
req.dims = {};
req.filter = {};
req.sql.field('COUNT(turma.id)', 'total_classes')
.field('SUM(turma.num_matricula)', 'total_enrollment')
.field("'Brasil'", 'name')
req.filter = yearFilter;
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')
.where('turma.tipo_turma_id = 0 AND turma.etapas_mod_ensino_segmento_id >= 1 AND turma.etapas_mod_ensino_segmento_id <= 10');
}
next();
}, query, addMissing(rqf), id2str.transform(), (req, res, next) => {
const classCount = mediaCalc(req.partial);
const yearClassCount = mediaCalc(req.result);
req.result = classCount;
}, rqf.build(), query, addMissing(rqf), id2str.transform(), (req, res, next) => {
// Se tem apenas uma dimensão
if(req.partial.length > 0) {
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) => {
let obj = {};
obj = result;
obj.label = "total_year_media";
obj.education_level_mod_name = "Total";
req.result.push(obj);
})
}
// Caso tenha mais de uma dimensão, retorna a consulta só pelas dimensões, sem linha de total
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')
.where('turma.tipo_turma_id = 0 AND turma.dependencia_adm_id <= 3 AND ((turma.etapa_resumida >= 1 AND turma.etapa_resumida <= 7) OR turma.etapa_resumida = 99)');
next();
}, query, id2str.transform(), (req, res, next) => {
}, rqf.build(), query, id2str.transform(), (req, res, next) => {
req.partial = [];
if(Object.keys(req.dims).length > 0 || Object.keys(req.filter).length > 0) {
if((req.dims) && (req.dims.size == 1)) {
req.partial = req.result;
// Se a consulta anterior selecionou dimensão:
// Considera apenas os anos escolhidos na consulta anterior para contar o número total de alunos
let yearFilter = {};
if("min_year" in req.filter)
yearFilter.min_year = req.filter.min_year;
if("max_year" in req.filter)
yearFilter.max_year = req.filter.max_year;
req.resetSql();
req.dims = {};
req.filter = {};
req.sql.field('COUNT(turma.id)', 'total_classes')
.field('SUM(turma.num_matricula)', 'total_enrollment')
.field("'Brasil'", 'name')
req.filter = yearFilter;
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')
.where('turma.tipo_turma_id = 0 AND turma.dependencia_adm_id <= 3 AND ((turma.etapa_resumida >= 1 AND turma.etapa_resumida <= 7) OR turma.etapa_resumida = 99)');
}
next();
}, 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) {
const classCount = mediaCalc(req.partial);
const yearClassCount = mediaCalc(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
yearClassCount.forEach((result) => {
let obj = {};
obj = result;
obj.label = "total_year_media";
obj.label = "total_year_average";
req.result.push(obj);
})
}
else {
const classCount = mediaCalc(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'));
Loading