syntax = "proto3";

package milvus.proto.query;

option go_package = "github.com/milvus-io/milvus/pkg/v2/proto/querypb";

import "common.proto";
import "milvus.proto";
import "rg.proto";
import "internal.proto";
import "schema.proto";
import "msg.proto";
import "data_coord.proto";
import "index_coord.proto";

service QueryCoord {
    rpc ShowLoadCollections(ShowCollectionsRequest)
        returns (ShowCollectionsResponse) {
    }
    rpc ShowLoadPartitions(ShowPartitionsRequest) returns (ShowPartitionsResponse) {
    }

    rpc LoadPartitions(LoadPartitionsRequest) returns (common.Status) {
    }
    rpc ReleasePartitions(ReleasePartitionsRequest) returns (common.Status) {
    }
    rpc LoadCollection(LoadCollectionRequest) returns (common.Status) {
    }
    rpc ReleaseCollection(ReleaseCollectionRequest) returns (common.Status) {
    }
    rpc SyncNewCreatedPartition(SyncNewCreatedPartitionRequest)
        returns (common.Status) {
    }

    rpc GetPartitionStates(GetPartitionStatesRequest)
        returns (GetPartitionStatesResponse) {
    }
    rpc GetLoadSegmentInfo(GetSegmentInfoRequest) returns (GetSegmentInfoResponse) {
    }
    rpc LoadBalance(LoadBalanceRequest) returns (common.Status) {
    }

    rpc ShowConfigurations(internal.ShowConfigurationsRequest)
        returns (internal.ShowConfigurationsResponse) {
    }
    // https://wiki.lfaidata.foundation/display/MIL/MEP+8+--+Add+metrics+for+proxy
    rpc GetMetrics(milvus.GetMetricsRequest)
        returns (milvus.GetMetricsResponse) {
    }

    // https://wiki.lfaidata.foundation/display/MIL/MEP+23+--+Multiple+memory+replication+design
    rpc GetReplicas(milvus.GetReplicasRequest)
        returns (milvus.GetReplicasResponse) {
    }
    rpc GetShardLeaders(GetShardLeadersRequest)
        returns (GetShardLeadersResponse) {
    }

    rpc CheckHealth(milvus.CheckHealthRequest)
        returns (milvus.CheckHealthResponse) {
    }

    rpc CreateResourceGroup(milvus.CreateResourceGroupRequest)
        returns (common.Status) {
    }
    rpc UpdateResourceGroups(UpdateResourceGroupsRequest) 
        returns (common.Status) {
    }
    rpc DropResourceGroup(milvus.DropResourceGroupRequest)
        returns (common.Status) {
    }
    rpc TransferNode(milvus.TransferNodeRequest) returns (common.Status) {
        option deprecated = true;
    }
    rpc TransferReplica(TransferReplicaRequest) returns (common.Status) {
    }
    rpc ListResourceGroups(milvus.ListResourceGroupsRequest)
        returns (milvus.ListResourceGroupsResponse) {
    }
    rpc DescribeResourceGroup(DescribeResourceGroupRequest)
        returns (DescribeResourceGroupResponse) {
    }
    rpc ListLoadedSegments(ListLoadedSegmentsRequest) returns (ListLoadedSegmentsResponse){}


  // ops interfaces
  rpc ListCheckers(ListCheckersRequest) returns (ListCheckersResponse) {}
  rpc ActivateChecker(ActivateCheckerRequest) returns (common.Status) {}
  rpc DeactivateChecker(DeactivateCheckerRequest) returns (common.Status) {}
    
  rpc ListQueryNode(ListQueryNodeRequest) returns (ListQueryNodeResponse) {}
  rpc GetQueryNodeDistribution(GetQueryNodeDistributionRequest) returns (GetQueryNodeDistributionResponse) {}
  rpc SuspendBalance(SuspendBalanceRequest) returns (common.Status)  {}
  rpc ResumeBalance(ResumeBalanceRequest) returns (common.Status)  {}
  rpc CheckBalanceStatus(CheckBalanceStatusRequest) returns (CheckBalanceStatusResponse) {}
  rpc SuspendNode(SuspendNodeRequest) returns (common.Status) {}
  rpc ResumeNode(ResumeNodeRequest) returns (common.Status) {}
  rpc TransferSegment(TransferSegmentRequest) returns (common.Status) {}
  rpc TransferChannel(TransferChannelRequest) returns (common.Status) {}
  rpc CheckQueryNodeDistribution(CheckQueryNodeDistributionRequest) returns (common.Status) {}

  rpc UpdateLoadConfig(UpdateLoadConfigRequest) returns (common.Status) {}
  rpc RunAnalyzer(RunAnalyzerRequest) returns(milvus.RunAnalyzerResponse){}
  rpc ComputePhraseMatchSlop(ComputePhraseMatchSlopRequest) returns(ComputePhraseMatchSlopResponse){}
  rpc ValidateAnalyzer(ValidateAnalyzerRequest) returns(ValidateAnalyzerResponse){}
}

