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

Merge branch 'multibuild' into siope_route

parents f2efe894 fabb86b7
No related branches found
No related tags found
2 merge requests!116Release v1.0.0,!91Siope route
...@@ -192,126 +192,140 @@ class ReqQueryFields { ...@@ -192,126 +192,140 @@ class ReqQueryFields {
}; };
} }
build() { buildQuery(req, sql) {
// "Constrói" o SQL // "Constrói" o SQL
return (req, res, next) => { let hasJoined = {};
let hasJoined = {}; let thisTable = sql.tableFrom;
let thisTable = req.sql.tableFrom; // Foreach no campos
// Foreach no campos Object.keys(this.fields).forEach((key) => {
Object.keys(this.fields).forEach((key) => { // Campo
// Campo let field = this.fields[key];
let field = this.fields[key]; 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]; // 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); if(typeof values[k] !== 'undefined') {
if(typeof values[k] !== 'undefined') { // Clonamos para não alterar o original
// Clonamos para não alterar o original let value = _.clone(values[k]);
let value = _.clone(values[k]); if(value.parseOnly) return;
if(value.parseOnly) return; // Checa se não fizemos o join para este valor e se é necessário fazer
// Checa se não fizemos o join para este valor e se é necessário fazer if(!hasJoined[value.table] && typeof value.join !== 'undefined') {
if(!hasJoined[value.table] && typeof value.join !== 'undefined') { let foreignTable = '';
let foreignTable = ''; if(value.join.foreignTable) foreignTable = value.join.foreignTable+'.';
if(value.join.foreignTable) foreignTable = value.join.foreignTable+'.'; if(value.join.foreignTable === '@') foreignTable = thisTable+'.';
if(value.join.foreignTable === '@') foreignTable = thisTable+'.'; // Fazemos o join
// Fazemos o join let onClause = '';
let onClause = ''; if(Array.isArray(value.join.primary)) {
if(Array.isArray(value.join.primary)) { // Se é um array, montamos a cláusula ON com mais de uma coluna
// Se é um array, montamos a cláusula ON com mais de uma coluna value.join.primary.forEach((column, index, arr) => {
value.join.primary.forEach((column, index, arr) => { onClause += foreignTable+value.join.foreign[index]+'='+value.table+'.'+column;
onClause += foreignTable+value.join.foreign[index]+'='+value.table+'.'+column; if(index < arr.length-1) {
if(index < arr.length-1) { onClause+=' AND ';
onClause+=' AND '; }
} });
}); } else {
} else { onClause = foreignTable+value.join.foreign+'='+value.table+'.'+value.join.primary;
onClause = foreignTable+value.join.foreign+'='+value.table+'.'+value.join.primary;
}
req.sql.join(value.table, null, onClause);
// Marcamos o join como feito para não ter problemas
hasJoined[value.table] = true;
} }
// Se o valor é um campo a ser incluído no SELECT sql.join(value.table, null, onClause);
if(typeof field.field !== 'undefined' && field.field) { // Marcamos o join como feito para não ter problemas
log.debug('SELECT'); hasJoined[value.table] = true;
let table = value.table; }
if(table === '@') table = thisTable; // Se o valor é um campo a ser incluído no SELECT
if (Array.isArray(value.resultField)) { if(typeof field.field !== 'undefined' && field.field) {
value.tableField.forEach((f, i) => { log.debug('SELECT');
req.sql.field(table+'.'+f, value.resultField[i] || f) let table = value.table;
.group(table+'.'+f) if(table === '@') table = thisTable;
.order(table+'.'+f); if (Array.isArray(value.resultField)) {
}) value.tableField.forEach((f, i) => {
}else{ sql.field(table+'.'+f, value.resultField[i] || f)
req.sql.field(table+'.'+value.tableField, value.resultField || value.tableField) .group(table+'.'+f)
.order(table+'.'+value.tableField) .order(table+'.'+f);
.group(table+'.'+value.tableField); })
} }else{
sql.field(table+'.'+value.tableField, value.resultField || value.tableField)
.order(table+'.'+value.tableField)
.group(table+'.'+value.tableField);
} }
// Se o valor é um campo para ser usado no WHERE }
if(typeof field.where !== 'undefined' && field.where) { // Se o valor é um campo para ser usado no WHERE
log.debug('WHERE'); if(typeof field.where !== 'undefined' && field.where) {
// Valor do where log.debug('WHERE');
// Valor do where
let whereValue = param[k];
log.debug('whereValue');
log.debug(whereValue);
log.debug(`Where value é array? ${Array.isArray(whereValue)}`);
let tbl = value.where.table || value.table; let whereValue = param[k];
if (tbl === '@') tbl = thisTable; log.debug('whereValue');
// multiple where log.debug(whereValue);
if (Array.isArray(value.where.field)) { log.debug(`Where value é array? ${Array.isArray(whereValue)}`);
let lower = (value.where.type === 'string') ? ' LOWER(?) ' : ' ? ';
let whereField = '';
let whereValues = [];
value.where.field.forEach((f, i, arr) => {
whereField += (value.where.type === 'string') ? 'LOWER(' + tbl + '.' + value.where.field[i] + ')' : tbl + '.' + value.where.field[i];
whereField += ' ' + value.where.relation + ' ?';
if (i < arr.length - 1) {
whereField += ' ' + value.where.condition + ' ';
}
if (Array.isArray(whereValue)) { let tbl = value.where.table || value.table;
let whereString = '('; if (tbl === '@') tbl = thisTable;
for(let i = 0; i < whereValue.length; ++i) { // multiple where
whereString += whereField; if (Array.isArray(value.where.field)) {
whereValues.push(parseWhereValue(value.where.type, whereValue[i])); let lower = (value.where.type === 'string') ? ' LOWER(?) ' : ' ? ';
if(i < whereValue.length-1) { let whereField = '';
whereString += ' OR '; let whereValues = [];
} value.where.field.forEach((f, i, arr) => {
} whereField += (value.where.type === 'string') ? 'LOWER(' + tbl + '.' + value.where.field[i] + ')' : tbl + '.' + value.where.field[i];
whereString += ')'; whereField += ' ' + value.where.relation + ' ?';
} else { if (i < arr.length - 1) {
whereValues.push(parseWhereValue(value.where.type, whereValue)); whereField += ' ' + value.where.condition + ' ';
} }
});
req.sql.where(whereField, ...whereValues); if (Array.isArray(whereValue)) {
} else {
let whereField = (value.where.type === 'string') ? 'LOWER(' + tbl + '.' + value.where.field + ')' : tbl + '.' + value.where.field;
let lower = (value.where.type === 'string') ? ' LOWER(?) ' : ' ? ';
if(Array.isArray(whereValue)) {
let whereString = '('; let whereString = '(';
let arrayWhereValues = [];
for(let i = 0; i < whereValue.length; ++i) { for(let i = 0; i < whereValue.length; ++i) {
whereString += whereField + ' ' + value.where.relation + lower; whereString += whereField;
arrayWhereValues.push(parseWhereValue(value.where.type, whereValue[i])); whereValues.push(parseWhereValue(value.where.type, whereValue[i]));
if(i < whereValue.length-1) { if(i < whereValue.length-1) {
whereString += ' OR '; whereString += ' OR ';
} }
} }
whereString += ')'; whereString += ')';
req.sql.where(whereString, ...arrayWhereValues);
} else { } else {
req.sql.where(whereField + ' ' + value.where.relation + lower, parseWhereValue(value.where.type, whereValue)); whereValues.push(parseWhereValue(value.where.type, whereValue));
} }
});
sql.where(whereField, ...whereValues);
} else {
let whereField = (value.where.type === 'string') ? 'LOWER(' + tbl + '.' + value.where.field + ')' : tbl + '.' + value.where.field;
let lower = (value.where.type === 'string') ? ' LOWER(?) ' : ' ? ';
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 += ')';
sql.where(whereString, ...arrayWhereValues);
} else {
sql.where(whereField + ' ' + value.where.relation + lower, parseWhereValue(value.where.type, whereValue));
} }
} }
} }
}); }
});
});
return sql;
}
build() {
return (req, res, next) => {
req.sql = this.buildQuery(req, req.sql);
next();
};
}
multibuild() {
return (req, res, next) => {
req.querySet.forEach((query) => {
query = this.buildQuery(req, query);
}); });
next(); next();
}; };
......
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