Skip to content

Commit f997092

Browse files
committed
Merge pull request #55 from js-data/develop
Merge branch 'develop' into master
2 parents 9580c95 + 7b1f53a commit f997092

File tree

2 files changed

+50
-17
lines changed

2 files changed

+50
-17
lines changed

src/index.js

Lines changed: 25 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -159,27 +159,33 @@ function loadWithRelations (items, resourceConfig, options) {
159159
})
160160
} else if (def.type === 'belongsTo' || (def.type === 'hasOne' && def.localKey)) {
161161
if (instance) {
162-
task = this.find(resourceConfig.getResource(relationName), DSUtils.get(instance, def.localKey), __options).then(relatedItem => {
163-
instance[def.localField] = relatedItem
164-
return relatedItem
165-
})
162+
let id = DSUtils.get(instance, def.localKey)
163+
if (id) {
164+
task = this.find(resourceConfig.getResource(relationName), DSUtils.get(instance, def.localKey), __options).then(relatedItem => {
165+
instance[def.localField] = relatedItem
166+
return relatedItem
167+
})
168+
}
166169
} else {
167-
task = this.findAll(resourceConfig.getResource(relationName), {
168-
where: {
169-
[relationDef.idAttribute]: {
170-
'in': DSUtils.filter(items.map(function (item) { return DSUtils.get(item, def.localKey) }), x => x)
171-
}
172-
}
173-
}, __options).then(relatedItems => {
174-
DSUtils.forEach(items, item => {
175-
DSUtils.forEach(relatedItems, relatedItem => {
176-
if (relatedItem[relationDef.idAttribute] === item[def.localKey]) {
177-
item[def.localField] = relatedItem
170+
let ids = DSUtils.filter(items.map(function (item) { return DSUtils.get(item, def.localKey) }), x => x)
171+
if (ids.length) {
172+
task = this.findAll(resourceConfig.getResource(relationName), {
173+
where: {
174+
[relationDef.idAttribute]: {
175+
'in': ids
178176
}
177+
}
178+
}, __options).then(relatedItems => {
179+
DSUtils.forEach(items, item => {
180+
DSUtils.forEach(relatedItems, relatedItem => {
181+
if (relatedItem[relationDef.idAttribute] === item[def.localKey]) {
182+
item[def.localField] = relatedItem
183+
}
184+
})
179185
})
186+
return relatedItems
180187
})
181-
return relatedItems
182-
})
188+
}
183189
}
184190
}
185191

@@ -404,6 +410,8 @@ class DSSqlAdapter {
404410
}
405411
} else if (op === 'like') {
406412
query = query.where(field, 'like', v)
413+
} else if (op === '|like') {
414+
query = query.orWhere(field, 'like', v)
407415
} else if (op === '|==' || op === '|===') {
408416
if (v === null) {
409417
query = query.orWhereNull(field)

test/findAll.spec.js

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,31 @@ describe('DSSqlAdapter#findAll', function () {
2121
assert.equal(users[0].profileId, profile1.id);
2222
});
2323

24+
it('should filter using the "like" operator', function* () {
25+
let user1 = yield adapter.create(User, {name: 'Sean'});
26+
let post1 = yield adapter.create(Post, {userId: user1.id, content: 'foo'});
27+
let post2 = yield adapter.create(Post, {userId: user1.id, content: 'bar'});
28+
let post3 = yield adapter.create(Post, {userId: user1.id, content: 'baz'});
29+
30+
let posts = yield adapter.findAll(Post, {where: {'content': {'like': 'ba%'}}});
31+
assert.equal(posts.length, 2);
32+
assert.equal(posts[0].content, 'bar');
33+
assert.equal(posts[1].content, 'baz');
34+
});
35+
36+
it('should filter using the "or like" operator', function* () {
37+
let user1 = yield adapter.create(User, {name: 'Sean'});
38+
let post1 = yield adapter.create(Post, {userId: user1.id, content: 'foo'});
39+
let post2 = yield adapter.create(Post, {userId: user1.id, content: 'bar'});
40+
let post3 = yield adapter.create(Post, {userId: user1.id, content: 'baz'});
41+
42+
let posts = yield adapter.findAll(Post, {where: {'content': {'like': 'ba%', '|like': 'f%'}}});
43+
assert.equal(posts.length, 3);
44+
assert.equal(posts[0].content, 'foo');
45+
assert.equal(posts[1].content, 'bar');
46+
assert.equal(posts[2].content, 'baz');
47+
});
48+
2449
describe('near', function () {
2550
beforeEach(function * () {
2651
this.googleAddress = yield adapter.create(Address, { name : 'Google', latitude: 37.4219999, longitude: -122.0862515 });

0 commit comments

Comments
 (0)