Adds support for pointer/string pointers comparison in LiveQuery (#4231)
* Adds support for pointer/string pointers comparison in LiveQuery * nits * Makes sure needed is set * Update QueryTools.js * Update QueryTools.js
This commit is contained in:
@@ -495,4 +495,79 @@ describe('matchesQuery', function() {
|
|||||||
expect(matchesQuery(message, q)).toBe(false);
|
expect(matchesQuery(message, q)).toBe(false);
|
||||||
|
|
||||||
});
|
});
|
||||||
|
|
||||||
|
function pointer(className, objectId) {
|
||||||
|
return { __type: 'Pointer', className, objectId };
|
||||||
|
}
|
||||||
|
|
||||||
|
it('should support containedIn with pointers', () => {
|
||||||
|
var message = {
|
||||||
|
id: new Id('Message', 'O1'),
|
||||||
|
profile: pointer('Profile', 'abc')
|
||||||
|
};
|
||||||
|
var q = new Parse.Query('Message');
|
||||||
|
q.containedIn('profile', [Parse.Object.fromJSON({ className: 'Profile', objectId: 'abc' }),
|
||||||
|
Parse.Object.fromJSON({ className: 'Profile', objectId: 'def' })]);
|
||||||
|
expect(matchesQuery(message, q)).toBe(true);
|
||||||
|
|
||||||
|
q = new Parse.Query('Message');
|
||||||
|
q.containedIn('profile', [Parse.Object.fromJSON({ className: 'Profile', objectId: 'ghi' }),
|
||||||
|
Parse.Object.fromJSON({ className: 'Profile', objectId: 'def' })]);
|
||||||
|
expect(matchesQuery(message, q)).toBe(false);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should support notContainedIn with pointers', () => {
|
||||||
|
var message = {
|
||||||
|
id: new Id('Message', 'O1'),
|
||||||
|
profile: pointer('Profile', 'abc')
|
||||||
|
};
|
||||||
|
var q = new Parse.Query('Message');
|
||||||
|
q.notContainedIn('profile', [Parse.Object.fromJSON({ className: 'Profile', objectId: 'def' }),
|
||||||
|
Parse.Object.fromJSON({ className: 'Profile', objectId: 'ghi' })]);
|
||||||
|
expect(matchesQuery(message, q)).toBe(true);
|
||||||
|
|
||||||
|
message = {
|
||||||
|
id: new Id('Message', 'O1'),
|
||||||
|
profile: pointer('Profile', 'def')
|
||||||
|
};
|
||||||
|
q = new Parse.Query('Message');
|
||||||
|
q.notContainedIn('profile', [Parse.Object.fromJSON({ className: 'Profile', objectId: 'ghi' }),
|
||||||
|
Parse.Object.fromJSON({ className: 'Profile', objectId: 'def' })]);
|
||||||
|
expect(matchesQuery(message, q)).toBe(false);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should support containedIn queries with [objectId]', () => {
|
||||||
|
var message = {
|
||||||
|
id: new Id('Message', 'O1'),
|
||||||
|
profile: pointer('Profile', 'abc')
|
||||||
|
};
|
||||||
|
var q = new Parse.Query('Message');
|
||||||
|
q.containedIn('profile', ['abc', 'def']);
|
||||||
|
expect(matchesQuery(message, q)).toBe(true);
|
||||||
|
|
||||||
|
message = {
|
||||||
|
id: new Id('Message', 'O1'),
|
||||||
|
profile: pointer('Profile', 'ghi')
|
||||||
|
};
|
||||||
|
q = new Parse.Query('Message');
|
||||||
|
q.containedIn('profile', ['abc', 'def']);
|
||||||
|
expect(matchesQuery(message, q)).toBe(false);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should support notContainedIn queries with [objectId]', () => {
|
||||||
|
var message = {
|
||||||
|
id: new Id('Message', 'O1'),
|
||||||
|
profile: pointer('Profile', 'ghi')
|
||||||
|
};
|
||||||
|
var q = new Parse.Query('Message');
|
||||||
|
q.notContainedIn('profile', ['abc', 'def']);
|
||||||
|
expect(matchesQuery(message, q)).toBe(true);
|
||||||
|
message = {
|
||||||
|
id: new Id('Message', 'O1'),
|
||||||
|
profile: pointer('Profile', 'ghi')
|
||||||
|
};
|
||||||
|
q = new Parse.Query('Message');
|
||||||
|
q.notContainedIn('profile', ['abc', 'def', 'ghi']);
|
||||||
|
expect(matchesQuery(message, q)).toBe(false);
|
||||||
|
});
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -89,6 +89,25 @@ function queryHash(query) {
|
|||||||
return query.className + ':' + sections.join('|');
|
return query.className + ':' + sections.join('|');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* contains -- Determines if an object is contained in a list with special handling for Parse pointers.
|
||||||
|
*/
|
||||||
|
function contains(haystack: Array, needle: any): boolean {
|
||||||
|
if (needle && needle.__type && needle.__type === 'Pointer') {
|
||||||
|
for (const i in haystack) {
|
||||||
|
const ptr = haystack[i];
|
||||||
|
if (typeof ptr === 'string' && ptr === needle.objectId) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
if (ptr.className === needle.className &&
|
||||||
|
ptr.objectId === needle.objectId) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
return haystack.indexOf(needle) > -1;
|
||||||
|
}
|
||||||
/**
|
/**
|
||||||
* matchesQuery -- Determines if an object would be returned by a Parse Query
|
* matchesQuery -- Determines if an object would be returned by a Parse Query
|
||||||
* It's a lightweight, where-clause only implementation of a full query engine.
|
* It's a lightweight, where-clause only implementation of a full query engine.
|
||||||
@@ -207,12 +226,12 @@ function matchesKeyConstraints(object, key, constraints) {
|
|||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case '$in':
|
case '$in':
|
||||||
if (compareTo.indexOf(object[key]) < 0) {
|
if (!contains(compareTo, object[key])) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case '$nin':
|
case '$nin':
|
||||||
if (compareTo.indexOf(object[key]) > -1) {
|
if (contains(compareTo, object[key])) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|||||||
Reference in New Issue
Block a user