From 13427005fe5e73f67efc3fd6d8cfc0220c6dc71a Mon Sep 17 00:00:00 2001 From: "Harish.K" Date: Wed, 29 Mar 2017 13:03:15 +0530 Subject: [PATCH] V0.0.5 Added support for mongo like query. Fully backward compatible --- index.js | 26 ++++++++++++++++++++++---- package.json | 2 +- test.js | 30 ++++++++++++++++++++++++++++++ 3 files changed, 53 insertions(+), 5 deletions(-) diff --git a/index.js b/index.js index b1da3e9..2b37e46 100644 --- a/index.js +++ b/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)); } diff --git a/package.json b/package.json index 392c16b..bb71c30 100644 --- a/package.json +++ b/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": { diff --git a/test.js b/test.js index 258b40c..ca06ccc 100644 --- a/test.js +++ b/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))' + }, ];