service QueryNode {
    rpc GetComponentStates(milvus.GetComponentStatesRequest)
        returns (milvus.ComponentStates) {
    }
    rpc GetTimeTickChannel(internal.GetTimeTickChannelRequest)
        returns (milvus.StringResponse) {
    }
    rpc GetStatisticsChannel(internal.GetStatisticsChannelRequest)
        returns (milvus.StringResponse) {
    }

    rpc WatchDmChannels(WatchDmChannelsRequest) returns (common.Status) {
    }
    rpc UnsubDmChannel(UnsubDmChannelRequest) returns (common.Status) {
    }
    rpc LoadSegments(LoadSegmentsRequest) returns (common.Status) {
    }
    rpc ReleaseCollection(ReleaseCollectionRequest) returns (common.Status) {
    }
    rpc LoadPartitions(LoadPartitionsRequest) returns (common.Status) {
    }
    rpc ReleasePartitions(ReleasePartitionsRequest) returns (common.Status) {
    }
    rpc ReleaseSegments(ReleaseSegmentsRequest) returns (common.Status) {
    }
    rpc GetSegmentInfo(GetSegmentInfoRequest) returns (GetSegmentInfoResponse) {
    }
    rpc SyncReplicaSegments(SyncReplicaSegmentsRequest)
        returns (common.Status) {
    }

    rpc GetStatistics(GetStatisticsRequest)
        returns (internal.GetStatisticsResponse) {
    }
    rpc Search(SearchRequest) returns (internal.SearchResults) {
    }
    rpc SearchSegments(SearchRequest) returns (internal.SearchResults) {
    }
    rpc Query(QueryRequest) returns (internal.RetrieveResults) {
    }
    rpc QueryStream(QueryRequest) returns (stream internal.RetrieveResults) {
    }
    rpc QuerySegments(QueryRequest) returns (internal.RetrieveResults) {
    }
    rpc QueryStreamSegments(QueryRequest)
        returns (stream internal.RetrieveResults) {
    }

    rpc ShowConfigurations(internal.ShowConfigurationsRequest)
        returns (internal.ShowConfigurationsResponse) {
    }
    // https://wiki.lfaidata.foundation/display/MIL/MEP+8+--+Add+metrics+for+proxy
    rpc GetMetrics(milvus.GetMetricsRequest)
        returns (milvus.GetMetricsResponse) {
    }

    rpc GetDataDistribution(GetDataDistributionRequest)
        returns (GetDataDistributionResponse) {
    }
    rpc SyncDistribution(SyncDistributionRequest) returns (common.Status) {
    }
    rpc Delete(DeleteRequest) returns (common.Status) {
    }
    // DeleteBatch is the API to apply same delete data into multiple segments.
    // it's basically same as `Delete` but cost less memory pressure.
    rpc DeleteBatch(DeleteBatchRequest) returns (DeleteBatchResponse) {
    } 
    rpc UpdateSchema(UpdateSchemaRequest) returns (common.Status) {}

    rpc RunAnalyzer(RunAnalyzerRequest) returns(milvus.RunAnalyzerResponse){}
    rpc GetHighlight(GetHighlightRequest) returns (GetHighlightResponse){}
    
    rpc DropIndex(DropIndexRequest) returns (common.Status) {}
    rpc ValidateAnalyzer(ValidateAnalyzerRequest) returns(ValidateAnalyzerResponse){}
    
    // file resource
    rpc SyncFileResource(internal.SyncFileResourceRequest) returns(common.Status) {}

    rpc ComputePhraseMatchSlop(ComputePhraseMatchSlopRequest) returns(ComputePhraseMatchSlopResponse){}
}

// --------------------QueryCoord grpc request and response proto------------------

message ComputePhraseMatchSlopRequest {
    common.MsgBase base = 1;
    string analyzer_params = 2;
    string query_text = 3;
    repeated string data_texts = 4;
}

message ComputePhraseMatchSlopResponse {
    common.Status status = 1;
    repeated bool is_match = 2;
    repeated int64 slops = 3;
}

message ShowCollectionsRequest {
    common.MsgBase base = 1;
    // Not useful for now
    int64 dbID = 2;
    repeated int64 collectionIDs = 3;
}

message ShowCollectionsResponse {
    common.Status status = 1;
    repeated int64 collectionIDs = 2;
    repeated int64 inMemory_percentages = 3;
    repeated bool query_service_available = 4;
    repeated int64 refresh_progress = 5;
    repeated schema.LongArray load_fields = 6;
}

message ShowPartitionsRequest {
    common.MsgBase base = 1;
    int64 dbID = 2;
    int64 collectionID = 3;
    repeated int64 partitionIDs = 4;
}

message ShowPartitionsResponse {
    common.Status status = 1;
    repeated int64 partitionIDs = 2;
    repeated int64 inMemory_percentages = 3;
    repeated int64 refresh_progress = 4;
}

message LoadCollectionRequest {
    common.MsgBase base = 1;
    int64 dbID = 2;
    int64 collectionID = 3;
    schema.CollectionSchema schema = 4;
    int32 replica_number = 5;
    // fieldID -> indexID
    map<int64, int64> field_indexID = 6;
    bool refresh = 7;
    // resource group names
    repeated string resource_groups = 8;
    repeated int64 load_fields = 9;
    common.LoadPriority priority = 10;
}

message ReleaseCollectionRequest {
    common.MsgBase base = 1;
    int64 dbID = 2;
    int64 collectionID = 3;
    int64 nodeID = 4;
}

message GetStatisticsRequest {
    internal.GetStatisticsRequest req = 1;
    repeated string dml_channels = 2;
    repeated int64 segmentIDs = 3;
    bool from_shard_leader = 4;
    DataScope scope = 5;  // All, Streaming, Historical
}

message LoadPartitionsRequest {
    common.MsgBase base = 1;
    int64 dbID = 2;
    int64 collectionID = 3;
    repeated int64 partitionIDs = 4;
    schema.CollectionSchema schema = 5;
    int32 replica_number = 6;
    // fieldID -> indexID
    map<int64, int64> field_indexID = 7;
    bool refresh = 8;
    // resource group names
    repeated string resource_groups = 9;
    repeated index.IndexInfo index_info_list = 10;
    repeated int64 load_fields = 11;
    common.LoadPriority priority = 12;
}

message ReleasePartitionsRequest {
    common.MsgBase base = 1;
    int64 dbID = 2;
    int64 collectionID = 3;
    repeated int64 partitionIDs = 4;
    int64 nodeID = 5;
}

message GetPartitionStatesRequest {
    common.MsgBase base = 1;
    int64 dbID = 2;
    int64 collectionID = 3;
    repeated int64 partitionIDs = 4;
}

message GetPartitionStatesResponse {
    common.Status status = 1;
    repeated PartitionStates partition_descriptions = 2;
}

message GetSegmentInfoRequest {
    common.MsgBase base = 1;
    repeated int64 segmentIDs = 2;  // deprecated
    int64 collectionID = 3;
}

message GetSegmentInfoResponse {
    common.Status status = 1;
    repeated SegmentInfo infos = 2;
}

message GetShardLeadersRequest {
    common.MsgBase base = 1;
    int64 collectionID = 2;
    bool with_unserviceable_shards = 3;
}

message GetShardLeadersResponse {
    common.Status status = 1;
    repeated ShardLeadersList shards = 2;
}

message UpdateResourceGroupsRequest {
    common.MsgBase base = 1;
    map<string, rg.ResourceGroupConfig> resource_groups = 2;
}

message ShardLeadersList {  // All leaders of all replicas of one shard
    string channel_name = 1;
    repeated int64 node_ids = 2;
    repeated string node_addrs = 3;
    repeated bool serviceable = 4;
}

message SyncNewCreatedPartitionRequest {
    common.MsgBase base = 1;
    int64 collectionID = 2;
    int64 partitionID = 3;
}

// -----------------query node grpc request and response proto----------------

message LoadMetaInfo {
    LoadType load_type = 1;
    int64 collectionID = 2;
    repeated int64 partitionIDs = 3;
    string metric_type = 4 [deprecated = true];
    string db_name = 5; // Only used for metrics label.
    string resource_group = 6; // Only used for metrics label.
    repeated int64 load_fields = 7;
    repeated common.KeyValuePair db_properties = 8;
    uint64 schema_version = 9; // used for schema change detection.
}

message WatchDmChannelsRequest {
    common.MsgBase base = 1;
    int64 nodeID = 2;
    int64 collectionID = 3;
    repeated int64 partitionIDs = 4;
    repeated data.VchannelInfo infos = 5;
    schema.CollectionSchema schema = 6;
    repeated data.SegmentInfo exclude_infos = 7;
    LoadMetaInfo load_meta = 8;
    int64 replicaID = 9;
    map<int64, data.SegmentInfo> segment_infos = 10;
    // Deprecated
    // for node down load balance, need to remove offline node in time after every watchDmChannel finish.
    int64 offlineNodeID = 11;
    int64 version = 12;
    repeated index.IndexInfo index_info_list = 13;
    int64 target_version = 14;
    map<int64, int64> sealed_segment_row_count = 15; // segmentID -> row count, same as unflushedSegmentIds in vchannelInfo
}

message UnsubDmChannelRequest {
    common.MsgBase base = 1;
    int64 nodeID = 2;
    int64 collectionID = 3;
    string channel_name = 4;
}

message SegmentLoadInfo {
    int64 segmentID = 1;
    int64 partitionID = 2;
    int64 collectionID = 3;
    int64 dbID = 4;
    int64 flush_time = 5;
    repeated data.FieldBinlog binlog_paths = 6;
    int64 num_of_rows = 7;
    repeated data.FieldBinlog statslogs = 8;
    repeated data.FieldBinlog deltalogs = 9;
    repeated int64 compactionFrom = 10;  // segmentIDs compacted from
    repeated FieldIndexInfo index_infos = 11;
    int64 segment_size = 12 [deprecated = true];
    string insert_channel = 13;
    msg.MsgPosition start_position = 14;
    msg.MsgPosition delta_position = 15;
    int64 readableVersion = 16;
    data.SegmentLevel level = 17;
    int64 storageVersion = 18;
    bool is_sorted = 19;
    map<int64, data.TextIndexStats> textStatsLogs = 20;
    repeated data.FieldBinlog bm25logs = 21;
    map<int64, data.JsonKeyStats> jsonKeyStatsLogs = 22;
    common.LoadPriority priority = 23;
    string manifest_path = 24;
}

message FieldIndexInfo {
    int64 fieldID = 1;
    // deprecated
    bool enable_index = 2;
    string index_name = 3;
    int64 indexID = 4;
    int64 buildID = 5;
    repeated common.KeyValuePair index_params = 6;
    repeated string index_file_paths = 7;
    int64 index_size = 8;
    int64 index_version = 9;
    int64 num_rows = 10;
    int32 current_index_version = 11;
    int64 index_store_version = 12;
}

message JsonStatsInfo {
    int64 fieldID = 1;
    int64 dataFormatVersion = 2;
    int64 indexID = 3;
    int64 buildID = 4;
    int64 versionID = 5;
}

enum LoadScope {
    Full = 0;
    Delta = 1;
    Index = 2;
    Stats = 3;
    Reopen = 4;
}

message LoadSegmentsRequest {
    common.MsgBase base = 1;
    int64 dst_nodeID = 2;
    repeated SegmentLoadInfo infos = 3;
    schema.CollectionSchema schema = 4;
    int64 source_nodeID = 5;
    int64 collectionID = 6;
    LoadMetaInfo load_meta = 7;
    int64 replicaID = 8;
    repeated msg.MsgPosition delta_positions =
        9;  // keep it for compatibility of rolling upgrade from 2.2.x to 2.3
    int64 version = 10;
    bool need_transfer = 11;
    LoadScope load_scope = 12;
    repeated index.IndexInfo index_info_list = 13;
    bool lazy_load = 14;
}

message ReleaseSegmentsRequest {
    common.MsgBase base = 1;
    int64 nodeID = 2;
    // Not useful for now
    int64 dbID = 3;
    int64 collectionID = 4;
    repeated int64 partitionIDs = 5;
    repeated int64 segmentIDs = 6;
    DataScope scope = 7;  // All, Streaming, Historical
    string shard = 8;
    bool need_transfer = 11;
    msg.MsgPosition checkpoint = 12; // channel's check point
}

message SearchRequest {
    internal.SearchRequest req = 1;
    repeated string dml_channels = 2;
    repeated int64 segmentIDs = 3;
    bool from_shard_leader = 4;
    DataScope scope = 5;  // All, Streaming, Historical
    int32 total_channel_num = 6;
}

message QueryRequest {
    internal.RetrieveRequest req = 1;
    repeated string dml_channels = 2;
    repeated int64 segmentIDs = 3;
    bool from_shard_leader = 4;
    DataScope scope = 5;  // All, Streaming, Historical
}

