1*d5c09012SAndroid Build Coastguard Worker// Copyright 2023 Google LLC 2*d5c09012SAndroid Build Coastguard Worker// 3*d5c09012SAndroid Build Coastguard Worker// Licensed under the Apache License, Version 2.0 (the "License"); 4*d5c09012SAndroid Build Coastguard Worker// you may not use this file except in compliance with the License. 5*d5c09012SAndroid Build Coastguard Worker// You may obtain a copy of the License at 6*d5c09012SAndroid Build Coastguard Worker// 7*d5c09012SAndroid Build Coastguard Worker// http://www.apache.org/licenses/LICENSE-2.0 8*d5c09012SAndroid Build Coastguard Worker// 9*d5c09012SAndroid Build Coastguard Worker// Unless required by applicable law or agreed to in writing, software 10*d5c09012SAndroid Build Coastguard Worker// distributed under the License is distributed on an "AS IS" BASIS, 11*d5c09012SAndroid Build Coastguard Worker// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12*d5c09012SAndroid Build Coastguard Worker// See the License for the specific language governing permissions and 13*d5c09012SAndroid Build Coastguard Worker// limitations under the License. 14*d5c09012SAndroid Build Coastguard Worker 15*d5c09012SAndroid Build Coastguard Workersyntax = "proto3"; 16*d5c09012SAndroid Build Coastguard Worker 17*d5c09012SAndroid Build Coastguard Workerpackage google.firestore.v1; 18*d5c09012SAndroid Build Coastguard Worker 19*d5c09012SAndroid Build Coastguard Workerimport "google/api/field_behavior.proto"; 20*d5c09012SAndroid Build Coastguard Workerimport "google/firestore/v1/document.proto"; 21*d5c09012SAndroid Build Coastguard Workerimport "google/protobuf/wrappers.proto"; 22*d5c09012SAndroid Build Coastguard Worker 23*d5c09012SAndroid Build Coastguard Workeroption csharp_namespace = "Google.Cloud.Firestore.V1"; 24*d5c09012SAndroid Build Coastguard Workeroption go_package = "cloud.google.com/go/firestore/apiv1/firestorepb;firestorepb"; 25*d5c09012SAndroid Build Coastguard Workeroption java_multiple_files = true; 26*d5c09012SAndroid Build Coastguard Workeroption java_outer_classname = "QueryProto"; 27*d5c09012SAndroid Build Coastguard Workeroption java_package = "com.google.firestore.v1"; 28*d5c09012SAndroid Build Coastguard Workeroption objc_class_prefix = "GCFS"; 29*d5c09012SAndroid Build Coastguard Workeroption php_namespace = "Google\\Cloud\\Firestore\\V1"; 30*d5c09012SAndroid Build Coastguard Workeroption ruby_package = "Google::Cloud::Firestore::V1"; 31*d5c09012SAndroid Build Coastguard Worker 32*d5c09012SAndroid Build Coastguard Worker// A Firestore query. 33*d5c09012SAndroid Build Coastguard Worker// 34*d5c09012SAndroid Build Coastguard Worker// The query stages are executed in the following order: 35*d5c09012SAndroid Build Coastguard Worker// 1. from 36*d5c09012SAndroid Build Coastguard Worker// 2. where 37*d5c09012SAndroid Build Coastguard Worker// 3. select 38*d5c09012SAndroid Build Coastguard Worker// 4. order_by + start_at + end_at 39*d5c09012SAndroid Build Coastguard Worker// 5. offset 40*d5c09012SAndroid Build Coastguard Worker// 6. limit 41*d5c09012SAndroid Build Coastguard Workermessage StructuredQuery { 42*d5c09012SAndroid Build Coastguard Worker // A selection of a collection, such as `messages as m1`. 43*d5c09012SAndroid Build Coastguard Worker message CollectionSelector { 44*d5c09012SAndroid Build Coastguard Worker // The collection ID. 45*d5c09012SAndroid Build Coastguard Worker // When set, selects only collections with this ID. 46*d5c09012SAndroid Build Coastguard Worker string collection_id = 2; 47*d5c09012SAndroid Build Coastguard Worker 48*d5c09012SAndroid Build Coastguard Worker // When false, selects only collections that are immediate children of 49*d5c09012SAndroid Build Coastguard Worker // the `parent` specified in the containing `RunQueryRequest`. 50*d5c09012SAndroid Build Coastguard Worker // When true, selects all descendant collections. 51*d5c09012SAndroid Build Coastguard Worker bool all_descendants = 3; 52*d5c09012SAndroid Build Coastguard Worker } 53*d5c09012SAndroid Build Coastguard Worker 54*d5c09012SAndroid Build Coastguard Worker // A filter. 55*d5c09012SAndroid Build Coastguard Worker message Filter { 56*d5c09012SAndroid Build Coastguard Worker // The type of filter. 57*d5c09012SAndroid Build Coastguard Worker oneof filter_type { 58*d5c09012SAndroid Build Coastguard Worker // A composite filter. 59*d5c09012SAndroid Build Coastguard Worker CompositeFilter composite_filter = 1; 60*d5c09012SAndroid Build Coastguard Worker 61*d5c09012SAndroid Build Coastguard Worker // A filter on a document field. 62*d5c09012SAndroid Build Coastguard Worker FieldFilter field_filter = 2; 63*d5c09012SAndroid Build Coastguard Worker 64*d5c09012SAndroid Build Coastguard Worker // A filter that takes exactly one argument. 65*d5c09012SAndroid Build Coastguard Worker UnaryFilter unary_filter = 3; 66*d5c09012SAndroid Build Coastguard Worker } 67*d5c09012SAndroid Build Coastguard Worker } 68*d5c09012SAndroid Build Coastguard Worker 69*d5c09012SAndroid Build Coastguard Worker // A filter that merges multiple other filters using the given operator. 70*d5c09012SAndroid Build Coastguard Worker message CompositeFilter { 71*d5c09012SAndroid Build Coastguard Worker // A composite filter operator. 72*d5c09012SAndroid Build Coastguard Worker enum Operator { 73*d5c09012SAndroid Build Coastguard Worker // Unspecified. This value must not be used. 74*d5c09012SAndroid Build Coastguard Worker OPERATOR_UNSPECIFIED = 0; 75*d5c09012SAndroid Build Coastguard Worker 76*d5c09012SAndroid Build Coastguard Worker // Documents are required to satisfy all of the combined filters. 77*d5c09012SAndroid Build Coastguard Worker AND = 1; 78*d5c09012SAndroid Build Coastguard Worker 79*d5c09012SAndroid Build Coastguard Worker // Documents are required to satisfy at least one of the combined filters. 80*d5c09012SAndroid Build Coastguard Worker OR = 2; 81*d5c09012SAndroid Build Coastguard Worker } 82*d5c09012SAndroid Build Coastguard Worker 83*d5c09012SAndroid Build Coastguard Worker // The operator for combining multiple filters. 84*d5c09012SAndroid Build Coastguard Worker Operator op = 1; 85*d5c09012SAndroid Build Coastguard Worker 86*d5c09012SAndroid Build Coastguard Worker // The list of filters to combine. 87*d5c09012SAndroid Build Coastguard Worker // 88*d5c09012SAndroid Build Coastguard Worker // Requires: 89*d5c09012SAndroid Build Coastguard Worker // 90*d5c09012SAndroid Build Coastguard Worker // * At least one filter is present. 91*d5c09012SAndroid Build Coastguard Worker repeated Filter filters = 2; 92*d5c09012SAndroid Build Coastguard Worker } 93*d5c09012SAndroid Build Coastguard Worker 94*d5c09012SAndroid Build Coastguard Worker // A filter on a specific field. 95*d5c09012SAndroid Build Coastguard Worker message FieldFilter { 96*d5c09012SAndroid Build Coastguard Worker // A field filter operator. 97*d5c09012SAndroid Build Coastguard Worker enum Operator { 98*d5c09012SAndroid Build Coastguard Worker // Unspecified. This value must not be used. 99*d5c09012SAndroid Build Coastguard Worker OPERATOR_UNSPECIFIED = 0; 100*d5c09012SAndroid Build Coastguard Worker 101*d5c09012SAndroid Build Coastguard Worker // The given `field` is less than the given `value`. 102*d5c09012SAndroid Build Coastguard Worker // 103*d5c09012SAndroid Build Coastguard Worker // Requires: 104*d5c09012SAndroid Build Coastguard Worker // 105*d5c09012SAndroid Build Coastguard Worker // * That `field` come first in `order_by`. 106*d5c09012SAndroid Build Coastguard Worker LESS_THAN = 1; 107*d5c09012SAndroid Build Coastguard Worker 108*d5c09012SAndroid Build Coastguard Worker // The given `field` is less than or equal to the given `value`. 109*d5c09012SAndroid Build Coastguard Worker // 110*d5c09012SAndroid Build Coastguard Worker // Requires: 111*d5c09012SAndroid Build Coastguard Worker // 112*d5c09012SAndroid Build Coastguard Worker // * That `field` come first in `order_by`. 113*d5c09012SAndroid Build Coastguard Worker LESS_THAN_OR_EQUAL = 2; 114*d5c09012SAndroid Build Coastguard Worker 115*d5c09012SAndroid Build Coastguard Worker // The given `field` is greater than the given `value`. 116*d5c09012SAndroid Build Coastguard Worker // 117*d5c09012SAndroid Build Coastguard Worker // Requires: 118*d5c09012SAndroid Build Coastguard Worker // 119*d5c09012SAndroid Build Coastguard Worker // * That `field` come first in `order_by`. 120*d5c09012SAndroid Build Coastguard Worker GREATER_THAN = 3; 121*d5c09012SAndroid Build Coastguard Worker 122*d5c09012SAndroid Build Coastguard Worker // The given `field` is greater than or equal to the given `value`. 123*d5c09012SAndroid Build Coastguard Worker // 124*d5c09012SAndroid Build Coastguard Worker // Requires: 125*d5c09012SAndroid Build Coastguard Worker // 126*d5c09012SAndroid Build Coastguard Worker // * That `field` come first in `order_by`. 127*d5c09012SAndroid Build Coastguard Worker GREATER_THAN_OR_EQUAL = 4; 128*d5c09012SAndroid Build Coastguard Worker 129*d5c09012SAndroid Build Coastguard Worker // The given `field` is equal to the given `value`. 130*d5c09012SAndroid Build Coastguard Worker EQUAL = 5; 131*d5c09012SAndroid Build Coastguard Worker 132*d5c09012SAndroid Build Coastguard Worker // The given `field` is not equal to the given `value`. 133*d5c09012SAndroid Build Coastguard Worker // 134*d5c09012SAndroid Build Coastguard Worker // Requires: 135*d5c09012SAndroid Build Coastguard Worker // 136*d5c09012SAndroid Build Coastguard Worker // * No other `NOT_EQUAL`, `NOT_IN`, `IS_NOT_NULL`, or `IS_NOT_NAN`. 137*d5c09012SAndroid Build Coastguard Worker // * That `field` comes first in the `order_by`. 138*d5c09012SAndroid Build Coastguard Worker NOT_EQUAL = 6; 139*d5c09012SAndroid Build Coastguard Worker 140*d5c09012SAndroid Build Coastguard Worker // The given `field` is an array that contains the given `value`. 141*d5c09012SAndroid Build Coastguard Worker ARRAY_CONTAINS = 7; 142*d5c09012SAndroid Build Coastguard Worker 143*d5c09012SAndroid Build Coastguard Worker // The given `field` is equal to at least one value in the given array. 144*d5c09012SAndroid Build Coastguard Worker // 145*d5c09012SAndroid Build Coastguard Worker // Requires: 146*d5c09012SAndroid Build Coastguard Worker // 147*d5c09012SAndroid Build Coastguard Worker // * That `value` is a non-empty `ArrayValue`, subject to disjunction 148*d5c09012SAndroid Build Coastguard Worker // limits. 149*d5c09012SAndroid Build Coastguard Worker // * No `NOT_IN` filters in the same query. 150*d5c09012SAndroid Build Coastguard Worker IN = 8; 151*d5c09012SAndroid Build Coastguard Worker 152*d5c09012SAndroid Build Coastguard Worker // The given `field` is an array that contains any of the values in the 153*d5c09012SAndroid Build Coastguard Worker // given array. 154*d5c09012SAndroid Build Coastguard Worker // 155*d5c09012SAndroid Build Coastguard Worker // Requires: 156*d5c09012SAndroid Build Coastguard Worker // 157*d5c09012SAndroid Build Coastguard Worker // * That `value` is a non-empty `ArrayValue`, subject to disjunction 158*d5c09012SAndroid Build Coastguard Worker // limits. 159*d5c09012SAndroid Build Coastguard Worker // * No other `ARRAY_CONTAINS_ANY` filters within the same disjunction. 160*d5c09012SAndroid Build Coastguard Worker // * No `NOT_IN` filters in the same query. 161*d5c09012SAndroid Build Coastguard Worker ARRAY_CONTAINS_ANY = 9; 162*d5c09012SAndroid Build Coastguard Worker 163*d5c09012SAndroid Build Coastguard Worker // The value of the `field` is not in the given array. 164*d5c09012SAndroid Build Coastguard Worker // 165*d5c09012SAndroid Build Coastguard Worker // Requires: 166*d5c09012SAndroid Build Coastguard Worker // 167*d5c09012SAndroid Build Coastguard Worker // * That `value` is a non-empty `ArrayValue` with at most 10 values. 168*d5c09012SAndroid Build Coastguard Worker // * No other `OR`, `IN`, `ARRAY_CONTAINS_ANY`, `NOT_IN`, `NOT_EQUAL`, 169*d5c09012SAndroid Build Coastguard Worker // `IS_NOT_NULL`, or `IS_NOT_NAN`. 170*d5c09012SAndroid Build Coastguard Worker // * That `field` comes first in the `order_by`. 171*d5c09012SAndroid Build Coastguard Worker NOT_IN = 10; 172*d5c09012SAndroid Build Coastguard Worker } 173*d5c09012SAndroid Build Coastguard Worker 174*d5c09012SAndroid Build Coastguard Worker // The field to filter by. 175*d5c09012SAndroid Build Coastguard Worker FieldReference field = 1; 176*d5c09012SAndroid Build Coastguard Worker 177*d5c09012SAndroid Build Coastguard Worker // The operator to filter by. 178*d5c09012SAndroid Build Coastguard Worker Operator op = 2; 179*d5c09012SAndroid Build Coastguard Worker 180*d5c09012SAndroid Build Coastguard Worker // The value to compare to. 181*d5c09012SAndroid Build Coastguard Worker Value value = 3; 182*d5c09012SAndroid Build Coastguard Worker } 183*d5c09012SAndroid Build Coastguard Worker 184*d5c09012SAndroid Build Coastguard Worker // A filter with a single operand. 185*d5c09012SAndroid Build Coastguard Worker message UnaryFilter { 186*d5c09012SAndroid Build Coastguard Worker // A unary operator. 187*d5c09012SAndroid Build Coastguard Worker enum Operator { 188*d5c09012SAndroid Build Coastguard Worker // Unspecified. This value must not be used. 189*d5c09012SAndroid Build Coastguard Worker OPERATOR_UNSPECIFIED = 0; 190*d5c09012SAndroid Build Coastguard Worker 191*d5c09012SAndroid Build Coastguard Worker // The given `field` is equal to `NaN`. 192*d5c09012SAndroid Build Coastguard Worker IS_NAN = 2; 193*d5c09012SAndroid Build Coastguard Worker 194*d5c09012SAndroid Build Coastguard Worker // The given `field` is equal to `NULL`. 195*d5c09012SAndroid Build Coastguard Worker IS_NULL = 3; 196*d5c09012SAndroid Build Coastguard Worker 197*d5c09012SAndroid Build Coastguard Worker // The given `field` is not equal to `NaN`. 198*d5c09012SAndroid Build Coastguard Worker // 199*d5c09012SAndroid Build Coastguard Worker // Requires: 200*d5c09012SAndroid Build Coastguard Worker // 201*d5c09012SAndroid Build Coastguard Worker // * No other `NOT_EQUAL`, `NOT_IN`, `IS_NOT_NULL`, or `IS_NOT_NAN`. 202*d5c09012SAndroid Build Coastguard Worker // * That `field` comes first in the `order_by`. 203*d5c09012SAndroid Build Coastguard Worker IS_NOT_NAN = 4; 204*d5c09012SAndroid Build Coastguard Worker 205*d5c09012SAndroid Build Coastguard Worker // The given `field` is not equal to `NULL`. 206*d5c09012SAndroid Build Coastguard Worker // 207*d5c09012SAndroid Build Coastguard Worker // Requires: 208*d5c09012SAndroid Build Coastguard Worker // 209*d5c09012SAndroid Build Coastguard Worker // * A single `NOT_EQUAL`, `NOT_IN`, `IS_NOT_NULL`, or `IS_NOT_NAN`. 210*d5c09012SAndroid Build Coastguard Worker // * That `field` comes first in the `order_by`. 211*d5c09012SAndroid Build Coastguard Worker IS_NOT_NULL = 5; 212*d5c09012SAndroid Build Coastguard Worker } 213*d5c09012SAndroid Build Coastguard Worker 214*d5c09012SAndroid Build Coastguard Worker // The unary operator to apply. 215*d5c09012SAndroid Build Coastguard Worker Operator op = 1; 216*d5c09012SAndroid Build Coastguard Worker 217*d5c09012SAndroid Build Coastguard Worker // The argument to the filter. 218*d5c09012SAndroid Build Coastguard Worker oneof operand_type { 219*d5c09012SAndroid Build Coastguard Worker // The field to which to apply the operator. 220*d5c09012SAndroid Build Coastguard Worker FieldReference field = 2; 221*d5c09012SAndroid Build Coastguard Worker } 222*d5c09012SAndroid Build Coastguard Worker } 223*d5c09012SAndroid Build Coastguard Worker 224*d5c09012SAndroid Build Coastguard Worker // An order on a field. 225*d5c09012SAndroid Build Coastguard Worker message Order { 226*d5c09012SAndroid Build Coastguard Worker // The field to order by. 227*d5c09012SAndroid Build Coastguard Worker FieldReference field = 1; 228*d5c09012SAndroid Build Coastguard Worker 229*d5c09012SAndroid Build Coastguard Worker // The direction to order by. Defaults to `ASCENDING`. 230*d5c09012SAndroid Build Coastguard Worker Direction direction = 2; 231*d5c09012SAndroid Build Coastguard Worker } 232*d5c09012SAndroid Build Coastguard Worker 233*d5c09012SAndroid Build Coastguard Worker // A sort direction. 234*d5c09012SAndroid Build Coastguard Worker enum Direction { 235*d5c09012SAndroid Build Coastguard Worker // Unspecified. 236*d5c09012SAndroid Build Coastguard Worker DIRECTION_UNSPECIFIED = 0; 237*d5c09012SAndroid Build Coastguard Worker 238*d5c09012SAndroid Build Coastguard Worker // Ascending. 239*d5c09012SAndroid Build Coastguard Worker ASCENDING = 1; 240*d5c09012SAndroid Build Coastguard Worker 241*d5c09012SAndroid Build Coastguard Worker // Descending. 242*d5c09012SAndroid Build Coastguard Worker DESCENDING = 2; 243*d5c09012SAndroid Build Coastguard Worker } 244*d5c09012SAndroid Build Coastguard Worker 245*d5c09012SAndroid Build Coastguard Worker // A reference to a field in a document, ex: `stats.operations`. 246*d5c09012SAndroid Build Coastguard Worker message FieldReference { 247*d5c09012SAndroid Build Coastguard Worker // A reference to a field in a document. 248*d5c09012SAndroid Build Coastguard Worker // 249*d5c09012SAndroid Build Coastguard Worker // Requires: 250*d5c09012SAndroid Build Coastguard Worker // 251*d5c09012SAndroid Build Coastguard Worker // * MUST be a dot-delimited (`.`) string of segments, where each segment 252*d5c09012SAndroid Build Coastguard Worker // conforms to [document field name][google.firestore.v1.Document.fields] 253*d5c09012SAndroid Build Coastguard Worker // limitations. 254*d5c09012SAndroid Build Coastguard Worker string field_path = 2; 255*d5c09012SAndroid Build Coastguard Worker } 256*d5c09012SAndroid Build Coastguard Worker 257*d5c09012SAndroid Build Coastguard Worker // The projection of document's fields to return. 258*d5c09012SAndroid Build Coastguard Worker message Projection { 259*d5c09012SAndroid Build Coastguard Worker // The fields to return. 260*d5c09012SAndroid Build Coastguard Worker // 261*d5c09012SAndroid Build Coastguard Worker // If empty, all fields are returned. To only return the name 262*d5c09012SAndroid Build Coastguard Worker // of the document, use `['__name__']`. 263*d5c09012SAndroid Build Coastguard Worker repeated FieldReference fields = 2; 264*d5c09012SAndroid Build Coastguard Worker } 265*d5c09012SAndroid Build Coastguard Worker 266*d5c09012SAndroid Build Coastguard Worker // Nearest Neighbors search config. 267*d5c09012SAndroid Build Coastguard Worker message FindNearest { 268*d5c09012SAndroid Build Coastguard Worker // The distance measure to use when comparing vectors. 269*d5c09012SAndroid Build Coastguard Worker enum DistanceMeasure { 270*d5c09012SAndroid Build Coastguard Worker // Should not be set. 271*d5c09012SAndroid Build Coastguard Worker DISTANCE_MEASURE_UNSPECIFIED = 0; 272*d5c09012SAndroid Build Coastguard Worker 273*d5c09012SAndroid Build Coastguard Worker // Measures the EUCLIDEAN distance between the vectors. See 274*d5c09012SAndroid Build Coastguard Worker // [Euclidean](https://en.wikipedia.org/wiki/Euclidean_distance) to learn 275*d5c09012SAndroid Build Coastguard Worker // more 276*d5c09012SAndroid Build Coastguard Worker EUCLIDEAN = 1; 277*d5c09012SAndroid Build Coastguard Worker 278*d5c09012SAndroid Build Coastguard Worker // Compares vectors based on the angle between them, which allows you to 279*d5c09012SAndroid Build Coastguard Worker // measure similarity that isn't based on the vectors magnitude. 280*d5c09012SAndroid Build Coastguard Worker // We recommend using DOT_PRODUCT with unit normalized vectors instead of 281*d5c09012SAndroid Build Coastguard Worker // COSINE distance, which is mathematically equivalent with better 282*d5c09012SAndroid Build Coastguard Worker // performance. See [Cosine 283*d5c09012SAndroid Build Coastguard Worker // Similarity](https://en.wikipedia.org/wiki/Cosine_similarity) to learn 284*d5c09012SAndroid Build Coastguard Worker // more. 285*d5c09012SAndroid Build Coastguard Worker COSINE = 2; 286*d5c09012SAndroid Build Coastguard Worker 287*d5c09012SAndroid Build Coastguard Worker // Similar to cosine but is affected by the magnitude of the vectors. See 288*d5c09012SAndroid Build Coastguard Worker // [Dot Product](https://en.wikipedia.org/wiki/Dot_product) to learn more. 289*d5c09012SAndroid Build Coastguard Worker DOT_PRODUCT = 3; 290*d5c09012SAndroid Build Coastguard Worker } 291*d5c09012SAndroid Build Coastguard Worker 292*d5c09012SAndroid Build Coastguard Worker // Required. An indexed vector field to search upon. Only documents which 293*d5c09012SAndroid Build Coastguard Worker // contain vectors whose dimensionality match the query_vector can be 294*d5c09012SAndroid Build Coastguard Worker // returned. 295*d5c09012SAndroid Build Coastguard Worker FieldReference vector_field = 1 [(google.api.field_behavior) = REQUIRED]; 296*d5c09012SAndroid Build Coastguard Worker 297*d5c09012SAndroid Build Coastguard Worker // Required. The query vector that we are searching on. Must be a vector of 298*d5c09012SAndroid Build Coastguard Worker // no more than 2048 dimensions. 299*d5c09012SAndroid Build Coastguard Worker Value query_vector = 2 [(google.api.field_behavior) = REQUIRED]; 300*d5c09012SAndroid Build Coastguard Worker 301*d5c09012SAndroid Build Coastguard Worker // Required. The Distance Measure to use, required. 302*d5c09012SAndroid Build Coastguard Worker DistanceMeasure distance_measure = 3 303*d5c09012SAndroid Build Coastguard Worker [(google.api.field_behavior) = REQUIRED]; 304*d5c09012SAndroid Build Coastguard Worker 305*d5c09012SAndroid Build Coastguard Worker // Required. The number of nearest neighbors to return. Must be a positive 306*d5c09012SAndroid Build Coastguard Worker // integer of no more than 1000. 307*d5c09012SAndroid Build Coastguard Worker google.protobuf.Int32Value limit = 4 308*d5c09012SAndroid Build Coastguard Worker [(google.api.field_behavior) = REQUIRED]; 309*d5c09012SAndroid Build Coastguard Worker } 310*d5c09012SAndroid Build Coastguard Worker 311*d5c09012SAndroid Build Coastguard Worker // Optional sub-set of the fields to return. 312*d5c09012SAndroid Build Coastguard Worker // 313*d5c09012SAndroid Build Coastguard Worker // This acts as a [DocumentMask][google.firestore.v1.DocumentMask] over the 314*d5c09012SAndroid Build Coastguard Worker // documents returned from a query. When not set, assumes that the caller 315*d5c09012SAndroid Build Coastguard Worker // wants all fields returned. 316*d5c09012SAndroid Build Coastguard Worker Projection select = 1; 317*d5c09012SAndroid Build Coastguard Worker 318*d5c09012SAndroid Build Coastguard Worker // The collections to query. 319*d5c09012SAndroid Build Coastguard Worker repeated CollectionSelector from = 2; 320*d5c09012SAndroid Build Coastguard Worker 321*d5c09012SAndroid Build Coastguard Worker // The filter to apply. 322*d5c09012SAndroid Build Coastguard Worker Filter where = 3; 323*d5c09012SAndroid Build Coastguard Worker 324*d5c09012SAndroid Build Coastguard Worker // The order to apply to the query results. 325*d5c09012SAndroid Build Coastguard Worker // 326*d5c09012SAndroid Build Coastguard Worker // Firestore allows callers to provide a full ordering, a partial ordering, or 327*d5c09012SAndroid Build Coastguard Worker // no ordering at all. In all cases, Firestore guarantees a stable ordering 328*d5c09012SAndroid Build Coastguard Worker // through the following rules: 329*d5c09012SAndroid Build Coastguard Worker // 330*d5c09012SAndroid Build Coastguard Worker // * The `order_by` is required to reference all fields used with an 331*d5c09012SAndroid Build Coastguard Worker // inequality filter. 332*d5c09012SAndroid Build Coastguard Worker // * All fields that are required to be in the `order_by` but are not already 333*d5c09012SAndroid Build Coastguard Worker // present are appended in lexicographical ordering of the field name. 334*d5c09012SAndroid Build Coastguard Worker // * If an order on `__name__` is not specified, it is appended by default. 335*d5c09012SAndroid Build Coastguard Worker // 336*d5c09012SAndroid Build Coastguard Worker // Fields are appended with the same sort direction as the last order 337*d5c09012SAndroid Build Coastguard Worker // specified, or 'ASCENDING' if no order was specified. For example: 338*d5c09012SAndroid Build Coastguard Worker // 339*d5c09012SAndroid Build Coastguard Worker // * `ORDER BY a` becomes `ORDER BY a ASC, __name__ ASC` 340*d5c09012SAndroid Build Coastguard Worker // * `ORDER BY a DESC` becomes `ORDER BY a DESC, __name__ DESC` 341*d5c09012SAndroid Build Coastguard Worker // * `WHERE a > 1` becomes `WHERE a > 1 ORDER BY a ASC, __name__ ASC` 342*d5c09012SAndroid Build Coastguard Worker // * `WHERE __name__ > ... AND a > 1` becomes 343*d5c09012SAndroid Build Coastguard Worker // `WHERE __name__ > ... AND a > 1 ORDER BY a ASC, __name__ ASC` 344*d5c09012SAndroid Build Coastguard Worker repeated Order order_by = 4; 345*d5c09012SAndroid Build Coastguard Worker 346*d5c09012SAndroid Build Coastguard Worker // A potential prefix of a position in the result set to start the query at. 347*d5c09012SAndroid Build Coastguard Worker // 348*d5c09012SAndroid Build Coastguard Worker // The ordering of the result set is based on the `ORDER BY` clause of the 349*d5c09012SAndroid Build Coastguard Worker // original query. 350*d5c09012SAndroid Build Coastguard Worker // 351*d5c09012SAndroid Build Coastguard Worker // ``` 352*d5c09012SAndroid Build Coastguard Worker // SELECT * FROM k WHERE a = 1 AND b > 2 ORDER BY b ASC, __name__ ASC; 353*d5c09012SAndroid Build Coastguard Worker // ``` 354*d5c09012SAndroid Build Coastguard Worker // 355*d5c09012SAndroid Build Coastguard Worker // This query's results are ordered by `(b ASC, __name__ ASC)`. 356*d5c09012SAndroid Build Coastguard Worker // 357*d5c09012SAndroid Build Coastguard Worker // Cursors can reference either the full ordering or a prefix of the location, 358*d5c09012SAndroid Build Coastguard Worker // though it cannot reference more fields than what are in the provided 359*d5c09012SAndroid Build Coastguard Worker // `ORDER BY`. 360*d5c09012SAndroid Build Coastguard Worker // 361*d5c09012SAndroid Build Coastguard Worker // Continuing off the example above, attaching the following start cursors 362*d5c09012SAndroid Build Coastguard Worker // will have varying impact: 363*d5c09012SAndroid Build Coastguard Worker // 364*d5c09012SAndroid Build Coastguard Worker // - `START BEFORE (2, /k/123)`: start the query right before `a = 1 AND 365*d5c09012SAndroid Build Coastguard Worker // b > 2 AND __name__ > /k/123`. 366*d5c09012SAndroid Build Coastguard Worker // - `START AFTER (10)`: start the query right after `a = 1 AND b > 10`. 367*d5c09012SAndroid Build Coastguard Worker // 368*d5c09012SAndroid Build Coastguard Worker // Unlike `OFFSET` which requires scanning over the first N results to skip, 369*d5c09012SAndroid Build Coastguard Worker // a start cursor allows the query to begin at a logical position. This 370*d5c09012SAndroid Build Coastguard Worker // position is not required to match an actual result, it will scan forward 371*d5c09012SAndroid Build Coastguard Worker // from this position to find the next document. 372*d5c09012SAndroid Build Coastguard Worker // 373*d5c09012SAndroid Build Coastguard Worker // Requires: 374*d5c09012SAndroid Build Coastguard Worker // 375*d5c09012SAndroid Build Coastguard Worker // * The number of values cannot be greater than the number of fields 376*d5c09012SAndroid Build Coastguard Worker // specified in the `ORDER BY` clause. 377*d5c09012SAndroid Build Coastguard Worker Cursor start_at = 7; 378*d5c09012SAndroid Build Coastguard Worker 379*d5c09012SAndroid Build Coastguard Worker // A potential prefix of a position in the result set to end the query at. 380*d5c09012SAndroid Build Coastguard Worker // 381*d5c09012SAndroid Build Coastguard Worker // This is similar to `START_AT` but with it controlling the end position 382*d5c09012SAndroid Build Coastguard Worker // rather than the start position. 383*d5c09012SAndroid Build Coastguard Worker // 384*d5c09012SAndroid Build Coastguard Worker // Requires: 385*d5c09012SAndroid Build Coastguard Worker // 386*d5c09012SAndroid Build Coastguard Worker // * The number of values cannot be greater than the number of fields 387*d5c09012SAndroid Build Coastguard Worker // specified in the `ORDER BY` clause. 388*d5c09012SAndroid Build Coastguard Worker Cursor end_at = 8; 389*d5c09012SAndroid Build Coastguard Worker 390*d5c09012SAndroid Build Coastguard Worker // The number of documents to skip before returning the first result. 391*d5c09012SAndroid Build Coastguard Worker // 392*d5c09012SAndroid Build Coastguard Worker // This applies after the constraints specified by the `WHERE`, `START AT`, & 393*d5c09012SAndroid Build Coastguard Worker // `END AT` but before the `LIMIT` clause. 394*d5c09012SAndroid Build Coastguard Worker // 395*d5c09012SAndroid Build Coastguard Worker // Requires: 396*d5c09012SAndroid Build Coastguard Worker // 397*d5c09012SAndroid Build Coastguard Worker // * The value must be greater than or equal to zero if specified. 398*d5c09012SAndroid Build Coastguard Worker int32 offset = 6; 399*d5c09012SAndroid Build Coastguard Worker 400*d5c09012SAndroid Build Coastguard Worker // The maximum number of results to return. 401*d5c09012SAndroid Build Coastguard Worker // 402*d5c09012SAndroid Build Coastguard Worker // Applies after all other constraints. 403*d5c09012SAndroid Build Coastguard Worker // 404*d5c09012SAndroid Build Coastguard Worker // Requires: 405*d5c09012SAndroid Build Coastguard Worker // 406*d5c09012SAndroid Build Coastguard Worker // * The value must be greater than or equal to zero if specified. 407*d5c09012SAndroid Build Coastguard Worker google.protobuf.Int32Value limit = 5; 408*d5c09012SAndroid Build Coastguard Worker 409*d5c09012SAndroid Build Coastguard Worker // Optional. A potential Nearest Neighbors Search. 410*d5c09012SAndroid Build Coastguard Worker // 411*d5c09012SAndroid Build Coastguard Worker // Applies after all other filters and ordering. 412*d5c09012SAndroid Build Coastguard Worker // 413*d5c09012SAndroid Build Coastguard Worker // Finds the closest vector embeddings to the given query vector. 414*d5c09012SAndroid Build Coastguard Worker FindNearest find_nearest = 9 [(google.api.field_behavior) = OPTIONAL]; 415*d5c09012SAndroid Build Coastguard Worker} 416*d5c09012SAndroid Build Coastguard Worker 417*d5c09012SAndroid Build Coastguard Worker// Firestore query for running an aggregation over a 418*d5c09012SAndroid Build Coastguard Worker// [StructuredQuery][google.firestore.v1.StructuredQuery]. 419*d5c09012SAndroid Build Coastguard Workermessage StructuredAggregationQuery { 420*d5c09012SAndroid Build Coastguard Worker // Defines an aggregation that produces a single result. 421*d5c09012SAndroid Build Coastguard Worker message Aggregation { 422*d5c09012SAndroid Build Coastguard Worker // Count of documents that match the query. 423*d5c09012SAndroid Build Coastguard Worker // 424*d5c09012SAndroid Build Coastguard Worker // The `COUNT(*)` aggregation function operates on the entire document 425*d5c09012SAndroid Build Coastguard Worker // so it does not require a field reference. 426*d5c09012SAndroid Build Coastguard Worker message Count { 427*d5c09012SAndroid Build Coastguard Worker // Optional. Optional constraint on the maximum number of documents to 428*d5c09012SAndroid Build Coastguard Worker // count. 429*d5c09012SAndroid Build Coastguard Worker // 430*d5c09012SAndroid Build Coastguard Worker // This provides a way to set an upper bound on the number of documents 431*d5c09012SAndroid Build Coastguard Worker // to scan, limiting latency, and cost. 432*d5c09012SAndroid Build Coastguard Worker // 433*d5c09012SAndroid Build Coastguard Worker // Unspecified is interpreted as no bound. 434*d5c09012SAndroid Build Coastguard Worker // 435*d5c09012SAndroid Build Coastguard Worker // High-Level Example: 436*d5c09012SAndroid Build Coastguard Worker // 437*d5c09012SAndroid Build Coastguard Worker // ``` 438*d5c09012SAndroid Build Coastguard Worker // AGGREGATE COUNT_UP_TO(1000) OVER ( SELECT * FROM k ); 439*d5c09012SAndroid Build Coastguard Worker // ``` 440*d5c09012SAndroid Build Coastguard Worker // 441*d5c09012SAndroid Build Coastguard Worker // Requires: 442*d5c09012SAndroid Build Coastguard Worker // 443*d5c09012SAndroid Build Coastguard Worker // * Must be greater than zero when present. 444*d5c09012SAndroid Build Coastguard Worker google.protobuf.Int64Value up_to = 1 445*d5c09012SAndroid Build Coastguard Worker [(google.api.field_behavior) = OPTIONAL]; 446*d5c09012SAndroid Build Coastguard Worker } 447*d5c09012SAndroid Build Coastguard Worker 448*d5c09012SAndroid Build Coastguard Worker // Sum of the values of the requested field. 449*d5c09012SAndroid Build Coastguard Worker // 450*d5c09012SAndroid Build Coastguard Worker // * Only numeric values will be aggregated. All non-numeric values 451*d5c09012SAndroid Build Coastguard Worker // including `NULL` are skipped. 452*d5c09012SAndroid Build Coastguard Worker // 453*d5c09012SAndroid Build Coastguard Worker // * If the aggregated values contain `NaN`, returns `NaN`. Infinity math 454*d5c09012SAndroid Build Coastguard Worker // follows IEEE-754 standards. 455*d5c09012SAndroid Build Coastguard Worker // 456*d5c09012SAndroid Build Coastguard Worker // * If the aggregated value set is empty, returns 0. 457*d5c09012SAndroid Build Coastguard Worker // 458*d5c09012SAndroid Build Coastguard Worker // * Returns a 64-bit integer if all aggregated numbers are integers and the 459*d5c09012SAndroid Build Coastguard Worker // sum result does not overflow. Otherwise, the result is returned as a 460*d5c09012SAndroid Build Coastguard Worker // double. Note that even if all the aggregated values are integers, the 461*d5c09012SAndroid Build Coastguard Worker // result is returned as a double if it cannot fit within a 64-bit signed 462*d5c09012SAndroid Build Coastguard Worker // integer. When this occurs, the returned value will lose precision. 463*d5c09012SAndroid Build Coastguard Worker // 464*d5c09012SAndroid Build Coastguard Worker // * When underflow occurs, floating-point aggregation is non-deterministic. 465*d5c09012SAndroid Build Coastguard Worker // This means that running the same query repeatedly without any changes to 466*d5c09012SAndroid Build Coastguard Worker // the underlying values could produce slightly different results each 467*d5c09012SAndroid Build Coastguard Worker // time. In those cases, values should be stored as integers over 468*d5c09012SAndroid Build Coastguard Worker // floating-point numbers. 469*d5c09012SAndroid Build Coastguard Worker message Sum { 470*d5c09012SAndroid Build Coastguard Worker // The field to aggregate on. 471*d5c09012SAndroid Build Coastguard Worker StructuredQuery.FieldReference field = 1; 472*d5c09012SAndroid Build Coastguard Worker } 473*d5c09012SAndroid Build Coastguard Worker 474*d5c09012SAndroid Build Coastguard Worker // Average of the values of the requested field. 475*d5c09012SAndroid Build Coastguard Worker // 476*d5c09012SAndroid Build Coastguard Worker // * Only numeric values will be aggregated. All non-numeric values 477*d5c09012SAndroid Build Coastguard Worker // including `NULL` are skipped. 478*d5c09012SAndroid Build Coastguard Worker // 479*d5c09012SAndroid Build Coastguard Worker // * If the aggregated values contain `NaN`, returns `NaN`. Infinity math 480*d5c09012SAndroid Build Coastguard Worker // follows IEEE-754 standards. 481*d5c09012SAndroid Build Coastguard Worker // 482*d5c09012SAndroid Build Coastguard Worker // * If the aggregated value set is empty, returns `NULL`. 483*d5c09012SAndroid Build Coastguard Worker // 484*d5c09012SAndroid Build Coastguard Worker // * Always returns the result as a double. 485*d5c09012SAndroid Build Coastguard Worker message Avg { 486*d5c09012SAndroid Build Coastguard Worker // The field to aggregate on. 487*d5c09012SAndroid Build Coastguard Worker StructuredQuery.FieldReference field = 1; 488*d5c09012SAndroid Build Coastguard Worker } 489*d5c09012SAndroid Build Coastguard Worker 490*d5c09012SAndroid Build Coastguard Worker // The type of aggregation to perform, required. 491*d5c09012SAndroid Build Coastguard Worker oneof operator { 492*d5c09012SAndroid Build Coastguard Worker // Count aggregator. 493*d5c09012SAndroid Build Coastguard Worker Count count = 1; 494*d5c09012SAndroid Build Coastguard Worker 495*d5c09012SAndroid Build Coastguard Worker // Sum aggregator. 496*d5c09012SAndroid Build Coastguard Worker Sum sum = 2; 497*d5c09012SAndroid Build Coastguard Worker 498*d5c09012SAndroid Build Coastguard Worker // Average aggregator. 499*d5c09012SAndroid Build Coastguard Worker Avg avg = 3; 500*d5c09012SAndroid Build Coastguard Worker } 501*d5c09012SAndroid Build Coastguard Worker 502*d5c09012SAndroid Build Coastguard Worker // Optional. Optional name of the field to store the result of the 503*d5c09012SAndroid Build Coastguard Worker // aggregation into. 504*d5c09012SAndroid Build Coastguard Worker // 505*d5c09012SAndroid Build Coastguard Worker // If not provided, Firestore will pick a default name following the format 506*d5c09012SAndroid Build Coastguard Worker // `field_<incremental_id++>`. For example: 507*d5c09012SAndroid Build Coastguard Worker // 508*d5c09012SAndroid Build Coastguard Worker // ``` 509*d5c09012SAndroid Build Coastguard Worker // AGGREGATE 510*d5c09012SAndroid Build Coastguard Worker // COUNT_UP_TO(1) AS count_up_to_1, 511*d5c09012SAndroid Build Coastguard Worker // COUNT_UP_TO(2), 512*d5c09012SAndroid Build Coastguard Worker // COUNT_UP_TO(3) AS count_up_to_3, 513*d5c09012SAndroid Build Coastguard Worker // COUNT(*) 514*d5c09012SAndroid Build Coastguard Worker // OVER ( 515*d5c09012SAndroid Build Coastguard Worker // ... 516*d5c09012SAndroid Build Coastguard Worker // ); 517*d5c09012SAndroid Build Coastguard Worker // ``` 518*d5c09012SAndroid Build Coastguard Worker // 519*d5c09012SAndroid Build Coastguard Worker // becomes: 520*d5c09012SAndroid Build Coastguard Worker // 521*d5c09012SAndroid Build Coastguard Worker // ``` 522*d5c09012SAndroid Build Coastguard Worker // AGGREGATE 523*d5c09012SAndroid Build Coastguard Worker // COUNT_UP_TO(1) AS count_up_to_1, 524*d5c09012SAndroid Build Coastguard Worker // COUNT_UP_TO(2) AS field_1, 525*d5c09012SAndroid Build Coastguard Worker // COUNT_UP_TO(3) AS count_up_to_3, 526*d5c09012SAndroid Build Coastguard Worker // COUNT(*) AS field_2 527*d5c09012SAndroid Build Coastguard Worker // OVER ( 528*d5c09012SAndroid Build Coastguard Worker // ... 529*d5c09012SAndroid Build Coastguard Worker // ); 530*d5c09012SAndroid Build Coastguard Worker // ``` 531*d5c09012SAndroid Build Coastguard Worker // 532*d5c09012SAndroid Build Coastguard Worker // Requires: 533*d5c09012SAndroid Build Coastguard Worker // 534*d5c09012SAndroid Build Coastguard Worker // * Must be unique across all aggregation aliases. 535*d5c09012SAndroid Build Coastguard Worker // * Conform to [document field name][google.firestore.v1.Document.fields] 536*d5c09012SAndroid Build Coastguard Worker // limitations. 537*d5c09012SAndroid Build Coastguard Worker string alias = 7 [(google.api.field_behavior) = OPTIONAL]; 538*d5c09012SAndroid Build Coastguard Worker } 539*d5c09012SAndroid Build Coastguard Worker 540*d5c09012SAndroid Build Coastguard Worker // The base query to aggregate over. 541*d5c09012SAndroid Build Coastguard Worker oneof query_type { 542*d5c09012SAndroid Build Coastguard Worker // Nested structured query. 543*d5c09012SAndroid Build Coastguard Worker StructuredQuery structured_query = 1; 544*d5c09012SAndroid Build Coastguard Worker } 545*d5c09012SAndroid Build Coastguard Worker 546*d5c09012SAndroid Build Coastguard Worker // Optional. Series of aggregations to apply over the results of the 547*d5c09012SAndroid Build Coastguard Worker // `structured_query`. 548*d5c09012SAndroid Build Coastguard Worker // 549*d5c09012SAndroid Build Coastguard Worker // Requires: 550*d5c09012SAndroid Build Coastguard Worker // 551*d5c09012SAndroid Build Coastguard Worker // * A minimum of one and maximum of five aggregations per query. 552*d5c09012SAndroid Build Coastguard Worker repeated Aggregation aggregations = 3 553*d5c09012SAndroid Build Coastguard Worker [(google.api.field_behavior) = OPTIONAL]; 554*d5c09012SAndroid Build Coastguard Worker} 555*d5c09012SAndroid Build Coastguard Worker 556*d5c09012SAndroid Build Coastguard Worker// A position in a query result set. 557*d5c09012SAndroid Build Coastguard Workermessage Cursor { 558*d5c09012SAndroid Build Coastguard Worker // The values that represent a position, in the order they appear in 559*d5c09012SAndroid Build Coastguard Worker // the order by clause of a query. 560*d5c09012SAndroid Build Coastguard Worker // 561*d5c09012SAndroid Build Coastguard Worker // Can contain fewer values than specified in the order by clause. 562*d5c09012SAndroid Build Coastguard Worker repeated Value values = 1; 563*d5c09012SAndroid Build Coastguard Worker 564*d5c09012SAndroid Build Coastguard Worker // If the position is just before or just after the given values, relative 565*d5c09012SAndroid Build Coastguard Worker // to the sort order defined by the query. 566*d5c09012SAndroid Build Coastguard Worker bool before = 2; 567*d5c09012SAndroid Build Coastguard Worker} 568