mirror of
https://github.com/harish2704/knex-json-query.git
synced 2026-09-10 12:51:08 +00:00
Initial commit
This commit is contained in:
@@ -0,0 +1,52 @@
|
|||||||
|
|
||||||
|
var simpleOperators = [
|
||||||
|
'LIKE',
|
||||||
|
'>',
|
||||||
|
'<',
|
||||||
|
];
|
||||||
|
|
||||||
|
var functionOperators = [
|
||||||
|
'BETWEEN',
|
||||||
|
'IN'
|
||||||
|
];
|
||||||
|
|
||||||
|
var functionOperatorMap = {
|
||||||
|
BETWEEN: 'whereBetween',
|
||||||
|
IN: 'whereIn'
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
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) );
|
||||||
|
}
|
||||||
|
if( functionOperators.indexOf(conditionName) !== -1 ){
|
||||||
|
return q[functionOperatorMap[conditionName] ]( field, val.slice(1) );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function getWhereCondition( cond ){
|
||||||
|
if( Array.isArray(cond) ){
|
||||||
|
return function(){
|
||||||
|
cond.forEach( function(v){
|
||||||
|
this.orWhere( getWhereCondition(v) );
|
||||||
|
}, this );
|
||||||
|
};
|
||||||
|
} else {
|
||||||
|
return function(){
|
||||||
|
var field;
|
||||||
|
for( field in cond ){
|
||||||
|
addCondition( this, field, cond[field] );
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
module.exports = getWhereCondition;
|
||||||
@@ -0,0 +1,27 @@
|
|||||||
|
{
|
||||||
|
"name": "knex-json-query",
|
||||||
|
"version": "0.0.1",
|
||||||
|
"description": "A high-level utility which will will generate Knex query from a single JSON object.",
|
||||||
|
"main": "index.js",
|
||||||
|
"scripts": {
|
||||||
|
"test": "mocha -R spec"
|
||||||
|
},
|
||||||
|
"repository": {
|
||||||
|
"type": "git",
|
||||||
|
"url": "git+https://github.com/harish2704/knex-json-query.git"
|
||||||
|
},
|
||||||
|
"keywords": [
|
||||||
|
"knex",
|
||||||
|
"sql",
|
||||||
|
"json-query"
|
||||||
|
],
|
||||||
|
"author": "Harish.K <harish2704@gmail.com>",
|
||||||
|
"license": "MIT",
|
||||||
|
"bugs": {
|
||||||
|
"url": "https://github.com/harish2704/knex-json-query/issues"
|
||||||
|
},
|
||||||
|
"homepage": "https://github.com/harish2704/knex-json-query#readme",
|
||||||
|
"devDependencies": {
|
||||||
|
"knex": "^0.12.6"
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,61 @@
|
|||||||
|
/* global describe, it */
|
||||||
|
var assert = require('assert');
|
||||||
|
var knex = require('knex')({});
|
||||||
|
var knexJsonQuery = require('./');
|
||||||
|
|
||||||
|
|
||||||
|
var conditions= [
|
||||||
|
/* -----------Tests for and conditoins---------- */
|
||||||
|
{
|
||||||
|
name: 'handle simple and conditions',
|
||||||
|
input:{ f1: 10, f2: 20, f3: 30 },
|
||||||
|
output: 'select * where ("f1" = 10 and "f2" = 20 and "f3" = 30)'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: 'handle simple and condition with like statement',
|
||||||
|
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 },
|
||||||
|
output: 'select * where ("f1" between 50 and 60 and "f2" = 20 and "f3" = 30)'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: 'handle simple and condition with in statement',
|
||||||
|
input:{ f1: ['IN', [ 50, 60 ] ], f2: 20, f3: 30 },
|
||||||
|
output: 'select * where ("f1" in (50, 60) and "f2" = 20 and "f3" = 30)'
|
||||||
|
},
|
||||||
|
/* -----------Tests for or conditoins---------- */
|
||||||
|
{
|
||||||
|
name: 'handle simple or condition',
|
||||||
|
input:[ { f1: 10 }, { f2: 20 }, { f3: 30 } ],
|
||||||
|
output: 'select * where (("f1" = 10) or ("f2" = 20) or ("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 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 in statement',
|
||||||
|
input:[ { f1: ['IN',[ 50, 60 ]] }, { f2: 20 }, { f3: 30 } ],
|
||||||
|
output: 'select * where (("f1" in (50, 60)) or ("f2" = 20) or ("f3" = 30))'
|
||||||
|
},
|
||||||
|
];
|
||||||
|
|
||||||
|
|
||||||
|
describe('SQL query generation from json query', function(){
|
||||||
|
conditions.forEach(function(v){
|
||||||
|
it( 'should ' + v.name , function(){
|
||||||
|
var expectedOut = knex.where( knexJsonQuery(v.input) ) + '';
|
||||||
|
assert.equal( v.output, expectedOut );
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
Reference in New Issue
Block a user