xref: /aosp_15_r20/external/googleapis/google/firestore/v1/query.proto (revision d5c09012810ac0c9f33fe448fb6da8260d444cc9)
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