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

// Next tag: 9.
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;
  required uint64 partition_id = 8;

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