syntax = "proto3";
package milvus.proto.internal;
option go_package = "github.com/milvus-io/milvus/pkg/v3/proto/internalpb";

import "common.proto";
import "schema.proto";
import "milvus.proto";
import "plan.proto";

message GetTimeTickChannelRequest {
}

message GetStatisticsChannelRequest {
}

message GetDdChannelRequest {
}

message NodeInfo {
  common.Address address = 1;
  string role = 2;
}

message ClearReadTaskQueueRequest {
  common.MsgBase base = 1;
  string task_type = 2;
  string reason = 3;
}

message ClearReadTaskQueueComponentResult {
  common.Status status = 1;
  string role = 2;
  int64 nodeID = 3;
  int64 queued_cleared = 4;
  int64 queued_nq_cleared = 5;
}

message ClearReadTaskQueueResponse {
  common.Status status = 1;
  int64 proxy_queued_cleared = 2;
  int64 querynode_queued_cleared = 3;
  int64 queued_nq_cleared = 4;
  repeated ClearReadTaskQueueComponentResult results = 5;
}

message InitParams {
  int64 nodeID = 1;
  repeated common.KeyValuePair start_params = 2;
}

message StringList {
  repeated string values = 1;
  common.Status status = 2;
}

message GetStatisticsRequest {
  common.MsgBase base = 1;
  // Not useful for now
  int64 dbID = 2;
  // The collection you want get statistics
  int64 collectionID = 3;
  // The partitions you want get statistics
  repeated int64 partitionIDs = 4;
  // timestamp of the statistics
  uint64 travel_timestamp = 5;
  uint64 guarantee_timestamp = 6;
  uint64 timeout_timestamp = 7;
}

message GetStatisticsResponse {
  common.MsgBase base = 1;
  // Contain error_code and reason
  common.Status status = 2;
  // Collection statistics data. Contain pairs like {"row_count": "1"}
  repeated common.KeyValuePair stats = 3;
}

message CreateAliasRequest {
  common.MsgBase base = 1;
  string db_name = 2;
  string collection_name = 3;
  string alias = 4;
}

message DropAliasRequest {
  common.MsgBase base = 1;
  string db_name = 2;
  string alias = 3;
}

message AlterAliasRequest{
  common.MsgBase base = 1;
  string db_name = 2;
  string collection_name = 3;
  string alias = 4;
}

message CreateIndexRequest {
  common.MsgBase base = 1;
  string db_name = 2;
  string collection_name = 3;
  string field_name = 4;
  int64 dbID = 5;
  int64 collectionID = 6;
  int64 fieldID = 7;
  repeated common.KeyValuePair extra_params = 8;
}

// search type will used by optimizer to determine the optimization rule in delegator
enum SearchType {
  DEFAULT = 0;                     // default search type
  PURE_ANN_SEARCH_NO_FILTER = 1;   // pure ann search without filter, excluding range search/groupby/iterator/iterative_filter cases
  PURE_ANN_SEARCH_WITH_FILTER = 2; // pure ann search with filter, excluding range search/groupby/iterator/iterative_filter cases
}

message SubSearchRequest {
  string dsl = 1;
  // serialized `PlaceholderGroup`
  bytes placeholder_group = 2;
  common.DslType dsl_type = 3;
  bytes serialized_expr_plan = 4;
  int64  nq = 5;
  repeated int64 partitionIDs = 6;
  int64  topk = 7;
  int64 offset = 8;
  string metricType = 9;
  int64 group_by_field_id = 10;
  int64 group_size = 11;
  int64 field_id = 12;
  bool ignore_growing = 13;
  string analyzer_name = 14;
  SearchType search_type = 15;
}