message SyncReplicaSegmentsRequest {
    common.MsgBase base = 1;
    string vchannel_name = 2;
    repeated ReplicaSegmentsInfo replica_segments = 3;
}

message ReplicaSegmentsInfo {
    int64 node_id = 1;
    int64 partition_id = 2;
    repeated int64 segment_ids = 3;
    repeated int64 versions = 4;
}

message GetLoadInfoRequest {
    common.MsgBase base = 1;
    int64 collection_id = 2;
}

message GetLoadInfoResponse {
    common.Status status = 1;
    schema.CollectionSchema schema = 2;
    LoadType load_type = 3;
    repeated int64 partitions = 4;
}

// ----------------request auto triggered by QueryCoord-----------------

message HandoffSegmentsRequest {
    common.MsgBase base = 1;
    repeated SegmentInfo segmentInfos = 2;
    repeated int64 released_segments = 3;
}

message LoadBalanceRequest {
    common.MsgBase base = 1;
    repeated int64 source_nodeIDs = 2;
    TriggerCondition balance_reason = 3;
    repeated int64 dst_nodeIDs = 4;
    repeated int64 sealed_segmentIDs = 5;
    int64 collectionID = 6;
}

// -------------------- internal meta proto------------------

enum DataScope {
    UnKnown = 0;
    All = 1;
    Streaming = 2;
    Historical = 3;
}

enum PartitionState {
    NotExist = 0;
    NotPresent = 1;
    OnDisk = 2;
    PartialInMemory = 3;
    InMemory = 4;
    PartialInGPU = 5;
    InGPU = 6;
}

enum TriggerCondition {
    UnKnowCondition = 0;
    Handoff = 1;
    LoadBalance = 2;
    GrpcRequest = 3;
    NodeDown = 4;
}

enum LoadType {
    UnKnownType = 0;
    LoadPartition = 1;
    LoadCollection = 2;
}

message DmChannelWatchInfo {
    int64 collectionID = 1;
    string dmChannel = 2;
    int64 nodeID_loaded = 3;
    int64 replicaID = 4;
    repeated int64 node_ids = 5;
}

message QueryChannelInfo {
    int64 collectionID = 1;
    string query_channel = 2;
    string query_result_channel = 3;
    repeated SegmentInfo global_sealed_segments = 4;
    msg.MsgPosition seek_position = 5;
}

message PartitionStates {
    int64 partitionID = 1;
    PartitionState state = 2;
    int64 inMemory_percentage = 3;
}

message SegmentInfo {
    int64 segmentID = 1;
    int64 collectionID = 2;
    int64 partitionID = 3;
    // deprecated, check node_ids(NodeIds) field
    int64 nodeID = 4;
    int64 mem_size = 5;
    int64 num_rows = 6;
    string index_name = 7;
    int64 indexID = 8;
    string dmChannel = 9;
    repeated int64 compactionFrom = 10;
    bool createdByCompaction = 11;
    common.SegmentState segment_state = 12;
    repeated FieldIndexInfo index_infos = 13;
    repeated int64 replica_ids = 14;
    repeated int64 node_ids = 15;
    bool enable_index = 16;
    bool is_fake = 17;
    data.SegmentLevel level = 18;
    bool is_sorted = 19;
    int64 storage_version = 20;
}

message CollectionInfo {
    int64 collectionID = 1;
    repeated int64 partitionIDs = 2;
    repeated PartitionStates partition_states = 3;
    LoadType load_type = 4;
    schema.CollectionSchema schema = 5;
    repeated int64 released_partitionIDs = 6;
    int64 inMemory_percentage = 7;
    repeated int64 replica_ids = 8;
    int32 replica_number = 9;
}

message UnsubscribeChannels {
    int64 collectionID = 1;
    repeated string channels = 2;
}

message UnsubscribeChannelInfo {
    int64 nodeID = 1;
    repeated UnsubscribeChannels collection_channels = 2;
}

// ---- synchronize messages proto between QueryCoord and QueryNode -----

message SegmentChangeInfo {
    int64 online_nodeID = 1;
    repeated SegmentInfo online_segments = 2;
    int64 offline_nodeID = 3;
    repeated SegmentInfo offline_segments = 4;
}

message SealedSegmentsChangeInfo {
    common.MsgBase base = 1;
    repeated SegmentChangeInfo infos = 2;
}

