Skip to content

feat(firestore): [PQ] add all the remaining private preview stages#13218

Merged
bhshkh merged 8 commits intogoogleapis:feature/fs-pipeline-queriesfrom
bhshkh:feat/fspq-sort-offset
Oct 30, 2025
Merged

feat(firestore): [PQ] add all the remaining private preview stages#13218
bhshkh merged 8 commits intogoogleapis:feature/fs-pipeline-queriesfrom
bhshkh:feat/fspq-sort-offset

Conversation

@bhshkh
Copy link
Copy Markdown
Contributor

@bhshkh bhshkh commented Oct 23, 2025

b/364927702

  1. add all the remaining private preview stages. Merging this PR completes the implementation of all the type "Stage" subType "General" private preview features. (except literals stage which is not yet inmplemented in Java and Node. Requires additonal approvals from Firestore team and will be added to separate PR).
    See "Firestore Features (Pipeline)" sheet in go/firestore-query-tracker
  2. Add integration and unit tests.
  3. Refactor existing stages code to remove duplicated code and rearrange in alphabetical order.
  4. Modify behaviour of Data and DataTo to match existing implementation in document.go
    // Exists reports whether the DocumentSnapshot represents an existing document.
    // Even if Exists returns false, the Ref and ReadTime fields of the DocumentSnapshot
    // are valid.
    func (d *DocumentSnapshot) Exists() bool {
    return d.proto != nil
    }
    // Data returns the DocumentSnapshot's fields as a map.
    // It is equivalent to
    //
    // var m map[string]interface{}
    // d.DataTo(&m)
    //
    // except that it returns nil if the document does not exist.
    func (d *DocumentSnapshot) Data() map[string]interface{} {
    if !d.Exists() {
    return nil
    }
    m, err := createMapFromValueMap(d.proto.Fields, d.c)
    // Any error here is a bug in the client.
    if err != nil {
    panic(fmt.Sprintf("firestore: %v", err))
    }
    return m
    }
    // DataTo uses the document's fields to populate p, which can be a pointer to a
    // map[string]interface{} or a pointer to a struct.
    //
    // Firestore field values are converted to Go values as follows:
    // - Null converts to nil.
    // - Bool converts to bool.
    // - String converts to string.
    // - Integer converts int64. When setting a struct field, any signed or unsigned
    // integer type is permitted except uint, uint64 or uintptr. Overflow is detected
    // and results in an error.
    // - Double converts to float64. When setting a struct field, float32 is permitted.
    // Overflow is detected and results in an error.
    // - Bytes is converted to []byte.
    // - Timestamp converts to time.Time.
    // - GeoPoint converts to *latlng.LatLng, where latlng is the package
    // "google.golang.org/genproto/googleapis/type/latlng".
    // - Arrays convert to []interface{}. When setting a struct field, the field
    // may be a slice or array of any type and is populated recursively.
    // Slices are resized to the incoming value's size, while arrays that are too
    // long have excess elements filled with zero values. If the array is too short,
    // excess incoming values will be dropped.
    // - Vectors convert to []float64
    // - Maps convert to map[string]interface{}. When setting a struct field,
    // maps of key type string and any value type are permitted, and are populated
    // recursively.
    // - References are converted to *firestore.DocumentRefs.
    //
    // Field names given by struct field tags are observed, as described in
    // DocumentRef.Create.
    //
    // Only the fields actually present in the document are used to populate p. Other fields
    // of p are left unchanged.
    //
    // If the document does not exist, DataTo returns a NotFound error.
    func (d *DocumentSnapshot) DataTo(p interface{}) error {
    if !d.Exists() {
    return status.Errorf(codes.NotFound, "document %s does not exist", d.Ref.Path)
    }

Previous pull requests

@product-auto-label product-auto-label Bot added the api: firestore Issues related to the Firestore API. label Oct 23, 2025
@bhshkh bhshkh marked this pull request as ready for review October 23, 2025 23:37
@bhshkh bhshkh requested review from a team October 23, 2025 23:37
@bhshkh
Copy link
Copy Markdown
Contributor Author

bhshkh commented Oct 23, 2025

/gemini review

Copy link
Copy Markdown
Contributor

@gemini-code-assist gemini-code-assist Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Code Review

This pull request is a substantial contribution, adding the remaining private preview stages for Firestore pipelines. The changes include implementing numerous new pipeline stages, refactoring existing pipeline code for better structure and consistency, and adding comprehensive unit and integration tests. The refactoring of PipelineResult.Data() and DataTo() to align with DocumentSnapshot is a good consistency improvement.

I've found a couple of critical issues in the new integration tests that will cause compilation errors due to leftover code. I've also pointed out some minor issues, including leftover debug code and an inconsistently named function parameter. Once these are addressed, this will be a solid addition to the library.

Comment thread firestore/integration_test.go Outdated
Comment on lines +3794 to +3796
if err != nil {
t.Fatalf("Failed to get data: %v", err)
}
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

critical

This if err != nil block will cause a compilation error because the err variable is not defined in this scope. The Data() method on PipelineResult was changed in this PR to no longer return an error. This block appears to be a leftover from the previous implementation and should be removed.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

err is defined in the scope but it was already checked in L3777. This comment still seems relevant though.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Done

Comment thread firestore/integration_test.go Outdated
Comment on lines +4101 to +4103
if err != nil {
t.Fatalf("Failed to get data: %v", err)
}
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

critical

Similar to a previous finding, this if err != nil block will cause a compilation error as err is not defined here. The Data() method no longer returns an error. This check should be removed.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Done

Comment thread firestore/pipeline.go Outdated
Comment on lines +320 to +324
func (p *Pipeline) Unnest(fieldpathsOrSelectables any) *Pipeline {
if p.err != nil {
return p
}
stage, err := newUnnestStageFromAny(fieldpathsOrSelectables)
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

medium

The parameter name fieldpathsOrSelectables is plural, but the function accepts a single any argument, not a variadic one. This is inconsistent with other functions like Replace and can be confusing. For clarity and consistency, please consider renaming it to the singular fieldpathOrSelectable and updating its usage within the function.

Suggested change
func (p *Pipeline) Unnest(fieldpathsOrSelectables any) *Pipeline {
if p.err != nil {
return p
}
stage, err := newUnnestStageFromAny(fieldpathsOrSelectables)
func (p *Pipeline) Unnest(fieldpathOrSelectable any) *Pipeline {
if p.err != nil {
return p
}
stage, err := newUnnestStageFromAny(fieldpathOrSelectable)

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Done

Comment thread firestore/pipeline_result.go Outdated
Comment on lines +226 to +227
// bytes, _ := protojson.MarshalOptions{AllowPartial: true, UseEnumNumbers: true, Multiline: true}.Marshal(req)
// fmt.Println(string(bytes))
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

medium

This commented-out debugging code should be removed before merging to keep the codebase clean.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

please fix

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Fixed

Comment thread firestore/integration_test.go Outdated
Comment on lines +3794 to +3796
if err != nil {
t.Fatalf("Failed to get data: %v", err)
}
Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

err is defined in the scope but it was already checked in L3777. This comment still seems relevant though.


// Any error here is a bug in the client.
if err != nil {
panic(fmt.Sprintf("firestore: %v", err))
Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

panic here seems undesirable. Why was Data() changed to not return an error?

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

To be inline with existing Data() method

func (d *DocumentSnapshot) Data() map[string]interface{} {
if !d.Exists() {
return nil
}
m, err := createMapFromValueMap(d.proto.Fields, d.c)
// Any error here is a bug in the client.
if err != nil {
panic(fmt.Sprintf("firestore: %v", err))
}
return m
}

Comment thread firestore/pipeline_result.go Outdated
Comment on lines +226 to +227
// bytes, _ := protojson.MarshalOptions{AllowPartial: true, UseEnumNumbers: true, Multiline: true}.Marshal(req)
// fmt.Println(string(bytes))
Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

please fix

Copy link
Copy Markdown
Contributor

@daniel-sanche daniel-sanche left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Left some initial comments, I'll try to take another look soon

Comment thread firestore/pipeline.go
PipelineType: &pb.ExecutePipelineRequest_StructuredPipeline{
StructuredPipeline: &pb.StructuredPipeline{Pipeline: pipelinePb},
},
// TODO: Add consistencyselector
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Is this todo still valid? If it's meant to be long term, maybe add some more context

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yes, it is still valid. I'll resolve it in next PR.

Comment thread firestore/pipeline_stage.go Outdated
stageNameSelect = "select"
stageNameUnion = "union"
stageNameUnnest = "unnest"
stageNameWhere = "where"
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I noticed inputStageCollection names are handled in a different way, with the name strings hard-coded in-line. Should those be added to this constant list for consistency?

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Updated

Comment thread firestore/pipeline_stage.go Outdated
stageNameAddFields = "add_fields"
stageNameAggregate = "aggregate"
stageNameDistinct = "distinct"
stageNameDocuments = "documents"
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Other sdks have a Generic stage (which seems to be renamed to RawStage after the latest updates?). Do you have anything like that here?

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Will add in next PR.

}, nil
}

type inputStageDocuments struct {
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Something I was meaning to look into that you might have an answer to:

For the CollectionGroup above this, you're taking in an ancestor and passing it in as the first argument. Is that still valid? The other implementations I've seen seem to just be passing an empty string as the first argument, but I haven't dug into that yet

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Removed the function to match other implementations.

@bhshkh bhshkh force-pushed the feat/fspq-sort-offset branch from 176319f to f045b7d Compare October 26, 2025 09:27
@bhshkh bhshkh force-pushed the feat/fspq-sort-offset branch from d46767e to b96e23d Compare October 27, 2025 03:15
@bhshkh bhshkh changed the title feat(firestore): add all the remaining private preview stages feat(firestore): [PQ] add all the remaining private preview stages Oct 27, 2025
Copy link
Copy Markdown
Contributor

@shollyman shollyman left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'm a little slow to review given the chaining builder pattern.

Things that throw me:

  • the differing behavior for error for happy path. One embeds an error in the existing entity and ignores the current spec in the chain of pipeline directives. The other returns a copy/clone of the pipeline?
  • Field namings. I'm having trouble tracking down the corresponding protos. I see this is being built in a feature branch, where can I see the source protos for pipelines?

Comment thread firestore/pipeline.go
// WithGroups sets the grouping keys for the aggregation.
func (a *AggregateSpec) WithGroups(fieldsOrSelectables ...any) *AggregateSpec {
a.groups, a.err = fieldsOrSelectablesToSelectables(fieldsOrSelectables...)
func (a *AggregateSpec) WithGroups(fieldpathsOrSelectables ...any) *AggregateSpec {
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

How much of the naming is coming from a common spec here? I'd expect more of an option pattern due to the WithGroups naming, but this appears to just set the Groups field of the AggregateSpec. Should it just be Groups()?

Feel free to ignore, I'm still coming to terms with this particular builder pattern.

@bhshkh
Copy link
Copy Markdown
Contributor Author

bhshkh commented Oct 29, 2025

I'm a little slow to review given the chaining builder pattern.

Things that throw me:

  • the differing behavior for error for happy path. One embeds an error in the existing entity and ignores the current spec in the chain of pipeline directives. The other returns a copy/clone of the pipeline?
  • Field namings. I'm having trouble tracking down the corresponding protos. I see this is being built in a feature branch, where can I see the source protos for pipelines?

The protos are here:

type StructuredPipeline struct {
state protoimpl.MessageState
sizeCache protoimpl.SizeCache
unknownFields protoimpl.UnknownFields
// Required. The pipeline query to execute.
Pipeline *Pipeline `protobuf:"bytes,1,opt,name=pipeline,proto3" json:"pipeline,omitempty"`
// Optional. Optional query-level arguments.
Options map[string]*Value `protobuf:"bytes,2,rep,name=options,proto3" json:"options,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"`
}

// A Firestore query represented as an ordered list of operations / stages.
type Pipeline struct {
state protoimpl.MessageState
sizeCache protoimpl.SizeCache
unknownFields protoimpl.UnknownFields
// Required. Ordered list of stages to evaluate.
Stages []*Pipeline_Stage `protobuf:"bytes,1,rep,name=stages,proto3" json:"stages,omitempty"`
}

// A single operation within a pipeline.
//
// A stage is made up of a unique name, and a list of arguments. The exact
// number of arguments & types is dependent on the stage type.
//
// To give an example, the stage `filter(state = "MD")` would be encoded as:
//
// ```
// name: "filter"
//
// args {
// function_value {
// name: "eq"
// args { field_reference_value: "state" }
// args { string_value: "MD" }
// }
// }
//
// ```
//
// See public documentation for the full list.
type Pipeline_Stage struct {
state protoimpl.MessageState
sizeCache protoimpl.SizeCache
unknownFields protoimpl.UnknownFields
// Required. The name of the stage to evaluate.
//
// **Requires:**
//
// * must be in snake case (lower case with underscore separator).
Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"`
// Optional. Ordered list of arguments the given stage expects.
Args []*Value `protobuf:"bytes,2,rep,name=args,proto3" json:"args,omitempty"`
// Optional. Optional named arguments that certain functions may support.
Options map[string]*Value `protobuf:"bytes,3,rep,name=options,proto3" json:"options,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"`
}

Copy link
Copy Markdown
Contributor

@shollyman shollyman left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

After offline discussion about this, approving this PR.

bhshkh added a commit that referenced this pull request Oct 30, 2025
…3194)

b/364927702

1. add all the remaining private preview aggregate functions. Merging
this PR completes the implementation of all the **type: "Function"
subType : "Accumulators (Aggregation)"** private preview features.
See "Firestore Features (Pipeline)" sheet in
[go/firestore-query-tracker](http://go/firestore-query-tracker) for the
list of features.

    Java reference:
-
https://github.com/googleapis/java-firestore/blob/ccaf9d4fac5bd87a4da3d37493ca66fdc7681bc3/google-cloud-firestore/src/main/java/com/google/cloud/firestore/pipeline/expressions/AggregateFunction.java#L43-L71
-
https://github.com/googleapis/java-firestore/blob/ccaf9d4fac5bd87a4da3d37493ca66fdc7681bc3/google-cloud-firestore/src/main/java/com/google/cloud/firestore/pipeline/expressions/AggregateFunction.java#L93-L111

2. add all the remaining private preview timestamp functions. Merging
this PR completes the implementation of all the **type: "Function"
subType: "Date / Timestamp"** private preview features. (except
timestamp_trunc function which is not yet inmplemented in any of the
SDKs. Requires additonal approvals from Firestore team and will be added
to separate PR).
See "Firestore Features (Pipeline)" sheet in
[go/firestore-query-tracker](http://go/firestore-query-tracker) for the
list of functions.

    Java reference:
-
https://github.com/googleapis/java-firestore/blob/ccaf9d4fac5bd87a4da3d37493ca66fdc7681bc3/google-cloud-firestore/src/main/java/com/google/cloud/firestore/pipeline/expressions/Expression.java#L2262-L2517

3. Add integration tests for all functions.
4. Remove Rand function since it is not targeted for private preview.
5. Renamed numericExprOrField to numericExprOrFieldPath since field is a
separate type/expression.

https://github.com/googleapis/google-cloud-go/blob/a3ee1f19068c6d3fb77ad797e29884a90d6402a2/firestore/pipeline_field.go#L21-L41



Previous pull requests

- #12217
- #12425
- #12538
- #13147
- #13199
- #13218
@bhshkh bhshkh merged commit d27101e into googleapis:feature/fs-pipeline-queries Oct 30, 2025
12 of 16 checks passed
bhshkh added a commit that referenced this pull request Oct 30, 2025
)

1. add all the private preview 'array' functions. 
Merging this PR completes the implementation of all the **type:
"Function" subType : "Array"** private preview features (except
'maximum' and 'minimum' which are not yet implemented in any of the
SDKs. Requires additonal approvals from Firestore team and will be added
to separate PR). See "Firestore Features (Pipeline)" sheet in
[go/firestore-query-tracker](http://go/firestore-query-tracker) for the
list of features.
    Java reference: 
-
https://github.com/googleapis/java-firestore/blob/wuandy/JavaPplPP/google-cloud-firestore/src/main/java/com/google/cloud/firestore/pipeline/expressions/Expression.java
2. add all the private preview 'string' functions. (except
'string_split' which is not yet implemented in any of the SDKs. Requires
additonal approvals from Firestore team and will be added to separate
PR)

3. add all the private preview 'vector' functions. 
4. add remaining types to ConstantOf to match Java's implementation.
    Java reference: 
-
https://github.com/googleapis/java-firestore/blob/ccaf9d4fac5bd87a4da3d37493ca66fdc7681bc3/google-cloud-firestore/src/main/java/com/google/cloud/firestore/pipeline/expressions/Expression.java#L70-L211

Previous pull requests

- #12217
- #12425
- #12538
- #13147
- #13199
- #13218
- #13194
bhshkh added a commit that referenced this pull request Oct 30, 2025
b/364927702

- toExprOrField was renamed to asFieldExpr in
https://github.com/googleapis/google-cloud-go/pull/13194/files#diff-4a55211f7d38a1f0599e2f4cc92795073f138b2c56b846c933bda19e26bc3a7a
. There were a few call locations were rename was missed while resolving
merge conflicts which caused build failures. Fixing those failures in
this PR.
- the function signature of Data was changed in
#13218. It no longer
returns err as second argument. Fixing this in this PR.
- remove duplicate asInt64Expr and asStringExpr
- Move pipeline tests to their own file


Previous pull requests

- #12217
- #12425
- #12538
- #13147
- #13199
- #13218
- #13194
- #13245
bhshkh added a commit that referenced this pull request Oct 30, 2025
b/364927702

- Combine FieldOf and FieldOfPath to avoid verbose name FieldOfPath


Previous pull requests

- #12217
- #12425
- #12538
- #13147
- #13199
- #13218
- #13194
- #13245
- #13270

---------

Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com>
bhshkh added a commit that referenced this pull request Oct 31, 2025
1. Move PipelineStages integration tests.
2. Remove IsNaN, IsNotNaN, IsNull, IsNotNull, Equivalent as they are no
longer supported by backend
3. Remove examples as commented here

#13245 (comment)

Previous pull requests

- #12217
- #12425
- #12538
- #13147
- #13199
- #13218
- #13194
- #13245
- #13270
- #13271
bhshkh added a commit that referenced this pull request Nov 3, 2025
Add raw stage similar to Java

https://github.com/googleapis/java-firestore/blob/742fab6583c9a6f9c47cf0496124c3c9b05fe0ee/google-cloud-firestore/src/main/java/com/google/cloud/firestore/Pipeline.java#L997-L1021


The raw stage is an escape hatch to allow customers to consume new
stages supported by the backend without having to update their SDK to a
version that adds the stage.



Previous pull requests

- #12217
- #12425
- #12538
- #13147
- #13199
- #13218
- #13194
- #13245
- #13270
- #13271
- #13279
bhshkh added a commit that referenced this pull request Nov 3, 2025
1. Move PipelineStages integration tests.
2. Remove IsNaN, IsNotNaN, IsNull, IsNotNull, Equivalent as they are no
longer supported by backend
3. Remove examples as commented here

#13245 (comment)

Previous pull requests

- #12217
- #12425
- #12538
- #13147
- #13199
- #13218
- #13194
- #13245
- #13270
- #13271
bhshkh added a commit that referenced this pull request Nov 3, 2025
Add raw stage similar to Java

https://github.com/googleapis/java-firestore/blob/742fab6583c9a6f9c47cf0496124c3c9b05fe0ee/google-cloud-firestore/src/main/java/com/google/cloud/firestore/Pipeline.java#L997-L1021


The raw stage is an escape hatch to allow customers to consume new
stages supported by the backend without having to update their SDK to a
version that adds the stage.



Previous pull requests

- #12217
- #12425
- #12538
- #13147
- #13199
- #13218
- #13194
- #13245
- #13270
- #13271
- #13279
bhshkh added a commit that referenced this pull request Nov 10, 2025
#13283)

Changes in this PR:

1. firestore_client.go : Updated generated client as per
googleapis/gapic-generator-go#1661 . Removed
retries from tests since the headers have now been fixed.
2. Remove Equivalent since it was removed from backend.
3. Add/update comments
4. Add timestamp truncate (pending from
#13194) and string
split (pending from
#13245) functions.
5. add all the private preview general, key, logical (except iferror),
type and object functions.
See "Firestore Features (Pipeline)" sheet in
[go/firestore-query-tracker](http://go/firestore-query-tracker) for the
list of functions.
    Java reference:
-
https://github.com/googleapis/java-firestore/blob/ccaf9d4fac5bd87a4da3d37493ca66fdc7681bc3/google-cloud-firestore/src/main/java/com/google/cloud/firestore/pipeline/expressions/Expression.java



Previous pull requests

- #12217
- #12425
- #12538
- #13147
- #13199
- #13218
- #13194
- #13245
- #13270
- #13271
- #13279
- #13280
- #13281
- #13282
- googleapis/gapic-generator-go#1661
@bhshkh bhshkh deleted the feat/fspq-sort-offset branch April 2, 2026 19:46
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

api: firestore Issues related to the Firestore API.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants