Skip to content

Commit

Permalink
feat: where condition support NULL value (#60)
Browse files Browse the repository at this point in the history
closes #59 and #35
  • Loading branch information
fengmk2 committed Dec 11, 2018
1 parent 6658389 commit 0d4d4ab
Show file tree
Hide file tree
Showing 5 changed files with 45 additions and 18 deletions.
6 changes: 5 additions & 1 deletion lib/operator.js
Expand Up @@ -320,7 +320,11 @@ proto._where = function(where) {
if (Array.isArray(value)) {
wheres.push('?? IN (?)');
} else {
wheres.push('?? = ?');
if (value === null || value === undefined) {
wheres.push('?? IS ?');
} else {
wheres.push('?? = ?');
}
}
values.push(key);
values.push(value);
Expand Down
14 changes: 7 additions & 7 deletions test/async.js
Expand Up @@ -440,21 +440,21 @@ describe('async.test.js', function() {
it('should get exists object without columns', async function() {
let user = await this.db.get(table, { email: prefix + 'm@fengmk2-get.com' });
assert(user);
assert.deepEqual(Object.keys(user), [ 'id', 'gmt_create', 'gmt_modified', 'name', 'email' ]);
assert.deepEqual(Object.keys(user), [ 'id', 'gmt_create', 'gmt_modified', 'name', 'email', 'mobile' ]);
assert.equal(user.name, prefix + 'fengmk2-get');

user = await this.db.get(table, { email: prefix + 'm@fengmk2-get.com' }, {
orders: [[ 'id', 'desc' ]],
});
assert(user);
assert.deepEqual(Object.keys(user), [ 'id', 'gmt_create', 'gmt_modified', 'name', 'email' ]);
assert.deepEqual(Object.keys(user), [ 'id', 'gmt_create', 'gmt_modified', 'name', 'email', 'mobile' ]);
assert.equal(user.name, prefix + 'fengmk3-get');

user = await this.db.get(table, { email: prefix + 'm@fengmk2-get.com' }, {
orders: [[ 'id', 'desc' ], 'gmt_modified', [ 'gmt_create', 'asc' ]],
});
assert(user);
assert.deepEqual(Object.keys(user), [ 'id', 'gmt_create', 'gmt_modified', 'name', 'email' ]);
assert.deepEqual(Object.keys(user), [ 'id', 'gmt_create', 'gmt_modified', 'name', 'email', 'mobile' ]);
assert.equal(user.name, prefix + 'fengmk3-get');
});

Expand All @@ -480,7 +480,7 @@ describe('async.test.js', function() {
});
assert(users);
assert.equal(users.length, 2);
assert.deepEqual(Object.keys(users[0]), [ 'id', 'gmt_create', 'gmt_modified', 'name', 'email' ]);
assert.deepEqual(Object.keys(users[0]), [ 'id', 'gmt_create', 'gmt_modified', 'name', 'email', 'mobile' ]);
assert.equal(users[0].name, prefix + 'fengmk2-get');

users = await this.db.select(table, {
Expand All @@ -490,7 +490,7 @@ describe('async.test.js', function() {
});
assert(users);
assert.equal(users.length, 1);
assert.deepEqual(Object.keys(users[0]), [ 'id', 'gmt_create', 'gmt_modified', 'name', 'email' ]);
assert.deepEqual(Object.keys(users[0]), [ 'id', 'gmt_create', 'gmt_modified', 'name', 'email', 'mobile' ]);
assert.equal(users[0].name, prefix + 'fengmk3-get');

users = await this.db.select(table, {
Expand All @@ -501,7 +501,7 @@ describe('async.test.js', function() {
});
assert(users);
assert.equal(users.length, 1);
assert.deepEqual(Object.keys(users[0]), [ 'id', 'gmt_create', 'gmt_modified', 'name', 'email' ]);
assert.deepEqual(Object.keys(users[0]), [ 'id', 'gmt_create', 'gmt_modified', 'name', 'email', 'mobile' ]);
assert.equal(users[0].name, prefix + 'fengmk2-get');

users = await this.db.select(table, {
Expand All @@ -518,7 +518,7 @@ describe('async.test.js', function() {
const users = await this.db.select(table);
assert(users);
assert.equal(users.length > 2, true);
assert.deepEqual(Object.keys(users[0]), [ 'id', 'gmt_create', 'gmt_modified', 'name', 'email' ]);
assert.deepEqual(Object.keys(users[0]), [ 'id', 'gmt_create', 'gmt_modified', 'name', 'email', 'mobile' ]);
});

it('should select with options.orders', async function() {
Expand Down
39 changes: 30 additions & 9 deletions test/client.test.js
Expand Up @@ -456,26 +456,45 @@ describe('client.test.js', function() {
email: prefix + 'm@fengmk2-get.com',
});
assert.equal(result.affectedRows, 1);

result = yield this.db.insert(table, {
name: prefix + 'fengmk-mobile-get',
email: prefix + 'm@fengmk2-mobile-get.com',
mobile: prefix + '13800000000',
});
assert.equal(result.affectedRows, 1);
});

it('should get support NULL value', function* () {
let user = yield this.db.get(table, { mobile: null });
assert(user);
assert(user.mobile === null);
user = yield this.db.get(table, { mobile: undefined });
assert(user);
assert(user.mobile === null);
user = yield this.db.get(table, { mobile: prefix + '13800000000' });
assert(user);
assert(user.mobile === prefix + '13800000000');
});

it('should get exists object without columns', function* () {
let user = yield this.db.get(table, { email: prefix + 'm@fengmk2-get.com' });
assert(user);
assert.deepEqual(Object.keys(user), [ 'id', 'gmt_create', 'gmt_modified', 'name', 'email' ]);
assert.deepEqual(Object.keys(user), [ 'id', 'gmt_create', 'gmt_modified', 'name', 'email', 'mobile' ]);
assert.equal(user.name, prefix + 'fengmk2-get');

user = yield this.db.get(table, { email: prefix + 'm@fengmk2-get.com' }, {
orders: [[ 'id', 'desc' ]],
});
assert(user);
assert.deepEqual(Object.keys(user), [ 'id', 'gmt_create', 'gmt_modified', 'name', 'email' ]);
assert.deepEqual(Object.keys(user), [ 'id', 'gmt_create', 'gmt_modified', 'name', 'email', 'mobile' ]);
assert.equal(user.name, prefix + 'fengmk3-get');

user = yield this.db.get(table, { email: prefix + 'm@fengmk2-get.com' }, {
orders: [[ 'id', 'desc' ], 'gmt_modified', [ 'gmt_create', 'asc' ]],
});
assert(user);
assert.deepEqual(Object.keys(user), [ 'id', 'gmt_create', 'gmt_modified', 'name', 'email' ]);
assert.deepEqual(Object.keys(user), [ 'id', 'gmt_create', 'gmt_modified', 'name', 'email', 'mobile' ]);
assert.equal(user.name, prefix + 'fengmk3-get');
});

Expand All @@ -501,7 +520,7 @@ describe('client.test.js', function() {
});
assert(users);
assert.equal(users.length, 2);
assert.deepEqual(Object.keys(users[0]), [ 'id', 'gmt_create', 'gmt_modified', 'name', 'email' ]);
assert.deepEqual(Object.keys(users[0]), [ 'id', 'gmt_create', 'gmt_modified', 'name', 'email', 'mobile' ]);
assert.equal(users[0].name, prefix + 'fengmk2-get');

users = yield this.db.select(table, {
Expand All @@ -511,7 +530,7 @@ describe('client.test.js', function() {
});
assert(users);
assert.equal(users.length, 1);
assert.deepEqual(Object.keys(users[0]), [ 'id', 'gmt_create', 'gmt_modified', 'name', 'email' ]);
assert.deepEqual(Object.keys(users[0]), [ 'id', 'gmt_create', 'gmt_modified', 'name', 'email', 'mobile' ]);
assert.equal(users[0].name, prefix + 'fengmk3-get');

users = yield this.db.select(table, {
Expand All @@ -522,7 +541,7 @@ describe('client.test.js', function() {
});
assert(users);
assert.equal(users.length, 1);
assert.deepEqual(Object.keys(users[0]), [ 'id', 'gmt_create', 'gmt_modified', 'name', 'email' ]);
assert.deepEqual(Object.keys(users[0]), [ 'id', 'gmt_create', 'gmt_modified', 'name', 'email', 'mobile' ]);
assert.equal(users[0].name, prefix + 'fengmk2-get');

users = yield this.db.select(table, {
Expand All @@ -539,7 +558,7 @@ describe('client.test.js', function() {
const users = yield this.db.select(table);
assert(users);
assert.equal(users.length > 2, true);
assert.deepEqual(Object.keys(users[0]), [ 'id', 'gmt_create', 'gmt_modified', 'name', 'email' ]);
assert.deepEqual(Object.keys(users[0]), [ 'id', 'gmt_create', 'gmt_modified', 'name', 'email', 'mobile' ]);
});

it('should select with options.orders', function* () {
Expand Down Expand Up @@ -725,7 +744,8 @@ describe('client.test.js', function() {
let result = yield this.db.update(table, {
name: prefix + 'fengmk2-update',
email: prefix + 'm@fengmk2-update2.com',
gmt_create: 'now()', // invalid date
// gmt_create: 'now()', // invalid date, will throw error now
gmt_create: this.db.literals.now,
gmt_modified: this.db.literals.now,
}, {
where: {
Expand All @@ -738,8 +758,9 @@ describe('client.test.js', function() {
name: prefix + 'fengmk2-update',
});
assert.equal(user.email, prefix + 'm@fengmk2-update2.com');
assert.equal(user.gmt_create, '0000-00-00 00:00:00');
// assert.equal(user.gmt_create, '0000-00-00 00:00:00');
assert(user.gmt_modified instanceof Date);
assert(user.gmt_create instanceof Date);

user.email = prefix + 'm@fengmk2-update3.com';
result = yield this.db.update(table, user, {
Expand Down
3 changes: 2 additions & 1 deletion test/operator.test.js
Expand Up @@ -15,7 +15,8 @@ describe('operator.test.js', function() {
assert.equal(op._where({}), '');
assert.equal(op._where({ id: 1 }), ' WHERE `id` = 1');
assert.equal(op._where({ id: 1, name: 'foo' }), ' WHERE `id` = 1 AND `name` = \'foo\'');
assert.equal(op._where({ id: 1, name2: null }), ' WHERE `id` = 1 AND `name2` = NULL');
assert.equal(op._where({ id: 1, name2: null }), ' WHERE `id` = 1 AND `name2` IS NULL');
assert.equal(op._where({ id: 1, name3: undefined }), ' WHERE `id` = 1 AND `name3` IS NULL');
assert.equal(op._where({ 'test.id': 1 }), ' WHERE `test`.`id` = 1');
assert.equal(op._where({ id: [ 1, 2 ], name: 'foo' }), ' WHERE `id` IN (1, 2) AND `name` = \'foo\'');
assert.equal(op._where({ id: [ 1 ], name: 'foo' }, [ 'id', 'name' ]), ' WHERE `id` IN (1) AND `name` = \'foo\'');
Expand Down
1 change: 1 addition & 0 deletions test/rds_init.sql
Expand Up @@ -4,6 +4,7 @@ CREATE TABLE IF NOT EXISTS `ali-sdk-test-user` (
`gmt_modified` datetime NOT NULL COMMENT 'modified time' DEFAULT NOW(),
`name` varchar(100) NOT NULL COMMENT 'user name',
`email` varchar(400) NOT NULL,
`mobile` varchar(50) DEFAULT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `name` (`name`),
KEY `gmt_modified` (`gmt_modified`)
Expand Down

0 comments on commit 0d4d4ab

Please sign in to comment.