Skip to content

Commit ea84ef5

Browse files
committed
Backporting - return aggregation results as a map from the remote layer instead of as an ObjectValue.
1 parent 130853b commit ea84ef5

File tree

7 files changed

+40
-35
lines changed

7 files changed

+40
-35
lines changed

packages/firestore/src/api/aggregate.ts

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,13 +21,14 @@ import { firestoreClientRunAggregateQuery } from '../core/firestore_client';
2121
import { count } from '../lite-api/aggregate';
2222
import { AggregateQuerySnapshot } from '../lite-api/aggregate_types';
2323
import { AggregateAlias } from '../model/aggregate_alias';
24-
import { ObjectValue } from '../model/object_value';
24+
import { ApiClientObjectMap, Value } from '../protos/firestore_proto_api';
2525
import { cast } from '../util/input_validation';
2626
import { mapToArray } from '../util/obj';
2727

2828
import { ensureFirestoreConfigured, Firestore } from './database';
2929
import { ExpUserDataWriter } from './reference_impl';
3030

31+
3132
export {
3233
aggregateQuerySnapshotEqual,
3334
count,
@@ -136,7 +137,7 @@ export function getAggregateFromServer<T extends AggregateSpec>(
136137
function convertToAggregateQuerySnapshot<T extends AggregateSpec>(
137138
firestore: Firestore,
138139
query: Query<unknown>,
139-
aggregateResult: ObjectValue
140+
aggregateResult: ApiClientObjectMap<Value>
140141
): AggregateQuerySnapshot<T> {
141142
const userDataWriter = new ExpUserDataWriter(firestore);
142143
const querySnapshot = new AggregateQuerySnapshot<T>(

packages/firestore/src/core/firestore_client.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -36,10 +36,10 @@ import { Document } from '../model/document';
3636
import { DocumentKey } from '../model/document_key';
3737
import { FieldIndex } from '../model/field_index';
3838
import { Mutation } from '../model/mutation';
39-
import { ObjectValue } from '../model/object_value';
4039
import { toByteStreamReader } from '../platform/byte_stream_reader';
4140
import { newSerializer } from '../platform/serializer';
4241
import { newTextEncoder } from '../platform/text_serializer';
42+
import { ApiClientObjectMap, Value } from '../protos/firestore_proto_api';
4343
import { Datastore, invokeRunAggregationQueryRpc } from '../remote/datastore';
4444
import {
4545
canUseNetwork,
@@ -527,8 +527,8 @@ export function firestoreClientRunAggregateQuery(
527527
client: FirestoreClient,
528528
query: Query,
529529
aggregates: Aggregate[]
530-
): Promise<ObjectValue> {
531-
const deferred = new Deferred<ObjectValue>();
530+
): Promise<ApiClientObjectMap<Value>> {
531+
const deferred = new Deferred<ApiClientObjectMap<Value>>();
532532

533533
client.asyncQueue.enqueueAndForget(async () => {
534534
// TODO (sum/avg) should we update this to use the event manager?

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ import { deepEqual } from '@firebase/util';
1919

2020
import { AggregateImpl } from '../core/aggregate';
2121
import { AggregateAlias } from '../model/aggregate_alias';
22-
import { ObjectValue } from '../model/object_value';
22+
import { ApiClientObjectMap, Value } from '../protos/firestore_proto_api';
2323
import { invokeRunAggregationQueryRpc } from '../remote/datastore';
2424
import { cast } from '../util/input_validation';
2525
import { mapToArray } from '../util/obj';
@@ -115,7 +115,7 @@ export function getAggregate<T extends AggregateSpec>(
115115
function convertToAggregateQuerySnapshot<T extends AggregateSpec>(
116116
firestore: Firestore,
117117
query: Query<unknown>,
118-
aggregateResult: ObjectValue
118+
aggregateResult: ApiClientObjectMap<Value>
119119
): AggregateQuerySnapshot<T> {
120120
const userDataWriter = new LiteUserDataWriter(firestore);
121121
const querySnapshot = new AggregateQuerySnapshot<T>(

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

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -16,8 +16,8 @@
1616
*/
1717

1818
import { AggregateType } from '../core/aggregate';
19-
import { ObjectValue } from '../model/object_value';
2019
import { FieldPath as InternalFieldPath } from '../model/path';
20+
import { ApiClientObjectMap, Value } from '../protos/firestore_proto_api';
2121

2222
import { Query } from './reference';
2323
import { AbstractUserDataWriter } from './user_data_writer';
@@ -85,7 +85,7 @@ export class AggregateQuerySnapshot<T extends AggregateSpec> {
8585
constructor(
8686
query: Query<unknown>,
8787
private readonly _userDataWriter: AbstractUserDataWriter,
88-
private readonly _data: ObjectValue
88+
private readonly _data: ApiClientObjectMap<Value>
8989
) {
9090
this.query = query;
9191
}
@@ -102,8 +102,8 @@ export class AggregateQuerySnapshot<T extends AggregateSpec> {
102102
* query.
103103
*/
104104
data(): AggregateSpecData<T> {
105-
return this._userDataWriter.convertValue(
106-
this._data.value
105+
return this._userDataWriter.convertObjectMap(
106+
this._data
107107
) as AggregateSpecData<T>;
108108
}
109109
}

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

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,10 +32,12 @@ import {
3232
import { TypeOrder } from '../model/type_order';
3333
import { typeOrder } from '../model/values';
3434
import {
35+
ApiClientObjectMap,
3536
ArrayValue as ProtoArrayValue,
3637
LatLng as ProtoLatLng,
3738
MapValue as ProtoMapValue,
3839
Timestamp as ProtoTimestamp,
40+
Value,
3941
Value as ProtoValue
4042
} from '../protos/firestore_proto_api';
4143
import { isValidResourceName } from '../remote/serializer';
@@ -91,9 +93,19 @@ export abstract class AbstractUserDataWriter {
9193
private convertObject(
9294
mapValue: ProtoMapValue,
9395
serverTimestampBehavior: ServerTimestampBehavior
96+
): DocumentData {
97+
return this.convertObjectMap(mapValue.fields, serverTimestampBehavior);
98+
}
99+
100+
/**
101+
* @internal
102+
*/
103+
convertObjectMap(
104+
fields: ApiClientObjectMap<Value> | undefined,
105+
serverTimestampBehavior: ServerTimestampBehavior = 'none'
94106
): DocumentData {
95107
const result: DocumentData = {};
96-
forEach(mapValue.fields, (key, value) => {
108+
forEach(fields, (key, value) => {
97109
result[key] = this.convertValue(value, serverTimestampBehavior);
98110
});
99111
return result;

packages/firestore/src/remote/datastore.ts

Lines changed: 15 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -22,18 +22,20 @@ import { Query, queryToTarget } from '../core/query';
2222
import { Document } from '../model/document';
2323
import { DocumentKey } from '../model/document_key';
2424
import { Mutation } from '../model/mutation';
25-
import { ObjectValue } from '../model/object_value';
2625
import {
26+
ApiClientObjectMap,
2727
BatchGetDocumentsRequest as ProtoBatchGetDocumentsRequest,
2828
BatchGetDocumentsResponse as ProtoBatchGetDocumentsResponse,
2929
RunAggregationQueryRequest as ProtoRunAggregationQueryRequest,
3030
RunAggregationQueryResponse as ProtoRunAggregationQueryResponse,
3131
RunQueryRequest as ProtoRunQueryRequest,
32-
RunQueryResponse as ProtoRunQueryResponse
32+
RunQueryResponse as ProtoRunQueryResponse,
33+
Value
3334
} from '../protos/firestore_proto_api';
3435
import { debugAssert, debugCast, hardAssert } from '../util/assert';
3536
import { AsyncQueue } from '../util/async_queue';
3637
import { Code, FirestoreError } from '../util/error';
38+
import { isNullOrUndefined } from '../util/types';
3739

3840
import { Connection } from './connection';
3941
import {
@@ -50,8 +52,7 @@ import {
5052
toMutation,
5153
toName,
5254
toQueryTarget,
53-
toRunAggregationQueryRequest,
54-
fromAggregationResult
55+
toRunAggregationQueryRequest
5556
} from './serializer';
5657

5758
/**
@@ -242,7 +243,7 @@ export async function invokeRunAggregationQueryRpc(
242243
datastore: Datastore,
243244
query: Query,
244245
aggregates: Aggregate[]
245-
): Promise<ObjectValue> {
246+
): Promise<ApiClientObjectMap<Value>> {
246247
const datastoreImpl = debugCast(datastore, DatastoreImpl);
247248
const request = toRunAggregationQueryRequest(
248249
datastoreImpl.serializer,
@@ -266,8 +267,16 @@ export async function invokeRunAggregationQueryRpc(
266267
filteredResult.length === 1,
267268
'Aggregation fields are missing from result.'
268269
);
270+
debugAssert(
271+
!isNullOrUndefined(filteredResult[0].result),
272+
'aggregationQueryResponse.result'
273+
);
274+
debugAssert(
275+
!isNullOrUndefined(filteredResult[0].result.aggregateFields),
276+
'aggregationQueryResponse.result.aggregateFields'
277+
);
269278

270-
return fromAggregationResult(filteredResult[0]);
279+
return filteredResult[0].result.aggregateFields;
271280
}
272281

273282
export function newPersistentWriteStream(

packages/firestore/src/remote/serializer.ts

Lines changed: 0 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -81,7 +81,6 @@ import {
8181
Precondition as ProtoPrecondition,
8282
QueryTarget as ProtoQueryTarget,
8383
RunAggregationQueryRequest as ProtoRunAggregationQueryRequest,
84-
RunAggregationQueryResponse as ProtoRunAggregationQueryResponse,
8584
Aggregation as ProtoAggregation,
8685
Status as ProtoStatus,
8786
Target as ProtoTarget,
@@ -438,22 +437,6 @@ export function fromDocument(
438437
return hasCommittedMutations ? result.setHasCommittedMutations() : result;
439438
}
440439

441-
export function fromAggregationResult(
442-
aggregationQueryResponse: ProtoRunAggregationQueryResponse
443-
): ObjectValue {
444-
assertPresent(
445-
aggregationQueryResponse.result,
446-
'aggregationQueryResponse.result'
447-
);
448-
assertPresent(
449-
aggregationQueryResponse.result.aggregateFields,
450-
'aggregationQueryResponse.result.aggregateFields'
451-
);
452-
return new ObjectValue({
453-
mapValue: { fields: aggregationQueryResponse.result?.aggregateFields }
454-
});
455-
}
456-
457440
function fromFound(
458441
serializer: JsonProtoSerializer,
459442
doc: ProtoBatchGetDocumentsResponse

0 commit comments

Comments
 (0)