in firestore-counter/functions/src/planner.ts [47:100]
public static planAggregations(
start: string,
snaps: firestore.DocumentSnapshot[]
): AggregationPlan[] {
if (snaps.length === 0) return [];
let result: AggregationPlan[] = [];
let prefixLen = Planner.aggrPrefixLen(
start,
snaps[snaps.length - 1].ref.path
);
let [aggregate, isPartial] = Planner.constructAggregate(
snaps[snaps.length - 1].ref.path,
prefixLen
);
let shards: firestore.DocumentSnapshot[] = [];
let partials: firestore.DocumentSnapshot[] = [];
for (let i = snaps.length - 1; i >= 0; i--) {
let [newAggregate, newIsPartial] = Planner.constructAggregate(
snaps[i].ref.path,
prefixLen
);
if (newAggregate !== aggregate) {
shards.reverse();
partials.reverse();
result.push({
aggregate: aggregate,
isPartial: isPartial,
shards: shards,
partials: partials,
});
aggregate = newAggregate;
isPartial = newIsPartial;
shards = [];
partials = [];
}
if (Planner.isPartialShard(snaps[i].ref.path)) {
partials.push(snaps[i]);
} else {
shards.push(snaps[i]);
}
}
shards.reverse();
partials.reverse();
result.push({
aggregate: aggregate,
isPartial: isPartial,
shards: shards,
partials: partials,
});
result.reverse();
return result;
}