Fix/3678 overloaded query constraints (#3723)

* Added failing test

* Updated test description

* Properly handle equalities with additional operator constraints

* adds continuation to silence rejected promises

* Wrap json parsing

* nits
This commit is contained in:
Florent Vilmart
2017-04-23 18:10:17 -04:00
committed by Arthur Cinader
parent d2b5be20a8
commit f7af48db89
2 changed files with 70 additions and 0 deletions

View File

@@ -1891,6 +1891,41 @@ describe('Parse.Query testing', () => {
}); });
}); });
it("equalTo on same column as $dontSelect should not break $dontSelect functionality (#3678)", function(done) {
var AuthorObject = Parse.Object.extend("Author");
var BlockedObject = Parse.Object.extend("Blocked");
var PostObject = Parse.Object.extend("Post");
var postAuthor = null;
var requestUser = null;
return new AuthorObject({ name: "Julius"}).save().then((user) => {
postAuthor = user;
return new AuthorObject({ name: "Bob"}).save();
}).then((user) => {
requestUser = user;
var objects = [
new PostObject({ author: postAuthor, title: "Lorem ipsum" }),
new PostObject({ author: requestUser, title: "Kafka" }),
new PostObject({ author: requestUser, title: "Brown fox" }),
new BlockedObject({ blockedBy: postAuthor, blockedUser: requestUser})
];
return Parse.Object.saveAll(objects);
}).then(() => {
var banListQuery = new Parse.Query(BlockedObject);
banListQuery.equalTo("blockedUser", requestUser);
return new Parse.Query(PostObject)
.equalTo("author", postAuthor)
.doesNotMatchKeyInQuery("author", "blockedBy", banListQuery)
.find()
.then((r) => {
expect(r.length).toEqual(0);
done();
}, done.fail);
})
});
it("object with length", function(done) { it("object with length", function(done) {
var TestObject = Parse.Object.extend("TestObject"); var TestObject = Parse.Object.extend("TestObject");
var obj = new TestObject(); var obj = new TestObject();

View File

@@ -169,6 +169,8 @@ RestQuery.prototype.buildRestWhere = function() {
return this.replaceInQuery(); return this.replaceInQuery();
}).then(() => { }).then(() => {
return this.replaceNotInQuery(); return this.replaceNotInQuery();
}).then(() => {
return this.replaceEquality();
}); });
} }
@@ -438,6 +440,39 @@ const cleanResultAuthData = function (result) {
} }
}; };
const replaceEqualityConstraint = (constraint) => {
if (typeof constraint !== 'object') {
return constraint;
}
const equalToObject = {};
let hasDirectConstraint = false;
let hasOperatorConstraint = false;
for (const key in constraint) {
if (key.indexOf('$') !== 0) {
hasDirectConstraint = true;
equalToObject[key] = constraint[key];
} else {
hasOperatorConstraint = true;
}
}
if (hasDirectConstraint && hasOperatorConstraint) {
constraint['$eq'] = equalToObject;
Object.keys(equalToObject).forEach((key) => {
delete constraint[key];
});
}
return constraint;
}
RestQuery.prototype.replaceEquality = function() {
if (typeof this.restWhere !== 'object') {
return;
}
for (const key in this.restWhere) {
this.restWhere[key] = replaceEqualityConstraint(this.restWhere[key]);
}
}
// Returns a promise for whether it was successful. // Returns a promise for whether it was successful.
// Populates this.response with an object that only has 'results'. // Populates this.response with an object that only has 'results'.
RestQuery.prototype.runFind = function(options = {}) { RestQuery.prototype.runFind = function(options = {}) {