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:
committed by
Arthur Cinader
parent
d2b5be20a8
commit
f7af48db89
@@ -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();
|
||||||
|
|||||||
@@ -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 = {}) {
|
||||||
|
|||||||
Reference in New Issue
Block a user