@@ -21,14 +21,16 @@ import { CountQueryRunner } from '../core/count_query_runner';
21
21
import { cast } from '../util/input_validation' ;
22
22
23
23
import {
24
- AggregateField ,
24
+ AggregateField , AggregateFieldSpec ,
25
25
AggregateQuerySnapshot ,
26
- AggregateSpec
26
+ AggregateSpec , AggregateType , AggregateFieldType , AggregateData
27
27
} from './aggregate_types' ;
28
28
import { getDatastore } from './components' ;
29
29
import { Firestore } from './database' ;
30
30
import { Query , queryEqual } from './reference' ;
31
31
import { LiteUserDataWriter } from './reference_impl' ;
32
+ import { FieldPath } from "./field_path" ;
33
+ import { AggregateQueryRunner } from "../core/aggregate_query_runner" ;
32
34
33
35
/**
34
36
* Calculates the number of documents in the result set of the given query,
@@ -53,6 +55,77 @@ export function getCount(
53
55
return new CountQueryRunner ( query , datastore , userDataWriter ) . run ( ) ;
54
56
}
55
57
58
+ export function getAggregateFromServer < T extends AggregateSpec > (
59
+ query : Query < unknown > ,
60
+ 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
71
+ ) : 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
+ }
80
+
81
+ return new Promise ( resolve => {
82
+ const data : any = { } ;
83
+ for ( const key in aggregateSpec ) {
84
+ const field = aggregateSpec [ key ] ;
85
+ switch ( field . aggregateType ) {
86
+ case "count" :
87
+ data [ key ] = 1 ;
88
+ break ;
89
+ case "sum" :
90
+ data [ key ] = 1 ;
91
+ break ;
92
+ case "average" :
93
+ data [ key ] = 1 ;
94
+ break ;
95
+ }
96
+ }
97
+ resolve ( new AggregateQuerySnapshot ( query , data ) )
98
+ } )
99
+ }
100
+
101
+ export function sum ( field : string | FieldPath ) : AggregateField < number , 'sum' > {
102
+ return new AggregateField ( 'sum' , field ) ;
103
+ }
104
+
105
+ export function average ( field : string | FieldPath ) : AggregateField < number | null , 'average' > {
106
+ return new AggregateField ( 'average' , field ) ;
107
+ }
108
+
109
+ export function count ( ) : AggregateField < number , 'count' > {
110
+ return new AggregateField ( 'count' ) ;
111
+ }
112
+
113
+ /**
114
+ * Compares two 'AggregateField` instances for equality.
115
+ *
116
+ * @param left
117
+ * @param right
118
+ */
119
+ export function aggregateFieldEqual (
120
+ left : AggregateField < unknown , AggregateType > ,
121
+ right : AggregateField < unknown , AggregateType >
122
+ ) : boolean {
123
+ return left instanceof AggregateField &&
124
+ right instanceof AggregateField &&
125
+ left . field == right . field &&
126
+ left . aggregateType == right . aggregateType ;
127
+ }
128
+
56
129
/**
57
130
* Compares two `AggregateQuerySnapshot` instances for equality.
58
131
*
0 commit comments