Skip to content
Snippets Groups Projects
Commit 2f433de1 authored by jvfpw18's avatar jvfpw18
Browse files

v1.12.4

parent eba479e0
Branches
Tags
1 merge request!247v1.12.4
Pipeline #22645 failed
......@@ -4,6 +4,10 @@ All notable changes to this project will be documented in this file.
The format is based on [Keep a Changelog](http://keepachangelog.com/)
and this project adheres to [Semantic Versioning](http://semver.org/).
## 1.12.4 - 2020-01-27
## Changed
- Fix addMissing
## 1.12.3 - 2019-12-20
## Changed
- Fix new categories in education type for teacher
......
......@@ -18,57 +18,87 @@ You should have received a copy of the GNU General Public License
along with simcaq-node. If not, see <https://www.gnu.org/licenses/>.
*/
function binarySearch(value, vector, a, b) {
// Search for a value in a vector returning an object with a boolean 'found' and the the position of where the element is/should be at.
while (a < b) {
let mid = Math.floor((b-a)/2) + a
if (vector[mid] === value)
return {found: true, pos: mid}
else if (vector[mid] > value)
b = mid
else
a = mid+1
}
return {found: false, pos: a}
}
module.exports = function addMissing(rqf) {
return (req, res, next) => {
let dims = Object.keys(req.dims).filter(i => { return i !== 'size'; });
console.log(req.dims, dims);
// FIXME: No momento, só funciona para duas dimensões (padrão para o LDE)
if((dims.length != 2) && (dims.length == 1 && req.filter.min_year == req.filter.max_year)) return next();
// if((dims.length != 2) && (dims.length == 1 && req.filter.min_year == req.filter.max_year)) return next();
// if(req.filter.min_year != req.filter.max_year) return next();
if(req.result.length === 0) return next();
if (req.result.length === 0 || dims.length === 0) return next();
if(dims.length == 2) {
if (dims.length === 1) // If there is only one dimension we add year as a dimension, since it is the standard dim.
dims.splice(0, 0, 'min_year')
let result = req.result;
let resultOriginal = req.result;
let dimsValues = {};
result.forEach((r) => {
let dimsValues = {}; // Object with the id's of dims
let dimsNames = {} // Object the names of the dims
resultOriginal.forEach((r) => {
dims.forEach((dim) => {
let rqfName = rqf.fieldValues[dim].resultField;
let rqfName = rqf.fieldValues[dim].resultField; // rqf with the id value
let secondaryRqfName = rqfName.slice(0, -2) + 'name' // rqf with the 'name' value
if (typeof rqfName === 'object') { // if the resultField is an array we verify what the rqf with the name field is
rqfName.forEach((name) => {
if (name.includes("_id"))
rqfName = name;
else
secondaryRqfName = name;
})
}
if (typeof dimsValues[rqfName] === 'undefined') {
dimsValues[rqfName] = [];
dimsNames[secondaryRqfName] = [];
}
if (dimsValues[rqfName].indexOf(r[rqfName]) === -1) {
if (['school', 'city', 'state', 'region'].includes(dim)) { // those should be ordered by its name
let namePosition = binarySearch(r[secondaryRqfName], dimsNames[secondaryRqfName], 0, dimsNames[secondaryRqfName].length) // find the position of the name in alphabetical order and keep the names vector ordered
dimsValues[rqfName].splice(namePosition.pos, 0, r[rqfName]);
dimsNames[secondaryRqfName].splice(namePosition.pos, 0, r[secondaryRqfName]);
}
else {
dimsValues[rqfName].push(r[rqfName]);
dimsNames[secondaryRqfName].push(r[secondaryRqfName])
}
}
})
});
let G = {};
let rqfName = rqf.fieldValues[dims[0]].resultField;
let rqfName2 = rqf.fieldValues[dims[1]].resultField;
G[rqfName] = {};
dimsValues[rqfName].forEach((value) => {
let secondDim = {};
if (dims[0] === 'min_year') // year should be sorted by its value
dimsValues['year'].sort();
dimsValues[rqfName2].forEach((dValue) => {
secondDim[dValue] = false;
});
console.log(dimsNames)
console.log(dimsValues)
G[rqfName][value] = {};
G[rqfName][value][rqfName2] = secondDim;
});
let newResult = [];
let rqfName = Object.keys(dimsValues)[0];
let rqfName2 = Object.keys(dimsValues)[1];
result.forEach((r) => {
let resultDim1 = r[rqfName];
let resultDim2 = r[rqfName2];
G[rqfName][resultDim1][rqfName2][resultDim2] = true;
});
let nameDim1 = Object.keys(dimsNames)[0];
let nameDim2 = Object.keys(dimsNames)[1];
Object.keys(G[rqfName]).forEach((dim1Value) => {
Object.keys(G[rqfName][dim1Value][rqfName2]).forEach((dim2Value) => {
let value = G[rqfName][dim1Value][rqfName2][dim2Value];
if(!value) {
let newEntry = Object.assign({}, result[0], {[rqfName]: parseInt(dim1Value, 10), [rqfName2]: parseInt(dim2Value, 10), total: 0});
dimsValues[rqfName].forEach((dim1Value, i) => { // add entries with 0's for all the combinations between dims
dimsValues[rqfName2].forEach((dim2Value, j) => {
let newEntry = Object.assign({}, resultOriginal[0], { [rqfName]: parseInt(dim1Value, 10), [rqfName2]: parseInt(dim2Value, 10), total: 0 });
if (newEntry.hasOwnProperty("average"))
newEntry.average = 0;
if (newEntry.hasOwnProperty("median"))
......@@ -79,125 +109,180 @@ module.exports = function addMissing(rqf){
newEntry.first_qt = 0;
if (newEntry.hasOwnProperty("third_qt"))
newEntry.third_qt = 0;
// result.push(newEntry);
let index = 0;
for(let i = 0; i < result.length; ++i) {
let r = result[i];
index = i;
if(r[rqfName] > newEntry[rqfName]) break;
if(r[rqfName] == newEntry[rqfName] && r[rqfName2] > newEntry[rqfName2]) break;
}
if (newEntry.dim1Value == undefined && newEntry.dim2Value == undefined) {
let newResult = [...result.slice(0, index), newEntry, ...result.slice(index, result.length)];
result = newResult;
}
}
});
});
req.result = result;
}
newEntry[nameDim1] = dimsNames[nameDim1][i]
newEntry[nameDim2] = dimsNames[nameDim2][j]
newResult.push(newEntry);
})
})
resultOriginal.forEach((r) => { // match entries that exists
let indexDim1 = dimsValues[rqfName].indexOf(r[rqfName])
let indexDim2 = dimsValues[rqfName2].indexOf(r[rqfName2])
newResult[indexDim1*dimsValues[rqfName2].length + indexDim2] = r;
})
req.result = newResult
// newResult[rqfName] = {};
// dimsValues[rqfName].forEach((value) => {
// let secondDim = {};
// dimsValues[rqfName2].forEach((dValue) => {
// secondDim[dValue] = false;
// });
// newResult[rqfName][value] = {};
// newResult[rqfName][value][rqfName2] = secondDim;
// });
// // console.log(newResult.year, "\n\n\n!!!!", resultOriginal, rqfName, rqfName2)
// resultOriginal.forEach((r) => {
// newResult[r[rqfName]]
// })
// resultOriginal.forEach((r) => {
// let resultDim1 = r[rqfName];
// let resultDim2 = r[rqfName2];
// newResult[rqfName][resultDim1][rqfName2][resultDim2] = true;
// });
// // console.log(newResult.year, "\n\n\n!!!!", resultOriginal, rqfName, rqfName2)
// Object.keys(newResult[rqfName]).forEach((dim1Value) => {
// Object.keys(newResult[rqfName][dim1Value][rqfName2]).forEach((dim2Value) => {
// let value = newResult[rqfName][dim1Value][rqfName2][dim2Value];
// if (!value) {
// let newEntry = Object.assign({}, resultOriginal[0], { [rqfName]: parseInt(dim1Value, 10), [rqfName2]: parseInt(dim2Value, 10), total: 0 });
// if (newEntry.hasOwnProperty("average"))
// newEntry.average = 0;
// if (newEntry.hasOwnProperty("median"))
// newEntry.median = 0;
// if (newEntry.hasOwnProperty("stddev"))
// newEntry.stddev = 0;
// if (newEntry.hasOwnProperty("first_qt"))
// newEntry.first_qt = 0;
// if (newEntry.hasOwnProperty("third_qt"))
// newEntry.third_qt = 0;
// // resultOriginal.push(newEntry);
// let index = 0;
// for (let i = 0; i < resultOriginal.length; ++i) {
// let r = resultOriginal[i];
// index = i;
// if (r[rqfName] > newEntry[rqfName]) break;
// if (r[rqfName] == newEntry[rqfName] && r[rqfName2] > newEntry[rqfName2]) break;
// }
// if (newEntry.dim1Value == undefined && newEntry.dim2Value == undefined) {
// resultOriginal = [...resultOriginal.slice(0, index), newEntry, ...resultOriginal.slice(index, resultOriginal.length)];
// }
// }
// });
// });
// req.result = resultOriginal;
// }
// Quando é série historica, é uma dimensão com max e min year nos filtros.
else if (dims.length == 1 && req.filter.min_year != req.filter.max_year) {
let result = req.result;
// else if (dims.length == 1 && req.filter.min_year != req.filter.max_year) {
// let result = req.result;
//Pega os valores da dimensão
let dimsValues = {};
result.forEach((r) => {
// //Pega os valores da dimensão
// let dimsValues = {};
// result.forEach((r) => {
// para cada dimensão
dims.forEach((dim) => {
// // para cada dimensão
// dims.forEach((dim) => {
// pega o nome da dimensao
let rqfName = rqf.fieldValues[dim].resultField;
if (rqfName[0] == "university_id" || rqfName[1] == "university_id") {
rqfName = "university_id"
};
let rqfName2 = "year"
//se n existir o array é uma nova dimensão, então cria os arrays para colocar os ids
if(typeof dimsValues[rqfName] === 'undefined') {
dimsValues[rqfName] = [];
}
if(typeof dimsValues[rqfName2] === 'undefined') {
dimsValues[rqfName2] = [];
}
//se já existe, verifica se está no vetor, se n estiver, adiciona o id
if(dimsValues[rqfName].indexOf(r[rqfName]) === -1) {
dimsValues[rqfName].push(r[rqfName]);
}
//se já existe, verifica se está no vetor, se n estiver, adiciona o ano
if(dimsValues[rqfName2].indexOf(r[rqfName2]) === -1) {
dimsValues[rqfName2].push(r[rqfName2]);
}
})
})
// // pega o nome da dimensao
// let rqfName = rqf.fieldValues[dim].resultField;
// if (rqfName[0] == "university_id" || rqfName[1] == "university_id") {
// rqfName = "university_id"
// };
// let rqfName2 = "year"
// //se n existir o array é uma nova dimensão, então cria os arrays para colocar os ids
// if(typeof dimsValues[rqfName] === 'undefined') {
// dimsValues[rqfName] = [];
// }
// if(typeof dimsValues[rqfName2] === 'undefined') {
// dimsValues[rqfName2] = [];
// }
// //se já existe, verifica se está no vetor, se n estiver, adiciona o id
// if(dimsValues[rqfName].indexOf(r[rqfName]) === -1) {
// dimsValues[rqfName].push(r[rqfName]);
// }
// //se já existe, verifica se está no vetor, se n estiver, adiciona o ano
// if(dimsValues[rqfName2].indexOf(r[rqfName2]) === -1) {
// dimsValues[rqfName2].push(r[rqfName2]);
// }
// })
// })
//ordena os anos
dimsValues["year"] = dimsValues["year"].sort();
// console.log(dimsValues);
let dimsValuesKey = Object.keys(dimsValues);
// console.log(dimsValuesKey);
let firstDim = dimsValuesKey[1];
console.log(firstDim)
let secondDim = dimsValuesKey[0];
console.log(secondDim)
let count = 0;
//Permuta as dimensões em ordem, agora verifica se existe no vetor de resultados.
dimsValues[firstDim].forEach((fDim) => {
dimsValues[secondDim].forEach((sDim) => {
//caso o object chegou ao final e ainda temos coisas para adicionar
if (typeof result[count] === 'undefined' ) {
let newEntry = Object.assign({}, result[count - 1]);
newEntry[firstDim] = fDim;
newEntry[secondDim] = sDim
newEntry["total"] = 0;
let newResult = [...result.slice(0, count), newEntry, ...result.slice(count, result.length)];
result = newResult;
count++;
}
// //ordena os anos
// dimsValues["year"] = dimsValues["year"].sort();
// // console.log(dimsValues);
// console.log(fDim,result[count][firstDim],sDim,result[count][secondDim])
//está no vetor, aumenta o contador
else if ((fDim == result[count][firstDim]) && (sDim == result[count][secondDim])) {
// console.log("A Entrada Existe");
count++;
//se não existe no objecto, vamos ordernar
} else {
// console.log("A entrada " + fDim + " "+ sDim + " Não existe");
//Se não existe pega uma copia do próximo, onde a primeira dimensão seja igual
if (result[count][firstDim] == fDim) {
let newEntry = Object.assign({}, result[count]);
newEntry[firstDim] = fDim;
newEntry[secondDim] = sDim
newEntry["total"] = 0;
let newResult = [...result.slice(0, count), newEntry, ...result.slice(count, result.length)];
result = newResult;
count++;
//se não existe pega uma copia do anterior, onde a primeira dimensão seja igual
} else if (result[count - 1][firstDim] == fDim) {
let newEntry = Object.assign({}, result[count - 1]);
newEntry[firstDim] = fDim;
newEntry[secondDim] = sDim
newEntry["total"] = 0;
let newResult = [...result.slice(0, count - 1), newEntry, ...result.slice(count - 1, result.length)];
result = newResult;
count++;
}
}
});
});
req.result = result;
}
// let dimsValuesKey = Object.keys(dimsValues);
// // console.log(dimsValuesKey);
// let firstDim = dimsValuesKey[0];
// let secondDim = dimsValuesKey[1];
// let count = 0;
// //Permuta as dimensões em ordem, agora verifica se existe no vetor de resultados.
// dimsValues[firstDim].forEach((fDim) => {
// dimsValues[secondDim].forEach((sDim) => {
// //caso o object chegou ao final e ainda temos coisas para adicionar
// if (typeof result[count] === 'undefined' ) {
// let newEntry = Object.assign({}, result[count - 1]);
// newEntry[firstDim] = fDim;
// newEntry[secondDim] = sDim
// newEntry["total"] = 0;
// let newResult = [...result.slice(0, count), newEntry, ...result.slice(count, result.length)];
// result = newResult;
// count++;
// }
// // console.log(fDim,result[count][firstDim],sDim,result[count][secondDim])
// //está no vetor, aumenta o contador
// else if ((fDim == result[count][firstDim]) && (sDim == result[count][secondDim])) {
// // console.log("A Entrada Existe");
// count++;
// //se não existe no objecto, vamos ordernar
// } else {
// // console.log("A entrada " + fDim + " "+ sDim + " Não existe");
// //Se não existe pega uma copia do próximo, onde a primeira dimensão seja igual
// if (result[count][firstDim] == fDim) {
// let newEntry = Object.assign({}, result[count]);
// newEntry[firstDim] = fDim;
// newEntry[secondDim] = sDim
// newEntry["total"] = 0;
// let newResult = [...result.slice(0, count), newEntry, ...result.slice(count, result.length)];
// result = newResult;
// count++;
// //se não existe pega uma copia do anterior, onde a primeira dimensão seja igual
// } else if (result[count - 1][firstDim] == fDim) {
// let newEntry = Object.assign({}, result[count - 1]);
// newEntry[firstDim] = fDim;
// newEntry[secondDim] = sDim
// newEntry["total"] = 0;
// let newResult = [...result.slice(0, count - 1), newEntry, ...result.slice(count - 1, result.length)];
// result = newResult;
// count++;
// }
// }
// });
// });
// req.result = result;
// }
next();
};
};
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment