Browse Source

Fixed the query structure to integrate multiple "and-condtions" and "or conditions" for a single field

pull/1/head
Harish.K 9 years ago
parent
commit
ff5b938f22
  1. 52
      index.js
  2. 26
      test.js

52
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(){

26
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))'
},
{

Loading…
Cancel
Save