// 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";

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 = "QueryPlanProto";
option java_package = "com.google.spanner.v1";


// Node information for nodes appearing in a [QueryPlan.plan_nodes][google.spanner.v1.QueryPlan.plan_nodes].
message PlanNode {
  // Metadata associated with a parent-child relationship appearing in a
  // [PlanNode][google.spanner.v1.PlanNode].
  message ChildLink {
    // The node to which the link points.
    int32 child_index = 1;

    // The type of the link. For example, in Hash Joins this could be used to
    // distinguish between the build child and the probe child, or in the case
    // of the child being an output variable, to represent the tag associated
    // with the output variable.
    string type = 2;

    // Only present if the child node is [SCALAR][google.spanner.v1.PlanNode.Kind.SCALAR] and corresponds
    // to an output variable of the parent node. The field carries the name of
    // the output variable.
    // For example, a `TableScan` operator that reads rows from a table will
    // have child links to the `SCALAR` nodes representing the output variables
    // created for each column that is read by the operator. The corresponding
    // `variable` fields will be set to the variable names assigned to the
    // columns.
    string variable = 3;
  }

  // Condensed representation of a node and its subtree. Only present for
  // `SCALAR` [PlanNode(s)][google.spanner.v1.PlanNode].
  message ShortRepresentation {
    // A string representation of the expression subtree rooted at this node.
    string description = 1;

    // A mapping of (subquery variable name) -> (subquery node id) for cases
    // where the `description` string of this node references a `SCALAR`
    // subquery contained in the expression subtree rooted at this node. The
    // referenced `SCALAR` subquery may not necessarily be a direct child of
    // this node.
    map<string, int32> subqueries = 2;
  }

  // The kind of [PlanNode][google.spanner.v1.PlanNode]. Distinguishes between the two different kinds of
  // nodes that can appear in a query plan.
  enum Kind {
    // Not specified.
    KIND_UNSPECIFIED = 0;

    // Denotes a Relational operator node in the expression tree. Relational
    // operators represent iterative processing of rows during query execution.
    // For example, a `TableScan` operation that reads rows from a table.
    RELATIONAL = 1;

    // Denotes a Scalar node in the expression tree. Scalar nodes represent
    // non-iterable entities in the query plan. For example, constants or
    // arithmetic operators appearing inside predicate expressions or references
    // to column names.
    SCALAR = 2;
  }

  // The `PlanNode`'s index in [node list][google.spanner.v1.QueryPlan.plan_nodes].
  int32 index = 1;

  // Used to determine the type of node. May be needed for visualizing
  // different kinds of nodes differently. For example, If the node is a
  // [SCALAR][google.spanner.v1.PlanNode.Kind.SCALAR] node, it will have a condensed representation
  // which can be used to directly embed a description of the node in its
  // parent.
  Kind kind = 2;

  // The display name for the node.
  string display_name = 3;

  // List of child node `index`es and their relationship to this parent.
  repeated ChildLink child_links = 4;

  // Condensed representation for [SCALAR][google.spanner.v1.PlanNode.Kind.SCALAR] nodes.
  ShortRepresentation short_representation = 5;

  // Attributes relevant to the node contained in a group of key-value pairs.
  // For example, a Parameter Reference node could have the following
  // information in its metadata:
  //
  //     {
  //       "parameter_reference": "param1",
  //       "parameter_type": "array"
  //     }
  google.protobuf.Struct metadata = 6;

  // The execution statistics associated with the node, contained in a group of
  // key-value pairs. Only present if the plan was returned as a result of a
  // profile query. For example, number of executions, number of rows/time per
  // execution etc.
  google.protobuf.Struct execution_stats = 7;
}

// Contains an ordered list of nodes appearing in the query plan.
message QueryPlan {
  // The nodes in the query plan. Plan nodes are returned in pre-order starting
  // with the plan root. Each [PlanNode][google.spanner.v1.PlanNode]'s `id` corresponds to its index in
  // `plan_nodes`.
  repeated PlanNode plan_nodes = 1;
}
