Skip to content
Snippets Groups Projects
Commit e946a55c authored by Vytor Calixto's avatar Vytor Calixto :space_invader:
Browse files

Add multivalue filters feature

parent 2bed8a71
No related branches found
No related tags found
1 merge request!116Release v1.0.0
...@@ -4,6 +4,21 @@ const log = require(`${libs}/log`)(module); ...@@ -4,6 +4,21 @@ const log = require(`${libs}/log`)(module);
const _ = require('lodash'); const _ = require('lodash');
function parseWhereValue(type, value) {
if(type === 'integer') return parseInt(value, 10);
if(type === 'double') return parseFloat(value);
if(type === 'string') return '%'+value+'%';
if(type === 'boolean') {
if (value.toLowerCase() === 'null') {
console.log('Fazendo uma consulta Null');
return null;
} else {
console.log('Fazendo uma consulta True');
return (value.toLowerCase() === 'true' || parseInt(value, 10) === 1);
}
}
}
class ReqQueryFields { class ReqQueryFields {
constructor(fields = {}, fieldValues = {}) { constructor(fields = {}, fieldValues = {}) {
// Exemplo de requisição: `/api/v1/enrollments?dims=state,region,location` // Exemplo de requisição: `/api/v1/enrollments?dims=state,region,location`
...@@ -128,7 +143,8 @@ class ReqQueryFields { ...@@ -128,7 +143,8 @@ class ReqQueryFields {
if (req.query[queryField]) { if (req.query[queryField]) {
// Se há mais de um parametro no campo, eles estão separados por vírgula. // Se há mais de um parametro no campo, eles estão separados por vírgula.
// Fazemos o split então para separar os valores // Fazemos o split então para separar os valores
const params = req.query[queryField].split(','); const regex = /,(?=[a-z])/; // Pega as vírgulas que não estão nos atributos multivalorados
const params = req.query[queryField].split(regex);
// Objeto temporário para guardar os parametros e seus valores. // Objeto temporário para guardar os parametros e seus valores.
const obj = {}; const obj = {};
for (const param of params) { for (const param of params) {
...@@ -136,7 +152,7 @@ class ReqQueryFields { ...@@ -136,7 +152,7 @@ class ReqQueryFields {
// Fazemos o split e temos um array `['state', 41]` // Fazemos o split e temos um array `['state', 41]`
const kv = param.split(':'); const kv = param.split(':');
// Checa se há um valor. Se não tem, definimos como true. // Checa se há um valor. Se não tem, definimos como true.
obj[kv[0]] = (typeof kv[1] === 'undefined') ? true : kv[1]; obj[kv[0]] = (typeof kv[1] === 'undefined') ? true : JSON.parse(kv[1]);
// `obj` é agora `{kv[0]: kv[1]}` ou `{kv[0]: true}`. // `obj` é agora `{kv[0]: kv[1]}` ou `{kv[0]: true}`.
// No exemplo `{'state': 41}` // No exemplo `{'state': 41}`
} }
...@@ -177,8 +193,6 @@ class ReqQueryFields { ...@@ -177,8 +193,6 @@ class ReqQueryFields {
log.debug(field); log.debug(field);
// `param` aqui é o atributo no objeto `req` (dims, filter, search, ...) // `param` aqui é o atributo no objeto `req` (dims, filter, search, ...)
let param = req[field.name]; let param = req[field.name];
// log.debug('param');
// log.debug(param);
// Fazemos um foreach nos parametros dentro do atributo // Fazemos um foreach nos parametros dentro do atributo
Object.keys(param).forEach((k) => { Object.keys(param).forEach((k) => {
let values = _.merge(this.fieldValues, field.values); let values = _.merge(this.fieldValues, field.values);
...@@ -226,19 +240,14 @@ class ReqQueryFields { ...@@ -226,19 +240,14 @@ class ReqQueryFields {
// Valor do where // Valor do where
let whereValue = param[k]; let whereValue = param[k];
// Valor sempre vem como string, necessário fazer parse para o banco log.debug('whereValue');
if(value.where.type === 'integer') whereValue = parseInt(whereValue, 10); log.debug(whereValue);
if(value.where.type === 'double') whereValue = parseFloat(whereValue); log.debug(`Where value é array? ${Array.isArray(whereValue)}`);
if(value.where.type === 'string') whereValue = '%'+whereValue+'%'; // TODO: |
if(value.where.type === 'boolean') { // TODO: |
if (whereValue.toLowerCase() === 'null') { // TODO: V
whereValue = null; //TODO: parse do valor do where onde apropriado!!!!!!!
console.log('Fazendo uma consulta Null');
} else {
whereValue = (whereValue.toLowerCase() === 'true' || parseInt(whereValue, 10) === 1);
console.log('Fazendo uma consulta True');
}
}
let tbl = value.where.table || value.table; let tbl = value.where.table || value.table;
// multiple where, only tested for boolean filds // multiple where, only tested for boolean filds
if (Array.isArray(value.tableField)) { if (Array.isArray(value.tableField)) {
...@@ -246,18 +255,46 @@ class ReqQueryFields { ...@@ -246,18 +255,46 @@ class ReqQueryFields {
let whereField = ''; let whereField = '';
let whereValues = []; let whereValues = [];
value.where.field.forEach((f, i, arr) => { value.where.field.forEach((f, i, arr) => {
whereValues.push(whereValue);
whereField += (value.where.type === 'string') ? 'LOWER(' + tbl + '.' + value.where.field[i] + ')' : tbl + '.' + value.where.field[i]; whereField += (value.where.type === 'string') ? 'LOWER(' + tbl + '.' + value.where.field[i] + ')' : tbl + '.' + value.where.field[i];
whereField += ' ' + value.where.relation + ' ?'; whereField += ' ' + value.where.relation + ' ?';
if (i < arr.length - 1) { if (i < arr.length - 1) {
whereField += ' ' + value.where.condition + ' '; whereField += ' ' + value.where.condition + ' ';
} }
if (Array.isArray(whereValue)) {
let whereString = '(';
for(let i = 0; i < whereValue.length; ++i) {
whereString += whereField;
whereValues.push(parseWhereValue(value.where.type, whereValue[i]));
if(i < whereValue.length-1) {
whereString += ' OR ';
}
}
whereString += ')';
} else {
whereValues.push(parseWhereValue(value.where.type, whereValue));
}
}); });
req.sql.where(whereField, ...whereValues); req.sql.where(whereField, ...whereValues);
} else { } else {
let whereField = (value.where.type === 'string') ? 'LOWER(' + tbl + '.' + value.where.field + ')' : tbl + '.' + value.where.field; let whereField = (value.where.type === 'string') ? 'LOWER(' + tbl + '.' + value.where.field + ')' : tbl + '.' + value.where.field;
let lower = (value.where.type === 'string') ? ' LOWER(?) ' : ' ? '; let lower = (value.where.type === 'string') ? ' LOWER(?) ' : ' ? ';
req.sql.where(whereField + ' ' + value.where.relation + lower, whereValue); if(Array.isArray(whereValue)) {
let whereString = '(';
let arrayWhereValues = [];
for(let i = 0; i < whereValue.length; ++i) {
whereString += whereField + ' ' + value.where.relation + lower;
arrayWhereValues.push(parseWhereValue(value.where.type, whereValue[i]));
if(i < whereValue.length-1) {
whereString += ' OR ';
}
}
whereString += ')';
req.sql.where(whereString, ...arrayWhereValues);
} else {
req.sql.where(whereField + ' ' + value.where.relation + lower, parseWhereValue(value.where.type, whereValue));
}
} }
} }
} }
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment