// Copyright (c) 2015, Google 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 = "proto3";

package google.bigtable.admin.table.v1;

import "google/longrunning/operations.proto";
import "google/protobuf/duration.proto";

option go_package = "google.golang.org/genproto/googleapis/bigtable/admin/table/v1;table";
option java_multiple_files = true;
option java_outer_classname = "BigtableTableDataProto";
option java_package = "com.google.bigtable.admin.table.v1";


// A collection of user data indexed by row, column, and timestamp.
// Each table is served using the resources of its parent cluster.
message Table {
  enum TimestampGranularity {
    MILLIS = 0;
  }

  // A unique identifier of the form
  // <cluster_name>/tables/[_a-zA-Z0-9][-_.a-zA-Z0-9]*
  string name = 1;

  // If this Table is in the process of being created, the Operation used to
  // track its progress. As long as this operation is present, the Table will
  // not accept any Table Admin or Read/Write requests.
  google.longrunning.Operation current_operation = 2;

  // The column families configured for this table, mapped by column family id.
  map<string, ColumnFamily> column_families = 3;

  // The granularity (e.g. MILLIS, MICROS) at which timestamps are stored in
  // this table. Timestamps not matching the granularity will be rejected.
  // Cannot be changed once the table is created.
  TimestampGranularity granularity = 4;
}

// A set of columns within a table which share a common configuration.
message ColumnFamily {
  // A unique identifier of the form <table_name>/columnFamilies/[-_.a-zA-Z0-9]+
  // The last segment is the same as the "name" field in
  // google.bigtable.v1.Family.
  string name = 1;

  // Garbage collection expression specified by the following grammar:
  //   GC = EXPR
  //      | "" ;
  //   EXPR = EXPR, "||", EXPR              (* lowest precedence *)
  //        | EXPR, "&&", EXPR
  //        | "(", EXPR, ")"                (* highest precedence *)
  //        | PROP ;
  //   PROP = "version() >", NUM32
  //        | "age() >", NUM64, [ UNIT ] ;
  //   NUM32 = non-zero-digit { digit } ;    (* # NUM32 <= 2^32 - 1 *)
  //   NUM64 = non-zero-digit { digit } ;    (* # NUM64 <= 2^63 - 1 *)
  //   UNIT =  "d" | "h" | "m"  (* d=days, h=hours, m=minutes, else micros *)
  // GC expressions can be up to 500 characters in length
  //
  // The different types of PROP are defined as follows:
  //   version() - cell index, counting from most recent and starting at 1
  //   age() - age of the cell (current time minus cell timestamp)
  //
  // Example: "version() > 3 || (age() > 3d && version() > 1)"
  //   drop cells beyond the most recent three, and drop cells older than three
  //   days unless they're the most recent cell in the row/column
  //
  // Garbage collection executes opportunistically in the background, and so
  // it's possible for reads to return a cell even if it matches the active GC
  // expression for its family.
  string gc_expression = 2;

  // Garbage collection rule specified as a protobuf.
  // Supersedes `gc_expression`.
  // Must serialize to at most 500 bytes.
  //
  // NOTE: Garbage collection executes opportunistically in the background, and
  // so it's possible for reads to return a cell even if it matches the active
  // GC expression for its family.
  GcRule gc_rule = 3;
}

// Rule for determining which cells to delete during garbage collection.
message GcRule {
  // A GcRule which deletes cells matching all of the given rules.
  message Intersection {
    // Only delete cells which would be deleted by every element of `rules`.
    repeated GcRule rules = 1;
  }

  // A GcRule which deletes cells matching any of the given rules.
  message Union {
    // Delete cells which would be deleted by any element of `rules`.
    repeated GcRule rules = 1;
  }

  oneof rule {
    // Delete all cells in a column except the most recent N.
    int32 max_num_versions = 1;

    // Delete cells in a column older than the given age.
    // Values must be at least one millisecond, and will be truncated to
    // microsecond granularity.
    google.protobuf.Duration max_age = 2;

    // Delete cells that would be deleted by every nested rule.
    Intersection intersection = 3;

    // Delete cells that would be deleted by any nested rule.
    Union union = 4;
  }
}
