Skip to content

Commit 2391bff

Browse files
authored
fix: Local datastore query with containedIn not working when field is an array (#1666)
1 parent e9a2cc9 commit 2391bff

File tree

3 files changed

+94
-0
lines changed

3 files changed

+94
-0
lines changed

integration/test/ParseLocalDatastoreTest.js

Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1227,6 +1227,66 @@ function runTest(controller) {
12271227
assert.equal(results[0].id, parent3.id);
12281228
});
12291229

1230+
it(`${controller.name} can handle containsAll query on array`, async () => {
1231+
const obj1 = new TestObject({ arrayField: [1, 2, 3, 4] });
1232+
const obj2 = new TestObject({ arrayField: [0, 2] });
1233+
const obj3 = new TestObject({ arrayField: [1, 2, 3] });
1234+
await Parse.Object.saveAll([obj1, obj2, obj3]);
1235+
await Parse.Object.pinAll([obj1, obj2, obj3]);
1236+
1237+
let query = new Parse.Query(TestObject);
1238+
query.containsAll('arrayField', [1, 2]);
1239+
query.fromPin();
1240+
let results = await query.find();
1241+
expect(results.length).toBe(2);
1242+
1243+
query = new Parse.Query(TestObject);
1244+
query.containsAll('arrayField', [5, 6]);
1245+
query.fromPin();
1246+
results = await query.find();
1247+
expect(results.length).toBe(0);
1248+
});
1249+
1250+
it(`${controller.name} can handle containedIn query on array`, async () => {
1251+
const obj1 = new TestObject({ arrayField: [1, 2, 3, 4] });
1252+
const obj2 = new TestObject({ arrayField: [0, 2] });
1253+
const obj3 = new TestObject({ arrayField: [1, 2, 3] });
1254+
await Parse.Object.saveAll([obj1, obj2, obj3]);
1255+
await Parse.Object.pinAll([obj1, obj2, obj3]);
1256+
1257+
let query = new Parse.Query(TestObject);
1258+
query.containedIn('arrayField', [3]);
1259+
query.fromPin();
1260+
let results = await query.find();
1261+
expect(results.length).toEqual(2);
1262+
1263+
query = new Parse.Query(TestObject);
1264+
query.containedIn('arrayField', [5]);
1265+
query.fromPin();
1266+
results = await query.find();
1267+
expect(results.length).toEqual(0);
1268+
});
1269+
1270+
it(`${controller.name} can handle notContainedIn query on array`, async () => {
1271+
const obj1 = new TestObject({ arrayField: [1, 2, 3, 4] });
1272+
const obj2 = new TestObject({ arrayField: [0, 2] });
1273+
const obj3 = new TestObject({ arrayField: [1, 2, 3] });
1274+
await Parse.Object.saveAll([obj1, obj2, obj3]);
1275+
await Parse.Object.pinAll([obj1, obj2, obj3]);
1276+
1277+
let query = new Parse.Query(TestObject);
1278+
query.notContainedIn('arrayField', [3]);
1279+
query.fromPin();
1280+
let results = await query.find();
1281+
expect(results.length).toEqual(1);
1282+
1283+
query = new Parse.Query(TestObject);
1284+
query.notContainedIn('arrayField', [5]);
1285+
query.fromPin();
1286+
results = await query.find();
1287+
expect(results.length).toEqual(3);
1288+
});
1289+
12301290
it(`${controller.name} can test equality with undefined`, async () => {
12311291
const query = new Parse.Query('BoxedNumber');
12321292
query.equalTo('number', undefined);

src/OfflineQuery.js

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,13 @@ function contains(haystack, needle) {
2424
}
2525
return false;
2626
}
27+
if (Array.isArray(needle)) {
28+
for (const need of needle) {
29+
if (contains(haystack, need)) {
30+
return true;
31+
}
32+
}
33+
}
2734
return haystack.indexOf(needle) > -1;
2835
}
2936

src/__tests__/OfflineQuery-test.js

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -610,6 +610,33 @@ describe('OfflineQuery', () => {
610610
expect(matchesQuery(q.className, message, [], q)).toBe(false);
611611
});
612612

613+
it('should support containedIn with array of pointers', () => {
614+
const profile1 = new ParseObject('Profile');
615+
profile1.id = 'yeahaw';
616+
const profile2 = new ParseObject('Profile');
617+
profile2.id = 'yes';
618+
619+
const message = new ParseObject('Message');
620+
message.id = 'O2';
621+
message.set('profiles', [profile1, profile2]);
622+
623+
let q = new ParseQuery('Message');
624+
q.containedIn('profiles', [
625+
ParseObject.fromJSON({ className: 'Profile', objectId: 'no' }),
626+
ParseObject.fromJSON({ className: 'Profile', objectId: 'yes' }),
627+
]);
628+
629+
expect(matchesQuery(q.className, message, [], q)).toBe(true);
630+
631+
q = new ParseQuery('Message');
632+
q.containedIn('profiles', [
633+
ParseObject.fromJSON({ className: 'Profile', objectId: 'no' }),
634+
ParseObject.fromJSON({ className: 'Profile', objectId: 'nope' }),
635+
]);
636+
637+
expect(matchesQuery(q.className, message, [], q)).toBe(false);
638+
});
639+
613640
it('should support notContainedIn with pointers', () => {
614641
const profile = new ParseObject('Profile');
615642
profile.id = 'abc';

0 commit comments

Comments
 (0)