// 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.

syntax = "proto2";

package quickstep.serialization;

import "catalog/Catalog.proto";
import "query_execution/QueryContext.proto";
import "relational_operators/WorkOrder.proto";

// Note: There are different types of completion messages for normal work orders
// rebuild work orders. This can be potentially helpful when we want to collect
// different statistics for executing different types of work orders.
// e.g. In select normal work order completion message, we could be interested
// in the selectivity of the block whose work order got execute. In rebuild work
// order completion message, we may be interested in adding the compression
// ratio or dictionary size of the rebuilt block.

// TODO(harshad) : If there are different fields in the two message types below,
// create a base message class called WorkOrderCompletionMessage and make the
// two classes below extend the base class. All the common fields in both the
// classes can be moved to the base class.

// A message sent upon completion of a normal (not rebuild) WorkOrder execution.
message NormalWorkOrderCompletionMessage {
  required uint64 operator_index = 1;
  required uint64 worker_thread_index = 2;
  required uint64 query_id = 3;

  // Epoch time in microseconds.
  optional uint64 execution_start_time = 4;
  optional uint64 execution_end_time = 5;
}

// A message sent upon completion of a rebuild WorkOrder execution.
message RebuildWorkOrderCompletionMessage {
  required uint64 operator_index = 1;
  required uint64 worker_thread_index = 2;
  required uint64 query_id = 3;

  // Epoch time in microseconds.
  optional uint64 execution_start_time = 4;
  optional uint64 execution_end_time = 5;
}

message CatalogRelationNewBlockMessage {
  required int32 relation_id = 1;
  required fixed64 block_id = 2;

  // Used by PartitionAwareInsertDestination.
  optional uint64 partition_id = 3;
  required uint64 query_id = 4;
}

message DataPipelineMessage {
  required uint64 operator_index = 1;
  required fixed64 block_id = 2;
  required int32 relation_id = 3;
  required uint64 query_id = 4;
}

// Distributed version related messages.
message ShiftbossRegistrationMessage {
  // The total Work Order processing capacity in Shiftboss, which equals to the
  // sum of the capacity of each worker managed by Shiftboss.
  required uint64 work_order_capacity = 1;
}

message ShiftbossRegistrationResponseMessage {
  required uint64 shiftboss_index = 1;
}

message QueryInitiateMessage {
  required uint64 query_id = 1;
  required CatalogDatabase catalog_database_cache = 2;
  required QueryContext query_context = 3;
}

message QueryInitiateResponseMessage {
  required uint64 query_id = 1;
}

message WorkOrderMessage {
  required uint64 query_id = 1;
  required uint64 operator_index = 2;
  required WorkOrder work_order = 3;
}

message InitiateRebuildMessage {
  required uint64 query_id = 1;
  required uint64 operator_index = 2;
  required uint64 insert_destination_index = 3;
  required  int32 relation_id = 4;
}

message InitiateRebuildResponseMessage {
  required uint64 query_id = 1;
  required uint64 operator_index = 2;
  required uint64 num_rebuild_work_orders = 3;
  required uint64 shiftboss_index = 4;
}

message QueryTeardownMessage {
  required uint64 query_id = 1;
}

message SaveQueryResultMessage {
  required uint64 query_id = 1;
  required int32 relation_id = 2;
  repeated fixed64 blocks = 3 [packed=true];

  required uint32 cli_id = 4;  // tmb::client_id.
}

message SaveQueryResultResponseMessage {
  required int32 relation_id = 1;
  required uint32 cli_id = 2;  // tmb::client_id.
}

message QueryExecutionSuccessMessage {
  optional CatalogRelationSchema result_relation = 1;
}

// BlockLocator related messages.
message BlockDomainRegistrationMessage {
  // Format IP:Port, i.e., "0.0.0.0:0".
  required string domain_network_address = 1;
}

// Used for RegistrationResponse, Unregistration, and FailureReport.
message BlockDomainMessage {
  required uint32 block_domain = 1;
}

// Used when StorageManager loads or evicts a block or a blob from its buffer
// pool.
message BlockLocationMessage {
  required fixed64 block_id = 1;
  required uint32 block_domain = 2;
}

message BlockMessage {
  required fixed64 block_id = 1;
}

message LocateBlockResponseMessage {
  repeated uint32 block_domains = 1;
}

message GetPeerDomainNetworkAddressesResponseMessage {
  repeated string domain_network_addresses = 1;
}
