* Adding elemMatch and nor * lint * adding test * adding edge test * postgres support * clean up * empty test
This commit is contained in:
committed by
Diamond Lewis
parent
ad244d6654
commit
c0f86ae1d1
@@ -754,6 +754,109 @@ describe('Parse.Query testing', () => {
|
|||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
it('containedBy pointer array', (done) => {
|
||||||
|
const objects = Array.from(Array(10).keys()).map((idx) => {
|
||||||
|
const obj = new Parse.Object('Object');
|
||||||
|
obj.set('key', idx);
|
||||||
|
return obj;
|
||||||
|
});
|
||||||
|
|
||||||
|
const parent = new Parse.Object('Parent');
|
||||||
|
const parent2 = new Parse.Object('Parent');
|
||||||
|
const parent3 = new Parse.Object('Parent');
|
||||||
|
|
||||||
|
Parse.Object.saveAll(objects).then(() => {
|
||||||
|
// [0, 1, 2]
|
||||||
|
parent.set('objects', objects.slice(0, 3));
|
||||||
|
|
||||||
|
const shift = objects.shift();
|
||||||
|
// [2, 0]
|
||||||
|
parent2.set('objects', [objects[1], shift]);
|
||||||
|
|
||||||
|
// [1, 2, 3, 4]
|
||||||
|
parent3.set('objects', objects.slice(1, 4));
|
||||||
|
|
||||||
|
return Parse.Object.saveAll([parent, parent2, parent3]);
|
||||||
|
}).then(() => {
|
||||||
|
// [1, 2, 3, 4, 5, 6, 7, 8, 9]
|
||||||
|
const pointers = objects.map(object => object.toPointer());
|
||||||
|
|
||||||
|
// Return all Parent where all parent.objects are contained in objects
|
||||||
|
return rp.get({
|
||||||
|
url: Parse.serverURL + "/classes/Parent",
|
||||||
|
json: {
|
||||||
|
where: {
|
||||||
|
objects: {
|
||||||
|
$containedBy: pointers
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
headers: {
|
||||||
|
'X-Parse-Application-Id': Parse.applicationId,
|
||||||
|
'X-Parse-Javascript-Key': Parse.javaScriptKey
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}).then((results) => {
|
||||||
|
expect(results.results[0].objectId).not.toBeUndefined();
|
||||||
|
expect(results.results[0].objectId).toBe(parent3.id);
|
||||||
|
expect(results.results.length).toBe(1);
|
||||||
|
done();
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
|
||||||
|
it('containedBy number array', (done) => {
|
||||||
|
const options = Object.assign({}, masterKeyOptions, {
|
||||||
|
body: {
|
||||||
|
where: { numbers: { $containedBy: [1, 2, 3, 4, 5, 6, 7, 8, 9] } },
|
||||||
|
}
|
||||||
|
});
|
||||||
|
const obj1 = new TestObject({ numbers: [0, 1, 2] });
|
||||||
|
const obj2 = new TestObject({ numbers: [2, 0] });
|
||||||
|
const obj3 = new TestObject({ numbers: [1, 2, 3, 4] });
|
||||||
|
Parse.Object.saveAll([obj1, obj2, obj3]).then(() => {
|
||||||
|
return rp.get(Parse.serverURL + "/classes/TestObject", options);
|
||||||
|
}).then((results) => {
|
||||||
|
expect(results.results[0].objectId).not.toBeUndefined();
|
||||||
|
expect(results.results[0].objectId).toBe(obj3.id);
|
||||||
|
expect(results.results.length).toBe(1);
|
||||||
|
done();
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
it('containedBy empty array', (done) => {
|
||||||
|
const options = Object.assign({}, masterKeyOptions, {
|
||||||
|
body: {
|
||||||
|
where: { numbers: { $containedBy: [] } },
|
||||||
|
}
|
||||||
|
});
|
||||||
|
const obj1 = new TestObject({ numbers: [0, 1, 2] });
|
||||||
|
const obj2 = new TestObject({ numbers: [2, 0] });
|
||||||
|
const obj3 = new TestObject({ numbers: [1, 2, 3, 4] });
|
||||||
|
Parse.Object.saveAll([obj1, obj2, obj3]).then(() => {
|
||||||
|
return rp.get(Parse.serverURL + "/classes/TestObject", options);
|
||||||
|
}).then((results) => {
|
||||||
|
expect(results.results.length).toBe(0);
|
||||||
|
done();
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
it('containedBy invalid query', (done) => {
|
||||||
|
const options = Object.assign({}, masterKeyOptions, {
|
||||||
|
body: {
|
||||||
|
where: { objects: { $containedBy: 1234 } },
|
||||||
|
}
|
||||||
|
});
|
||||||
|
const obj = new TestObject();
|
||||||
|
obj.save().then(() => {
|
||||||
|
return rp.get(Parse.serverURL + "/classes/TestObject", options);
|
||||||
|
}).then(done.fail).catch((error) => {
|
||||||
|
equal(error.error.code, Parse.Error.INVALID_JSON);
|
||||||
|
equal(error.error.error, 'bad $containedBy: should be an array');
|
||||||
|
done();
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
const BoxedNumber = Parse.Object.extend({
|
const BoxedNumber = Parse.Object.extend({
|
||||||
className: "BoxedNumber"
|
className: "BoxedNumber"
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -290,6 +290,9 @@ function transformQueryKeyValue(className, key, value, schema) {
|
|||||||
if (transformedConstraint.$text) {
|
if (transformedConstraint.$text) {
|
||||||
return {key: '$text', value: transformedConstraint.$text};
|
return {key: '$text', value: transformedConstraint.$text};
|
||||||
}
|
}
|
||||||
|
if (transformedConstraint.$elemMatch) {
|
||||||
|
return { key: '$nor', value: [{ [key]: transformedConstraint }] };
|
||||||
|
}
|
||||||
return {key, value: transformedConstraint};
|
return {key, value: transformedConstraint};
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -797,6 +800,19 @@ function transformConstraint(constraint, field) {
|
|||||||
answer[key] = s;
|
answer[key] = s;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case '$containedBy': {
|
||||||
|
const arr = constraint[key];
|
||||||
|
if (!(arr instanceof Array)) {
|
||||||
|
throw new Parse.Error(
|
||||||
|
Parse.Error.INVALID_JSON,
|
||||||
|
`bad $containedBy: should be an array`
|
||||||
|
);
|
||||||
|
}
|
||||||
|
answer.$elemMatch = {
|
||||||
|
$nin: arr.map(transformer)
|
||||||
|
};
|
||||||
|
break;
|
||||||
|
}
|
||||||
case '$options':
|
case '$options':
|
||||||
answer[key] = constraint[key];
|
answer[key] = constraint[key];
|
||||||
break;
|
break;
|
||||||
|
|||||||
@@ -446,6 +446,20 @@ const buildWhereClause = ({ schema, query, index }): WhereClause => {
|
|||||||
index += 1;
|
index += 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (fieldValue.$containedBy) {
|
||||||
|
const arr = fieldValue.$containedBy;
|
||||||
|
if (!(arr instanceof Array)) {
|
||||||
|
throw new Parse.Error(
|
||||||
|
Parse.Error.INVALID_JSON,
|
||||||
|
`bad $containedBy: should be an array`
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
patterns.push(`$${index}:name <@ $${index + 1}::jsonb`);
|
||||||
|
values.push(fieldName, JSON.stringify(arr));
|
||||||
|
index += 2;
|
||||||
|
}
|
||||||
|
|
||||||
if (fieldValue.$text) {
|
if (fieldValue.$text) {
|
||||||
const search = fieldValue.$text.$search;
|
const search = fieldValue.$text.$search;
|
||||||
let language = 'english';
|
let language = 'english';
|
||||||
|
|||||||
Reference in New Issue
Block a user