diff --git a/dist/js-data-rethinkdb.js b/dist/js-data-rethinkdb.js index 0bc46e0..e09c3c4 100644 --- a/dist/js-data-rethinkdb.js +++ b/dist/js-data-rethinkdb.js @@ -148,6 +148,16 @@ module.exports = 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') { @@ -168,6 +178,16 @@ module.exports = 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/src/index.js b/src/index.js index bfed0d3..6a7d657 100644 --- a/src/index.js +++ b/src/index.js @@ -88,6 +88,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') { @@ -108,6 +118,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 2fb5b71..e0b1a85 100644 --- a/test/findAll.spec.js +++ b/test/findAll.spec.js @@ -31,6 +31,7 @@ describe('DSRethinkDBAdapter#findAll', function() { user = yield adapter.destroy(User, user.id) assert.isFalse(!!user) }) + it('should filter users using the "in" operator', function*() { var users = yield adapter.findAll(User, { where: { @@ -54,4 +55,109 @@ describe('DSRethinkDBAdapter#findAll', function() { user = yield adapter.destroy(User, user.id) assert.isFalse(!!user) }) + + it('should filter users using the "notContains" operator', function*() { + var users = yield adapter.findAll(User, { + where: { + roles: { + 'notContains': 'user' + } + } + }) + assert.equal(users.length, 0) + + var user = yield adapter.create(User, { name: 'John', roles: [ 'admin' ] }) + + users = yield adapter.findAll(User, { + where: { + roles: { + 'notContains': 'user' + } + } + }) + assert.equal(users.length, 1) + assert.deepEqual(users[0], { id: user.id, name: 'John', roles: [ 'admin' ] }) + + user = yield adapter.destroy(User, user.id) + assert.isFalse(!!user) + }) + + it('should filter users using the "contains" operator', function*() { + var users = yield adapter.findAll(User, { + where: { + roles: { + 'contains': 'admin' + } + } + }) + assert.equal(users.length, 0) + + var user = yield adapter.create(User, { name: 'John', roles: [ 'admin' ] }) + + users = yield adapter.findAll(User, { + where: { + roles: { + 'contains': 'admin' + } + } + }) + assert.equal(users.length, 1) + assert.deepEqual(users[0], { id: user.id, name: 'John', roles: [ 'admin' ] }) + + user = yield adapter.destroy(User, user.id) + assert.isFalse(!!user) + }) + + it('should filter users using the "like" operator', function*() { + var users = yield adapter.findAll(User, { + where: { + name: { + 'like': 'J' + } + } + }) + + assert.equal(users.length, 0) + var user = yield adapter.create(User, { name: 'John' }) + + users = yield adapter.findAll(User, { + where: { + name: { + 'like': 'J' + } + } + }) + + assert.equal(users.length, 1) + assert.deepEqual(users[0], { id: user.id, name: 'John' }) + + user = yield adapter.destroy(User, user.id) + assert.isFalse(!!user) + }) + + it('should filter users using the "notLike" operator', function*() { + var users = yield adapter.findAll(User, { + where: { + name: { + 'notLike': 'x' + } + } + }) + assert.equal(users.length, 0); + + var user = yield adapter.create(User, { name: 'John' }) + + users = yield adapter.findAll(User, { + where: { + name: { + 'notLike': 'x' + } + } + }) + assert.equal(users.length, 1); + assert.deepEqual(users[0], { id: user.id, name: 'John' }) + + user = yield adapter.destroy(User, user.id) + assert.isFalse(!!user) + }) })