message SearchRequest {
  common.MsgBase base = 1;
  int64 reqID = 2;
  int64 dbID = 3;
  int64 collectionID = 4;
  repeated int64 partitionIDs = 5;
  string dsl = 6;
  // serialized `PlaceholderGroup`
  bytes placeholder_group = 7;
  common.DslType dsl_type = 8;
  bytes serialized_expr_plan = 9;
  repeated int64 output_fields_id = 10;
  uint64 mvcc_timestamp = 11;
  uint64 guarantee_timestamp = 12;
  uint64 timeout_timestamp = 13;
  int64  nq = 14;
  int64  topk = 15;
  string metricType = 16;
  bool ignoreGrowing = 17; // Optional
  string username = 18;
  repeated SubSearchRequest sub_reqs = 19;
  bool   is_advanced = 20;
  int64 offset = 21;
  common.ConsistencyLevel consistency_level = 22;
  int64 group_by_field_id = 23;
  int64 group_size = 24;
  int64 field_id = 25;
  bool is_topk_reduce = 26;
  bool is_recall_evaluation = 27;
  bool is_iterator = 28;
  string analyzer_name = 29;
  uint64 collection_ttl_timestamps = 30;
  uint64 entity_ttl_physical_time = 31;
  // PK filter from proxy: 0 = not checked (backward compat), 1 = has optimizable PK predicate, 2 = no PK predicate.
  // When 2, delegator can skip plan unmarshal for segment filter optimization.
  int32 pk_filter = 32;
  SearchType search_type = 33;
  repeated int64 group_by_field_ids = 34;
}

message SubSearchResults {
  string metric_type = 1;
  int64 num_queries = 2;
  int64 top_k = 3;
  // schema.SearchResultsData inside
  bytes sliced_blob = 4;
  int64 sliced_num_count = 5;
  int64 sliced_offset = 6;
  // to indicate it belongs to which sub request
  int64 req_index = 7;
  // pre-decoded SearchResultData, avoids re-marshal/unmarshal between delegator and proxy
  schema.SearchResultData result_data = 8;
}

message SearchResults {
  common.MsgBase base = 1;
  common.Status status = 2;
  int64 reqID = 3;
  string metric_type = 4;
  int64 num_queries = 5;
  int64 top_k = 6;
  repeated int64 sealed_segmentIDs_searched = 7;
  repeated string channelIDs_searched = 8;
  repeated int64 global_sealed_segmentIDs = 9;
  // schema.SearchResultsData inside
  bytes sliced_blob = 10;
  int64 sliced_num_count = 11;
  int64 sliced_offset = 12;

  // search request cost
  CostAggregation costAggregation = 13;
  map<string, uint64> channels_mvcc = 14;
  repeated SubSearchResults sub_results = 15;
  bool is_advanced = 16;
  int64 all_search_count = 17;
  bool is_topk_reduce = 18;
  bool is_recall_evaluation = 19;
  int64 scanned_remote_bytes = 20;
  int64 scanned_total_bytes = 21;
  // pre-decoded SearchResultData, avoids re-marshal/unmarshal between delegator and proxy
  schema.SearchResultData result_data = 22;
  // Per-segment filter valid counts for two-stage search (filter-only mode).
  // Index corresponds to sealed_segmentIDs_searched.
  repeated int64 filter_valid_counts = 23;
}

message CostAggregation {
  int64 responseTime = 1;
  int64 serviceTime = 2;
  int64 totalNQ = 3;
  int64 totalRelatedDataSize = 4;
}

