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

message WorkOrderCompletionMessage {
  enum WorkOrderType {
    NORMAL = 0;
    REBUILD = 1;
  }

  required WorkOrderType work_order_type = 1;

  required uint64 operator_index = 2;
  required uint64 worker_thread_index = 3;
  required uint64 query_id = 4;

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

  // Required in the distributed version.
  optional uint64 shiftboss_index = 7;
}

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;

  // Used by PartitionAwareInsertDestination.
  optional uint64 partition_id = 5 [default = 0];
}

// 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;
  required CatalogDatabase catalog_database = 2;
}

message SqlQueryMessage {
  required string sql_query = 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 CommandResponseMessage {
  required string command_response = 1;
}

message QueryExecutionSuccessMessage {
  optional CatalogRelationSchema result_relation = 1;
}

message QueryResultTeardownMessage {
  required int32 relation_id = 1;
}

message QueryExecutionErrorMessage {
  required string error_message = 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 for the block locality based scheduling in ForemanDistributed.
message BlockDomainToShiftbossIndexMessage {
  required uint32 block_domain = 1;
  required uint64 shiftboss_index = 2;
}

// 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 GetAllDomainNetworkAddressesResponseMessage {
  message DomainNetworkAddress {
    required uint32 block_domain = 1;
    required string network_address = 2;
  }

  repeated DomainNetworkAddress domain_network_addresses = 1;
}
