// Copyright 2017 Google Inc.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//     http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

syntax = "proto3";

package google.spanner.v1;

import "google/api/annotations.proto";
import "google/protobuf/struct.proto";
import "google/spanner/v1/query_plan.proto";
import "google/spanner/v1/transaction.proto";
import "google/spanner/v1/type.proto";

option csharp_namespace = "Google.Cloud.Spanner.V1";
option go_package = "google.golang.org/genproto/googleapis/spanner/v1;spanner";
option java_multiple_files = true;
option java_outer_classname = "ResultSetProto";
option java_package = "com.google.spanner.v1";


// Results from [Read][google.spanner.v1.Spanner.Read] or
// [ExecuteSql][google.spanner.v1.Spanner.ExecuteSql].
message ResultSet {
  // Metadata about the result set, such as row type information.
  ResultSetMetadata metadata = 1;

  // Each element in `rows` is a row whose format is defined by
  // [metadata.row_type][google.spanner.v1.ResultSetMetadata.row_type]. The ith element
  // in each row matches the ith field in
  // [metadata.row_type][google.spanner.v1.ResultSetMetadata.row_type]. Elements are
  // encoded based on type as described
  // [here][google.spanner.v1.TypeCode].
  repeated google.protobuf.ListValue rows = 2;

  // Query plan and execution statistics for the query that produced this
  // result set. These can be requested by setting
  // [ExecuteSqlRequest.query_mode][google.spanner.v1.ExecuteSqlRequest.query_mode].
  ResultSetStats stats = 3;
}

// Partial results from a streaming read or SQL query. Streaming reads and
// SQL queries better tolerate large result sets, large rows, and large
// values, but are a little trickier to consume.
message PartialResultSet {
  // Metadata about the result set, such as row type information.
  // Only present in the first response.
  ResultSetMetadata metadata = 1;

  // A streamed result set consists of a stream of values, which might
  // be split into many `PartialResultSet` messages to accommodate
  // large rows and/or large values. Every N complete values defines a
  // row, where N is equal to the number of entries in
  // [metadata.row_type.fields][google.spanner.v1.StructType.fields].
  //
  // Most values are encoded based on type as described
  // [here][google.spanner.v1.TypeCode].
  //
  // It is possible that the last value in values is "chunked",
  // meaning that the rest of the value is sent in subsequent
  // `PartialResultSet`(s). This is denoted by the [chunked_value][google.spanner.v1.PartialResultSet.chunked_value]
  // field. Two or more chunked values can be merged to form a
  // complete value as follows:
  //
  //   * `bool/number/null`: cannot be chunked
  //   * `string`: concatenate the strings
  //   * `list`: concatenate the lists. If the last element in a list is a
  //     `string`, `list`, or `object`, merge it with the first element in
  //     the next list by applying these rules recursively.
  //   * `object`: concatenate the (field name, field value) pairs. If a
  //     field name is duplicated, then apply these rules recursively
  //     to merge the field values.
  //
  // Some examples of merging:
  //
  //     # Strings are concatenated.
  //     "foo", "bar" => "foobar"
  //
  //     # Lists of non-strings are concatenated.
  //     [2, 3], [4] => [2, 3, 4]
  //
  //     # Lists are concatenated, but the last and first elements are merged
  //     # because they are strings.
  //     ["a", "b"], ["c", "d"] => ["a", "bc", "d"]
  //
  //     # Lists are concatenated, but the last and first elements are merged
  //     # because they are lists. Recursively, the last and first elements
  //     # of the inner lists are merged because they are strings.
  //     ["a", ["b", "c"]], [["d"], "e"] => ["a", ["b", "cd"], "e"]
  //
  //     # Non-overlapping object fields are combined.
  //     {"a": "1"}, {"b": "2"} => {"a": "1", "b": 2"}
  //
  //     # Overlapping object fields are merged.
  //     {"a": "1"}, {"a": "2"} => {"a": "12"}
  //
  //     # Examples of merging objects containing lists of strings.
  //     {"a": ["1"]}, {"a": ["2"]} => {"a": ["12"]}
  //
  // For a more complete example, suppose a streaming SQL query is
  // yielding a result set whose rows contain a single string
  // field. The following `PartialResultSet`s might be yielded:
  //
  //     {
  //       "metadata": { ... }
  //       "values": ["Hello", "W"]
  //       "chunked_value": true
  //       "resume_token": "Af65..."
  //     }
  //     {
  //       "values": ["orl"]
  //       "chunked_value": true
  //       "resume_token": "Bqp2..."
  //     }
  //     {
  //       "values": ["d"]
  //       "resume_token": "Zx1B..."
  //     }
  //
  // This sequence of `PartialResultSet`s encodes two rows, one
  // containing the field value `"Hello"`, and a second containing the
  // field value `"World" = "W" + "orl" + "d"`.
  repeated google.protobuf.Value values = 2;

  // If true, then the final value in [values][google.spanner.v1.PartialResultSet.values] is chunked, and must
  // be combined with more values from subsequent `PartialResultSet`s
  // to obtain a complete field value.
  bool chunked_value = 3;

  // Streaming calls might be interrupted for a variety of reasons, such
  // as TCP connection loss. If this occurs, the stream of results can
  // be resumed by re-sending the original request and including
  // `resume_token`. Note that executing any other transaction in the
  // same session invalidates the token.
  bytes resume_token = 4;

  // Query plan and execution statistics for the query that produced this
  // streaming result set. These can be requested by setting
  // [ExecuteSqlRequest.query_mode][google.spanner.v1.ExecuteSqlRequest.query_mode] and are sent
  // only once with the last response in the stream.
  ResultSetStats stats = 5;
}

// Metadata about a [ResultSet][google.spanner.v1.ResultSet] or [PartialResultSet][google.spanner.v1.PartialResultSet].
message ResultSetMetadata {
  // Indicates the field names and types for the rows in the result
  // set.  For example, a SQL query like `"SELECT UserId, UserName FROM
  // Users"` could return a `row_type` value like:
  //
  //     "fields": [
  //       { "name": "UserId", "type": { "code": "INT64" } },
  //       { "name": "UserName", "type": { "code": "STRING" } },
  //     ]
  StructType row_type = 1;

  // If the read or SQL query began a transaction as a side-effect, the
  // information about the new transaction is yielded here.
  Transaction transaction = 2;
}

// Additional statistics about a [ResultSet][google.spanner.v1.ResultSet] or [PartialResultSet][google.spanner.v1.PartialResultSet].
message ResultSetStats {
  // [QueryPlan][google.spanner.v1.QueryPlan] for the query associated with this result.
  QueryPlan query_plan = 1;

  // Aggregated statistics from the execution of the query. Only present when
  // the query is profiled. For example, a query could return the statistics as
  // follows:
  //
  //     {
  //       "rows_returned": "3",
  //       "elapsed_time": "1.22 secs",
  //       "cpu_time": "1.19 secs"
  //     }
  google.protobuf.Struct query_stats = 2;
}
