Skip to content

Commit a38d748

Browse files
committed
Add _like operator, credit goes to @tony-kerz for the idea
1 parent 3f933b0 commit a38d748

File tree

5 files changed

+35
-6
lines changed

5 files changed

+35
-6
lines changed

CHANGELOG.md

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,11 @@
11
# Change Log
22

3+
## [0.8.4][2015-12-13]
4+
5+
### Added
6+
7+
* Like operator `GET /posts?title_like=json` (accepts RegExp)
8+
39
## [0.8.3][2015-11-25]
410

511
### Added

README.md

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -112,6 +112,12 @@ Add `_ne` to exclude a value
112112
GET /posts?id_ne=1
113113
```
114114

115+
Add `_like` to filter using RegExp
116+
117+
```
118+
GET /posts?title_like=server
119+
```
120+
115121
### Full-text search
116122

117123
Add `q`

package.json

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,9 @@
3535
"supertest": "~0.8.1"
3636
},
3737
"scripts": {
38-
"test": "NODE_ENV=test mocha -R spec test/**/*.js && standard",
38+
"test": "npm run test:cli && npm run test:server && standard",
39+
"test:cli": "NODE_ENV=test mocha -R spec test/cli/*.js",
40+
"test:server": "NODE_ENV=test mocha -R spec test/server/*.js",
3941
"start": "node bin",
4042
"prepush": "npm t"
4143
},

src/server/router/plural.js

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -74,7 +74,8 @@ module.exports = function (db, name) {
7474
query === '_' ||
7575
query.indexOf('_lte') !== -1 ||
7676
query.indexOf('_gte') !== -1 ||
77-
query.indexOf('_ne') !== -1
77+
query.indexOf('_ne') !== -1 ||
78+
query.indexOf('_like') !== -1
7879
) return
7980
}
8081
delete req.query[query]
@@ -109,21 +110,22 @@ module.exports = function (db, name) {
109110
.map(function (value) {
110111
var isDifferent = key.indexOf('_ne') !== -1
111112
var isRange = key.indexOf('_lte') !== -1 || key.indexOf('_gte') !== -1
112-
var path = key.replace(/(_lte|_gte|_ne)$/, '')
113-
var elementValue
113+
var isLike = key.indexOf('_like') !== -1
114+
var path = key.replace(/(_lte|_gte|_ne|_like)$/, '')
115+
var elementValue = _.get(element, path)
114116

115117
if (isRange) {
116118
var isLowerThan = key.indexOf('_gte') !== -1
117-
elementValue = _.get(element, path)
118119

119120
if (isLowerThan) {
120121
return value <= elementValue
121122
} else {
122123
return value >= elementValue
123124
}
124125
} else if (isDifferent) {
125-
elementValue = _.get(element, path)
126126
return value !== elementValue
127+
} else if (isLike) {
128+
return new RegExp(value).test(elementValue)
127129
} else {
128130
return _.matchesProperty(key, value)(element)
129131
}

test/server/plural.js

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -244,6 +244,19 @@ describe('Server', function () {
244244
})
245245
})
246246

247+
describe('GET /:resource?attr_like=', function () {
248+
it('should respond with an array that matches the like operator', function (done) {
249+
request(server)
250+
.get('/tags?body_like=hoto')
251+
.expect('Content-Type', /json/)
252+
.expect([
253+
db.tags[1],
254+
db.tags[2]
255+
])
256+
.expect(200, done)
257+
})
258+
})
259+
247260
describe('GET /:parent/:parentId/:resource', function () {
248261
it('should respond with json and corresponding nested resources', function (done) {
249262
request(server)

0 commit comments

Comments
 (0)