From 4731af52c1c8a217b1c128803fa723c2cbacbec5 Mon Sep 17 00:00:00 2001 From: Johnny Hall Date: Tue, 22 Sep 2015 21:39:10 +0100 Subject: [PATCH] Adds support for like/notLike and contains/notContains --- src/index.js | 20 ++++++++ test/findAll.spec.js | 115 +++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 135 insertions(+) diff --git a/src/index.js b/src/index.js index 44cca03..33377ba 100644 --- a/src/index.js +++ b/src/index.js @@ -90,6 +90,16 @@ class DSRethinkDBAdapter { subQuery = subQuery ? subQuery.and(row(field).default([]).setIntersection(r.expr(v).default([])).count().eq(0)) : row(field).default([]).setIntersection(r.expr(v).default([])).count().eq(0) } else if (op === 'isectNotEmpty') { subQuery = subQuery ? subQuery.and(row(field).default([]).setIntersection(r.expr(v).default([])).count().ne(0)) : row(field).default([]).setIntersection(r.expr(v).default([])).count().ne(0) + } else if (op === 'like') { + v = '(i?)' + v // Case-insensitive + subQuery = subQuery ? subQuery.and(row(field).default(null).match(v)) : row(field).default(null).match(v) + } else if (op === 'notLike') { + v = '(i?)' + v // Case-insensitive + subQuery = subQuery ? subQuery.and(row(field).default(null).match(v).not()) : row(field).default(null).match(v).not() + } else if (op === 'contains') { + subQuery = subQuery ? subQuery.and(row(field).default([]).contains(r.expr(v).default(null))) : row(field).default([]).contains(r.expr(v).default(null)) + } else if (op === 'notContains') { + subQuery = subQuery ? subQuery.and(row(field).default([]).contains(r.expr(v).default(null)).not()) : row(field).default([]).contains(r.expr(v).default(null)).not() } else if (op === 'in') { subQuery = subQuery ? subQuery.and(r.expr(v).default(r.expr([])).contains(row(field).default(null))) : r.expr(v).default(r.expr([])).contains(row(field).default(null)) } else if (op === 'notIn') { @@ -110,6 +120,16 @@ class DSRethinkDBAdapter { subQuery = subQuery ? subQuery.or(row(field).default([]).setIntersection(r.expr(v).default([])).count().eq(0)) : row(field).default([]).setIntersection(r.expr(v).default([])).count().eq(0) } else if (op === '|isectNotEmpty') { subQuery = subQuery ? subQuery.or(row(field).default([]).setIntersection(r.expr(v).default([])).count().ne(0)) : row(field).default([]).setIntersection(r.expr(v).default([])).count().ne(0) + } else if (op === '|like') { + v = '(i?)' + v // Case-insensitive + subQuery = subQuery ? subQuery.or(row(field).default(null).match(v)) : row(field).default(null).match(v) + } else if (op === '|notLike') { + v = '(i?)' + v // Case-insensitive + subQuery = subQuery ? subQuery.or(row(field).default(null).match(v).not()) : row(field).default(null).match(v).not() + } else if (op === '|contains') { + subQuery = subQuery ? subQuery.or(row(field).default([]).contains(r.expr(v).default(null))) : row(field).default([]).contains(r.expr(v).default(null)) + } else if (op === '|notContains') { + subQuery = subQuery ? subQuery.or(row(field).default([]).contains(r.expr(v).default(null)).not()) : row(field).default([]).contains(r.expr(v).default(null)).not() } else if (op === '|in') { subQuery = subQuery ? subQuery.or(r.expr(v).default(r.expr([])).contains(row(field).default(null))) : r.expr(v).default(r.expr([])).contains(row(field).default(null)) } else if (op === '|notIn') { diff --git a/test/findAll.spec.js b/test/findAll.spec.js index 9ee1f45..f875c6c 100644 --- a/test/findAll.spec.js +++ b/test/findAll.spec.js @@ -49,4 +49,119 @@ describe('DSRethinkDBAdapter#findAll', function () { assert.isFalse(!!destroyedUser); }); }); + it('should filter users using the "notContains" operator', function () { + var id; + + return adapter.findAll(User, { + where: { + roles: { + 'notContains': 'user' + } + } + }).then(function (users) { + assert.equal(users.length, 0); + return adapter.create(User, { name: 'John', roles: [ 'admin' ] }); + }).then(function (user) { + id = user.id; + return adapter.findAll(User, { + where: { + roles: { + 'notContains': 'user' + } + } + }); + }).then(function (users) { + assert.equal(users.length, 1); + assert.deepEqual(users[0], { id: id, name: 'John', roles: [ 'admin' ] }); + return adapter.destroy(User, id); + }).then(function (destroyedUser) { + assert.isFalse(!!destroyedUser); + }); + }); it('should filter users using the "contains" operator', function () { + var id; + + return adapter.findAll(User, { + where: { + roles: { + 'contains': 'admin' + } + } + }).then(function (users) { + assert.equal(users.length, 0); + return adapter.create(User, { name: 'John', roles: [ 'admin' ] }); + }).then(function (user) { + id = user.id; + return adapter.findAll(User, { + where: { + roles: { + 'contains': 'admin' + } + } + }); + }).then(function (users) { + assert.equal(users.length, 1); + assert.deepEqual(users[0], { id: id, name: 'John', roles: [ 'admin' ] }); + return adapter.destroy(User, id); + }).then(function (destroyedUser) { + assert.isFalse(!!destroyedUser); + }); + }); + it('should filter users using the "like" operator', function () { + var id; + + return adapter.findAll(User, { + where: { + name: { + 'like': 'J' + } + } + }).then(function (users) { + assert.equal(users.length, 0); + return adapter.create(User, { name: 'John' }); + }).then(function (user) { + id = user.id; + return adapter.findAll(User, { + where: { + name: { + 'like': 'J' + } + } + }); + }).then(function (users) { + assert.equal(users.length, 1); + assert.deepEqual(users[0], { id: id, name: 'John' }); + return adapter.destroy(User, id); + }).then(function (destroyedUser) { + assert.isFalse(!!destroyedUser); + }); + }); + it('should filter users using the "notLike" operator', function () { + var id; + + return adapter.findAll(User, { + where: { + name: { + 'notLike': 'x' + } + } + }).then(function (users) { + assert.equal(users.length, 0); + return adapter.create(User, { name: 'John' }); + }).then(function (user) { + id = user.id; + return adapter.findAll(User, { + where: { + name: { + 'notLike': 'x' + } + } + }); + }).then(function (users) { + assert.equal(users.length, 1); + assert.deepEqual(users[0], { id: id, name: 'John' }); + return adapter.destroy(User, id); + }).then(function (destroyedUser) { + assert.isFalse(!!destroyedUser); + }); + }); });