message GetDataDistributionRequest {
    common.MsgBase base = 1;
    map<string, msg.MsgPosition> checkpoints = 2;
    int64 lastUpdateTs = 3;
}

message GetDataDistributionResponse {
    common.Status status = 1;
    int64 nodeID = 2;
    repeated SegmentVersionInfo segments = 3;
    repeated ChannelVersionInfo channels = 4;
    repeated LeaderView leader_views = 5;
    int64 lastModifyTs = 6;
    double memCapacityInMB = 7;
    int64 cpu_num = 8;
}

message LeaderView {
    int64 collection = 1;
    string channel = 2;
    map<int64, SegmentDist> segment_dist = 3;
    repeated int64 growing_segmentIDs = 4;
    map<int64, msg.MsgPosition> growing_segments = 5;
    int64 TargetVersion = 6; // deprecated
    int64 num_of_growing_rows = 7;
    map<int64, int64> partition_stats_versions = 8;
    LeaderViewStatus status = 9;
}

message LeaderViewStatus {
    bool serviceable = 1;
    bool catching_up_streaming_data = 2;  // true = still catching up, not ready
}

message SegmentDist {
    int64 nodeID = 1;
    int64 version = 2;
}

message SegmentVersionInfo {
    int64 ID = 1;
    int64 collection = 2;
    int64 partition = 3;
    string channel = 4;
    int64 version = 5;
    uint64 last_delta_timestamp = 6;
    map<int64, FieldIndexInfo> index_info = 7;
    data.SegmentLevel level = 8;
    bool is_sorted = 9;
    repeated int64 field_json_index_stats = 10;
    map<int64, JsonStatsInfo> json_stats_info = 11; 
    string manifest_path = 12;
}

message ChannelVersionInfo {
    string channel = 1;
    int64 collection = 2;
    int64 version = 3;
}

enum LoadStatus {
    Invalid = 0;
    Loading = 1;
    Loaded = 2;
}

message CollectionLoadInfo {
    int64 collectionID = 1;
    repeated int64 released_partitions =
        2;  // Deprecated: No longer used; kept for compatibility.
    int32 replica_number = 3;
    LoadStatus status = 4;
    map<int64, int64> field_indexID = 5;
    LoadType load_type = 6;
    int32 recover_times = 7;
    repeated int64 load_fields = 8;
    int64 dbID= 9;
    bool user_specified_replica_mode = 10;
}

message PartitionLoadInfo {
    int64 collectionID = 1;
    int64 partitionID = 2;
    int32 replica_number =
        3;  // Deprecated: No longer used; kept for compatibility.
    LoadStatus status = 4;
    map<int64, int64> field_indexID =
        5;  // Deprecated: No longer used; kept for compatibility.
    int32 recover_times = 7;
}

message ChannelNodeInfo {
    repeated int64 rw_nodes =6;
}

message Replica {
    int64 ID = 1;
    int64 collectionID = 2;
    // nodes and ro_nodes can only load sealed segment.
    // only manage the legacy querynode that not embedded in the streamingnode.
    repeated int64 nodes = 3; // all (read and write) nodes. mutual exclusive with ro_nodes.
    string resource_group = 4;
    repeated int64 ro_nodes = 5; // the in-using node but should not be assigned to these replica.
    // cannot load segment on it anymore.
    map<string, ChannelNodeInfo> channel_node_infos = 6;
    // rw_sq_nodes and ro_sq_nodes can only watch channel and assign segment, will be removed in 3.0.
    // only manage the querynode embedded in the streamingnode.
    repeated int64 rw_sq_nodes = 7; // all (read and write) nodes. mutual exclusive with ro_sq_nodes.
    repeated int64 ro_sq_nodes = 8; // the in-using node but should not be assigned to these replica.
    // cannot watch channel on it anymore.
}

enum SyncType {
    Remove = 0;
    Set = 1;
    Amend = 2;
    UpdateVersion = 3;
    UpdatePartitionStats = 4;
}

message SyncAction {
    SyncType type = 1;
    int64 partitionID = 2;
    int64 segmentID = 3;
    int64 nodeID = 4;
    int64 version = 5;
    SegmentLoadInfo info = 6;
    repeated int64 growingInTarget = 7;
    repeated int64 sealedInTarget = 8;
    int64 TargetVersion = 9;
    repeated int64 droppedInTarget = 10;
    msg.MsgPosition checkpoint = 11;
    map<int64, int64> partition_stats_versions = 12;
    msg.MsgPosition deleteCP = 13;
    map<int64, int64> sealed_segment_row_count = 14; // segmentID -> row count, same as sealedInTarget
}

