Group aggregation supports multiple columns for postgres (#6483)
* Group aggregation supports multiple columns for postgres * Group aggregation supports multiple columns for postgres * Group aggregation supports multiple columns for postgres * Group aggregation supports multiple columns for postgres
This commit is contained in:
@@ -225,6 +225,32 @@ describe('Parse.Query Aggregate testing', () => {
|
|||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
it('group by multiple columns ', done => {
|
||||||
|
const obj1 = new TestObject();
|
||||||
|
const obj2 = new TestObject();
|
||||||
|
const obj3 = new TestObject();
|
||||||
|
const pipeline = [
|
||||||
|
{
|
||||||
|
group: {
|
||||||
|
objectId: {
|
||||||
|
score: '$score',
|
||||||
|
views: '$views',
|
||||||
|
},
|
||||||
|
count: { $sum: 1 },
|
||||||
|
},
|
||||||
|
},
|
||||||
|
];
|
||||||
|
Parse.Object.saveAll([obj1, obj2, obj3])
|
||||||
|
.then(() => {
|
||||||
|
const query = new Parse.Query(TestObject);
|
||||||
|
return query.aggregate(pipeline);
|
||||||
|
})
|
||||||
|
.then(results => {
|
||||||
|
expect(results.length).toEqual(5);
|
||||||
|
done();
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
it('group by date object', done => {
|
it('group by date object', done => {
|
||||||
const obj1 = new TestObject();
|
const obj1 = new TestObject();
|
||||||
const obj2 = new TestObject();
|
const obj2 = new TestObject();
|
||||||
@@ -963,25 +989,29 @@ describe('Parse.Query Aggregate testing', () => {
|
|||||||
await Parse.Object.saveAll([obj1, obj2, obj3, obj4, obj5, obj6]);
|
await Parse.Object.saveAll([obj1, obj2, obj3, obj4, obj5, obj6]);
|
||||||
|
|
||||||
expect(
|
expect(
|
||||||
(await new Parse.Query('MyCollection').aggregate([
|
(
|
||||||
{
|
await new Parse.Query('MyCollection').aggregate([
|
||||||
match: {
|
{
|
||||||
language: { $in: [null, 'en'] },
|
match: {
|
||||||
|
language: { $in: [null, 'en'] },
|
||||||
|
},
|
||||||
},
|
},
|
||||||
},
|
])
|
||||||
]))
|
)
|
||||||
.map(value => value.otherField)
|
.map(value => value.otherField)
|
||||||
.sort()
|
.sort()
|
||||||
).toEqual([1, 2, 3, 4]);
|
).toEqual([1, 2, 3, 4]);
|
||||||
|
|
||||||
expect(
|
expect(
|
||||||
(await new Parse.Query('MyCollection').aggregate([
|
(
|
||||||
{
|
await new Parse.Query('MyCollection').aggregate([
|
||||||
match: {
|
{
|
||||||
$or: [{ language: 'en' }, { language: null }],
|
match: {
|
||||||
|
$or: [{ language: 'en' }, { language: null }],
|
||||||
|
},
|
||||||
},
|
},
|
||||||
},
|
])
|
||||||
]))
|
)
|
||||||
.map(value => value.otherField)
|
.map(value => value.otherField)
|
||||||
.sort()
|
.sort()
|
||||||
).toEqual([1, 2, 3, 4]);
|
).toEqual([1, 2, 3, 4]);
|
||||||
|
|||||||
@@ -2219,20 +2219,30 @@ export class PostgresStorageAdapter implements StorageAdapter {
|
|||||||
groupValues = value;
|
groupValues = value;
|
||||||
const groupByFields = [];
|
const groupByFields = [];
|
||||||
for (const alias in value) {
|
for (const alias in value) {
|
||||||
const operation = Object.keys(value[alias])[0];
|
if (typeof value[alias] === 'string' && value[alias]) {
|
||||||
const source = transformAggregateField(value[alias][operation]);
|
const source = transformAggregateField(value[alias]);
|
||||||
if (mongoAggregateToPostgres[operation]) {
|
|
||||||
if (!groupByFields.includes(`"${source}"`)) {
|
if (!groupByFields.includes(`"${source}"`)) {
|
||||||
groupByFields.push(`"${source}"`);
|
groupByFields.push(`"${source}"`);
|
||||||
}
|
}
|
||||||
columns.push(
|
|
||||||
`EXTRACT(${
|
|
||||||
mongoAggregateToPostgres[operation]
|
|
||||||
} FROM $${index}:name AT TIME ZONE 'UTC') AS $${index +
|
|
||||||
1}:name`
|
|
||||||
);
|
|
||||||
values.push(source, alias);
|
values.push(source, alias);
|
||||||
|
columns.push(`$${index}:name AS $${index + 1}:name`);
|
||||||
index += 2;
|
index += 2;
|
||||||
|
} else {
|
||||||
|
const operation = Object.keys(value[alias])[0];
|
||||||
|
const source = transformAggregateField(value[alias][operation]);
|
||||||
|
if (mongoAggregateToPostgres[operation]) {
|
||||||
|
if (!groupByFields.includes(`"${source}"`)) {
|
||||||
|
groupByFields.push(`"${source}"`);
|
||||||
|
}
|
||||||
|
columns.push(
|
||||||
|
`EXTRACT(${
|
||||||
|
mongoAggregateToPostgres[operation]
|
||||||
|
} FROM $${index}:name AT TIME ZONE 'UTC') AS $${index +
|
||||||
|
1}:name`
|
||||||
|
);
|
||||||
|
values.push(source, alias);
|
||||||
|
index += 2;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
groupPattern = `GROUP BY $${index}:raw`;
|
groupPattern = `GROUP BY $${index}:raw`;
|
||||||
|
|||||||
Reference in New Issue
Block a user