Support pointer in aggregate query (#4493)
This commit is contained in:
@@ -96,6 +96,27 @@ describe('Parse.Query Aggregate testing', () => {
|
|||||||
}).catch(done.fail);
|
}).catch(done.fail);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
it('group by pointer', (done) => {
|
||||||
|
const pointer1 = new TestObject();
|
||||||
|
const pointer2 = new TestObject();
|
||||||
|
const obj1 = new TestObject({ pointer: pointer1 });
|
||||||
|
const obj2 = new TestObject({ pointer: pointer2 });
|
||||||
|
const obj3 = new TestObject({ pointer: pointer1 });
|
||||||
|
const pipeline = [
|
||||||
|
{ group: { objectId: '$pointer' } }
|
||||||
|
];
|
||||||
|
Parse.Object.saveAll([pointer1, pointer2, obj1, obj2, obj3]).then(() => {
|
||||||
|
const query = new Parse.Query(TestObject);
|
||||||
|
return query.aggregate(pipeline);
|
||||||
|
}).then((results) => {
|
||||||
|
expect(results.length).toEqual(3);
|
||||||
|
expect(results.some(result => result.objectId === pointer1.id)).toEqual(true);
|
||||||
|
expect(results.some(result => result.objectId === pointer2.id)).toEqual(true);
|
||||||
|
expect(results.some(result => result.objectId === null)).toEqual(true);
|
||||||
|
done();
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
it('group sum query', (done) => {
|
it('group sum query', (done) => {
|
||||||
const options = Object.assign({}, masterKeyOptions, {
|
const options = Object.assign({}, masterKeyOptions, {
|
||||||
body: {
|
body: {
|
||||||
|
|||||||
@@ -515,12 +515,26 @@ export class MongoStorageAdapter implements StorageAdapter {
|
|||||||
}
|
}
|
||||||
|
|
||||||
aggregate(className: string, schema: any, pipeline: any, readPreference: ?string) {
|
aggregate(className: string, schema: any, pipeline: any, readPreference: ?string) {
|
||||||
|
let isPointerField = false;
|
||||||
|
pipeline = pipeline.map((stage) => {
|
||||||
|
if (stage.$group && stage.$group._id) {
|
||||||
|
const field = stage.$group._id.substring(1);
|
||||||
|
if (schema.fields[field] && schema.fields[field].type === 'Pointer') {
|
||||||
|
isPointerField = true;
|
||||||
|
stage.$group._id = `$_p_${field}`;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return stage;
|
||||||
|
});
|
||||||
readPreference = this._parseReadPreference(readPreference);
|
readPreference = this._parseReadPreference(readPreference);
|
||||||
return this._adaptiveCollection(className)
|
return this._adaptiveCollection(className)
|
||||||
.then(collection => collection.aggregate(pipeline, { readPreference, maxTimeMS: this._maxTimeMS }))
|
.then(collection => collection.aggregate(pipeline, { readPreference, maxTimeMS: this._maxTimeMS }))
|
||||||
.then(results => {
|
.then(results => {
|
||||||
results.forEach(result => {
|
results.forEach(result => {
|
||||||
if (result.hasOwnProperty('_id')) {
|
if (result.hasOwnProperty('_id')) {
|
||||||
|
if (isPointerField && result._id) {
|
||||||
|
result._id = result._id.split('$')[1];
|
||||||
|
}
|
||||||
result.objectId = result._id;
|
result.objectId = result._id;
|
||||||
delete result._id;
|
delete result._id;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -754,13 +754,13 @@ export class PostgresStorageAdapter implements StorageAdapter {
|
|||||||
debug('schemaUpgrade', { className, schema });
|
debug('schemaUpgrade', { className, schema });
|
||||||
conn = conn || this._client;
|
conn = conn || this._client;
|
||||||
const self = this;
|
const self = this;
|
||||||
|
|
||||||
return conn.tx('schema-upgrade', function * (t) {
|
return conn.tx('schema-upgrade', function * (t) {
|
||||||
const columns = yield t.map('SELECT column_name FROM information_schema.columns WHERE table_name = $<className>', { className }, a => a.column_name);
|
const columns = yield t.map('SELECT column_name FROM information_schema.columns WHERE table_name = $<className>', { className }, a => a.column_name);
|
||||||
const newColumns = Object.keys(schema.fields)
|
const newColumns = Object.keys(schema.fields)
|
||||||
.filter(item => columns.indexOf(item) === -1)
|
.filter(item => columns.indexOf(item) === -1)
|
||||||
.map(fieldName => self.addFieldIfNotExists(className, fieldName, schema.fields[fieldName], t));
|
.map(fieldName => self.addFieldIfNotExists(className, fieldName, schema.fields[fieldName], t));
|
||||||
|
|
||||||
yield t.batch(newColumns);
|
yield t.batch(newColumns);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
@@ -896,7 +896,7 @@ export class PostgresStorageAdapter implements StorageAdapter {
|
|||||||
return this._client.any('SELECT * FROM "_SCHEMA" WHERE "className"=$<className>', { className })
|
return this._client.any('SELECT * FROM "_SCHEMA" WHERE "className"=$<className>', { className })
|
||||||
.then(result => {
|
.then(result => {
|
||||||
if (result.length !== 1) {
|
if (result.length !== 1) {
|
||||||
throw undefined;
|
throw undefined;
|
||||||
}
|
}
|
||||||
return result[0].schema;
|
return result[0].schema;
|
||||||
})
|
})
|
||||||
@@ -1267,12 +1267,12 @@ export class PostgresStorageAdapter implements StorageAdapter {
|
|||||||
const createValue = Object.assign({}, query, update);
|
const createValue = Object.assign({}, query, update);
|
||||||
return this.createObject(className, schema, createValue)
|
return this.createObject(className, schema, createValue)
|
||||||
.catch(error => {
|
.catch(error => {
|
||||||
// ignore duplicate value errors as it's upsert
|
// ignore duplicate value errors as it's upsert
|
||||||
if (error.code !== Parse.Error.DUPLICATE_VALUE) {
|
if (error.code !== Parse.Error.DUPLICATE_VALUE) {
|
||||||
throw error;
|
throw error;
|
||||||
}
|
}
|
||||||
return this.findOneAndUpdate(className, schema, query, update);
|
return this.findOneAndUpdate(className, schema, query, update);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
find(className: string, schema: SchemaType, query: QueryType, { skip, limit, sort, keys }: QueryOptions) {
|
find(className: string, schema: SchemaType, query: QueryType, { skip, limit, sort, keys }: QueryOptions) {
|
||||||
@@ -1452,7 +1452,7 @@ export class PostgresStorageAdapter implements StorageAdapter {
|
|||||||
throw error;
|
throw error;
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
distinct(className: string, schema: SchemaType, query: QueryType, fieldName: string) {
|
distinct(className: string, schema: SchemaType, query: QueryType, fieldName: string) {
|
||||||
|
|||||||
Reference in New Issue
Block a user