Browse Source

V0.0.5

Added support for mongo like query. Fully backward compatible
pull/1/head v0.0.5
Harish.K 9 years ago
parent
commit
13427005fe
  1. 26
      index.js
  2. 2
      package.json
  3. 30
      test.js

26
index.js

@ -23,9 +23,22 @@ var functionOperatorMap = {
AND_NOTNULL: 'andWhereNotNull',
};
var aliases = {
REGEX: 'REGEXP'
};
function addCondition (q, field, val) {
if( val.constructor.name === 'Object' ){
delete val.$options;
val = Object.keys(val).map( function(key){
return [ key.slice(1).toUpperCase(), val[key] ];
});
if( val.length === 1){
val = val[0];
}
}
if (Array.isArray(val[0])) {
return q.where(function () {
return val.forEach(addCondition.bind(null, this, field));
@ -33,13 +46,18 @@ function addCondition (q, field, val) {
}
if (!Array.isArray(val)) {
// Simple string or number value
val = ['AND', field, val ];
} else if (functionOperatorMap.hasOwnProperty( val[0] ) ) {
val = [ val[0], field ].concat(val.slice(1));
} else {
val = [ 'AND', field ].concat(val);
val[0] = aliases[ val[0] ] || val[0];
if (functionOperatorMap.hasOwnProperty( val[0] ) ) {
// SQL operator
val = [ val[0], field ].concat(val.slice(1));
} else {
// other cases like ( '>', '10' ) Greater than 10
val = [ 'AND', field ].concat(val);
}
}
return q[functionOperatorMap[val[0]]].apply(q, val.slice(1));
}

2
package.json

@ -1,6 +1,6 @@
{
"name": "knex-json-query",
"version": "0.0.4",
"version": "0.0.5",
"description": "A high-level utility which will will generate Knex query from a single JSON object.",
"main": "index.js",
"scripts": {

30
test.js

@ -17,6 +17,16 @@ var conditions= [
input:{"firstName":[["LIKE","H%"],["OR","hemanth"]]},
output: 'select * where (("firstName" LIKE \'H%\' or "firstName" = \'hemanth\'))'
},
{
name: 'handle regex query: MongoQuery',
input:{"firstName":{ $regex: "H*" }},
output: 'select * where ("firstName" REGEXP \'H*\')'
},
{
name: 'handle regex query and should omit $options: MongoQuery',
input:{"firstName":{ $regex: "H*", $options: 'i' }},
output: 'select * where ("firstName" REGEXP \'H*\')'
},
{
name: 'handle simple and conditions',
input:{ f1: [[ 'A' ],['LIKE', 'B' ]], f2: 20, f3: 30 },
@ -63,21 +73,41 @@ var conditions= [
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 multiple conditions in one field: MongoQuery',
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 } ],
output: 'select * where (("f1" LIKE 10) or ("f2" = 20) or ("f3" = 30))'
},
{
name: 'handle simple or condition with like statement: MongoQuery',
input:[ { f1: { $like: 10 } }, { f2: 20 }, { f3: 30 } ],
output: 'select * where (("f1" LIKE 10) or ("f2" = 20) or ("f3" = 30))'
},
{
name: 'handle simple or condition with between statement',
input:[ { f1: ['BETWEEN',[50, 60] ] }, { f2: 20 }, { f3: 30 } ],
output: 'select * where (("f1" between 50 and 60) or ("f2" = 20) or ("f3" = 30))'
},
{
name: 'handle simple or condition with between statement :MongoQuery',
input:[ { f1: { $between:[50, 60] } }, { f2: 20 }, { f3: 30 } ],
output: 'select * where (("f1" between 50 and 60) or ("f2" = 20) or ("f3" = 30))'
},
{
name: 'handle simple or condition with in statement',
input:[ { f1: ['IN',[ 50, 60 ]] }, { f2: 20 }, { f3: 30 } ],
output: 'select * where (("f1" in (50, 60)) or ("f2" = 20) or ("f3" = 30))'
},
{
name: 'handle simple or condition with in statement :MongoQuery',
input:[ { f1: {$in:[ 50, 60 ]} }, { f2: 20 }, { f3: 30 } ],
output: 'select * where (("f1" in (50, 60)) or ("f2" = 20) or ("f3" = 30))'
},
];

Loading…
Cancel
Save