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

// This file contains protocol buffers that are used for Client service.

option java_package = "org.apache.hadoop.hbase.protobuf.generated";
option java_outer_classname = "ClientProtos";
option java_generic_services = true;
option java_generate_equals_and_hash = true;
option optimize_for = SPEED;

import "HBase.proto";
import "Filter.proto";
import "Cell.proto";
import "Comparator.proto";

/**
 * The protocol buffer version of Authorizations.
 */
message Authorizations {
  repeated string label = 1;
}

/**
 * The protocol buffer version of CellVisibility.
 */
message CellVisibility {
  required string expression = 1;
}

/**
 * Container for a list of column qualifier names of a family.
 */
message Column {
  required bytes family = 1;
  repeated bytes qualifier = 2;
}

/**
 * The protocol buffer version of Get.
 * Unless existence_only is specified, return all the requested data
 * for the row that matches exactly, or the one that immediately
 * precedes it if closest_row_before is specified.
 */
message Get {
  required bytes row = 1;
  repeated Column column = 2;
  repeated NameBytesPair attribute = 3;
  optional Filter filter = 4;
  optional TimeRange time_range = 5;
  optional uint32 max_versions = 6 [default = 1];
  optional bool cache_blocks = 7 [default = true];
  optional uint32 store_limit = 8;
  optional uint32 store_offset = 9;

  // The result isn't asked for, just check for
  // the existence.
  optional bool existence_only = 10 [default = false];

  // If the row to get doesn't exist, return the
  // closest row before.
  optional bool closest_row_before = 11 [default = false];
}

message Result {
  // Result includes the Cells or else it just has a count of Cells
  // that are carried otherwise.
  repeated Cell cell = 1;
  // The below count is set when the associated cells are
  // not part of this protobuf message; they are passed alongside
  // and then this Message is just a placeholder with metadata.
  // The count is needed to know how many to peel off the block of Cells as
  // ours.  NOTE: This is different from the pb managed cell_count of the
  // 'cell' field above which is non-null when the cells are pb'd.
  optional int32 associated_cell_count = 2;

  // used for Get to check existence only. Not set if existence_only was not set to true
  //  in the query.
  optional bool exists = 3;
}

/**
 * The get request. Perform a single Get operation.
 */
message GetRequest {
  required RegionSpecifier region = 1;
  required Get get = 2;
}

message GetResponse {
  optional Result result = 1;
}

/**
 * Condition to check if the value of a given cell (row,
 * family, qualifier) matches a value via a given comparator.
 *
 * Condition is used in check and mutate operations.
 */
message Condition {
  required bytes row = 1;
  required bytes family = 2;
  required bytes qualifier = 3;
  required CompareType compare_type = 4;
  required Comparator comparator = 5;
}


/**
 * A specific mutation inside a mutate request.
 * It can be an append, increment, put or delete based
 * on the mutation type.  It can be fully filled in or
 * only metadata present because data is being carried
 * elsewhere outside of pb.
 */
message MutationProto {
  optional bytes row = 1;
  optional MutationType mutate_type = 2;
  repeated ColumnValue column_value = 3;
  optional uint64 timestamp = 4;
  repeated NameBytesPair attribute = 5;
  optional Durability durability = 6 [default = USE_DEFAULT];

  // For some mutations, a result may be returned, in which case,
  // time range can be specified for potential performance gain
  optional TimeRange time_range = 7;
  // The below count is set when the associated cells are NOT
  // part of this protobuf message; they are passed alongside
  // and then this Message is a placeholder with metadata.  The
  // count is needed to know how many to peel off the block of Cells as
  // ours.  NOTE: This is different from the pb managed cell_count of the
  // 'cell' field above which is non-null when the cells are pb'd.
  optional int32 associated_cell_count = 8;

  optional uint64 nonce = 9;

  enum Durability {
    USE_DEFAULT  = 0;
    SKIP_WAL     = 1;
    ASYNC_WAL    = 2;
    SYNC_WAL     = 3;
    FSYNC_WAL    = 4;
  }

  enum MutationType {
    APPEND = 0;
    INCREMENT = 1;
    PUT = 2;
    DELETE = 3;
  }

  enum DeleteType {
    DELETE_ONE_VERSION = 0;
    DELETE_MULTIPLE_VERSIONS = 1;
    DELETE_FAMILY = 2;
    DELETE_FAMILY_VERSION = 3;
  }

  message ColumnValue {
    required bytes family = 1;
    repeated QualifierValue qualifier_value = 2;

    message QualifierValue {
      optional bytes qualifier = 1;
      optional bytes value = 2;
      optional uint64 timestamp = 3;
      optional DeleteType delete_type = 4;
      optional bytes tags = 5;
    }
  }
}

