From 0ca5685851fb4b31f726b8a480f7988c6738d4a2 Mon Sep 17 00:00:00 2001 From: Mike Eldridge Date: Sat, 5 Dec 2015 21:41:32 -0600 Subject: [PATCH] handle null in queries via knex's whereNull family of calls --- src/index.js | 24 ++++++++++++++++++++---- test/filterQuery.spec.js | 24 ++++++++++++++++++++++++ 2 files changed, 44 insertions(+), 4 deletions(-) diff --git a/src/index.js b/src/index.js index efff30b..fa92e86 100644 --- a/src/index.js +++ b/src/index.js @@ -336,9 +336,17 @@ class DSSqlAdapter { } if (op === '==' || op === '===') { - query = query.where(field, v) + if (v === null) { + query = query.whereNull(field) + } else { + query = query.where(field, v) + } } else if (op === '!=' || op === '!==') { - query = query.where(field, '!=', v) + if (v === null) { + query = query.whereNotNull(field) + } else { + query = query.where(field, '!=', v) + } } else if (op === '>') { query = query.where(field, '>', v) } else if (op === '>=') { @@ -397,9 +405,17 @@ class DSSqlAdapter { } else if (op === 'like') { query = query.where(field, 'like', v) } else if (op === '|==' || op === '|===') { - query = query.orWhere(field, v) + if (v === null) { + query = query.orWhereNull(field) + } else { + query = query.orWhere(field, v) + } } else if (op === '|!=' || op === '|!==') { - query = query.orWhere(field, '!=', v) + if (v === null) { + query = query.orWhereNotNull(field) + } else { + query = query.orWhere(field, '!=', v) + } } else if (op === '|>') { query = query.orWhere(field, '>', v) } else if (op === '|>=') { diff --git a/test/filterQuery.spec.js b/test/filterQuery.spec.js index 2018313..b8ff969 100644 --- a/test/filterQuery.spec.js +++ b/test/filterQuery.spec.js @@ -34,4 +34,28 @@ describe('DSSqlAdapter#filterQuery', function () { var filterQuery = adapter.filterQuery(User, { orderBy: 'name' }, { query }); assert.equal(filterQuery.toString(), 'select * from `test` order by `name` asc') }); + + it('should convert == null to IS NULL', function* () { + var query = adapter.query.from('test'); + var filterQuery = adapter.filterQuery(User, { name: { '==' : null } }, { query }); + assert.equal(filterQuery.toString(), 'select * from `test` where `name` is null') + }); + + it('should convert != null to IS NOT NULL', function* () { + var query = adapter.query.from('test'); + var filterQuery = adapter.filterQuery(User, { name: { '!=' : null } }, { query }); + assert.equal(filterQuery.toString(), 'select * from `test` where `name` is not null') + }); + + it('should convert |== null to OR field IS NULL', function* () { + var query = adapter.query.from('test'); + var filterQuery = adapter.filterQuery(User, { name: 'Sean', age: { '|==' : null } }, { query }); + assert.equal(filterQuery.toString(), 'select * from `test` where `name` = \'Sean\' or `age` is null') + }); + + it('should convert |!= null to OR field IS NOT NULL', function* () { + var query = adapter.query.from('test'); + var filterQuery = adapter.filterQuery(User, { name: 'Sean', age: { '|!=' : null } }, { query }); + assert.equal(filterQuery.toString(), 'select * from `test` where `name` = \'Sean\' or `age` is not null') + }); });