//   Copyright 2011-2015 Quickstep Technologies LLC.
//   Copyright 2015-2016 Pivotal Software, Inc.
//
//   Licensed 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 "storage/StorageBlockLayout.proto";

enum InsertDestinationType {
  ALWAYS_CREATE_BLOCK = 0;
  BLOCK_POOL = 1;
  PARTITION_AWARE = 2;
}

message InsertDestination {
  required InsertDestinationType insert_destination_type = 1;
  required int32 relation_id = 2;

  // Note(zuyu): the actual StorageBlockLayout for insertion, if set.
  optional StorageBlockLayoutDescription layout = 3;

  required uint64 relational_op_index = 4;

  // The convention for extension numbering is that extensions for a particular
  // tInsertDestinationType should begin from (insert_destination_type + 1) * 16.
  extensions 16 to max;
}

message BlockPoolInsertDestination {
  extend InsertDestination {
    // NOTE(zuyu): empty for UpdateOperator, and otherwise all existing blocks
    // from the relation.
    repeated fixed64 blocks = 32 [packed=true];
  }
}

message PartitionAwareInsertDestination {
  extend InsertDestination {
    optional PartitionScheme partition_scheme = 48;
  }
}
