Skip to content
Snippets Groups Projects

Release v1.7.0

1 file
+ 34
42
Compare changes
  • Side-by-side
  • Inline
+ 110
57
@@ -298,27 +298,39 @@ classCountApp.get('/source', (req, res, next) => {
@@ -298,27 +298,39 @@ classCountApp.get('/source', (req, res, next) => {
next();
next();
}, query, response('source'));
}, query, response('source'));
function mediaCalc(response) {
// Se a dimensão obrigatória do LDE (etapa de ensino) possui alguma etapa sem nenhum valor, então é criado um objeto
let obj = [];
// com média 0.0 e é inserido no resultado. Usada para não quebrar a sequência de etapas na tabela do LDE.
response.forEach((result) => {
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 newObj = {};
let keys = Object.keys(result);
Object.keys(prevFirstDimId).forEach((key) => {
keys.forEach((key) => {
newObj[key] = prevFirstDimId[key];
if(key !== "total_classes" && key !== "total_enrollment")
});
newObj[key] = result[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.total = result.total_enrollment / result.total_classes;
newObj.average = 0.0;
obj.push(newObj);
result.splice(result.indexOf(prevFirstDimId) + 1, 0, newObj);
 
}
 
prevFirstDimId = d;
});
});
return(obj);
}
}
 
// LDE
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
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')
@@ -332,75 +344,116 @@ classCountApp.get('/', rqf.parse(), rqf.build(), (req, res, next) => {
@@ -332,75 +344,116 @@ 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 = [];
 
 
// Caso tenha apenas uma dimensão, o indicador possuirá uma linha de total
 
if((req.dims) && (req.dims.size == 1)) {
req.partial = req.result;
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.resetSql();
req.dims = {};
req.dims = {};
req.filter = {};
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')
.where('turma.tipo_turma_id = 0 AND turma.etapas_mod_ensino_segmento_id >= 1 AND turma.etapas_mod_ensino_segmento_id <= 10');
.where('turma.tipo_turma_id = 0 AND turma.etapas_mod_ensino_segmento_id >= 1 AND turma.etapas_mod_ensino_segmento_id <= 10');
 
}
next();
next();
}, query, addMissing(rqf), id2str.transform(), (req, res, next) => {
}, rqf.build(), query, addMissing(rqf), id2str.transform(), (req, res, next) => {
const classCount = mediaCalc(req.partial);
// Se tem apenas uma dimensão
const yearClassCount = mediaCalc(req.result);
if(req.partial.length > 0) {
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) => {
yearClassCount.forEach((result) => {
let obj = {};
let obj = {};
obj = result;
obj = result;
obj.label = "total_year_media";
obj.education_level_mod_name = "Total";
req.result.push(obj);
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();
next();
}, response('class_count'));
}, response('class_count'));
 
// 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')
.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)');
.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();
next();
}, query, id2str.transform(), (req, res, next) => {
}, rqf.build(), query, id2str.transform(), (req, res, next) => {
req.partial = [];
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;
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.resetSql();
req.dims = {};
req.dims = {};
req.filter = {};
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')
.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)');
.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();
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) {
if(req.partial.length > 0) {
const classCount = mediaCalc(req.partial);
const yearClassCount = req.result;
const yearClassCount = mediaCalc(req.result);
req.result = req.partial;
req.result = classCount;
 
// 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) => {
yearClassCount.forEach((result) => {
let obj = {};
let obj = {};
obj = result;
obj = result;
obj.label = "total_year_media";
obj.label = "total_year_average";
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 = mediaCalc(req.result);
req.result = classCount;
}
next();
next();
}, response('class_count'));
}, response('class_count'));
Loading