Skip to content

[FR] Add SUM Functionality to AggregateQuerySnapshot #1703

Open

Description

@KKimj

Feature proposal

Firebase Component: Firestore

Hello,
The Firestore C++ SDK currently supports only the count() method in the firebase::firestore::AggregateQuerySnapshot class but lacks a sum() method (and avg()), which is essential for aggregating numeric fields across documents.

Current State

The public functions of AggregateQuerySnapshot are:

  • count()
  • is_valid()
  • Assignment operators (operator=)
  • query()

Reference:

Flutter SDK Implications

This enhancement would also benefit the Flutter SDK, which relies on the Firestore C++ SDK for Windows platform support. For example, in the FlutterFire plugin, unsupported aggregation types like sum currently result in:

...
      case AggregateType::sum:
        std::cout << "Sum is not supported on C++" << std::endl;
        break;
...

Adding sum() to the C++ SDK would also benefit Flutter developers using Firestore on Windows.

Benefits

Implementing a sum() method would:

  1. Provide access to Firestore's aggregation capabilities in the C++ SDK.
  2. Support more use cases for C++ and Flutter developers.

Looking forward to hearing thoughts and feedback!
Thanks,

Activity

  1. google-oss-bot commented on Mar 31, 2025

    @google-oss-bot

    I found a few problems with this issue:

    • I couldn't figure out how to label this issue, so I've labeled it for a human to triage. Hang tight.
    • This issue does not seem to follow the issue template. Make sure you provide all the required information.
  2. self-assigned this
    on Mar 31, 2025
  3. cherylEnkidu commented on Mar 31, 2025

    @cherylEnkidu
    Contributor

    Hi @KKimj , thank you for filling out the ticket. This has been added to the feature request list.

  4. jwinarske commented on Sep 2, 2026

    @jwinarske

    Heads up for anyone picking this up: on desktop the core already does the work.
    The Firestore core the SDK vendors (firebase-ios-sdk, pinned in
    cmake/external/firestore.cmake) carries aggregations end to end. From the
    built libfirestore_core.a:

    api::Query::Aggregate(std::vector<model::AggregateField>&&) const
    api::AggregateQuery::GetAggregate(callback<StatusOr<model::ObjectValue>>)
    core::FirestoreClient::RunAggregateQuery(...)
    

    and model::AggregateField is enum class OpKind { Sum, Avg, Count }.

    Nothing calls it. QueryInternal::Count() reaches for query_.Count(), and
    query_.Aggregate() has no caller anywhere in the repo. So for the desktop
    path this is exposing an API over machinery that already works, not
    implementing aggregation.

    Results come back in the ObjectValue keyed by the alias you asked for. Worth
    knowing: a sum of integers arrives as integer_value and a sum of doubles as
    double_value, so reading only the double gives 0 for the integer case.

    I've got this working locally against the Firestore emulator (sum, average,
    filtered aggregations, sparse fields) as a patch we carry downstream. It's
    desktop-only and its API shape doesn't match where this issue is heading, so
    I'm not proposing it as-is — just flagging that the desktop half is smaller
    than it looks.

    Also: AVERAGE has no issue or PR of its own, only SUM.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions