// Licensed to 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. Apache Software Foundation (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 = "proto3";

option java_package = "org.apache.skywalking.banyandb";
option go_package = "github.com/apache/skywalking-banyandb/api/proto/banyandb/v1;v1";

package banyandb.v1;

import "google/protobuf/timestamp.proto";
import "google/protobuf/struct.proto";
import "banyandb/v1/database.proto";

message Str {
  string value = 1;
}

message Int {
  int64 value = 1;
}

message StrArray {
  repeated string value = 1;
}

message IntArray {
  repeated int64 value = 1;
}

message Field {
  oneof value_type {
    google.protobuf.NullValue null = 1;
    Str str = 2;
    StrArray str_array = 3;
    Int int = 4;
    IntArray int_array = 5;
  }
}

message EntityValue {
  // entity_id could be span_id of a Span or segment_id of a Segment in the context of Trace
  string entity_id = 1;
  // timestamp_nanoseconds is in the timeunit of nanoseconds. It represents
  // 1) either the start time of a Span/Segment,
  // 2) or the timestamp of a log
  google.protobuf.Timestamp timestamp = 2;
  // binary representation of segments, including tags, spans...
  bytes data_binary = 3;
  // support all of indexed fields in the fields.
  // Pair only has value, as the value of PairValue match with the key
  // by the index rules and index rule bindings of Metadata group.
  // indexed fields of multiple entities are compression in the fields.
  repeated Field fields = 4;
}

message WriteRequest {
  // the metadata is only required in the first write.
  Metadata metadata = 1;
  // the entity is required.
  EntityValue entity = 2;
}

message WriteResponse {}