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