Skip to content

Commit 02e2518

Browse files
sum avg (#7502)
* Support sum and average aggregations.
1 parent cbfd14c commit 02e2518

File tree

14 files changed

+556
-249
lines changed

14 files changed

+556
-249
lines changed

.changeset/beige-oranges-eat.md

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
---
2+
"@firebase/firestore": minor
3+
"firebase": minor
4+
---
5+
6+
Support sum and average aggregations.

common/api-review/firestore-lite.api.md

Lines changed: 20 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,11 +19,15 @@ export type AddPrefixToKeys<Prefix extends string, T extends Record<string, unkn
1919

2020
// @public
2121
export class AggregateField<T> {
22+
readonly aggregateType: AggregateType;
2223
readonly type = "AggregateField";
2324
}
2425

2526
// @public
26-
export type AggregateFieldType = AggregateField<number | null>;
27+
export function aggregateFieldEqual(left: AggregateField<unknown>, right: AggregateField<unknown>): boolean;
28+
29+
// @public
30+
export type AggregateFieldType = ReturnType<typeof sum> | ReturnType<typeof average> | ReturnType<typeof count>;
2731

2832
// @public
2933
export class AggregateQuerySnapshot<AggregateSpecType extends AggregateSpec, AppModelType = DocumentData, DbModelType extends DocumentData = DocumentData> {
@@ -46,6 +50,9 @@ export type AggregateSpecData<T extends AggregateSpec> = {
4650
[P in keyof T]: T[P] extends AggregateField<infer U> ? U : never;
4751
};
4852

53+
// @public
54+
export type AggregateType = 'count' | 'avg' | 'sum';
55+
4956
// @public
5057
export function and(...queryConstraints: QueryFilterConstraint[]): QueryCompositeFilterConstraint;
5158

@@ -55,6 +62,9 @@ export function arrayRemove(...elements: unknown[]): FieldValue;
5562
// @public
5663
export function arrayUnion(...elements: unknown[]): FieldValue;
5764

65+
// @public
66+
export function average(field: string | FieldPath): AggregateField<number | null>;
67+
5868
// @public
5969
export class Bytes {
6070
static fromBase64String(base64: string): Bytes;
@@ -95,6 +105,9 @@ export function connectFirestoreEmulator(firestore: Firestore, host: string, por
95105
mockUserToken?: EmulatorMockTokenOptions | string;
96106
}): void;
97107

108+
// @public
109+
export function count(): AggregateField<number>;
110+
98111
// @public
99112
export function deleteDoc<AppModelType, DbModelType extends DocumentData>(reference: DocumentReference<AppModelType, DbModelType>): Promise<void>;
100113

@@ -201,6 +214,9 @@ export class GeoPoint {
201214
};
202215
}
203216

217+
// @public
218+
export function getAggregate<AggregateSpecType extends AggregateSpec, AppModelType, DbModelType extends DocumentData>(query: Query<AppModelType, DbModelType>, aggregateSpec: AggregateSpecType): Promise<AggregateQuerySnapshot<AggregateSpecType, AppModelType, DbModelType>>;
219+
204220
// @public
205221
export function getCount<AppModelType, DbModelType extends DocumentData>(query: Query<AppModelType, DbModelType>): Promise<AggregateQuerySnapshot<{
206222
count: AggregateField<number>;
@@ -388,6 +404,9 @@ export function startAt<AppModelType, DbModelType extends DocumentData>(snapshot
388404
// @public
389405
export function startAt(...fieldValues: unknown[]): QueryStartAtConstraint;
390406

407+
// @public
408+
export function sum(field: string | FieldPath): AggregateField<number>;
409+
391410
// @public
392411
export function terminate(firestore: Firestore): Promise<void>;
393412

common/api-review/firestore.api.md

Lines changed: 20 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,11 +19,15 @@ export type AddPrefixToKeys<Prefix extends string, T extends Record<string, unkn
1919

2020
// @public
2121
export class AggregateField<T> {
22+
readonly aggregateType: AggregateType;
2223
readonly type = "AggregateField";
2324
}
2425

2526
// @public
26-
export type AggregateFieldType = AggregateField<number | null>;
27+
export function aggregateFieldEqual(left: AggregateField<unknown>, right: AggregateField<unknown>): boolean;
28+
29+
// @public
30+
export type AggregateFieldType = ReturnType<typeof sum> | ReturnType<typeof average> | ReturnType<typeof count>;
2731

2832
// @public
2933
export class AggregateQuerySnapshot<AggregateSpecType extends AggregateSpec, AppModelType = DocumentData, DbModelType extends DocumentData = DocumentData> {
@@ -46,6 +50,9 @@ export type AggregateSpecData<T extends AggregateSpec> = {
4650
[P in keyof T]: T[P] extends AggregateField<infer U> ? U : never;
4751
};
4852

53+
// @public
54+
export type AggregateType = 'count' | 'avg' | 'sum';
55+
4956
// @public
5057
export function and(...queryConstraints: QueryFilterConstraint[]): QueryCompositeFilterConstraint;
5158

@@ -55,6 +62,9 @@ export function arrayRemove(...elements: unknown[]): FieldValue;
5562
// @public
5663
export function arrayUnion(...elements: unknown[]): FieldValue;
5764

65+
// @public
66+
export function average(field: string | FieldPath): AggregateField<number | null>;
67+
5868
// @public
5969
export class Bytes {
6070
static fromBase64String(base64: string): Bytes;
@@ -101,6 +111,9 @@ export function connectFirestoreEmulator(firestore: Firestore, host: string, por
101111
mockUserToken?: EmulatorMockTokenOptions | string;
102112
}): void;
103113

114+
// @public
115+
export function count(): AggregateField<number>;
116+
104117
// @public
105118
export function deleteAllPersistentCacheIndexes(indexManager: PersistentCacheIndexManager): void;
106119

@@ -260,6 +273,9 @@ export class GeoPoint {
260273
};
261274
}
262275

276+
// @public
277+
export function getAggregateFromServer<AggregateSpecType extends AggregateSpec, AppModelType, DbModelType extends DocumentData>(query: Query<AppModelType, DbModelType>, aggregateSpec: AggregateSpecType): Promise<AggregateQuerySnapshot<AggregateSpecType, AppModelType, DbModelType>>;
278+
263279
// @public
264280
export function getCountFromServer<AppModelType, DbModelType extends DocumentData>(query: Query<AppModelType, DbModelType>): Promise<AggregateQuerySnapshot<{
265281
count: AggregateField<number>;
@@ -661,6 +677,9 @@ export function startAt<AppModelType, DbModelType extends DocumentData>(snapshot
661677
// @public
662678
export function startAt(...fieldValues: unknown[]): QueryStartAtConstraint;
663679

680+
// @public
681+
export function sum(field: string | FieldPath): AggregateField<number>;
682+
664683
// @public
665684
export type TaskState = 'Error' | 'Running' | 'Success';
666685

docs-devsite/firestore_.aggregatefield.md

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,8 +22,19 @@ export declare class AggregateField<T>
2222

2323
| Property | Modifiers | Type | Description |
2424
| --- | --- | --- | --- |
25+
| [aggregateType](./firestore_.aggregatefield.md#aggregatefieldaggregatetype) | | [AggregateType](./firestore_.md#aggregatetype) | Indicates the aggregation operation of this AggregateField. |
2526
| [type](./firestore_.aggregatefield.md#aggregatefieldtype) | | (not declared) | A type string to uniquely identify instances of this class. |
2627

28+
## AggregateField.aggregateType
29+
30+
Indicates the aggregation operation of this AggregateField.
31+
32+
<b>Signature:</b>
33+
34+
```typescript
35+
readonly aggregateType: AggregateType;
36+
```
37+
2738
## AggregateField.type
2839

2940
A type string to uniquely identify instances of this class.

0 commit comments

Comments
 (0)