syntax = "proto3";
package milvus.proto.common;

option go_package="github.com/milvus-io/milvus/api/commonpb";

option java_multiple_files = true;
option java_package = "io.milvus.grpc";
option java_outer_classname = "CommonProto";
option java_generate_equals_and_hash = true;

import "google/protobuf/descriptor.proto";

enum ErrorCode {
    Success = 0;
    UnexpectedError = 1;
    ConnectFailed = 2;
    PermissionDenied = 3;
    CollectionNotExists = 4;
    IllegalArgument = 5;
    IllegalDimension = 7;
    IllegalIndexType = 8;
    IllegalCollectionName = 9;
    IllegalTOPK = 10;
    IllegalRowRecord = 11;
    IllegalVectorID = 12;
    IllegalSearchResult = 13;
    FileNotFound = 14;
    MetaFailed = 15;
    CacheFailed = 16;
    CannotCreateFolder = 17;
    CannotCreateFile = 18;
    CannotDeleteFolder = 19;
    CannotDeleteFile = 20;
    BuildIndexError = 21;
    IllegalNLIST = 22;
    IllegalMetricType = 23;
    OutOfMemory = 24;
    IndexNotExist = 25;
    EmptyCollection = 26;
    UpdateImportTaskFailure = 27;
    CollectionNameNotFound = 28;
    CreateCredentialFailure = 29;
    UpdateCredentialFailure = 30;
    DeleteCredentialFailure = 31;
    GetCredentialFailure = 32;
    ListCredUsersFailure = 33;
    GetUserFailure = 34;
    CreateRoleFailure = 35;
    DropRoleFailure = 36;
    OperateUserRoleFailure = 37;
    SelectRoleFailure = 38;
    SelectUserFailure = 39;
    SelectResourceFailure = 40;
    OperatePrivilegeFailure = 41;
    SelectGrantFailure = 42;
    RefreshPolicyInfoCacheFailure = 43;
    ListPolicyFailure = 44;
    NotShardLeader = 45;
    NoReplicaAvailable = 46;
    SegmentNotFound = 47;
    ForceDeny = 48;
    RateLimit = 49;

    // Service availability.
    // NA: Not Available.
    DataCoordNA = 100;

    // internal error code.
    DDRequestRace = 1000;
}

enum IndexState {
    IndexStateNone = 0;
    Unissued = 1;
    InProgress = 2;
    Finished = 3;
    Failed = 4;
    Retry = 5;
}

enum SegmentState {
    SegmentStateNone = 0;
    NotExist = 1;
    Growing = 2;
    Sealed = 3;
    Flushed = 4;
    Flushing = 5;
    Dropped = 6;
    Importing = 7;
}

message Status {
    ErrorCode error_code = 1;
    string reason = 2;
}

message KeyValuePair {
    string key = 1;
    string value = 2;
}

message KeyDataPair {
    string key = 1;
    bytes data = 2;
}

message Blob {
    bytes value = 1;
}

enum PlaceholderType {
  None = 0;
  BinaryVector = 100;
  FloatVector = 101;
}

message PlaceholderValue {
  string tag = 1;
  PlaceholderType type = 2;
  // values is a 2d-array, every array contains a vector
  repeated bytes values = 3;
}

message PlaceholderGroup {
  repeated PlaceholderValue placeholders = 1;
}


message Address {
  string ip = 1;
  int64 port = 2;
}

enum MsgType {
    Undefined = 0;
    /* DEFINITION REQUESTS: COLLECTION */
    CreateCollection = 100;
    DropCollection = 101;
    HasCollection = 102;
    DescribeCollection = 103;
    ShowCollections = 104;
    GetSystemConfigs = 105;
    LoadCollection = 106;
    ReleaseCollection = 107;
    CreateAlias = 108;
    DropAlias = 109;
    AlterAlias = 110;


    /* DEFINITION REQUESTS: PARTITION */
    CreatePartition = 200;
    DropPartition = 201;
    HasPartition = 202;
    DescribePartition = 203;
    ShowPartitions = 204;
    LoadPartitions = 205;
    ReleasePartitions = 206;

    /* DEFINE REQUESTS: SEGMENT */
    ShowSegments = 250;
    DescribeSegment = 251;
    LoadSegments = 252;
    ReleaseSegments = 253;
    HandoffSegments = 254;
    LoadBalanceSegments = 255;
    DescribeSegments = 256;

    /* DEFINITION REQUESTS: INDEX */
    CreateIndex = 300;
    DescribeIndex = 301;
    DropIndex = 302;

    /* MANIPULATION REQUESTS */
    Insert = 400;
    Delete = 401;
    Flush = 402;
    ResendSegmentStats = 403;

