// 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.
//
// Separate file created to resolve circular dependency between
// common.proto and wire_protocol.proto due to necessity of
// RowOperationsPB in PartitionSchemaPB to support varying
// hash schemas per range.
syntax = "proto2";
package kudu;

option java_package = "org.apache.kudu";

import "kudu/util/pb_util.proto";

// A set of operations (INSERT, UPDATE, UPSERT, or DELETE) to apply to a table,
// or the set of split rows and range bounds when creating or altering table.
// Range bounds determine the boundaries of range partitions during table
// creation, split rows further subdivide the ranges into more partitions.
message RowOperationsPB {
  enum Type {
    UNKNOWN = 0;
    INSERT = 1;
    UPDATE = 2;
    DELETE = 3;
    UPSERT = 5;
    INSERT_IGNORE = 10;
    UPDATE_IGNORE = 11;
    DELETE_IGNORE = 12;
    UPSERT_IGNORE = 13;

    // Used when specifying split rows on table creation.
    SPLIT_ROW = 4;
    // Used when specifying an inclusive lower bound range on table creation.
    // Should be followed by the associated upper bound. If all values are
    // missing, then signifies unbounded.
    RANGE_LOWER_BOUND = 6;
    // Used when specifying an exclusive upper bound range on table creation.
    // Should be preceded by the associated lower bound. If all values are
    // missing, then signifies unbounded.
    RANGE_UPPER_BOUND = 7;
    // Used when specifying an exclusive lower bound range on table creation.
    // Should be followed by the associated upper bound. If all values are
    // missing, then signifies unbounded.
    EXCLUSIVE_RANGE_LOWER_BOUND = 8;
    // Used when specifying an inclusive upper bound range on table creation.
    // Should be preceded by the associated lower bound. If all values are
    // missing, then signifies unbounded.
    INCLUSIVE_RANGE_UPPER_BOUND = 9;
  }

  // The row data for each operation is stored in the following format:
  //
  // [operation type] (one byte):
  //   A single-byte field which determines the type of operation. The values are
  //   based on the 'Type' enum above.
  // [column isset bitmap]   (one bit for each column in the Schema, rounded to nearest byte)
  //   A set bit in this bitmap indicates that the user has specified the given column
  //   in the row. This indicates that the column will be present in the data to follow.
  // [null bitmap]           (one bit for each Schema column, rounded to nearest byte)
  //   A set bit in this bitmap indicates that the given column is NULL.
  //   This is only present if there are any nullable columns.
  // [column data]
  //   For each column which is set and not NULL, the column's data follows. The data
  //   format of each cell is the canonical in-memory format (eg little endian).
  //   For string data, the pointers are relative to 'indirect_data'.
  //
  // The rows are concatenated end-to-end with no padding/alignment.
  optional bytes rows = 2 [(kudu.REDACT) = true];
  optional bytes indirect_data = 3 [(kudu.REDACT) = true];
}