message RetrieveRequest {
  common.MsgBase base = 1;
  int64 reqID = 2;
  int64 dbID = 3;
  int64 collectionID = 4;
  repeated int64 partitionIDs = 5;
  bytes serialized_expr_plan = 6;
  repeated int64 output_fields_id = 7;
  uint64 mvcc_timestamp = 8;
  uint64 guarantee_timestamp = 9;
  uint64 timeout_timestamp = 10;
  int64 limit = 11; // Optional
  bool ignoreGrowing = 12;
  bool is_count = 13;
  int64 iteration_extension_reduce_rate = 14;
  string username = 15;
  bool reduce_stop_for_best = 16; //deprecated
  int32 reduce_type = 17;
  common.ConsistencyLevel consistency_level = 18;
  bool is_iterator = 19;
  uint64 collection_ttl_timestamps = 20;
  // for query agg
  repeated int64 group_by_field_ids = 21;
  repeated plan.Aggregate aggregates = 22;
  uint64 entity_ttl_physical_time = 23;
  // ORDER BY fields — populated by proxy, consumed by QN/Delegator
  // to avoid re-parsing serialized_expr_plan on the hot path.
  repeated plan.OrderByField order_by_fields = 24;
  string query_label = 25; // "query" or "upsert_query", used for metrics differentiation
  // PK filter from proxy: 0 = not checked (backward compat), 1 = has optimizable PK predicate, 2 = no PK predicate.
  // When 2, delegator can skip plan unmarshal for segment filter optimization.
  int32 pk_filter = 26;
}

// Element indices for element-level query results
message ElementIndices {
  repeated int32 indices = 1;
}

message RetrieveResults {
  common.MsgBase base = 1;
  common.Status status = 2;
  int64 reqID = 3;
  schema.IDs ids = 4;
  repeated schema.FieldData fields_data = 5;
  repeated int64 sealed_segmentIDs_retrieved = 6;
  repeated string channelIDs_retrieved = 7;
  repeated int64 global_sealed_segmentIDs = 8;

  // query request cost
  CostAggregation costAggregation = 13;
  int64 all_retrieve_count = 14;
  bool has_more_result = 15;
  int64 scanned_remote_bytes = 16;
  int64 scanned_total_bytes = 17;

   // Element-level query support
  bool element_level = 18;
  repeated ElementIndices element_indices = 19;
}

message LoadIndex {
  common.MsgBase base = 1;
  int64 segmentID = 2;
  string fieldName = 3;
  int64 fieldID = 4;
  repeated string index_paths = 5;
  repeated common.KeyValuePair index_params = 6;
}

message IndexStats {
  repeated common.KeyValuePair index_params = 1;
  int64 num_related_segments = 2;
}

message FieldStats {
  int64 collectionID = 1;
  int64 fieldID = 2;
  repeated IndexStats index_stats = 3;
}

message SegmentStats {
  int64 segmentID = 1;
  int64 memory_size = 2;
  int64 num_rows = 3;
  bool recently_modified = 4;
}

message ChannelTimeTickMsg {
  common.MsgBase base = 1;
  repeated string channelNames = 2;
  repeated uint64 timestamps = 3;
  uint64 default_timestamp = 4;
}

message CredentialInfo {
  string username = 1; // not save in metadata.
  // encrypted by bcrypt (for higher security level)
  string encrypted_password = 2;
  string tenant = 3 [deprecated=true]; // not used.
  bool is_super = 4 [deprecated=true]; // not used.
  // encrypted by sha256 (for good performance in cache mapping)
  string sha256_password = 5; // not save in metadata.
  uint64 time_tick = 6; // the timetick in wal which the credential updates
  optional string description = 7;
}

message ListPolicyRequest {
  // Not useful for now
  common.MsgBase base = 1;
}

message ListPolicyResponse {
  // Contain error_code and reason
  common.Status status = 1;
  repeated string policy_infos = 2;
  repeated string user_roles = 3;
  repeated milvus.PrivilegeGroupInfo privilege_groups = 4;
}

message ShowConfigurationsRequest {
  common.MsgBase base = 1;
  string pattern = 2;
}

message ShowConfigurationsResponse {
  common.Status status = 1;
  repeated common.KeyValuePair configuations = 2;
}

enum RateScope {
  Cluster = 0;
  Database = 1;
  Collection = 2;
  Partition = 3;
}

enum RateType {
  DDLCollection = 0;
  DDLPartition = 1;
  DDLIndex = 2;
  DDLFlush = 3;
  DDLCompaction = 4;
  DMLInsert = 5;
  DMLDelete = 6;
  DMLBulkLoad = 7;
  DQLSearch = 8;
  DQLQuery = 9;
  DMLUpsert = 10 [deprecated = true]; // UpsertRequest uses DMLInsert for rate limiting
  DDLDB = 11;
}