    /* QUERY */
    Search = 500;
    SearchResult = 501;
    GetIndexState = 502;
    GetIndexBuildProgress = 503;
    GetCollectionStatistics = 504;
    GetPartitionStatistics = 505;
    Retrieve = 506;
    RetrieveResult = 507;
    WatchDmChannels = 508;
    RemoveDmChannels = 509;
    WatchQueryChannels = 510;
    RemoveQueryChannels = 511;
    SealedSegmentsChangeInfo = 512;
    WatchDeltaChannels = 513;
    GetShardLeaders = 514;
    GetReplicas = 515;
    UnsubDmChannel = 516;
    GetDistribution = 517;
    SyncDistribution = 518;

    /* DATA SERVICE */
    SegmentInfo = 600;
    SystemInfo = 601;
    GetRecoveryInfo = 602;
    GetSegmentState = 603;

    /* FUNCTION */
    CreateFunction = 700;
    DropFunction = 701;
    GetFunctionInfo = 702;

    /* SYSTEM CONTROL */
    TimeTick = 1200;
    QueryNodeStats = 1201; // GOOSE TODO: Remove kQueryNodeStats
    LoadIndex = 1202;
    RequestID = 1203;
    RequestTSO = 1204;
    AllocateSegment = 1205;
    SegmentStatistics = 1206;
    SegmentFlushDone = 1207;

    DataNodeTt = 1208;

    /* Credential */
    CreateCredential = 1500;
    GetCredential = 1501;
    DeleteCredential = 1502;
    UpdateCredential = 1503;
    ListCredUsernames = 1504;

    /* RBAC */
    CreateRole = 1600;
    DropRole = 1601;
    OperateUserRole = 1602;
    SelectRole = 1603;
    SelectUser = 1604;
    SelectResource = 1605;
    OperatePrivilege = 1606;
    SelectGrant = 1607;
    RefreshPolicyInfoCache = 1608;
    ListPolicy = 1609;
}

message MsgBase {
    MsgType msg_type = 1;
    int64  msgID = 2;
    uint64 timestamp = 3;
    int64 sourceID = 4;
}

enum DslType {
    Dsl = 0;
    BoolExprV1 = 1;
}

// Don't Modify This. @czs
message MsgHeader {
    common.MsgBase base = 1;
}

// Don't Modify This. @czs
message DMLMsgHeader {
    common.MsgBase base = 1;
    string shardName = 2;
}

enum CompactionState {
  UndefiedState = 0;
  Executing = 1;
  Completed = 2;
}

enum ConsistencyLevel {
    Strong = 0;
    Session = 1; // default in PyMilvus
    Bounded = 2;
    Eventually = 3;
    Customized = 4; // Users pass their own `guarantee_timestamp`.
}

enum ImportState {
    ImportPending = 0;              // the task in in pending list of rootCoord, waiting to be executed
    ImportFailed = 1;               // the task failed for some reason, get detail reason from GetImportStateResponse.infos
    ImportStarted = 2;              // the task has been sent to datanode to execute
    ImportPersisted = 5;            // all data files have been parsed and data already persisted
    ImportCompleted = 6;            // all indexes are successfully built and segments are able to be compacted as normal.
    ImportFailedAndCleaned = 7;     // the task failed and all segments it generated are cleaned up.
}

enum ObjectType {
    Collection = 0;
    Global = 1;
    User = 2;
}

enum ObjectPrivilege {
    PrivilegeAll = 0;
    PrivilegeCreateCollection = 1;
    PrivilegeDropCollection = 2;
    PrivilegeDescribeCollection = 3;
    PrivilegeShowCollections = 4;
    PrivilegeLoad = 5;
    PrivilegeRelease = 6;
    PrivilegeCompaction = 7;
    PrivilegeInsert = 8;
    PrivilegeDelete = 9;

    PrivilegeGetStatistics = 10;
    PrivilegeCreateIndex = 11;
    PrivilegeIndexDetail = 12;
    PrivilegeDropIndex = 13;
    PrivilegeSearch = 14;
    PrivilegeFlush = 15;
    PrivilegeQuery = 16;
    PrivilegeLoadBalance = 17;
    PrivilegeImport = 18;
    PrivilegeCreateOwnership = 19;
    PrivilegeUpdateUser = 20;
    PrivilegeDropOwnership = 21;
    PrivilegeSelectOwnership = 22;
    PrivilegeManageOwnership = 23;
    PrivilegeSelectUser = 24;
}

message PrivilegeExt {
    ObjectType object_type = 1;
    ObjectPrivilege object_privilege = 2;
    int32 object_name_index = 3;
    int32 object_name_indexs = 4;
}

extend google.protobuf.MessageOptions {
    PrivilegeExt privilege_ext_obj = 1001;
}
