diff --git a/index.js b/index.js index d48589e..7e5db10 100644 --- a/index.js +++ b/index.js @@ -1,36 +1,54 @@ -var simpleOperators = [ - 'LIKE', - '>', - '<', -]; var functionOperators = [ 'BETWEEN', - 'IN' + 'IN', + /* ---- */ + 'OR', + 'AND', + /* ---- */ + 'OR_BETWEEN', + 'OR_IN', + /* ---- */ + 'AND_BETWEEN', + 'AND_IN' ]; var functionOperatorMap = { BETWEEN: 'whereBetween', - IN: 'whereIn' + IN: 'whereIn', + /* ---- */ + OR: 'orWhere', + AND: 'where', + /* ---- */ + OR_BETWEEN: 'orWhereBetween', + OR_IN: 'orWhereIn', + /* ---- */ + AND_BETWEEN: 'andWhereBetween', + AND_IN: 'andWhereIn' }; -function addCondition( q, field, val ){ - var conditionFn, conditionName; - if( !Array.isArray(val)){ - return q.where( field, val ); - } - conditionName = val[0]; - if( simpleOperators.indexOf( conditionName ) !== -1 ){ - return q.where.apply(q, [field].concat(val) ); +function addCondition (q, field, val) { + if (Array.isArray(val[0])) { + return q.where(function () { + return val.forEach(addCondition.bind(null, this, field)) + }) } - if( functionOperators.indexOf(conditionName) !== -1 ){ - return q[functionOperatorMap[conditionName] ]( field, val.slice(1) ); + + if (!Array.isArray(val)) { + val = ['AND', field, val ] + } else if (functionOperators.indexOf(val[0]) !== -1) { + val.splice(1, 0, field) + } else { + val = [ 'AND', field ].concat(val) } + + return q[functionOperatorMap[val[0]]].apply(q, val.slice(1)) } + function getWhereCondition( cond ){ if( Array.isArray(cond) ){ return function(){ diff --git a/test.js b/test.js index e7385db..b213d1e 100644 --- a/test.js +++ b/test.js @@ -12,14 +12,29 @@ var conditions= [ input:{ f1: 10, f2: 20, f3: 30 }, output: 'select * where ("f1" = 10 and "f2" = 20 and "f3" = 30)' }, + { + name: 'handle basic operators :: greater-than less-than', + input:{ f1: ['>', 10], f2: [ '<', 20 ], f3: 30 }, + output: 'select * where ("f1" > 10 and "f2" < 20 and "f3" = 30)' + }, + { + name: 'handle basic operators :: in', + input:{ f1: ['IN', [10,50]], f2: [ '<', 20 ], f3: 30 }, + output: 'select * where ("f1" in (10, 50) and "f2" < 20 and "f3" = 30)' + }, + { + name: 'handle multiple conditions in one field', + input:{ f1: [ [ 'LIKE', 20 ], 21, [ 'AND_BETWEEN', [ 40, 45 ] ] ], f2: 20, f3: 30 }, + output: 'select * where (("f1" LIKE 20 and "f1" = 21 and "f1" between 40 and 45) and "f2" = 20 and "f3" = 30)' + }, { name: 'handle simple and condition with like statement', - input:{ f1: ['LIKE', 20], f2: 20, f3: 30 }, + input:{ f1: [ 'LIKE', 20 ], f2: 20, f3: 30 }, output: 'select * where ("f1" LIKE 20 and "f2" = 20 and "f3" = 30)' }, { name: 'handle simple and condition with between statement', - input:{ f1: ['BETWEEN', 50, 60 ], f2: 20, f3: 30 }, + input:{ f1: ['BETWEEN', [50, 60] ], f2: 20, f3: 30 }, output: 'select * where ("f1" between 50 and 60 and "f2" = 20 and "f3" = 30)' }, { @@ -33,6 +48,11 @@ var conditions= [ input:[ { f1: 10 }, { f2: 20 }, { f3: 30 } ], output: 'select * where (("f1" = 10) or ("f2" = 20) or ("f3" = 30))' }, + { + name: 'handle multiple conditions in one field', + input:{ f1: [ [ 'LIKE', 20 ], [ 'OR', 21 ], [ 'OR_BETWEEN', [ 40, 45 ] ] ], f2: 20, f3: 30 }, + output: 'select * where (("f1" LIKE 20 or "f1" = 21 or "f1" between 40 and 45) and "f2" = 20 and "f3" = 30)' + }, { name: 'handle simple or condition with like statement', input:[ { f1: ['LIKE',10] }, { f2: 20 }, { f3: 30 } ], @@ -40,7 +60,7 @@ var conditions= [ }, { name: 'handle simple or condition with between statement', - input:[ { f1: ['BETWEEN',50, 60] }, { f2: 20 }, { f3: 30 } ], + input:[ { f1: ['BETWEEN',[50, 60] ] }, { f2: 20 }, { f3: 30 } ], output: 'select * where (("f1" between 50 and 60) or ("f2" = 20) or ("f3" = 30))' }, {