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

syntax = "proto2";
package heron.proto.system;

option java_package = "org.apache.heron.proto.system";
option java_outer_classname = "HeronTuples";

import "topology.proto";

message RootId {
  required int32 taskid = 1;
  required sfixed64 key = 2;
}

message AckTuple {
  repeated RootId roots = 1;
  required sfixed64 ackedtuple = 2;
}

message HeronDataTuple {
  required sfixed64 key = 1;
  repeated RootId roots = 2;               // What are the roots
  repeated bytes values = 3;               // The actual payload
  // If present, this set of tuples must be sent
  // to these destination global task ids as well
  // Only valid for data tuples from instance to stmgr
  repeated int32 dest_task_ids = 4;
}

message HeronDataTupleSet {
  required heron.proto.api.StreamId stream = 1;
  repeated HeronDataTuple tuples = 2;
}

// Note:- only one of the acks/fails/emits is set
message HeronControlTupleSet {
  repeated AckTuple acks = 1;
  repeated AckTuple fails = 2;
  repeated AckTuple emits = 3;
}

// Note:- Only one of data/control is set in any message
message HeronTupleSet {
  optional HeronDataTupleSet data = 1;
  optional HeronControlTupleSet control = 2;
  required int32 src_task_id = 3;
}

message HeronDataTupleSet2 {
  required heron.proto.api.StreamId stream = 1;
  repeated bytes tuples = 2;
}

message HeronTupleSet2 {
  optional HeronDataTupleSet2 data = 1;
  optional HeronControlTupleSet control = 2;
  required int32 src_task_id = 3;
}