message Rate {
  RateType rt = 1;
  double r = 2;
}

enum ImportJobState {
  None = 0;
  Pending = 1;
  PreImporting = 2;
  Importing = 3;
  Failed = 4;
  Completed = 5;
  IndexBuilding = 6;
  Sorting = 7;
  Uncommitted = 8;
  Committing  = 9;
}

message ImportFile {
  int64 id = 1;
  // A singular row-based file or multiple column-based files.
  repeated string paths = 2;
}

message ImportRequestInternal {
  int64 dbID = 1 [deprecated=true];
  int64 collectionID = 2;
  string collection_name = 3;
  repeated int64 partitionIDs = 4;
  repeated string channel_names = 5;
  schema.CollectionSchema schema = 6;
  repeated ImportFile files = 7;
  repeated common.KeyValuePair options = 8;
  uint64 data_timestamp = 9;
  int64 jobID = 10;
}

message ImportRequest {
  string db_name = 1;
  string collection_name = 2;
  string partition_name = 3;
  repeated ImportFile files = 4;
  repeated common.KeyValuePair options = 5;
}

message ImportResponse {
  common.Status status = 1;
  string jobID = 2;
}

message GetImportProgressRequest {
  string db_name = 1;
  string jobID = 2;
}

message ImportTaskProgress {
  string file_name = 1;
  int64 file_size = 2;
  string reason = 3;
  int64 progress = 4;
  string complete_time = 5;
  string state = 6;
  int64 imported_rows = 7;
  int64 total_rows = 8;
}

message GetImportProgressResponse {
  common.Status status = 1;
  ImportJobState state = 2;
  string reason = 3;
  int64 progress = 4;
  string collection_name = 5;
  string complete_time = 6;
  repeated ImportTaskProgress task_progresses = 7;
  int64 imported_rows = 8;
  int64 total_rows = 9;
  string create_time = 10;
}

message ListImportsRequestInternal {
  int64 dbID = 1;
  int64 collectionID = 2;
}

message ListImportsRequest {
  string db_name = 1;
  string collection_name = 2;
}

message ListImportsResponse {
  common.Status status = 1;
  repeated string jobIDs = 2;
  repeated ImportJobState states = 3;
  repeated string reasons = 4;
  repeated int64 progresses = 5;
  repeated string collection_names = 6;
}

message GetSegmentsInfoRequest {
  string dbName = 1;
  int64 collectionID = 2;
  repeated int64 segmentIDs = 3;
}

message FieldBinlog {
  int64 fieldID = 1;
  repeated int64 logIDs = 2;
}

message SegmentInfo {
  int64 segmentID = 1;
  int64 collectionID = 2;
  int64 partitionID = 3;
  string vChannel = 4;
  int64 num_rows = 5;
  common.SegmentState state = 6;
  common.SegmentLevel level = 7;
  bool is_sorted = 8;
  repeated FieldBinlog insert_logs = 9;
  repeated FieldBinlog delta_logs = 10;
  repeated FieldBinlog stats_logs = 11;
}

message GetSegmentsInfoResponse {
  common.Status status = 1;
  repeated SegmentInfo segmentInfos = 2;
}

message GetQuotaMetricsRequest {
    common.MsgBase base = 1;
}

message GetQuotaMetricsResponse {
  common.Status status = 1;
  string metrics_info = 2;
}

message FileResourceInfo {
  string name = 1;
  string path = 2;
  int64 id = 3;
  string storage_name = 5;
}

message SyncFileResourceRequest{
  repeated FileResourceInfo resources = 1;
  uint64 version = 2;
}

message BackupEzkRequest {
  common.MsgBase base = 1;
  string db_name = 2;
}

message BackupEzkResponse {
  common.Status status = 1;
  string ezk = 2;
}
