xref: /aosp_15_r20/external/googleapis/google/spanner/v1/keys.proto (revision d5c09012810ac0c9f33fe448fb6da8260d444cc9)
1*d5c09012SAndroid Build Coastguard Worker// Copyright 2022 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.spanner.v1;
18*d5c09012SAndroid Build Coastguard Worker
19*d5c09012SAndroid Build Coastguard Workerimport "google/protobuf/struct.proto";
20*d5c09012SAndroid Build Coastguard Worker
21*d5c09012SAndroid Build Coastguard Workeroption csharp_namespace = "Google.Cloud.Spanner.V1";
22*d5c09012SAndroid Build Coastguard Workeroption go_package = "cloud.google.com/go/spanner/apiv1/spannerpb;spannerpb";
23*d5c09012SAndroid Build Coastguard Workeroption java_multiple_files = true;
24*d5c09012SAndroid Build Coastguard Workeroption java_outer_classname = "KeysProto";
25*d5c09012SAndroid Build Coastguard Workeroption java_package = "com.google.spanner.v1";
26*d5c09012SAndroid Build Coastguard Workeroption php_namespace = "Google\\Cloud\\Spanner\\V1";
27*d5c09012SAndroid Build Coastguard Workeroption ruby_package = "Google::Cloud::Spanner::V1";
28*d5c09012SAndroid Build Coastguard Worker
29*d5c09012SAndroid Build Coastguard Worker// KeyRange represents a range of rows in a table or index.
30*d5c09012SAndroid Build Coastguard Worker//
31*d5c09012SAndroid Build Coastguard Worker// A range has a start key and an end key. These keys can be open or
32*d5c09012SAndroid Build Coastguard Worker// closed, indicating if the range includes rows with that key.
33*d5c09012SAndroid Build Coastguard Worker//
34*d5c09012SAndroid Build Coastguard Worker// Keys are represented by lists, where the ith value in the list
35*d5c09012SAndroid Build Coastguard Worker// corresponds to the ith component of the table or index primary key.
36*d5c09012SAndroid Build Coastguard Worker// Individual values are encoded as described
37*d5c09012SAndroid Build Coastguard Worker// [here][google.spanner.v1.TypeCode].
38*d5c09012SAndroid Build Coastguard Worker//
39*d5c09012SAndroid Build Coastguard Worker// For example, consider the following table definition:
40*d5c09012SAndroid Build Coastguard Worker//
41*d5c09012SAndroid Build Coastguard Worker//     CREATE TABLE UserEvents (
42*d5c09012SAndroid Build Coastguard Worker//       UserName STRING(MAX),
43*d5c09012SAndroid Build Coastguard Worker//       EventDate STRING(10)
44*d5c09012SAndroid Build Coastguard Worker//     ) PRIMARY KEY(UserName, EventDate);
45*d5c09012SAndroid Build Coastguard Worker//
46*d5c09012SAndroid Build Coastguard Worker// The following keys name rows in this table:
47*d5c09012SAndroid Build Coastguard Worker//
48*d5c09012SAndroid Build Coastguard Worker//     ["Bob", "2014-09-23"]
49*d5c09012SAndroid Build Coastguard Worker//     ["Alfred", "2015-06-12"]
50*d5c09012SAndroid Build Coastguard Worker//
51*d5c09012SAndroid Build Coastguard Worker// Since the `UserEvents` table's `PRIMARY KEY` clause names two
52*d5c09012SAndroid Build Coastguard Worker// columns, each `UserEvents` key has two elements; the first is the
53*d5c09012SAndroid Build Coastguard Worker// `UserName`, and the second is the `EventDate`.
54*d5c09012SAndroid Build Coastguard Worker//
55*d5c09012SAndroid Build Coastguard Worker// Key ranges with multiple components are interpreted
56*d5c09012SAndroid Build Coastguard Worker// lexicographically by component using the table or index key's declared
57*d5c09012SAndroid Build Coastguard Worker// sort order. For example, the following range returns all events for
58*d5c09012SAndroid Build Coastguard Worker// user `"Bob"` that occurred in the year 2015:
59*d5c09012SAndroid Build Coastguard Worker//
60*d5c09012SAndroid Build Coastguard Worker//     "start_closed": ["Bob", "2015-01-01"]
61*d5c09012SAndroid Build Coastguard Worker//     "end_closed": ["Bob", "2015-12-31"]
62*d5c09012SAndroid Build Coastguard Worker//
63*d5c09012SAndroid Build Coastguard Worker// Start and end keys can omit trailing key components. This affects the
64*d5c09012SAndroid Build Coastguard Worker// inclusion and exclusion of rows that exactly match the provided key
65*d5c09012SAndroid Build Coastguard Worker// components: if the key is closed, then rows that exactly match the
66*d5c09012SAndroid Build Coastguard Worker// provided components are included; if the key is open, then rows
67*d5c09012SAndroid Build Coastguard Worker// that exactly match are not included.
68*d5c09012SAndroid Build Coastguard Worker//
69*d5c09012SAndroid Build Coastguard Worker// For example, the following range includes all events for `"Bob"` that
70*d5c09012SAndroid Build Coastguard Worker// occurred during and after the year 2000:
71*d5c09012SAndroid Build Coastguard Worker//
72*d5c09012SAndroid Build Coastguard Worker//     "start_closed": ["Bob", "2000-01-01"]
73*d5c09012SAndroid Build Coastguard Worker//     "end_closed": ["Bob"]
74*d5c09012SAndroid Build Coastguard Worker//
75*d5c09012SAndroid Build Coastguard Worker// The next example retrieves all events for `"Bob"`:
76*d5c09012SAndroid Build Coastguard Worker//
77*d5c09012SAndroid Build Coastguard Worker//     "start_closed": ["Bob"]
78*d5c09012SAndroid Build Coastguard Worker//     "end_closed": ["Bob"]
79*d5c09012SAndroid Build Coastguard Worker//
80*d5c09012SAndroid Build Coastguard Worker// To retrieve events before the year 2000:
81*d5c09012SAndroid Build Coastguard Worker//
82*d5c09012SAndroid Build Coastguard Worker//     "start_closed": ["Bob"]
83*d5c09012SAndroid Build Coastguard Worker//     "end_open": ["Bob", "2000-01-01"]
84*d5c09012SAndroid Build Coastguard Worker//
85*d5c09012SAndroid Build Coastguard Worker// The following range includes all rows in the table:
86*d5c09012SAndroid Build Coastguard Worker//
87*d5c09012SAndroid Build Coastguard Worker//     "start_closed": []
88*d5c09012SAndroid Build Coastguard Worker//     "end_closed": []
89*d5c09012SAndroid Build Coastguard Worker//
90*d5c09012SAndroid Build Coastguard Worker// This range returns all users whose `UserName` begins with any
91*d5c09012SAndroid Build Coastguard Worker// character from A to C:
92*d5c09012SAndroid Build Coastguard Worker//
93*d5c09012SAndroid Build Coastguard Worker//     "start_closed": ["A"]
94*d5c09012SAndroid Build Coastguard Worker//     "end_open": ["D"]
95*d5c09012SAndroid Build Coastguard Worker//
96*d5c09012SAndroid Build Coastguard Worker// This range returns all users whose `UserName` begins with B:
97*d5c09012SAndroid Build Coastguard Worker//
98*d5c09012SAndroid Build Coastguard Worker//     "start_closed": ["B"]
99*d5c09012SAndroid Build Coastguard Worker//     "end_open": ["C"]
100*d5c09012SAndroid Build Coastguard Worker//
101*d5c09012SAndroid Build Coastguard Worker// Key ranges honor column sort order. For example, suppose a table is
102*d5c09012SAndroid Build Coastguard Worker// defined as follows:
103*d5c09012SAndroid Build Coastguard Worker//
104*d5c09012SAndroid Build Coastguard Worker//     CREATE TABLE DescendingSortedTable {
105*d5c09012SAndroid Build Coastguard Worker//       Key INT64,
106*d5c09012SAndroid Build Coastguard Worker//       ...
107*d5c09012SAndroid Build Coastguard Worker//     ) PRIMARY KEY(Key DESC);
108*d5c09012SAndroid Build Coastguard Worker//
109*d5c09012SAndroid Build Coastguard Worker// The following range retrieves all rows with key values between 1
110*d5c09012SAndroid Build Coastguard Worker// and 100 inclusive:
111*d5c09012SAndroid Build Coastguard Worker//
112*d5c09012SAndroid Build Coastguard Worker//     "start_closed": ["100"]
113*d5c09012SAndroid Build Coastguard Worker//     "end_closed": ["1"]
114*d5c09012SAndroid Build Coastguard Worker//
115*d5c09012SAndroid Build Coastguard Worker// Note that 100 is passed as the start, and 1 is passed as the end,
116*d5c09012SAndroid Build Coastguard Worker// because `Key` is a descending column in the schema.
117*d5c09012SAndroid Build Coastguard Workermessage KeyRange {
118*d5c09012SAndroid Build Coastguard Worker  // The start key must be provided. It can be either closed or open.
119*d5c09012SAndroid Build Coastguard Worker  oneof start_key_type {
120*d5c09012SAndroid Build Coastguard Worker    // If the start is closed, then the range includes all rows whose
121*d5c09012SAndroid Build Coastguard Worker    // first `len(start_closed)` key columns exactly match `start_closed`.
122*d5c09012SAndroid Build Coastguard Worker    google.protobuf.ListValue start_closed = 1;
123*d5c09012SAndroid Build Coastguard Worker
124*d5c09012SAndroid Build Coastguard Worker    // If the start is open, then the range excludes rows whose first
125*d5c09012SAndroid Build Coastguard Worker    // `len(start_open)` key columns exactly match `start_open`.
126*d5c09012SAndroid Build Coastguard Worker    google.protobuf.ListValue start_open = 2;
127*d5c09012SAndroid Build Coastguard Worker  }
128*d5c09012SAndroid Build Coastguard Worker
129*d5c09012SAndroid Build Coastguard Worker  // The end key must be provided. It can be either closed or open.
130*d5c09012SAndroid Build Coastguard Worker  oneof end_key_type {
131*d5c09012SAndroid Build Coastguard Worker    // If the end is closed, then the range includes all rows whose
132*d5c09012SAndroid Build Coastguard Worker    // first `len(end_closed)` key columns exactly match `end_closed`.
133*d5c09012SAndroid Build Coastguard Worker    google.protobuf.ListValue end_closed = 3;
134*d5c09012SAndroid Build Coastguard Worker
135*d5c09012SAndroid Build Coastguard Worker    // If the end is open, then the range excludes rows whose first
136*d5c09012SAndroid Build Coastguard Worker    // `len(end_open)` key columns exactly match `end_open`.
137*d5c09012SAndroid Build Coastguard Worker    google.protobuf.ListValue end_open = 4;
138*d5c09012SAndroid Build Coastguard Worker  }
139*d5c09012SAndroid Build Coastguard Worker}
140*d5c09012SAndroid Build Coastguard Worker
141*d5c09012SAndroid Build Coastguard Worker// `KeySet` defines a collection of Cloud Spanner keys and/or key ranges. All
142*d5c09012SAndroid Build Coastguard Worker// the keys are expected to be in the same table or index. The keys need
143*d5c09012SAndroid Build Coastguard Worker// not be sorted in any particular way.
144*d5c09012SAndroid Build Coastguard Worker//
145*d5c09012SAndroid Build Coastguard Worker// If the same key is specified multiple times in the set (for example
146*d5c09012SAndroid Build Coastguard Worker// if two ranges, two keys, or a key and a range overlap), Cloud Spanner
147*d5c09012SAndroid Build Coastguard Worker// behaves as if the key were only specified once.
148*d5c09012SAndroid Build Coastguard Workermessage KeySet {
149*d5c09012SAndroid Build Coastguard Worker  // A list of specific keys. Entries in `keys` should have exactly as
150*d5c09012SAndroid Build Coastguard Worker  // many elements as there are columns in the primary or index key
151*d5c09012SAndroid Build Coastguard Worker  // with which this `KeySet` is used.  Individual key values are
152*d5c09012SAndroid Build Coastguard Worker  // encoded as described [here][google.spanner.v1.TypeCode].
153*d5c09012SAndroid Build Coastguard Worker  repeated google.protobuf.ListValue keys = 1;
154*d5c09012SAndroid Build Coastguard Worker
155*d5c09012SAndroid Build Coastguard Worker  // A list of key ranges. See [KeyRange][google.spanner.v1.KeyRange] for more information about
156*d5c09012SAndroid Build Coastguard Worker  // key range specifications.
157*d5c09012SAndroid Build Coastguard Worker  repeated KeyRange ranges = 2;
158*d5c09012SAndroid Build Coastguard Worker
159*d5c09012SAndroid Build Coastguard Worker  // For convenience `all` can be set to `true` to indicate that this
160*d5c09012SAndroid Build Coastguard Worker  // `KeySet` matches all keys in the table or index. Note that any keys
161*d5c09012SAndroid Build Coastguard Worker  // specified in `keys` or `ranges` are only yielded once.
162*d5c09012SAndroid Build Coastguard Worker  bool all = 3;
163*d5c09012SAndroid Build Coastguard Worker}
164