xref: /aosp_15_r20/external/googleapis/google/datastore/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.datastore.v1;
18*d5c09012SAndroid Build Coastguard Worker
19*d5c09012SAndroid Build Coastguard Workerimport "google/api/field_behavior.proto";
20*d5c09012SAndroid Build Coastguard Workerimport "google/datastore/v1/entity.proto";
21*d5c09012SAndroid Build Coastguard Workerimport "google/protobuf/timestamp.proto";
22*d5c09012SAndroid Build Coastguard Workerimport "google/protobuf/wrappers.proto";
23*d5c09012SAndroid Build Coastguard Worker
24*d5c09012SAndroid Build Coastguard Workeroption csharp_namespace = "Google.Cloud.Datastore.V1";
25*d5c09012SAndroid Build Coastguard Workeroption go_package = "google.golang.org/genproto/googleapis/datastore/v1;datastore";
26*d5c09012SAndroid Build Coastguard Workeroption java_multiple_files = true;
27*d5c09012SAndroid Build Coastguard Workeroption java_outer_classname = "QueryProto";
28*d5c09012SAndroid Build Coastguard Workeroption java_package = "com.google.datastore.v1";
29*d5c09012SAndroid Build Coastguard Workeroption php_namespace = "Google\\Cloud\\Datastore\\V1";
30*d5c09012SAndroid Build Coastguard Workeroption ruby_package = "Google::Cloud::Datastore::V1";
31*d5c09012SAndroid Build Coastguard Worker
32*d5c09012SAndroid Build Coastguard Worker// The result of fetching an entity from Datastore.
33*d5c09012SAndroid Build Coastguard Workermessage EntityResult {
34*d5c09012SAndroid Build Coastguard Worker  // Specifies what data the 'entity' field contains.
35*d5c09012SAndroid Build Coastguard Worker  // A `ResultType` is either implied (for example, in `LookupResponse.missing`
36*d5c09012SAndroid Build Coastguard Worker  // from `datastore.proto`, it is always `KEY_ONLY`) or specified by context
37*d5c09012SAndroid Build Coastguard Worker  // (for example, in message `QueryResultBatch`, field `entity_result_type`
38*d5c09012SAndroid Build Coastguard Worker  // specifies a `ResultType` for all the values in field `entity_results`).
39*d5c09012SAndroid Build Coastguard Worker  enum ResultType {
40*d5c09012SAndroid Build Coastguard Worker    // Unspecified. This value is never used.
41*d5c09012SAndroid Build Coastguard Worker    RESULT_TYPE_UNSPECIFIED = 0;
42*d5c09012SAndroid Build Coastguard Worker
43*d5c09012SAndroid Build Coastguard Worker    // The key and properties.
44*d5c09012SAndroid Build Coastguard Worker    FULL = 1;
45*d5c09012SAndroid Build Coastguard Worker
46*d5c09012SAndroid Build Coastguard Worker    // A projected subset of properties. The entity may have no key.
47*d5c09012SAndroid Build Coastguard Worker    PROJECTION = 2;
48*d5c09012SAndroid Build Coastguard Worker
49*d5c09012SAndroid Build Coastguard Worker    // Only the key.
50*d5c09012SAndroid Build Coastguard Worker    KEY_ONLY = 3;
51*d5c09012SAndroid Build Coastguard Worker  }
52*d5c09012SAndroid Build Coastguard Worker
53*d5c09012SAndroid Build Coastguard Worker  // The resulting entity.
54*d5c09012SAndroid Build Coastguard Worker  Entity entity = 1;
55*d5c09012SAndroid Build Coastguard Worker
56*d5c09012SAndroid Build Coastguard Worker  // The version of the entity, a strictly positive number that monotonically
57*d5c09012SAndroid Build Coastguard Worker  // increases with changes to the entity.
58*d5c09012SAndroid Build Coastguard Worker  //
59*d5c09012SAndroid Build Coastguard Worker  // This field is set for
60*d5c09012SAndroid Build Coastguard Worker  // [`FULL`][google.datastore.v1.EntityResult.ResultType.FULL] entity results.
61*d5c09012SAndroid Build Coastguard Worker  //
62*d5c09012SAndroid Build Coastguard Worker  // For [missing][google.datastore.v1.LookupResponse.missing] entities in
63*d5c09012SAndroid Build Coastguard Worker  // `LookupResponse`, this is the version of the snapshot that was used to look
64*d5c09012SAndroid Build Coastguard Worker  // up the entity, and it is always set except for eventually consistent reads.
65*d5c09012SAndroid Build Coastguard Worker  int64 version = 4;
66*d5c09012SAndroid Build Coastguard Worker
67*d5c09012SAndroid Build Coastguard Worker  // The time at which the entity was created.
68*d5c09012SAndroid Build Coastguard Worker  // This field is set for
69*d5c09012SAndroid Build Coastguard Worker  // [`FULL`][google.datastore.v1.EntityResult.ResultType.FULL] entity results.
70*d5c09012SAndroid Build Coastguard Worker  // If this entity is missing, this field will not be set.
71*d5c09012SAndroid Build Coastguard Worker  google.protobuf.Timestamp create_time = 6;
72*d5c09012SAndroid Build Coastguard Worker
73*d5c09012SAndroid Build Coastguard Worker  // The time at which the entity was last changed.
74*d5c09012SAndroid Build Coastguard Worker  // This field is set for
75*d5c09012SAndroid Build Coastguard Worker  // [`FULL`][google.datastore.v1.EntityResult.ResultType.FULL] entity results.
76*d5c09012SAndroid Build Coastguard Worker  // If this entity is missing, this field will not be set.
77*d5c09012SAndroid Build Coastguard Worker  google.protobuf.Timestamp update_time = 5;
78*d5c09012SAndroid Build Coastguard Worker
79*d5c09012SAndroid Build Coastguard Worker  // A cursor that points to the position after the result entity.
80*d5c09012SAndroid Build Coastguard Worker  // Set only when the `EntityResult` is part of a `QueryResultBatch` message.
81*d5c09012SAndroid Build Coastguard Worker  bytes cursor = 3;
82*d5c09012SAndroid Build Coastguard Worker}
83*d5c09012SAndroid Build Coastguard Worker
84*d5c09012SAndroid Build Coastguard Worker// A query for entities.
85*d5c09012SAndroid Build Coastguard Workermessage Query {
86*d5c09012SAndroid Build Coastguard Worker  // The projection to return. Defaults to returning all properties.
87*d5c09012SAndroid Build Coastguard Worker  repeated Projection projection = 2;
88*d5c09012SAndroid Build Coastguard Worker
89*d5c09012SAndroid Build Coastguard Worker  // The kinds to query (if empty, returns entities of all kinds).
90*d5c09012SAndroid Build Coastguard Worker  // Currently at most 1 kind may be specified.
91*d5c09012SAndroid Build Coastguard Worker  repeated KindExpression kind = 3;
92*d5c09012SAndroid Build Coastguard Worker
93*d5c09012SAndroid Build Coastguard Worker  // The filter to apply.
94*d5c09012SAndroid Build Coastguard Worker  Filter filter = 4;
95*d5c09012SAndroid Build Coastguard Worker
96*d5c09012SAndroid Build Coastguard Worker  // The order to apply to the query results (if empty, order is unspecified).
97*d5c09012SAndroid Build Coastguard Worker  repeated PropertyOrder order = 5;
98*d5c09012SAndroid Build Coastguard Worker
99*d5c09012SAndroid Build Coastguard Worker  // The properties to make distinct. The query results will contain the first
100*d5c09012SAndroid Build Coastguard Worker  // result for each distinct combination of values for the given properties
101*d5c09012SAndroid Build Coastguard Worker  // (if empty, all results are returned).
102*d5c09012SAndroid Build Coastguard Worker  //
103*d5c09012SAndroid Build Coastguard Worker  // Requires:
104*d5c09012SAndroid Build Coastguard Worker  //
105*d5c09012SAndroid Build Coastguard Worker  // * If `order` is specified, the set of distinct on properties must appear
106*d5c09012SAndroid Build Coastguard Worker  // before the non-distinct on properties in `order`.
107*d5c09012SAndroid Build Coastguard Worker  repeated PropertyReference distinct_on = 6;
108*d5c09012SAndroid Build Coastguard Worker
109*d5c09012SAndroid Build Coastguard Worker  // A starting point for the query results. Query cursors are
110*d5c09012SAndroid Build Coastguard Worker  // returned in query result batches and
111*d5c09012SAndroid Build Coastguard Worker  // [can only be used to continue the same
112*d5c09012SAndroid Build Coastguard Worker  // query](https://cloud.google.com/datastore/docs/concepts/queries#cursors_limits_and_offsets).
113*d5c09012SAndroid Build Coastguard Worker  bytes start_cursor = 7;
114*d5c09012SAndroid Build Coastguard Worker
115*d5c09012SAndroid Build Coastguard Worker  // An ending point for the query results. Query cursors are
116*d5c09012SAndroid Build Coastguard Worker  // returned in query result batches and
117*d5c09012SAndroid Build Coastguard Worker  // [can only be used to limit the same
118*d5c09012SAndroid Build Coastguard Worker  // query](https://cloud.google.com/datastore/docs/concepts/queries#cursors_limits_and_offsets).
119*d5c09012SAndroid Build Coastguard Worker  bytes end_cursor = 8;
120*d5c09012SAndroid Build Coastguard Worker
121*d5c09012SAndroid Build Coastguard Worker  // The number of results to skip. Applies before limit, but after all other
122*d5c09012SAndroid Build Coastguard Worker  // constraints. Optional. Must be >= 0 if specified.
123*d5c09012SAndroid Build Coastguard Worker  int32 offset = 10;
124*d5c09012SAndroid Build Coastguard Worker
125*d5c09012SAndroid Build Coastguard Worker  // The maximum number of results to return. Applies after all other
126*d5c09012SAndroid Build Coastguard Worker  // constraints. Optional.
127*d5c09012SAndroid Build Coastguard Worker  // Unspecified is interpreted as no limit.
128*d5c09012SAndroid Build Coastguard Worker  // Must be >= 0 if specified.
129*d5c09012SAndroid Build Coastguard Worker  google.protobuf.Int32Value limit = 12;
130*d5c09012SAndroid Build Coastguard Worker}
131*d5c09012SAndroid Build Coastguard Worker
132*d5c09012SAndroid Build Coastguard Worker// Datastore query for running an aggregation over a
133*d5c09012SAndroid Build Coastguard Worker// [Query][google.datastore.v1.Query].
134*d5c09012SAndroid Build Coastguard Workermessage AggregationQuery {
135*d5c09012SAndroid Build Coastguard Worker  // Defines an aggregation that produces a single result.
136*d5c09012SAndroid Build Coastguard Worker  message Aggregation {
137*d5c09012SAndroid Build Coastguard Worker    // Count of entities that match the query.
138*d5c09012SAndroid Build Coastguard Worker    //
139*d5c09012SAndroid Build Coastguard Worker    // The `COUNT(*)` aggregation function operates on the entire entity
140*d5c09012SAndroid Build Coastguard Worker    // so it does not require a field reference.
141*d5c09012SAndroid Build Coastguard Worker    message Count {
142*d5c09012SAndroid Build Coastguard Worker      // Optional. Optional constraint on the maximum number of entities to
143*d5c09012SAndroid Build Coastguard Worker      // count.
144*d5c09012SAndroid Build Coastguard Worker      //
145*d5c09012SAndroid Build Coastguard Worker      // This provides a way to set an upper bound on the number of entities
146*d5c09012SAndroid Build Coastguard Worker      // to scan, limiting latency, and cost.
147*d5c09012SAndroid Build Coastguard Worker      //
148*d5c09012SAndroid Build Coastguard Worker      // Unspecified is interpreted as no bound.
149*d5c09012SAndroid Build Coastguard Worker      //
150*d5c09012SAndroid Build Coastguard Worker      // If a zero value is provided, a count result of zero should always be
151*d5c09012SAndroid Build Coastguard Worker      // expected.
152*d5c09012SAndroid Build Coastguard Worker      //
153*d5c09012SAndroid Build Coastguard Worker      // High-Level Example:
154*d5c09012SAndroid Build Coastguard Worker      //
155*d5c09012SAndroid Build Coastguard Worker      // ```
156*d5c09012SAndroid Build Coastguard Worker      // AGGREGATE COUNT_UP_TO(1000) OVER ( SELECT * FROM k );
157*d5c09012SAndroid Build Coastguard Worker      // ```
158*d5c09012SAndroid Build Coastguard Worker      //
159*d5c09012SAndroid Build Coastguard Worker      // Requires:
160*d5c09012SAndroid Build Coastguard Worker      //
161*d5c09012SAndroid Build Coastguard Worker      // * Must be non-negative when present.
162*d5c09012SAndroid Build Coastguard Worker      google.protobuf.Int64Value up_to = 1
163*d5c09012SAndroid Build Coastguard Worker          [(google.api.field_behavior) = OPTIONAL];
164*d5c09012SAndroid Build Coastguard Worker    }
165*d5c09012SAndroid Build Coastguard Worker
166*d5c09012SAndroid Build Coastguard Worker    // Sum of the values of the requested property.
167*d5c09012SAndroid Build Coastguard Worker    //
168*d5c09012SAndroid Build Coastguard Worker    // * Only numeric values will be aggregated. All non-numeric values
169*d5c09012SAndroid Build Coastguard Worker    // including `NULL` are skipped.
170*d5c09012SAndroid Build Coastguard Worker    //
171*d5c09012SAndroid Build Coastguard Worker    // * If the aggregated values contain `NaN`, returns `NaN`. Infinity math
172*d5c09012SAndroid Build Coastguard Worker    // follows IEEE-754 standards.
173*d5c09012SAndroid Build Coastguard Worker    //
174*d5c09012SAndroid Build Coastguard Worker    // * If the aggregated value set is empty, returns 0.
175*d5c09012SAndroid Build Coastguard Worker    //
176*d5c09012SAndroid Build Coastguard Worker    // * Returns a 64-bit integer if all aggregated numbers are integers and the
177*d5c09012SAndroid Build Coastguard Worker    // sum result does not overflow. Otherwise, the result is returned as a
178*d5c09012SAndroid Build Coastguard Worker    // double. Note that even if all the aggregated values are integers, the
179*d5c09012SAndroid Build Coastguard Worker    // result is returned as a double if it cannot fit within a 64-bit signed
180*d5c09012SAndroid Build Coastguard Worker    // integer. When this occurs, the returned value will lose precision.
181*d5c09012SAndroid Build Coastguard Worker    //
182*d5c09012SAndroid Build Coastguard Worker    // * When underflow occurs, floating-point aggregation is non-deterministic.
183*d5c09012SAndroid Build Coastguard Worker    // This means that running the same query repeatedly without any changes to
184*d5c09012SAndroid Build Coastguard Worker    // the underlying values could produce slightly different results each
185*d5c09012SAndroid Build Coastguard Worker    // time. In those cases, values should be stored as integers over
186*d5c09012SAndroid Build Coastguard Worker    // floating-point numbers.
187*d5c09012SAndroid Build Coastguard Worker    message Sum {
188*d5c09012SAndroid Build Coastguard Worker      // The property to aggregate on.
189*d5c09012SAndroid Build Coastguard Worker      PropertyReference property = 1;
190*d5c09012SAndroid Build Coastguard Worker    }
191*d5c09012SAndroid Build Coastguard Worker
192*d5c09012SAndroid Build Coastguard Worker    // Average of the values of the requested property.
193*d5c09012SAndroid Build Coastguard Worker    //
194*d5c09012SAndroid Build Coastguard Worker    // * Only numeric values will be aggregated. All non-numeric values
195*d5c09012SAndroid Build Coastguard Worker    // including `NULL` are skipped.
196*d5c09012SAndroid Build Coastguard Worker    //
197*d5c09012SAndroid Build Coastguard Worker    // * If the aggregated values contain `NaN`, returns `NaN`. Infinity math
198*d5c09012SAndroid Build Coastguard Worker    // follows IEEE-754 standards.
199*d5c09012SAndroid Build Coastguard Worker    //
200*d5c09012SAndroid Build Coastguard Worker    // * If the aggregated value set is empty, returns `NULL`.
201*d5c09012SAndroid Build Coastguard Worker    //
202*d5c09012SAndroid Build Coastguard Worker    // * Always returns the result as a double.
203*d5c09012SAndroid Build Coastguard Worker    message Avg {
204*d5c09012SAndroid Build Coastguard Worker      // The property to aggregate on.
205*d5c09012SAndroid Build Coastguard Worker      PropertyReference property = 1;
206*d5c09012SAndroid Build Coastguard Worker    }
207*d5c09012SAndroid Build Coastguard Worker
208*d5c09012SAndroid Build Coastguard Worker    // The type of aggregation to perform, required.
209*d5c09012SAndroid Build Coastguard Worker    oneof operator {
210*d5c09012SAndroid Build Coastguard Worker      // Count aggregator.
211*d5c09012SAndroid Build Coastguard Worker      Count count = 1;
212*d5c09012SAndroid Build Coastguard Worker
213*d5c09012SAndroid Build Coastguard Worker      // Sum aggregator.
214*d5c09012SAndroid Build Coastguard Worker      Sum sum = 2;
215*d5c09012SAndroid Build Coastguard Worker
216*d5c09012SAndroid Build Coastguard Worker      // Average aggregator.
217*d5c09012SAndroid Build Coastguard Worker      Avg avg = 3;
218*d5c09012SAndroid Build Coastguard Worker    }
219*d5c09012SAndroid Build Coastguard Worker
220*d5c09012SAndroid Build Coastguard Worker    // Optional. Optional name of the property to store the result of the
221*d5c09012SAndroid Build Coastguard Worker    // aggregation.
222*d5c09012SAndroid Build Coastguard Worker    //
223*d5c09012SAndroid Build Coastguard Worker    // If not provided, Datastore will pick a default name following the format
224*d5c09012SAndroid Build Coastguard Worker    // `property_<incremental_id++>`. For example:
225*d5c09012SAndroid Build Coastguard Worker    //
226*d5c09012SAndroid Build Coastguard Worker    // ```
227*d5c09012SAndroid Build Coastguard Worker    // AGGREGATE
228*d5c09012SAndroid Build Coastguard Worker    //   COUNT_UP_TO(1) AS count_up_to_1,
229*d5c09012SAndroid Build Coastguard Worker    //   COUNT_UP_TO(2),
230*d5c09012SAndroid Build Coastguard Worker    //   COUNT_UP_TO(3) AS count_up_to_3,
231*d5c09012SAndroid Build Coastguard Worker    //   COUNT(*)
232*d5c09012SAndroid Build Coastguard Worker    // OVER (
233*d5c09012SAndroid Build Coastguard Worker    //   ...
234*d5c09012SAndroid Build Coastguard Worker    // );
235*d5c09012SAndroid Build Coastguard Worker    // ```
236*d5c09012SAndroid Build Coastguard Worker    //
237*d5c09012SAndroid Build Coastguard Worker    // becomes:
238*d5c09012SAndroid Build Coastguard Worker    //
239*d5c09012SAndroid Build Coastguard Worker    // ```
240*d5c09012SAndroid Build Coastguard Worker    // AGGREGATE
241*d5c09012SAndroid Build Coastguard Worker    //   COUNT_UP_TO(1) AS count_up_to_1,
242*d5c09012SAndroid Build Coastguard Worker    //   COUNT_UP_TO(2) AS property_1,
243*d5c09012SAndroid Build Coastguard Worker    //   COUNT_UP_TO(3) AS count_up_to_3,
244*d5c09012SAndroid Build Coastguard Worker    //   COUNT(*) AS property_2
245*d5c09012SAndroid Build Coastguard Worker    // OVER (
246*d5c09012SAndroid Build Coastguard Worker    //   ...
247*d5c09012SAndroid Build Coastguard Worker    // );
248*d5c09012SAndroid Build Coastguard Worker    // ```
249*d5c09012SAndroid Build Coastguard Worker    //
250*d5c09012SAndroid Build Coastguard Worker    // Requires:
251*d5c09012SAndroid Build Coastguard Worker    //
252*d5c09012SAndroid Build Coastguard Worker    // * Must be unique across all aggregation aliases.
253*d5c09012SAndroid Build Coastguard Worker    // * Conform to [entity property
254*d5c09012SAndroid Build Coastguard Worker    // name][google.datastore.v1.Entity.properties] limitations.
255*d5c09012SAndroid Build Coastguard Worker    string alias = 7 [(google.api.field_behavior) = OPTIONAL];
256*d5c09012SAndroid Build Coastguard Worker  }
257*d5c09012SAndroid Build Coastguard Worker
258*d5c09012SAndroid Build Coastguard Worker  // The base query to aggregate over.
259*d5c09012SAndroid Build Coastguard Worker  oneof query_type {
260*d5c09012SAndroid Build Coastguard Worker    // Nested query for aggregation
261*d5c09012SAndroid Build Coastguard Worker    Query nested_query = 1;
262*d5c09012SAndroid Build Coastguard Worker  }
263*d5c09012SAndroid Build Coastguard Worker
264*d5c09012SAndroid Build Coastguard Worker  // Optional. Series of aggregations to apply over the results of the
265*d5c09012SAndroid Build Coastguard Worker  // `nested_query`.
266*d5c09012SAndroid Build Coastguard Worker  //
267*d5c09012SAndroid Build Coastguard Worker  // Requires:
268*d5c09012SAndroid Build Coastguard Worker  //
269*d5c09012SAndroid Build Coastguard Worker  // * A minimum of one and maximum of five aggregations per query.
270*d5c09012SAndroid Build Coastguard Worker  repeated Aggregation aggregations = 3
271*d5c09012SAndroid Build Coastguard Worker      [(google.api.field_behavior) = OPTIONAL];
272*d5c09012SAndroid Build Coastguard Worker}
273*d5c09012SAndroid Build Coastguard Worker
274*d5c09012SAndroid Build Coastguard Worker// A representation of a kind.
275*d5c09012SAndroid Build Coastguard Workermessage KindExpression {
276*d5c09012SAndroid Build Coastguard Worker  // The name of the kind.
277*d5c09012SAndroid Build Coastguard Worker  string name = 1;
278*d5c09012SAndroid Build Coastguard Worker}
279*d5c09012SAndroid Build Coastguard Worker
280*d5c09012SAndroid Build Coastguard Worker// A reference to a property relative to the kind expressions.
281*d5c09012SAndroid Build Coastguard Workermessage PropertyReference {
282*d5c09012SAndroid Build Coastguard Worker  // A reference to a property.
283*d5c09012SAndroid Build Coastguard Worker  //
284*d5c09012SAndroid Build Coastguard Worker  // Requires:
285*d5c09012SAndroid Build Coastguard Worker  //
286*d5c09012SAndroid Build Coastguard Worker  // * MUST be a dot-delimited (`.`) string of segments, where each segment
287*d5c09012SAndroid Build Coastguard Worker  // conforms to [entity property name][google.datastore.v1.Entity.properties]
288*d5c09012SAndroid Build Coastguard Worker  // limitations.
289*d5c09012SAndroid Build Coastguard Worker  string name = 2;
290*d5c09012SAndroid Build Coastguard Worker}
291*d5c09012SAndroid Build Coastguard Worker
292*d5c09012SAndroid Build Coastguard Worker// A representation of a property in a projection.
293*d5c09012SAndroid Build Coastguard Workermessage Projection {
294*d5c09012SAndroid Build Coastguard Worker  // The property to project.
295*d5c09012SAndroid Build Coastguard Worker  PropertyReference property = 1;
296*d5c09012SAndroid Build Coastguard Worker}
297*d5c09012SAndroid Build Coastguard Worker
298*d5c09012SAndroid Build Coastguard Worker// The desired order for a specific property.
299*d5c09012SAndroid Build Coastguard Workermessage PropertyOrder {
300*d5c09012SAndroid Build Coastguard Worker  // The sort direction.
301*d5c09012SAndroid Build Coastguard Worker  enum Direction {
302*d5c09012SAndroid Build Coastguard Worker    // Unspecified. This value must not be used.
303*d5c09012SAndroid Build Coastguard Worker    DIRECTION_UNSPECIFIED = 0;
304*d5c09012SAndroid Build Coastguard Worker
305*d5c09012SAndroid Build Coastguard Worker    // Ascending.
306*d5c09012SAndroid Build Coastguard Worker    ASCENDING = 1;
307*d5c09012SAndroid Build Coastguard Worker
308*d5c09012SAndroid Build Coastguard Worker    // Descending.
309*d5c09012SAndroid Build Coastguard Worker    DESCENDING = 2;
310*d5c09012SAndroid Build Coastguard Worker  }
311*d5c09012SAndroid Build Coastguard Worker
312*d5c09012SAndroid Build Coastguard Worker  // The property to order by.
313*d5c09012SAndroid Build Coastguard Worker  PropertyReference property = 1;
314*d5c09012SAndroid Build Coastguard Worker
315*d5c09012SAndroid Build Coastguard Worker  // The direction to order by. Defaults to `ASCENDING`.
316*d5c09012SAndroid Build Coastguard Worker  Direction direction = 2;
317*d5c09012SAndroid Build Coastguard Worker}
318*d5c09012SAndroid Build Coastguard Worker
319*d5c09012SAndroid Build Coastguard Worker// A holder for any type of filter.
320*d5c09012SAndroid Build Coastguard Workermessage Filter {
321*d5c09012SAndroid Build Coastguard Worker  // The type of filter.
322*d5c09012SAndroid Build Coastguard Worker  oneof filter_type {
323*d5c09012SAndroid Build Coastguard Worker    // A composite filter.
324*d5c09012SAndroid Build Coastguard Worker    CompositeFilter composite_filter = 1;
325*d5c09012SAndroid Build Coastguard Worker
326*d5c09012SAndroid Build Coastguard Worker    // A filter on a property.
327*d5c09012SAndroid Build Coastguard Worker    PropertyFilter property_filter = 2;
328*d5c09012SAndroid Build Coastguard Worker  }
329*d5c09012SAndroid Build Coastguard Worker}
330*d5c09012SAndroid Build Coastguard Worker
331*d5c09012SAndroid Build Coastguard Worker// A filter that merges multiple other filters using the given operator.
332*d5c09012SAndroid Build Coastguard Workermessage CompositeFilter {
333*d5c09012SAndroid Build Coastguard Worker  // A composite filter operator.
334*d5c09012SAndroid Build Coastguard Worker  enum Operator {
335*d5c09012SAndroid Build Coastguard Worker    // Unspecified. This value must not be used.
336*d5c09012SAndroid Build Coastguard Worker    OPERATOR_UNSPECIFIED = 0;
337*d5c09012SAndroid Build Coastguard Worker
338*d5c09012SAndroid Build Coastguard Worker    // The results are required to satisfy each of the combined filters.
339*d5c09012SAndroid Build Coastguard Worker    AND = 1;
340*d5c09012SAndroid Build Coastguard Worker
341*d5c09012SAndroid Build Coastguard Worker    // Documents are required to satisfy at least one of the combined filters.
342*d5c09012SAndroid Build Coastguard Worker    OR = 2;
343*d5c09012SAndroid Build Coastguard Worker  }
344*d5c09012SAndroid Build Coastguard Worker
345*d5c09012SAndroid Build Coastguard Worker  // The operator for combining multiple filters.
346*d5c09012SAndroid Build Coastguard Worker  Operator op = 1;
347*d5c09012SAndroid Build Coastguard Worker
348*d5c09012SAndroid Build Coastguard Worker  // The list of filters to combine.
349*d5c09012SAndroid Build Coastguard Worker  //
350*d5c09012SAndroid Build Coastguard Worker  // Requires:
351*d5c09012SAndroid Build Coastguard Worker  //
352*d5c09012SAndroid Build Coastguard Worker  // * At least one filter is present.
353*d5c09012SAndroid Build Coastguard Worker  repeated Filter filters = 2;
354*d5c09012SAndroid Build Coastguard Worker}
355*d5c09012SAndroid Build Coastguard Worker
356*d5c09012SAndroid Build Coastguard Worker// A filter on a specific property.
357*d5c09012SAndroid Build Coastguard Workermessage PropertyFilter {
358*d5c09012SAndroid Build Coastguard Worker  // A property filter operator.
359*d5c09012SAndroid Build Coastguard Worker  enum Operator {
360*d5c09012SAndroid Build Coastguard Worker    // Unspecified. This value must not be used.
361*d5c09012SAndroid Build Coastguard Worker    OPERATOR_UNSPECIFIED = 0;
362*d5c09012SAndroid Build Coastguard Worker
363*d5c09012SAndroid Build Coastguard Worker    // The given `property` is less than the given `value`.
364*d5c09012SAndroid Build Coastguard Worker    //
365*d5c09012SAndroid Build Coastguard Worker    // Requires:
366*d5c09012SAndroid Build Coastguard Worker    //
367*d5c09012SAndroid Build Coastguard Worker    // * That `property` comes first in `order_by`.
368*d5c09012SAndroid Build Coastguard Worker    LESS_THAN = 1;
369*d5c09012SAndroid Build Coastguard Worker
370*d5c09012SAndroid Build Coastguard Worker    // The given `property` is less than or equal to the given `value`.
371*d5c09012SAndroid Build Coastguard Worker    //
372*d5c09012SAndroid Build Coastguard Worker    // Requires:
373*d5c09012SAndroid Build Coastguard Worker    //
374*d5c09012SAndroid Build Coastguard Worker    // * That `property` comes first in `order_by`.
375*d5c09012SAndroid Build Coastguard Worker    LESS_THAN_OR_EQUAL = 2;
376*d5c09012SAndroid Build Coastguard Worker
377*d5c09012SAndroid Build Coastguard Worker    // The given `property` is greater than the given `value`.
378*d5c09012SAndroid Build Coastguard Worker    //
379*d5c09012SAndroid Build Coastguard Worker    // Requires:
380*d5c09012SAndroid Build Coastguard Worker    //
381*d5c09012SAndroid Build Coastguard Worker    // * That `property` comes first in `order_by`.
382*d5c09012SAndroid Build Coastguard Worker    GREATER_THAN = 3;
383*d5c09012SAndroid Build Coastguard Worker
384*d5c09012SAndroid Build Coastguard Worker    // The given `property` is greater than or equal to the given `value`.
385*d5c09012SAndroid Build Coastguard Worker    //
386*d5c09012SAndroid Build Coastguard Worker    // Requires:
387*d5c09012SAndroid Build Coastguard Worker    //
388*d5c09012SAndroid Build Coastguard Worker    // * That `property` comes first in `order_by`.
389*d5c09012SAndroid Build Coastguard Worker    GREATER_THAN_OR_EQUAL = 4;
390*d5c09012SAndroid Build Coastguard Worker
391*d5c09012SAndroid Build Coastguard Worker    // The given `property` is equal to the given `value`.
392*d5c09012SAndroid Build Coastguard Worker    EQUAL = 5;
393*d5c09012SAndroid Build Coastguard Worker
394*d5c09012SAndroid Build Coastguard Worker    // The given `property` is equal to at least one value in the given array.
395*d5c09012SAndroid Build Coastguard Worker    //
396*d5c09012SAndroid Build Coastguard Worker    // Requires:
397*d5c09012SAndroid Build Coastguard Worker    //
398*d5c09012SAndroid Build Coastguard Worker    // * That `value` is a non-empty `ArrayValue`, subject to disjunction
399*d5c09012SAndroid Build Coastguard Worker    //   limits.
400*d5c09012SAndroid Build Coastguard Worker    // * No `NOT_IN` is in the same query.
401*d5c09012SAndroid Build Coastguard Worker    IN = 6;
402*d5c09012SAndroid Build Coastguard Worker
403*d5c09012SAndroid Build Coastguard Worker    // The given `property` is not equal to the given `value`.
404*d5c09012SAndroid Build Coastguard Worker    //
405*d5c09012SAndroid Build Coastguard Worker    // Requires:
406*d5c09012SAndroid Build Coastguard Worker    //
407*d5c09012SAndroid Build Coastguard Worker    // * No other `NOT_EQUAL` or `NOT_IN` is in the same query.
408*d5c09012SAndroid Build Coastguard Worker    // * That `property` comes first in the `order_by`.
409*d5c09012SAndroid Build Coastguard Worker    NOT_EQUAL = 9;
410*d5c09012SAndroid Build Coastguard Worker
411*d5c09012SAndroid Build Coastguard Worker    // Limit the result set to the given entity and its descendants.
412*d5c09012SAndroid Build Coastguard Worker    //
413*d5c09012SAndroid Build Coastguard Worker    // Requires:
414*d5c09012SAndroid Build Coastguard Worker    //
415*d5c09012SAndroid Build Coastguard Worker    // * That `value` is an entity key.
416*d5c09012SAndroid Build Coastguard Worker    // * All evaluated disjunctions must have the same `HAS_ANCESTOR` filter.
417*d5c09012SAndroid Build Coastguard Worker    HAS_ANCESTOR = 11;
418*d5c09012SAndroid Build Coastguard Worker
419*d5c09012SAndroid Build Coastguard Worker    // The value of the `property` is not in the given array.
420*d5c09012SAndroid Build Coastguard Worker    //
421*d5c09012SAndroid Build Coastguard Worker    // Requires:
422*d5c09012SAndroid Build Coastguard Worker    //
423*d5c09012SAndroid Build Coastguard Worker    // * That `value` is a non-empty `ArrayValue` with at most 10 values.
424*d5c09012SAndroid Build Coastguard Worker    // * No other `OR`, `IN`, `NOT_IN`, `NOT_EQUAL` is in the same query.
425*d5c09012SAndroid Build Coastguard Worker    // * That `field` comes first in the `order_by`.
426*d5c09012SAndroid Build Coastguard Worker    NOT_IN = 13;
427*d5c09012SAndroid Build Coastguard Worker  }
428*d5c09012SAndroid Build Coastguard Worker
429*d5c09012SAndroid Build Coastguard Worker  // The property to filter by.
430*d5c09012SAndroid Build Coastguard Worker  PropertyReference property = 1;
431*d5c09012SAndroid Build Coastguard Worker
432*d5c09012SAndroid Build Coastguard Worker  // The operator to filter by.
433*d5c09012SAndroid Build Coastguard Worker  Operator op = 2;
434*d5c09012SAndroid Build Coastguard Worker
435*d5c09012SAndroid Build Coastguard Worker  // The value to compare the property to.
436*d5c09012SAndroid Build Coastguard Worker  Value value = 3;
437*d5c09012SAndroid Build Coastguard Worker}
438*d5c09012SAndroid Build Coastguard Worker
439*d5c09012SAndroid Build Coastguard Worker// A [GQL
440*d5c09012SAndroid Build Coastguard Worker// query](https://cloud.google.com/datastore/docs/apis/gql/gql_reference).
441*d5c09012SAndroid Build Coastguard Workermessage GqlQuery {
442*d5c09012SAndroid Build Coastguard Worker  // A string of the format described
443*d5c09012SAndroid Build Coastguard Worker  // [here](https://cloud.google.com/datastore/docs/apis/gql/gql_reference).
444*d5c09012SAndroid Build Coastguard Worker  string query_string = 1;
445*d5c09012SAndroid Build Coastguard Worker
446*d5c09012SAndroid Build Coastguard Worker  // When false, the query string must not contain any literals and instead must
447*d5c09012SAndroid Build Coastguard Worker  // bind all values. For example,
448*d5c09012SAndroid Build Coastguard Worker  // `SELECT * FROM Kind WHERE a = 'string literal'` is not allowed, while
449*d5c09012SAndroid Build Coastguard Worker  // `SELECT * FROM Kind WHERE a = @value` is.
450*d5c09012SAndroid Build Coastguard Worker  bool allow_literals = 2;
451*d5c09012SAndroid Build Coastguard Worker
452*d5c09012SAndroid Build Coastguard Worker  // For each non-reserved named binding site in the query string, there must be
453*d5c09012SAndroid Build Coastguard Worker  // a named parameter with that name, but not necessarily the inverse.
454*d5c09012SAndroid Build Coastguard Worker  //
455*d5c09012SAndroid Build Coastguard Worker  // Key must match regex `[A-Za-z_$][A-Za-z_$0-9]*`, must not match regex
456*d5c09012SAndroid Build Coastguard Worker  // `__.*__`, and must not be `""`.
457*d5c09012SAndroid Build Coastguard Worker  map<string, GqlQueryParameter> named_bindings = 5;
458*d5c09012SAndroid Build Coastguard Worker
459*d5c09012SAndroid Build Coastguard Worker  // Numbered binding site @1 references the first numbered parameter,
460*d5c09012SAndroid Build Coastguard Worker  // effectively using 1-based indexing, rather than the usual 0.
461*d5c09012SAndroid Build Coastguard Worker  //
462*d5c09012SAndroid Build Coastguard Worker  // For each binding site numbered i in `query_string`, there must be an i-th
463*d5c09012SAndroid Build Coastguard Worker  // numbered parameter. The inverse must also be true.
464*d5c09012SAndroid Build Coastguard Worker  repeated GqlQueryParameter positional_bindings = 4;
465*d5c09012SAndroid Build Coastguard Worker}
466*d5c09012SAndroid Build Coastguard Worker
467*d5c09012SAndroid Build Coastguard Worker// A binding parameter for a GQL query.
468*d5c09012SAndroid Build Coastguard Workermessage GqlQueryParameter {
469*d5c09012SAndroid Build Coastguard Worker  // The type of parameter.
470*d5c09012SAndroid Build Coastguard Worker  oneof parameter_type {
471*d5c09012SAndroid Build Coastguard Worker    // A value parameter.
472*d5c09012SAndroid Build Coastguard Worker    Value value = 2;
473*d5c09012SAndroid Build Coastguard Worker
474*d5c09012SAndroid Build Coastguard Worker    // A query cursor. Query cursors are returned in query
475*d5c09012SAndroid Build Coastguard Worker    // result batches.
476*d5c09012SAndroid Build Coastguard Worker    bytes cursor = 3;
477*d5c09012SAndroid Build Coastguard Worker  }
478*d5c09012SAndroid Build Coastguard Worker}
479*d5c09012SAndroid Build Coastguard Worker
480*d5c09012SAndroid Build Coastguard Worker// A batch of results produced by a query.
481*d5c09012SAndroid Build Coastguard Workermessage QueryResultBatch {
482*d5c09012SAndroid Build Coastguard Worker  // The possible values for the `more_results` field.
483*d5c09012SAndroid Build Coastguard Worker  enum MoreResultsType {
484*d5c09012SAndroid Build Coastguard Worker    // Unspecified. This value is never used.
485*d5c09012SAndroid Build Coastguard Worker    MORE_RESULTS_TYPE_UNSPECIFIED = 0;
486*d5c09012SAndroid Build Coastguard Worker
487*d5c09012SAndroid Build Coastguard Worker    // There may be additional batches to fetch from this query.
488*d5c09012SAndroid Build Coastguard Worker    NOT_FINISHED = 1;
489*d5c09012SAndroid Build Coastguard Worker
490*d5c09012SAndroid Build Coastguard Worker    // The query is finished, but there may be more results after the limit.
491*d5c09012SAndroid Build Coastguard Worker    MORE_RESULTS_AFTER_LIMIT = 2;
492*d5c09012SAndroid Build Coastguard Worker
493*d5c09012SAndroid Build Coastguard Worker    // The query is finished, but there may be more results after the end
494*d5c09012SAndroid Build Coastguard Worker    // cursor.
495*d5c09012SAndroid Build Coastguard Worker    MORE_RESULTS_AFTER_CURSOR = 4;
496*d5c09012SAndroid Build Coastguard Worker
497*d5c09012SAndroid Build Coastguard Worker    // The query is finished, and there are no more results.
498*d5c09012SAndroid Build Coastguard Worker    NO_MORE_RESULTS = 3;
499*d5c09012SAndroid Build Coastguard Worker  }
500*d5c09012SAndroid Build Coastguard Worker
501*d5c09012SAndroid Build Coastguard Worker  // The number of results skipped, typically because of an offset.
502*d5c09012SAndroid Build Coastguard Worker  int32 skipped_results = 6;
503*d5c09012SAndroid Build Coastguard Worker
504*d5c09012SAndroid Build Coastguard Worker  // A cursor that points to the position after the last skipped result.
505*d5c09012SAndroid Build Coastguard Worker  // Will be set when `skipped_results` != 0.
506*d5c09012SAndroid Build Coastguard Worker  bytes skipped_cursor = 3;
507*d5c09012SAndroid Build Coastguard Worker
508*d5c09012SAndroid Build Coastguard Worker  // The result type for every entity in `entity_results`.
509*d5c09012SAndroid Build Coastguard Worker  EntityResult.ResultType entity_result_type = 1;
510*d5c09012SAndroid Build Coastguard Worker
511*d5c09012SAndroid Build Coastguard Worker  // The results for this batch.
512*d5c09012SAndroid Build Coastguard Worker  repeated EntityResult entity_results = 2;
513*d5c09012SAndroid Build Coastguard Worker
514*d5c09012SAndroid Build Coastguard Worker  // A cursor that points to the position after the last result in the batch.
515*d5c09012SAndroid Build Coastguard Worker  bytes end_cursor = 4;
516*d5c09012SAndroid Build Coastguard Worker
517*d5c09012SAndroid Build Coastguard Worker  // The state of the query after the current batch.
518*d5c09012SAndroid Build Coastguard Worker  MoreResultsType more_results = 5;
519*d5c09012SAndroid Build Coastguard Worker
520*d5c09012SAndroid Build Coastguard Worker  // The version number of the snapshot this batch was returned from.
521*d5c09012SAndroid Build Coastguard Worker  // This applies to the range of results from the query's `start_cursor` (or
522*d5c09012SAndroid Build Coastguard Worker  // the beginning of the query if no cursor was given) to this batch's
523*d5c09012SAndroid Build Coastguard Worker  // `end_cursor` (not the query's `end_cursor`).
524*d5c09012SAndroid Build Coastguard Worker  //
525*d5c09012SAndroid Build Coastguard Worker  // In a single transaction, subsequent query result batches for the same query
526*d5c09012SAndroid Build Coastguard Worker  // can have a greater snapshot version number. Each batch's snapshot version
527*d5c09012SAndroid Build Coastguard Worker  // is valid for all preceding batches.
528*d5c09012SAndroid Build Coastguard Worker  // The value will be zero for eventually consistent queries.
529*d5c09012SAndroid Build Coastguard Worker  int64 snapshot_version = 7;
530*d5c09012SAndroid Build Coastguard Worker
531*d5c09012SAndroid Build Coastguard Worker  // Read timestamp this batch was returned from.
532*d5c09012SAndroid Build Coastguard Worker  // This applies to the range of results from the query's `start_cursor` (or
533*d5c09012SAndroid Build Coastguard Worker  // the beginning of the query if no cursor was given) to this batch's
534*d5c09012SAndroid Build Coastguard Worker  // `end_cursor` (not the query's `end_cursor`).
535*d5c09012SAndroid Build Coastguard Worker  //
536*d5c09012SAndroid Build Coastguard Worker  // In a single transaction, subsequent query result batches for the same query
537*d5c09012SAndroid Build Coastguard Worker  // can have a greater timestamp. Each batch's read timestamp
538*d5c09012SAndroid Build Coastguard Worker  // is valid for all preceding batches.
539*d5c09012SAndroid Build Coastguard Worker  // This value will not be set for eventually consistent queries in Cloud
540*d5c09012SAndroid Build Coastguard Worker  // Datastore.
541*d5c09012SAndroid Build Coastguard Worker  google.protobuf.Timestamp read_time = 8;
542*d5c09012SAndroid Build Coastguard Worker}
543