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

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 LocateBlockResponseMessage {
  repeated uint32 block_domains = 1;
}

message GetPeerDomainNetworkAddressesResponseMessage {
  repeated string domain_network_addresses = 1;
}