message SyncDistributionRequest {
    common.MsgBase base = 1;
    int64 collectionID = 2;
    string channel = 3;
    repeated SyncAction actions = 4;
    schema.CollectionSchema schema = 5;
    LoadMetaInfo load_meta = 6;
    int64 replicaID = 7;
    int64 version = 8;
    repeated index.IndexInfo index_info_list = 9;
}

message ResourceGroup {
    string name = 1;
    int32 capacity = 2 [deprecated = true]; // capacity can be found in config.requests.nodeNum and config.limits.nodeNum.
    repeated int64 nodes = 3;
    rg.ResourceGroupConfig config = 4;
}

// transfer `replicaNum` replicas in `collectionID` from `source_resource_group` to `target_resource_groups`
message TransferReplicaRequest {
    common.MsgBase base = 1;
    string source_resource_group = 2;
    string target_resource_group = 3;
    int64 collectionID = 4;
    int64 num_replica = 5;
}

message DescribeResourceGroupRequest {
    common.MsgBase base = 1;
    string resource_group = 2;
}

message DescribeResourceGroupResponse {
    common.Status status = 1;
    ResourceGroupInfo resource_group = 2;
}

message ResourceGroupInfo {
    string name = 1;
    int32 capacity = 2 [deprecated = true]; // capacity can be found in config.requests.nodeNum and config.limits.nodeNum.
    int32 num_available_node = 3;
    // collection id -> loaded replica num
    map<int64, int32> num_loaded_replica = 4;
    // collection id -> accessed other rg's node num 
    map<int64, int32> num_outgoing_node = 5;
     // collection id -> be accessed node num by other rg
    map<int64, int32> num_incoming_node = 6;
    // resource group configuration.
    rg.ResourceGroupConfig config = 7;
    repeated common.NodeInfo nodes = 8;
}

message DeleteRequest {
    common.MsgBase base = 1;
    int64 collection_id = 2;
    int64 partition_id = 3;
    string vchannel_name = 4;
    int64 segment_id = 5;
    schema.IDs primary_keys = 6;
    repeated uint64 timestamps = 7;
    DataScope scope = 8;
    bool use_load = 9;
}

message DeleteBatchRequest {
    common.MsgBase base = 1;
    int64 collection_id = 2;
    int64 partition_id = 3;
    string vchannel_name = 4;
    repeated int64 segment_ids = 5;
    schema.IDs primary_keys = 6;
    repeated uint64 timestamps = 7;
    DataScope scope = 8;
}

// DeleteBatchResponse returns failed/missing segment ids
// cannot just using common.Status to handle partial failure logic
message DeleteBatchResponse {
    common.Status status = 1;
    repeated int64 failed_ids = 2;
    repeated int64 missing_ids = 3;
}

message ActivateCheckerRequest {
    common.MsgBase base = 1;
    int32 checkerID = 2;
}

message DeactivateCheckerRequest {
    common.MsgBase base = 1;
    int32 checkerID = 2;
}

message ListCheckersRequest {
    common.MsgBase base = 1;
    repeated int32 checkerIDs = 2;
}

message ListCheckersResponse {
    common.Status status = 1;
    repeated CheckerInfo checkerInfos = 2;
}

message CheckerInfo {
    int32 id = 1;
    string desc = 2;
    bool activated = 3;
    bool found = 4;
}

message SegmentTarget {
  int64 ID = 1;
  data.SegmentLevel level = 2; 
  int64 num_of_rows = 3;
}

message PartitionTarget {
  int64 partitionID = 1;
  repeated SegmentTarget segments = 2;
}

message ChannelTarget {
  string channelName = 1;
  repeated int64 dropped_segmentIDs = 2;
  repeated int64 growing_segmentIDs = 3;
  repeated PartitionTarget partition_targets = 4;
  msg.MsgPosition seek_position = 5;
  msg.MsgPosition delete_checkpoint = 6;
}

message CollectionTarget {
  int64 collectionID = 1;
  repeated ChannelTarget Channel_targets = 2;
  int64 version = 3;
}
message NodeInfo {
  int64 ID = 2;
  string address = 3;
  string state = 4;
}

message ListQueryNodeRequest {
  common.MsgBase base = 1;
}

message ListQueryNodeResponse {
  common.Status status = 1;
  repeated NodeInfo nodeInfos = 2;
}

message GetQueryNodeDistributionRequest {
  common.MsgBase base = 1;
  int64 nodeID = 2;
}

