/* -------------------------------------------------------------------
 * riak_ts.proto: Protocol buffers for Riak KV/TS
 *                (timeseries-specific messages)
 * -------------------------------------------------------------------
 *
 * NOTE: IMPORTANT
 * Any change to the definitions in this file REQUIRES the following
 * steps after:
 *
 * # Re-generate erlang source from changed .proto files:
 * make erl_protogen
 *
 * # Commit changed files:
 * git add -A; git commit -m 'Update erlang code from .proto files'
 */

// Java package specifiers
option java_package = "com.basho.riak.protobuf";
option java_outer_classname = "RiakTsPB";

import "riak.proto"; // for RpbPair

// Dispatch a query to Riak
message TsQueryReq {
  // left optional to support parameterized queries in the future
  optional TsInterpolation query = 1;
  optional bool stream = 2 [default = false];
  optional bytes cover_context = 3; // chopped up coverage plan per-req
}

message TsQueryResp {
  repeated TsColumnDescription columns = 1;
  repeated TsRow rows = 2;  // 0 to n rows
  optional bool done = 3 [default = true];
}

message TsGetReq {
  required bytes table = 1;
  repeated TsCell key = 2;
  optional uint32 timeout = 3;
}

message TsGetResp {
  repeated TsColumnDescription columns = 1;
  repeated TsRow rows = 2;  // 0 or 1 rows
}


message TsPutReq {
  required bytes table = 1;

  // optional: omitting it should use table order
  repeated TsColumnDescription columns = 2;

  repeated TsRow rows = 3;
}

message TsPutResp {

}

message TsDelReq {
  required bytes table = 1;
  repeated TsCell key = 2;
  optional bytes vclock = 3;
  optional uint32 timeout = 4;
}

message TsDelResp {

}

message TsInterpolation {
  required bytes base = 1;
  repeated RpbPair interpolations = 2;
}

enum TsColumnType {
  VARCHAR = 0;
  SINT64 = 1;
  DOUBLE = 2;
  TIMESTAMP = 3;
  BOOLEAN = 4;
  BLOB = 5;
}

message TsColumnDescription {
  required bytes name = 1;
  required TsColumnType type = 2;
}

message TsRow {
  repeated TsCell cells = 1;
}

message TsCell {
  optional bytes varchar_value = 1;
  optional sint64 sint64_value = 2;
  optional sint64 timestamp_value = 3;
  optional bool boolean_value = 4;
  optional double double_value = 5;
}

message TsListKeysReq {
  required bytes table = 1;
  optional uint32 timeout = 2;
}

message TsListKeysResp {
  repeated TsRow keys = 1;
  optional bool done = 2;
}

// Request a segmented coverage plan for this query
message TsCoverageReq {
  // left optional to support parameterized queries in the future
  optional TsInterpolation query = 1;
  required bytes table = 2;
  optional bytes replace_cover = 3;     // For failure recovery
  repeated bytes unavailable_cover = 4; // Other coverage contexts that have failed to assist Riak in deciding what nodes to avoid
}

// Segmented TS coverage plan response
message TsCoverageResp {
   repeated TsCoverageEntry entries = 1;
}

// Segment of a TS coverage plan
message TsCoverageEntry {
    required bytes ip = 1;
    required uint32 port = 2;
    required bytes cover_context = 3; // Opaque context to pass into follow-up request
    optional TsRange range = 4; // Might be other types of coverage queries/responses
}

// Each prospective subquery has a range of valid time values
message TsRange {
    required bytes field_name = 1;
    required sint64 lower_bound = 2;
    required bool lower_bound_inclusive = 3;
    required sint64 upper_bound = 4;
    required bool upper_bound_inclusive = 5;
    required bytes desc = 6; // Some human readable description of the time range
}
