Add whereIsNull, whereIsNotNull, orWhereIsNull, orWhereIsNotNull methods
This commit is contained in:
parent
5f974da5d9
commit
1a0ff7ff15
@ -86,12 +86,6 @@ var h = {
|
|||||||
|
|
||||||
for(i=0; i< l; i++)
|
for(i=0; i< l; i++)
|
||||||
{
|
{
|
||||||
// Recurse for nested arrays
|
|
||||||
if (Array.isArray(arr[i]))
|
|
||||||
{
|
|
||||||
return h.regexInArray(arr[i], pattern);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Short circuit if any items match
|
// Short circuit if any items match
|
||||||
if (pattern.test(arr[i])) return true;
|
if (pattern.test(arr[i])) return true;
|
||||||
}
|
}
|
||||||
|
@ -187,6 +187,25 @@ var QueryBuilder = function(driver, adapter) {
|
|||||||
_p.mixedSet('whereMap', 'both', args.key, args.val);
|
_p.mixedSet('whereMap', 'both', args.key, args.val);
|
||||||
_p.mixedSet('whereValues', 'value', args.key, args.val);
|
_p.mixedSet('whereValues', 'value', args.key, args.val);
|
||||||
},
|
},
|
||||||
|
fixConjunction: function(conj) {
|
||||||
|
var lastItem = state.queryMap[state.queryMap.length - 1];
|
||||||
|
var conjunctionList = helpers.arrayPluck(state.queryMap, 'conjunction');
|
||||||
|
|
||||||
|
if (state.queryMap.length === 0 || ( ! helpers.regexInArray(conjunctionList, /^ ?WHERE/i)))
|
||||||
|
{
|
||||||
|
conj = " WHERE ";
|
||||||
|
}
|
||||||
|
else if (lastItem.type === 'groupStart')
|
||||||
|
{
|
||||||
|
conj = '';
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
conj = ' ' + conj + ' ';
|
||||||
|
}
|
||||||
|
|
||||||
|
return conj;
|
||||||
|
},
|
||||||
where: function(key, val, defaultConj) {
|
where: function(key, val, defaultConj) {
|
||||||
// Normalize key and value and insert into state.whereMap
|
// Normalize key and value and insert into state.whereMap
|
||||||
_p.whereMixedSet(key, val);
|
_p.whereMixedSet(key, val);
|
||||||
@ -201,24 +220,8 @@ var QueryBuilder = function(driver, adapter) {
|
|||||||
// Simple key value, or an operator?
|
// Simple key value, or an operator?
|
||||||
item += (fieldArray.length === 1 || fieldArray[1] === '') ? '=?' : " " + fieldArray[1] + " ?";
|
item += (fieldArray.length === 1 || fieldArray[1] === '') ? '=?' : " " + fieldArray[1] + " ?";
|
||||||
|
|
||||||
var firstItem = state.queryMap[0],
|
|
||||||
lastItem = state.queryMap[state.queryMap.length - 1];
|
|
||||||
|
|
||||||
// Determine the correct conjunction
|
// Determine the correct conjunction
|
||||||
var conjunctionList = helpers.arrayPluck(state.queryMap, 'conjunction');
|
var conj = _p.fixConjunction(defaultConj);
|
||||||
var conj = defaultConj;
|
|
||||||
if (state.queryMap.length === 0 || ( ! helpers.regexInArray(conjunctionList, /^ ?WHERE/i)))
|
|
||||||
{
|
|
||||||
conj = " WHERE ";
|
|
||||||
}
|
|
||||||
else if (lastItem.type === 'groupStart')
|
|
||||||
{
|
|
||||||
conj = '';
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
conj = ' ' + conj + ' ';
|
|
||||||
}
|
|
||||||
|
|
||||||
_p.appendMap(conj, item, 'where');
|
_p.appendMap(conj, item, 'where');
|
||||||
|
|
||||||
@ -226,6 +229,13 @@ var QueryBuilder = function(driver, adapter) {
|
|||||||
state.whereMap = {};
|
state.whereMap = {};
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
|
whereNull: function(field, stmt, conj) {
|
||||||
|
conj = conj || 'AND';
|
||||||
|
field = driver.quoteIdentifiers(field);
|
||||||
|
var item = field + ' ' + stmt;
|
||||||
|
|
||||||
|
_p.appendMap(_p.fixConjunction(conj), item, 'whereNull');
|
||||||
|
},
|
||||||
having: function(/*key, val, conj*/) {
|
having: function(/*key, val, conj*/) {
|
||||||
var args = getArgs('key:string|object, [val]:string|number, [conj]:string', arguments);
|
var args = getArgs('key:string|object, [val]:string|number, [conj]:string', arguments);
|
||||||
args.conj = args.conj || 'AND';
|
args.conj = args.conj || 'AND';
|
||||||
@ -521,6 +531,50 @@ var QueryBuilder = function(driver, adapter) {
|
|||||||
return this;
|
return this;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Select a field that is Null
|
||||||
|
*
|
||||||
|
* @param {String} field - The name of the field that has a NULL value
|
||||||
|
* @return this
|
||||||
|
*/
|
||||||
|
this.whereIsNull = function(field) {
|
||||||
|
_p.whereNull(field, 'IS NULL', 'AND');
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Specify that a field IS NOT NULL
|
||||||
|
*
|
||||||
|
* @param {String} field
|
||||||
|
* @return this
|
||||||
|
*/
|
||||||
|
this.whereIsNotNull = function(field) {
|
||||||
|
_p.whereNull(field, 'IS NOT NULL', 'AND');
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Field is null prefixed with 'OR'
|
||||||
|
*
|
||||||
|
* @param {String} field
|
||||||
|
* @return this
|
||||||
|
*/
|
||||||
|
this.orWhereIsNull = function(field) {
|
||||||
|
_p.whereNull(field, 'IS NULL', 'OR');
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Field is not null prefixed with 'OR'
|
||||||
|
*
|
||||||
|
* @param {String} field
|
||||||
|
* @return this
|
||||||
|
*/
|
||||||
|
this.orWhereIsNotNull = function(field) {
|
||||||
|
_p.whereNull(field, 'IS NOT NULL', 'OR');
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Set a 'where in' clause
|
* Set a 'where in' clause
|
||||||
*
|
*
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "ci-node-query",
|
"name": "ci-node-query",
|
||||||
"version": "1.1.1",
|
"version": "1.2.0",
|
||||||
"description": "A query builder for node based on the one in CodeIgniter",
|
"description": "A query builder for node based on the one in CodeIgniter",
|
||||||
"author": "Timothy J Warren <tim@timshomepage.net>",
|
"author": "Timothy J Warren <tim@timshomepage.net>",
|
||||||
"engines": {
|
"engines": {
|
||||||
|
@ -113,6 +113,36 @@ module.exports = (function QueryBuilderTestBase() {
|
|||||||
.where('id >', 1)
|
.where('id >', 1)
|
||||||
.limit(3)
|
.limit(3)
|
||||||
.get(base.testCallback.bind(this, test));
|
.get(base.testCallback.bind(this, test));
|
||||||
|
},
|
||||||
|
'Select where IS NOT NULL': function(test) {
|
||||||
|
test.expect(1);
|
||||||
|
base.qb.select('id', 'key as k', 'val')
|
||||||
|
.from('create_test ct')
|
||||||
|
.whereIsNotNull('id')
|
||||||
|
.get(base.testCallback.bind(this, test));
|
||||||
|
},
|
||||||
|
'Select where IS NULL': function(test) {
|
||||||
|
test.expect(1);
|
||||||
|
base.qb.select('id', 'key as k', 'val')
|
||||||
|
.from('create_test ct')
|
||||||
|
.whereIsNull('id')
|
||||||
|
.get(base.testCallback.bind(this, test));
|
||||||
|
},
|
||||||
|
'Select where OR IS NOT NULL': function(test) {
|
||||||
|
test.expect(1);
|
||||||
|
base.qb.select('id', 'key as k', 'val')
|
||||||
|
.from('create_test ct')
|
||||||
|
.whereIsNull('id')
|
||||||
|
.orWhereIsNotNull('id')
|
||||||
|
.get(base.testCallback.bind(this, test));
|
||||||
|
},
|
||||||
|
'Select where OR IS NULL': function(test) {
|
||||||
|
test.expect(1);
|
||||||
|
base.qb.select('id', 'key as k', 'val')
|
||||||
|
.from('create_test ct')
|
||||||
|
.where('id', 3)
|
||||||
|
.orWhereIsNull('id')
|
||||||
|
.get(base.testCallback.bind(this, test));
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
// ! Grouping tests
|
// ! Grouping tests
|
||||||
|
Loading…
Reference in New Issue
Block a user