module.exports = function addMissing(rqf){ return (req, res, next) => { let dims = Object.keys(req.dims).filter(i => {return i !== 'size';}); // FIXME: No momento, só funciona para duas dimensões (padrão para o LDE) if(dims.length != 2) return next(); if(req.filter.min_year != req.filter.max_year) return next(); if(req.result.length === 0) return next(); let result = req.result; let dimsValues = {}; result.forEach((r) => { dims.forEach((dim) => { let rqfName = rqf.fieldValues[dim].resultField; if(typeof dimsValues[rqfName] === 'undefined') { dimsValues[rqfName] = []; } if(dimsValues[rqfName].indexOf(r[rqfName]) === -1) { dimsValues[rqfName].push(r[rqfName]); } }) }); let G = {}; let rqfName = rqf.fieldValues[dims[0]].resultField; let rqfName2 = rqf.fieldValues[dims[1]].resultField; G[rqfName] = {}; dimsValues[rqfName].forEach((value) => { let secondDim = {}; dimsValues[rqfName2].forEach((dValue) => { secondDim[dValue] = false; }); G[rqfName][value] = {}; G[rqfName][value][rqfName2] = secondDim; }); result.forEach((r) => { let resultDim1 = r[rqfName]; let resultDim2 = r[rqfName2]; G[rqfName][resultDim1][rqfName2][resultDim2] = true; }); 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}); // 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; } let newResult = [...result.slice(0, index), newEntry, ...result.slice(index, result.length)]; result = newResult; } }); }); req.result = result; next(); }; };