/**
 * The mutate request. Perform a single Mutate operation.
 *
 * Optionally, you can specify a condition. The mutate
 * will take place only if the condition is met.  Otherwise,
 * the mutate will be ignored.  In the response result,
 * parameter processed is used to indicate if the mutate
 * actually happened.
 */
message MutateRequest {
  required RegionSpecifier region = 1;
  required MutationProto mutation = 2;
  optional Condition condition = 3;
  optional uint64 nonce_group = 4;
}

message MutateResponse {
  optional Result result = 1;

  // used for mutate to indicate processed only
  optional bool processed = 2;
}

/**
 * Instead of get from a table, you can scan it with optional filters.
 * You can specify the row key range, time range, the columns/families
 * to scan and so on.
 *
 * This scan is used the first time in a scan request. The response of
 * the initial scan will return a scanner id, which should be used to
 * fetch result batches later on before it is closed.
 */
message Scan {
  repeated Column column = 1;
  repeated NameBytesPair attribute = 2;
  optional bytes start_row = 3;
  optional bytes stop_row = 4;
  optional Filter filter = 5;
  optional TimeRange time_range = 6;
  optional uint32 max_versions = 7 [default = 1];
  optional bool cache_blocks = 8 [default = true];
  optional uint32 batch_size = 9;
  optional uint64 max_result_size = 10;
  optional uint32 store_limit = 11;
  optional uint32 store_offset = 12;
  optional bool load_column_families_on_demand = 13; /* DO NOT add defaults to load_column_families_on_demand. */
  optional bool small = 14;
  optional bool reversed = 15 [default = false];
  optional uint32 caching = 17;
}

/**
 * A scan request. Initially, it should specify a scan. Later on, you
 * can use the scanner id returned to fetch result batches with a different
 * scan request.
 *
 * The scanner will remain open if there are more results, and it's not
 * asked to be closed explicitly.
 *
 * You can fetch the results and ask the scanner to be closed to save
 * a trip if you are not interested in remaining results.
 */
message ScanRequest {
  optional RegionSpecifier region = 1;
  optional Scan scan = 2;
  optional uint64 scanner_id = 3;
  optional uint32 number_of_rows = 4;
  optional bool close_scanner = 5;
  optional uint64 next_call_seq = 6;
}

/**
 * The scan response. If there are no more results, more_results will
 * be false.  If it is not specified, it means there are more.
 */
message ScanResponse {
  // This field is filled in if we are doing cellblocks.  A cellblock is made up
  // of all Cells serialized out as one cellblock BUT responses from a server
  // have their Cells grouped by Result.  So we can reconstitute the
  // Results on the client-side, this field is a list of counts of Cells
  // in each Result that makes up the response.  For example, if this field
  // has 3, 3, 3 in it, then we know that on the client, we are to make
  // three Results each of three Cells each.
  repeated uint32 cells_per_result = 1;
  optional uint64 scanner_id = 2;
  optional bool more_results = 3;
  optional uint32 ttl = 4;
  // If cells are not carried in an accompanying cellblock, then they are pb'd here.
  // This field is mutually exclusive with cells_per_result (since the Cells will
  // be inside the pb'd Result)
  repeated Result results = 5;

  // A server may choose to limit the number of results returned to the client for
  // reasons such as the size in bytes or quantity of results accumulated. This field
  // will true when more results exist in the current region.
  optional bool more_results_in_region = 8;
}

