diff --git a/spec/QueryTools.spec.js b/spec/QueryTools.spec.js index 16b9e78433..99774473b0 100644 --- a/spec/QueryTools.spec.js +++ b/spec/QueryTools.spec.js @@ -412,4 +412,66 @@ describe('matchesQuery', function() { expect(matchesQuery(caltrainStation, q)).toBe(false); expect(matchesQuery(santaClara, q)).toBe(false); }); + + it('matches on subobjects with dot notation', function() { + var message = { + id: new Id('Message', 'O1'), + text: "content", + status: {x: "read", y: "delivered"} + }; + + var q = new Parse.Query('Message'); + q.equalTo("status.x", "read"); + expect(matchesQuery(message, q)).toBe(true); + + q = new Parse.Query('Message'); + q.equalTo("status.z", "read"); + expect(matchesQuery(message, q)).toBe(false); + + q = new Parse.Query('Message'); + q.equalTo("status.x", "delivered"); + expect(matchesQuery(message, q)).toBe(false); + + q = new Parse.Query('Message'); + q.notEqualTo("status.x", "read"); + expect(matchesQuery(message, q)).toBe(false); + + q = new Parse.Query('Message'); + q.notEqualTo("status.z", "read"); + expect(matchesQuery(message, q)).toBe(true); + + q = new Parse.Query('Message'); + q.notEqualTo("status.x", "delivered"); + expect(matchesQuery(message, q)).toBe(true); + + q = new Parse.Query('Message'); + q.exists("status.x"); + expect(matchesQuery(message, q)).toBe(true); + + q = new Parse.Query('Message'); + q.exists("status.z"); + expect(matchesQuery(message, q)).toBe(false); + + q = new Parse.Query('Message'); + q.exists("nonexistent.x"); + expect(matchesQuery(message, q)).toBe(false); + + q = new Parse.Query('Message'); + q.doesNotExist("status.x"); + expect(matchesQuery(message, q)).toBe(false); + + q = new Parse.Query('Message'); + q.doesNotExist("status.z"); + expect(matchesQuery(message, q)).toBe(true); + + q = new Parse.Query('Message'); + q.doesNotExist("nonexistent.z"); + expect(matchesQuery(message, q)).toBe(true); + + q = new Parse.Query('Message'); + q.equalTo("status.x", "read"); + q.doesNotExist("status.y"); + expect(matchesQuery(message, q)).toBe(false); + + }); }); diff --git a/src/LiveQuery/QueryTools.js b/src/LiveQuery/QueryTools.js index 6a772ca107..b8f681e34d 100644 --- a/src/LiveQuery/QueryTools.js +++ b/src/LiveQuery/QueryTools.js @@ -133,6 +133,13 @@ function matchesKeyConstraints(object, key, constraints) { if (constraints === null) { return false; } + if(key.indexOf(".") >= 0){ + // Key references a subobject + var keyComponents = key.split("."); + var subObjectKey = keyComponents[0]; + var keyRemainder = keyComponents.slice(1).join("."); + return matchesKeyConstraints(object[subObjectKey] || {}, keyRemainder, constraints); + } var i; if (key === '$or') { for (i = 0; i < constraints.length; i++) {