/**
 * 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 "Comparator.proto";

/**
 * 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
 */
message Get {
  required bytes row = 1;
  repeated Column column = 2;
  repeated NameBytesPair attribute = 3;
  optional uint64 lockId = 4;
  optional Filter filter = 5;
  optional TimeRange timeRange = 6;
  optional uint32 maxVersions = 7 [default = 1];
  optional bool cacheBlocks = 8 [default = true];
  optional uint32 storeLimit = 9;
  optional uint32 storeOffset = 10;
}

/**
 * For performance reason, we don't use KeyValue
 * here. We use the actual KeyValue bytes.
 */
message Result {
  repeated bytes keyValueBytes = 1;
}

/**
 * The get request. Perform a single Get operation.
 * Unless existenceOnly is specified, return all the requested data
 * for the row that matches exactly, or the one that immediately
 * precedes it if closestRowBefore is specified.
 *
 * If existenceOnly is set, only the existence will be returned.
 */
message GetRequest {
  required RegionSpecifier region = 1;
  required Get get = 2;

  // If the row to get doesn't exist, return the
  // closest row before.
  optional bool closestRowBefore = 3;

  // The result isn't asked for, just check for
  // the existence. If specified, closestRowBefore
  // will be ignored
  optional bool existenceOnly = 4;
}

message GetResponse {
  optional Result result = 1;

  // used for Get to check existence only
  optional bool exists = 2;
}

/**
 * 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 compareType = 4;
  required Comparator comparator = 5;
}

/**
 * A specific mutate inside a mutate request.
 * It can be an append, increment, put or delete based
 * on the mutate type.
 */
message Mutate {
  required bytes row = 1;
  required MutateType mutateType = 2;
  repeated ColumnValue columnValue = 3;
  repeated NameBytesPair attribute = 4;
  optional uint64 timestamp = 5;
  optional uint64 lockId = 6;
  optional bool writeToWAL = 7 [default = true];

  // For some mutate, result may be returned, in which case,
  // time range can be specified for potential performance gain
  optional TimeRange timeRange = 10;

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

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

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

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

/**
 * 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 Mutate mutate = 2;
  optional Condition condition = 3;
}

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 startRow = 3;
  optional bytes stopRow = 4;
  optional Filter filter = 5;
  optional TimeRange timeRange = 6;
  optional uint32 maxVersions = 7 [default = 1];
  optional bool cacheBlocks = 8 [default = true];
  optional uint32 batchSize = 9;
  optional uint64 maxResultSize = 10;
  optional uint32 storeLimit = 11;
  optional uint32 storeOffset = 12;
}

/**
 * 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 scannerId = 3;
  optional uint32 numberOfRows = 4;
  optional bool closeScanner = 5;
}

/**
 * The scan response. If there are no more results, moreResults will
 * be false.  If it is not specified, it means there are more.
 */
message ScanResponse {
  repeated Result result = 1;
  optional uint64 scannerId = 2;
  optional bool moreResults = 3;
  optional uint32 ttl = 4;
}

message LockRowRequest {
  required RegionSpecifier region = 1;
  repeated bytes row = 2;
}

message LockRowResponse {
  required uint64 lockId = 1;
  optional uint32 ttl = 2;
}

message UnlockRowRequest {
  required RegionSpecifier region = 1;
  required uint64 lockId = 2;
}

message UnlockRowResponse {
}

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

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

message BulkLoadHFileResponse {
  required bool loaded = 1;
}

/**
 * An individual coprocessor call. You must specify the protocol,
 * the method, and the row to which the call will be executed.
 *
 * You can specify the configuration settings in the property list.
 *
 * The parameter list has the parameters used for the method.
 * A parameter is a pair of parameter name and the binary parameter
 * value. The name is the parameter class name.  The value is the
 * binary format of the parameter, for example, protocol buffer
 * encoded value.
 */
message Exec {
  required bytes row = 1;
  required string protocolName = 2;
  required string methodName = 3;
  repeated NameStringPair property = 4;
  repeated NameBytesPair parameter = 5;
}

  /**
   * Executes a single {@link org.apache.hadoop.hbase.ipc.CoprocessorProtocol}
   * method using the registered protocol handlers.
   * {@link CoprocessorProtocol} implementations must be registered via the
   * {@link org.apache.hadoop.hbase.regionserver.HRegion#registerProtocol(
   * Class, org.apache.hadoop.hbase.ipc.CoprocessorProtocol)}
   * method before they are available.
 */
message ExecCoprocessorRequest {
  required RegionSpecifier region = 1;
  required Exec call = 2;
}

message ExecCoprocessorResponse {
  required NameBytesPair value = 1;
}

/**
 * An action that is part of MultiRequest.
 * This is a union type - exactly one of the fields will be set.
 */
message MultiAction {
  optional Mutate mutate = 1;
  optional Get get = 2;
  optional Exec exec = 3;
}

/**
 * An individual action result. The result will in the
 * same order as the action in the request. If an action
 * returns a value, it is set in value field. If it doesn't
 * return anything, the result will be empty. If an action
 * fails to execute due to any exception, the exception
 * is returned as a stringified parameter.
 */
message ActionResult {
  optional NameBytesPair value = 1;
  optional NameBytesPair exception = 2;
}

/**
 * You can execute a list of actions on a given region in order.
 *
 * If it is a list of mutate actions, atomic can be set
 * to make sure they can be processed atomically, just like
 * RowMutations.
 */
message MultiRequest {
  required RegionSpecifier region = 1;
  repeated MultiAction action = 2;
  optional bool atomic = 3;
}

message MultiResponse {
  repeated ActionResult result = 1;
}


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

  rpc mutate(MutateRequest)
    returns(MutateResponse);

  rpc scan(ScanRequest)
    returns(ScanResponse);

  rpc lockRow(LockRowRequest)
    returns(LockRowResponse);

  rpc unlockRow(UnlockRowRequest)
    returns(UnlockRowResponse);

  rpc bulkLoadHFile(BulkLoadHFileRequest)
    returns(BulkLoadHFileResponse);

  rpc execCoprocessor(ExecCoprocessorRequest)
    returns(ExecCoprocessorResponse);

  rpc multi(MultiRequest)
    returns(MultiResponse);
}
