// Licensed to the Apache Software Foundation (ASF) under one
// or more contributor license agreements.  See the NOTICE file
// distributed with this work for additional information
// regarding copyright ownership.  The ASF licenses this file
// to you 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.

namespace cpp impala
namespace java org.apache.impala.thrift

include "Status.thrift"
include "Types.thrift"

enum TExecState {
  REGISTERED = 0,
  PLANNING = 1,
  QUEUED = 2,
  RUNNING = 3,
  FINISHED = 4,

  CANCELLED = 5,
  FAILED = 6,
}

// Execution stats for a single plan node.
struct TExecStats {
  // The wall clock time spent on the "main" thread. This is the user perceived
  // latency. This value indicates the current bottleneck.
  // Note: anywhere we have a queue between operators, this time can fluctuate
  // significantly without the overall query time changing much (i.e. the bottleneck
  // moved to another operator). This is unavoidable though.
  1: optional i64 latency_ns

  // Total CPU time spent across all threads. For operators that have an async
  // component (e.g. multi-threaded) this will be >= latency_ns.
  // TODO-MT: remove this or latency_ns
  2: optional i64 cpu_time_ns

  // Number of rows returned.
  3: optional i64 cardinality

  // Peak memory used (in bytes).
  4: optional i64 memory_used
}

// Summary for a single plan node. This includes labels for how to display the
// node as well as per instance stats.
struct TPlanNodeExecSummary {
  1: required Types.TPlanNodeId node_id
  2: required Types.TFragmentIdx fragment_idx
  3: required string label
  4: optional string label_detail
  5: required i32 num_children

  // Estimated stats generated by the planner
  6: optional TExecStats estimated_stats

  // One entry for each fragment instance executing this plan node.
  7: optional list<TExecStats> exec_stats

  // If true, this plan node is an exchange node that is the receiver of a broadcast.
  8: optional bool is_broadcast
}

// Progress counters for an in-flight query.
struct TExecProgress {
  1: optional i64 total_scan_ranges
  2: optional i64 num_completed_scan_ranges
}

// Execution summary of an entire query.
struct TExecSummary {
  // State of the query.
  1: required TExecState state

  // Contains the error if state is FAILED.
  2: optional Status.TStatus status

  // Flattened execution summary of the plan tree.
  3: optional list<TPlanNodeExecSummary> nodes

  // For each exch node in 'nodes', contains the index to the root node of the sending
  // fragment for this exch. Both the key and value are indices into 'nodes'.
  4: optional map<i32, i32> exch_to_sender_map

  // List of errors that were encountered during execution. This can be non-empty
  // even if status is okay, in which case it contains errors that impala skipped
  // over.
  5: optional list<string> error_logs

  // Optional record indicating the query progress
  6: optional TExecProgress progress
}
