Skip to content

Commit 4731af5

Browse files
committed
Adds support for like/notLike and contains/notContains
1 parent 2ec134d commit 4731af5

File tree

2 files changed

+135
-0
lines changed

2 files changed

+135
-0
lines changed

src/index.js

+20
Original file line numberDiff line numberDiff line change
@@ -90,6 +90,16 @@ class DSRethinkDBAdapter {
9090
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)
9191
} else if (op === 'isectNotEmpty') {
9292
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)
93+
} else if (op === 'like') {
94+
v = '(i?)' + v // Case-insensitive
95+
subQuery = subQuery ? subQuery.and(row(field).default(null).match(v)) : row(field).default(null).match(v)
96+
} else if (op === 'notLike') {
97+
v = '(i?)' + v // Case-insensitive
98+
subQuery = subQuery ? subQuery.and(row(field).default(null).match(v).not()) : row(field).default(null).match(v).not()
99+
} else if (op === 'contains') {
100+
subQuery = subQuery ? subQuery.and(row(field).default([]).contains(r.expr(v).default(null))) : row(field).default([]).contains(r.expr(v).default(null))
101+
} else if (op === 'notContains') {
102+
subQuery = subQuery ? subQuery.and(row(field).default([]).contains(r.expr(v).default(null)).not()) : row(field).default([]).contains(r.expr(v).default(null)).not()
93103
} else if (op === 'in') {
94104
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))
95105
} else if (op === 'notIn') {
@@ -110,6 +120,16 @@ class DSRethinkDBAdapter {
110120
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)
111121
} else if (op === '|isectNotEmpty') {
112122
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)
123+
} else if (op === '|like') {
124+
v = '(i?)' + v // Case-insensitive
125+
subQuery = subQuery ? subQuery.or(row(field).default(null).match(v)) : row(field).default(null).match(v)
126+
} else if (op === '|notLike') {
127+
v = '(i?)' + v // Case-insensitive
128+
subQuery = subQuery ? subQuery.or(row(field).default(null).match(v).not()) : row(field).default(null).match(v).not()
129+
} else if (op === '|contains') {
130+
subQuery = subQuery ? subQuery.or(row(field).default([]).contains(r.expr(v).default(null))) : row(field).default([]).contains(r.expr(v).default(null))
131+
} else if (op === '|notContains') {
132+
subQuery = subQuery ? subQuery.or(row(field).default([]).contains(r.expr(v).default(null)).not()) : row(field).default([]).contains(r.expr(v).default(null)).not()
113133
} else if (op === '|in') {
114134
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))
115135
} else if (op === '|notIn') {

test/findAll.spec.js

+115
Original file line numberDiff line numberDiff line change
@@ -49,4 +49,119 @@ describe('DSRethinkDBAdapter#findAll', function () {
4949
assert.isFalse(!!destroyedUser);
5050
});
5151
});
52+
it('should filter users using the "notContains" operator', function () {
53+
var id;
54+
55+
return adapter.findAll(User, {
56+
where: {
57+
roles: {
58+
'notContains': 'user'
59+
}
60+
}
61+
}).then(function (users) {
62+
assert.equal(users.length, 0);
63+
return adapter.create(User, { name: 'John', roles: [ 'admin' ] });
64+
}).then(function (user) {
65+
id = user.id;
66+
return adapter.findAll(User, {
67+
where: {
68+
roles: {
69+
'notContains': 'user'
70+
}
71+
}
72+
});
73+
}).then(function (users) {
74+
assert.equal(users.length, 1);
75+
assert.deepEqual(users[0], { id: id, name: 'John', roles: [ 'admin' ] });
76+
return adapter.destroy(User, id);
77+
}).then(function (destroyedUser) {
78+
assert.isFalse(!!destroyedUser);
79+
});
80+
}); it('should filter users using the "contains" operator', function () {
81+
var id;
82+
83+
return adapter.findAll(User, {
84+
where: {
85+
roles: {
86+
'contains': 'admin'
87+
}
88+
}
89+
}).then(function (users) {
90+
assert.equal(users.length, 0);
91+
return adapter.create(User, { name: 'John', roles: [ 'admin' ] });
92+
}).then(function (user) {
93+
id = user.id;
94+
return adapter.findAll(User, {
95+
where: {
96+
roles: {
97+
'contains': 'admin'
98+
}
99+
}
100+
});
101+
}).then(function (users) {
102+
assert.equal(users.length, 1);
103+
assert.deepEqual(users[0], { id: id, name: 'John', roles: [ 'admin' ] });
104+
return adapter.destroy(User, id);
105+
}).then(function (destroyedUser) {
106+
assert.isFalse(!!destroyedUser);
107+
});
108+
});
109+
it('should filter users using the "like" operator', function () {
110+
var id;
111+
112+
return adapter.findAll(User, {
113+
where: {
114+
name: {
115+
'like': 'J'
116+
}
117+
}
118+
}).then(function (users) {
119+
assert.equal(users.length, 0);
120+
return adapter.create(User, { name: 'John' });
121+
}).then(function (user) {
122+
id = user.id;
123+
return adapter.findAll(User, {
124+
where: {
125+
name: {
126+
'like': 'J'
127+
}
128+
}
129+
});
130+
}).then(function (users) {
131+
assert.equal(users.length, 1);
132+
assert.deepEqual(users[0], { id: id, name: 'John' });
133+
return adapter.destroy(User, id);
134+
}).then(function (destroyedUser) {
135+
assert.isFalse(!!destroyedUser);
136+
});
137+
});
138+
it('should filter users using the "notLike" operator', function () {
139+
var id;
140+
141+
return adapter.findAll(User, {
142+
where: {
143+
name: {
144+
'notLike': 'x'
145+
}
146+
}
147+
}).then(function (users) {
148+
assert.equal(users.length, 0);
149+
return adapter.create(User, { name: 'John' });
150+
}).then(function (user) {
151+
id = user.id;
152+
return adapter.findAll(User, {
153+
where: {
154+
name: {
155+
'notLike': 'x'
156+
}
157+
}
158+
});
159+
}).then(function (users) {
160+
assert.equal(users.length, 1);
161+
assert.deepEqual(users[0], { id: id, name: 'John' });
162+
return adapter.destroy(User, id);
163+
}).then(function (destroyedUser) {
164+
assert.isFalse(!!destroyedUser);
165+
});
166+
});
52167
});

0 commit comments

Comments
 (0)