/**
 * Atomically bulk load multiple HFiles (say from different column families)
 * into an open region.
 */
message BulkLoadHFileRequest {
  required RegionSpecifier region = 1;
  repeated FamilyPath family_path = 2;
  optional bool assign_seq_num = 3;

  message FamilyPath {
    required bytes family = 1;
    required string path = 2;
  }
}

message BulkLoadHFileResponse {
  required bool loaded = 1;
}

message CoprocessorServiceCall {
  required bytes row = 1;
  required string service_name = 2;
  required string method_name = 3;
  required bytes request = 4;
}

message CoprocessorServiceResult {
  optional NameBytesPair value = 1;
}

message CoprocessorServiceRequest {
  required RegionSpecifier region = 1;
  required CoprocessorServiceCall call = 2;
}

message CoprocessorServiceResponse {
  required RegionSpecifier region = 1;
  required NameBytesPair value = 2;
}

// Either a Get or a Mutation
message Action {
  // If part of a multi action, useful aligning
  // result with what was originally submitted.
  optional uint32 index = 1;
  optional MutationProto mutation = 2;
  optional Get get = 3;
  optional CoprocessorServiceCall service_call = 4;
}

/**
 * Actions to run against a Region.
 */
message RegionAction {
  required RegionSpecifier region = 1;
  // When set, run mutations as atomic unit.
  optional bool atomic = 2;
  repeated Action action = 3;
}

/*
* Statistics about the current load on the region
*/
message RegionLoadStats {
  // Percent load on the memstore. Guaranteed to be positive, between 0 and 100.
  optional int32 memstoreLoad = 1 [default = 0];
  // Percent JVM heap occupancy. Guaranteed to be positive, between 0 and 100.
  // We can move this to "ServerLoadStats" should we develop them.
  optional int32 heapOccupancy = 2 [default = 0];
  // Compaction pressure. Guaranteed to be positive, between 0 and 100.
  optional int32 compactionPressure = 3 [default = 0];
}

/**
 * Either a Result or an Exception NameBytesPair (keyed by
 * exception name whose value is the exception stringified)
 * or maybe empty if no result and no exception.
 */
message ResultOrException {
  // If part of a multi call, save original index of the list of all
  // passed so can align this response w/ original request.
  optional uint32 index = 1;
  optional Result result = 2;
  optional NameBytesPair exception = 3;
  // result if this was a coprocessor service call
  optional CoprocessorServiceResult service_result = 4;
  // current load on the region
  optional RegionLoadStats loadStats = 5;  
}

/**
 * The result of a RegionAction.
 */
message RegionActionResult {
  repeated ResultOrException resultOrException = 1;
  // If the operation failed globally for this region, this exception is set
  optional NameBytesPair exception = 2;
}

/**
 * Execute a list of actions on a given region in order.
 * Nothing prevents a request to contains a set of RegionAction on the same region.
 * For this reason, the matching between the MultiRequest and the MultiResponse is not
 *  done by the region specifier but by keeping the order of the RegionActionResult vs.
 *  the order of the RegionAction.
 */
message MultiRequest {
  repeated RegionAction regionAction = 1;
  optional uint64 nonceGroup = 2;
  optional Condition condition = 3;
}

message MultiResponse {
  repeated RegionActionResult regionActionResult = 1;
  // used for mutate to indicate processed only
  optional bool processed = 2;
}


service ClientService {
  rpc Get(GetRequest)
    returns(GetResponse);

  rpc Mutate(MutateRequest)
    returns(MutateResponse);

  rpc Scan(ScanRequest)
    returns(ScanResponse);

  rpc BulkLoadHFile(BulkLoadHFileRequest)
    returns(BulkLoadHFileResponse);

  rpc ExecService(CoprocessorServiceRequest)
    returns(CoprocessorServiceResponse);
    
  rpc ExecRegionServerService(CoprocessorServiceRequest)
    returns(CoprocessorServiceResponse);

  rpc Multi(MultiRequest)
    returns(MultiResponse);
}