message GetQueryNodeDistributionResponse {
  common.Status status = 1;
  int64 ID = 2;
  repeated string channel_names = 3;
  repeated int64 sealed_segmentIDs = 4;
}

message SuspendBalanceRequest {
  common.MsgBase base = 1;
}

message ResumeBalanceRequest {
  common.MsgBase base = 1;
}

message CheckBalanceStatusRequest {
  common.MsgBase base = 1;
}

message CheckBalanceStatusResponse {
  common.Status status = 1;
  bool is_active = 2;
}

message SuspendNodeRequest {
  common.MsgBase base = 1;
  int64 nodeID = 2;
}

message ResumeNodeRequest {
  common.MsgBase base = 1;
  int64 nodeID = 2;
}

message TransferSegmentRequest {
  common.MsgBase base = 1;
  int64 segmentID = 2;
  int64 source_nodeID = 3;
  int64 target_nodeID = 4;
  bool transfer_all = 5;
  bool to_all_nodes = 6;
  bool copy_mode = 7;
}

message TransferChannelRequest {
  common.MsgBase base = 1;
  string channel_name = 2;
  int64 source_nodeID = 3;
  int64 target_nodeID = 4;
  bool transfer_all = 5;
  bool to_all_nodes = 6;
  bool copy_mode = 7;
}

message CheckQueryNodeDistributionRequest {
  common.MsgBase base = 1;
  int64 source_nodeID = 3;
  int64 target_nodeID = 4;
}

message UpdateLoadConfigRequest {
    common.MsgBase base = 1;
    int64 dbID = 2;
    repeated int64 collectionIDs = 3;
    int32 replica_number = 4;
    repeated string resource_groups = 5;
}

message UpdateSchemaRequest {
    common.MsgBase base = 1;
    int64 collectionID = 2;
    schema.CollectionSchema schema = 3;
    uint64 version = 4;
}

message RunAnalyzerRequest{
    common.MsgBase base = 1;
    string channel = 2;
    int64 field_id = 3;
    repeated string analyzer_names = 4;
    repeated bytes placeholder =5;

    bool with_detail = 6;
    bool with_hash = 7;

    string analyzer_params = 8;
}

message AnalyzerInfo{
    string params = 1;
    string field = 2;
    string name = 3;
}

message ValidateAnalyzerRequest{
    common.MsgBase base = 1;
    repeated AnalyzerInfo analyzer_infos = 2;
}

message ValidateAnalyzerResponse{
    common.Status status = 1;
    repeated int64 resource_ids = 2;
}

message HighlightOptions{
    int64 fragment_size = 1;
    int64 fragment_offset = 2;
    int64 num_of_fragments = 3;
}

enum HighlightQueryType{
    TextMatch = 0;
}

message HighlightQuery{
    HighlightQueryType type = 1;
}

// HighlightTask fetch highlight for all queries at one field
// search_text_num/search_num == len(topks) == nq
// corpus_text_num == sum(topks) == len(search_results)
message HighlightTask{
    string field_name = 1;
    int64 field_id = 2;
    // len(texts) = search_text_num + corpus_text_num + len(queries);
    // text = search_text...corpus_text...query_text
    repeated string texts = 3;
    repeated string analyzer_names = 4; // used if field with multi-analyzer
    
    int64 search_text_num = 5;
    int64 corpus_text_num = 6;
    HighlightOptions options = 7;
    repeated HighlightQuery queries = 8;
}

// Get Lexical highlight from delegator
message GetHighlightRequest{
    common.MsgBase base = 1;
    string channel = 2;
    repeated int64 topks = 3;
    repeated HighlightTask tasks=4; // one task for one field
}

// start_offset and end_offset are fragment offset in the original text
// number of offsets always be 2 * number of highlight terms in the fragment
message HighlightFragment{      
    int64 start_offset = 1;
    int64 end_offset = 2;
    // char offset of the highlight terms in the fragment
    repeated int64 offsets = 3;
}

message HighlightResult{       
    repeated HighlightFragment fragments = 2;
}

message GetHighlightResponse{
    common.Status status = 1;
    repeated HighlightResult results = 2;
}

message ListLoadedSegmentsRequest {
    common.MsgBase base = 1;
}

message ListLoadedSegmentsResponse {
    common.Status status = 1;
    repeated int64 segmentIDs = 2;
}
message DropIndexRequest {
    common.MsgBase base = 1;
    int64 segmentID = 2;
    repeated int64 indexIDs = 3;
    string channel = 4;
    bool need_transfer = 5;
}
