// Copyright 2024 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // // This file defines the format of Firestore bundle file/stream. It is not a part of the // Firestore API, only a specification used by Server and Client SDK to write and read // bundles. syntax = "proto3"; package google.firestore.bundle; import "google/firestore/v1/document.proto"; import "google/firestore/v1/query.proto"; import "google/protobuf/timestamp.proto"; option csharp_namespace = "Firestore.Bundle"; option go_package = "cloud.google.com/go/firestore/bundle/bundlepb;bundlepb"; option java_multiple_files = true; option java_outer_classname = "BundleProto"; option java_package = "com.google.firestore.bundle"; option objc_class_prefix = "FSTPB"; option php_namespace = "Firestore\\Bundle"; // Encodes a query saved in the bundle. message BundledQuery { // The parent resource name. string parent = 1; // The query to run. oneof query_type { // A structured query. google.firestore.v1.StructuredQuery structured_query = 2; } // If the query is a limit query, should the limit be applied to the beginning or // the end of results. enum LimitType { FIRST = 0; LAST = 1; } LimitType limit_type = 3; } // A Query associated with a name, created as part of the bundle file, and can be read // by client SDKs once the bundle containing them is loaded. message NamedQuery { // Name of the query, such that client can use the name to load this query // from bundle, and resume from when the query results are materialized // into this bundle. string name = 1; // The query saved in the bundle. BundledQuery bundled_query = 2; // The read time of the query, when it is used to build the bundle. This is useful to // resume the query from the bundle, once it is loaded by client SDKs. google.protobuf.Timestamp read_time = 3; } // Metadata describing a Firestore document saved in the bundle. message BundledDocumentMetadata { // The document key of a bundled document. string name = 1; // The snapshot version of the document data bundled. google.protobuf.Timestamp read_time = 2; // Whether the document exists. bool exists = 3; // The names of the queries in this bundle that this document matches to. repeated string queries = 4; } // Metadata describing the bundle file/stream. message BundleMetadata { // The ID of the bundle. string id = 1; // Time at which the documents snapshot is taken for this bundle. google.protobuf.Timestamp create_time = 2; // The schema version of the bundle. uint32 version = 3; // The number of documents in the bundle. uint32 total_documents = 4; // The size of the bundle in bytes, excluding this `BundleMetadata`. uint64 total_bytes = 5; } // A Firestore bundle is a length-prefixed stream of JSON representations of // `BundleElement`. // Only one `BundleMetadata` is expected, and it should be the first element. // The named queries follow after `metadata`. Every `document_metadata` is // immediately followed by a `document`. message BundleElement { oneof element_type { BundleMetadata metadata = 1; NamedQuery named_query = 2; BundledDocumentMetadata document_metadata = 3; google.firestore.v1.Document document = 4; } }