Skip to content

Commit d93f595

Browse files
committed
Stubing out the API for sum and average.
1 parent e9404ab commit d93f595

File tree

3 files changed

+43
-42
lines changed

3 files changed

+43
-42
lines changed

packages/firestore/src/api.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,8 @@ export {
2525
AggregateFieldType,
2626
AggregateSpec,
2727
AggregateSpecData,
28-
AggregateQuerySnapshot
28+
AggregateQuerySnapshot,
29+
AggregateType
2930
} from './lite-api/aggregate_types';
3031

3132
export { FieldPath, documentId } from './api/field_path';

packages/firestore/src/lite-api/aggregate.ts

Lines changed: 25 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -21,16 +21,15 @@ import { CountQueryRunner } from '../core/count_query_runner';
2121
import { cast } from '../util/input_validation';
2222

2323
import {
24-
AggregateField, AggregateFieldSpec,
24+
AggregateField,
2525
AggregateQuerySnapshot,
26-
AggregateSpec, AggregateType, AggregateFieldType, AggregateData
26+
AggregateSpec,
2727
} from './aggregate_types';
2828
import { getDatastore } from './components';
2929
import { Firestore } from './database';
3030
import { Query, queryEqual } from './reference';
3131
import { LiteUserDataWriter } from './reference_impl';
3232
import {FieldPath} from "./field_path";
33-
import {AggregateQueryRunner} from "../core/aggregate_query_runner";
3433

3534
/**
3635
* Calculates the number of documents in the result set of the given query,
@@ -55,33 +54,20 @@ export function getCount(
5554
return new CountQueryRunner(query, datastore, userDataWriter).run();
5655
}
5756

57+
/**
58+
* TODO
59+
* @param query
60+
* @param aggregates
61+
*/
5862
export function getAggregateFromServer<T extends AggregateSpec>(
5963
query: Query<unknown>,
6064
aggregates: T
61-
): Promise<AggregateQuerySnapshot<T>>;
62-
63-
export function getAggregateFromServer<T extends AggregateFieldType>(
64-
query: Query<unknown>,
65-
aggregateField: T
66-
): Promise<AggregateQuerySnapshot<T>>;
67-
68-
export function getAggregateFromServer<T extends AggregateSpec | AggregateFieldType>(
69-
query: Query<unknown>,
70-
aggregateFieldOrSpec: T
7165
): Promise<AggregateQuerySnapshot<T>> {
72-
let aggregateSpec: AggregateSpec | undefined;
73-
74-
if (aggregateFieldOrSpec instanceof AggregateField) {
75-
aggregateSpec = {[aggregateFieldOrSpec.aggregateType]: aggregateFieldOrSpec};
76-
}
77-
else {
78-
aggregateSpec = aggregateFieldOrSpec;
79-
}
8066

8167
return new Promise(resolve => {
8268
const data: any = {};
83-
for (const key in aggregateSpec) {
84-
const field = aggregateSpec[key];
69+
for (const key in aggregates) {
70+
const field = aggregates[key];
8571
switch (field.aggregateType) {
8672
case "count":
8773
data[key] = 1;
@@ -98,15 +84,26 @@ export function getAggregateFromServer<T extends AggregateSpec | AggregateFieldT
9884
})
9985
}
10086

101-
export function sum(field: string | FieldPath): AggregateField<number, 'sum'> {
87+
/**
88+
* TODO
89+
* @param field
90+
*/
91+
export function sum(field: string | FieldPath): AggregateField<number> {
10292
return new AggregateField('sum', field);
10393
}
10494

105-
export function average(field: string | FieldPath): AggregateField<number | null, 'average'> {
95+
/**
96+
* TODO
97+
* @param field
98+
*/
99+
export function average(field: string | FieldPath): AggregateField<number | null> {
106100
return new AggregateField('average', field);
107101
}
108102

109-
export function count(): AggregateField<number, 'count'> {
103+
/**
104+
* TODO
105+
*/
106+
export function count(): AggregateField<number> {
110107
return new AggregateField('count');
111108
}
112109

@@ -117,8 +114,8 @@ export function count(): AggregateField<number, 'count'> {
117114
* @param right
118115
*/
119116
export function aggregateFieldEqual(
120-
left: AggregateField<unknown, AggregateType>,
121-
right: AggregateField<unknown, AggregateType>
117+
left: AggregateField<unknown>,
118+
right: AggregateField<unknown>
122119
): boolean {
123120
return left instanceof AggregateField &&
124121
right instanceof AggregateField &&

packages/firestore/src/lite-api/aggregate_types.ts

Lines changed: 16 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -19,16 +19,26 @@ import { Query } from './reference';
1919
import {FieldPath} from "./field_path";
2020
import {average, count, sum} from './aggregate';
2121

22+
/**
23+
* Union type representing the aggregate type to be performed.
24+
*/
2225
export type AggregateType = 'average' | 'count' | 'sum';
2326

2427
/**
2528
* Represents an aggregation that can be performed by Firestore.
2629
*/
27-
export class AggregateField<R, A extends AggregateType = 'count'> {
30+
export class AggregateField<R> {
2831
/** A type string to uniquely identify instances of this class. */
2932
readonly type = 'AggregateField';
3033

31-
constructor(public readonly aggregateType: A, public readonly field?: string | FieldPath) {
34+
/**
35+
* Create a new AggregateField<R>
36+
* @param aggregateType
37+
* @param field
38+
*/
39+
constructor(
40+
public readonly aggregateType: AggregateType = 'count',
41+
public readonly field?: string | FieldPath) {
3242
}
3343
}
3444

@@ -53,20 +63,13 @@ export interface AggregateSpec {
5363
* from the input `AggregateSpec`.
5464
*/
5565
export type AggregateSpecData<T extends AggregateSpec > = {
56-
[P in keyof T]: T[P] extends AggregateField<infer U, any> ? U : never;
66+
[P in keyof T]: T[P] extends AggregateField<infer U> ? U : never;
5767
};
5868

59-
export type AggregateFieldSpec<T extends AggregateFieldType> =
60-
T extends AggregateField<infer R, infer A> ? Record<A, T> : never;
61-
62-
export type AggregateData<T extends AggregateSpec | AggregateFieldType> =
63-
T extends AggregateSpec ? AggregateSpecData<T> :
64-
T extends AggregateFieldType ? AggregateFieldSpec<T> : never;
65-
6669
/**
6770
* The results of executing an aggregation query.
6871
*/
69-
export class AggregateQuerySnapshot<T extends AggregateSpec | AggregateFieldType> {
72+
export class AggregateQuerySnapshot<T extends AggregateSpec> {
7073
/** A type string to uniquely identify instances of this class. */
7174
readonly type = 'AggregateQuerySnapshot';
7275

@@ -79,7 +82,7 @@ export class AggregateQuerySnapshot<T extends AggregateSpec | AggregateFieldType
7982
/** @hideconstructor */
8083
constructor(
8184
query: Query<unknown>,
82-
private readonly _data: AggregateData<T>
85+
private readonly _data: AggregateSpecData<T>
8386
) {
8487
this.query = query;
8588
}
@@ -95,7 +98,7 @@ export class AggregateQuerySnapshot<T extends AggregateSpec | AggregateFieldType
9598
* @returns The results of the aggregations performed over the underlying
9699
* query.
97100
*/
98-
data(): AggregateData<T> {
101+
data(): AggregateSpecData<T> {
99102
return this._data;
100103
}
101104
}

0 commit comments

Comments
 (0)