3434#include " utils/TypeUtils.h"
3535
3636namespace milvus {
37+ namespace {
38+
39+ Status
40+ ConvertDescribeCollectionResponse (const proto::milvus::DescribeCollectionResponse& rpc_response,
41+ CollectionDesc& collection_desc) {
42+ const auto & status = rpc_response.status ();
43+ auto legacy_code = status.error_code ();
44+ if (status.code () != 0 || legacy_code != proto::common::ErrorCode::Success) {
45+ return {StatusCode::SERVER_FAILED, status.reason (), 0 , status.code (), legacy_code};
46+ }
47+
48+ CollectionSchema schema;
49+ ConvertCollectionSchema (rpc_response.schema (), schema);
50+ schema.SetShardsNum (rpc_response.shards_num ());
51+
52+ collection_desc.SetSchema (std::move (schema));
53+ collection_desc.SetID (rpc_response.collectionid ());
54+ collection_desc.SetCreatedTime (rpc_response.created_timestamp ());
55+
56+ std::vector<std::string> aliases;
57+ aliases.reserve (rpc_response.aliases_size ());
58+ aliases.insert (aliases.end (), rpc_response.aliases ().begin (), rpc_response.aliases ().end ());
59+ collection_desc.SetAlias (std::move (aliases));
60+
61+ std::unordered_map<std::string, std::string> properties;
62+ for (int i = 0 ; i < rpc_response.properties_size (); i++) {
63+ const auto & prop = rpc_response.properties (i);
64+ properties[prop.key ()] = prop.value ();
65+ }
66+ collection_desc.SetProperties (std::move (properties));
67+
68+ return Status::OK ();
69+ }
70+
71+ } // namespace
3772
3873std::shared_ptr<MilvusClientV2>
3974MilvusClientV2::Create () {
@@ -339,26 +374,11 @@ MilvusClientV2Impl::DescribeCollection(const DescribeCollectionRequest& request,
339374 };
340375
341376 auto post = [&response](const proto::milvus::DescribeCollectionResponse& rpc_response) {
342- CollectionSchema schema;
343- ConvertCollectionSchema (rpc_response.schema (), schema);
344- schema.SetShardsNum (rpc_response.shards_num ());
345-
346377 CollectionDesc collection_desc;
347- collection_desc.SetSchema (std::move (schema));
348- collection_desc.SetID (rpc_response.collectionid ());
349- collection_desc.SetCreatedTime (rpc_response.created_timestamp ());
350-
351- std::vector<std::string> aliases;
352- aliases.reserve (rpc_response.aliases_size ());
353- aliases.insert (aliases.end (), rpc_response.aliases ().begin (), rpc_response.aliases ().end ());
354- collection_desc.SetAlias (std::move (aliases));
355-
356- std::unordered_map<std::string, std::string> properties;
357- for (int i = 0 ; i < rpc_response.properties_size (); i++) {
358- const auto & prop = rpc_response.properties (i);
359- properties[prop.key ()] = prop.value ();
378+ auto status = ConvertDescribeCollectionResponse (rpc_response, collection_desc);
379+ if (!status.IsOk ()) {
380+ return status;
360381 }
361- collection_desc.SetProperties (std::move (properties));
362382
363383 response.SetDesc (std::move (collection_desc));
364384 return Status::OK ();
@@ -368,6 +388,106 @@ MilvusClientV2Impl::DescribeCollection(const DescribeCollectionRequest& request,
368388 pre , &MilvusConnection::DescribeCollection, post );
369389}
370390
391+ Status
392+ MilvusClientV2Impl::BatchDescribeCollections (const BatchDescribeCollectionsRequest& request,
393+ BatchDescribeCollectionsResponse& response) {
394+ auto pre = [&request](proto::milvus::BatchDescribeCollectionRequest& rpc_request) {
395+ rpc_request.set_db_name (request.DatabaseName ());
396+ for (const auto & collection_name : request.CollectionNames ()) {
397+ rpc_request.add_collection_name (collection_name);
398+ }
399+ for (auto collection_id : request.CollectionIDs ()) {
400+ rpc_request.add_collectionid (collection_id);
401+ }
402+ return Status::OK ();
403+ };
404+
405+ auto post = [&response](const proto::milvus::BatchDescribeCollectionResponse& rpc_response) {
406+ std::vector<CollectionDesc> descs;
407+ descs.reserve (rpc_response.responses_size ());
408+ for (const auto & rpc_desc : rpc_response.responses ()) {
409+ CollectionDesc desc;
410+ auto status = ConvertDescribeCollectionResponse (rpc_desc, desc);
411+ if (!status.IsOk ()) {
412+ return status;
413+ }
414+ descs.emplace_back (std::move (desc));
415+ }
416+
417+ response.SetDescs (std::move (descs));
418+ return Status::OK ();
419+ };
420+
421+ return connection_.Invoke <proto::milvus::BatchDescribeCollectionRequest,
422+ proto::milvus::BatchDescribeCollectionResponse>(
423+ pre , &MilvusConnection::BatchDescribeCollection, post );
424+ }
425+
426+ Status
427+ MilvusClientV2Impl::DescribeReplicas (const DescribeReplicasRequest& request, DescribeReplicasResponse& response) {
428+ if (request.CollectionName ().empty ()) {
429+ return {StatusCode::INVALID_ARGUMENT, " Collection name cannot be empty" };
430+ }
431+
432+ auto pre = [&request](proto::milvus::GetReplicasRequest& rpc_request) {
433+ rpc_request.set_db_name (request.DatabaseName ());
434+ rpc_request.set_collection_name (request.CollectionName ());
435+ rpc_request.set_with_shard_nodes (true );
436+ return Status::OK ();
437+ };
438+
439+ auto post = [&response](const proto::milvus::GetReplicasResponse& rpc_response) {
440+ std::vector<ReplicaInfo> replicas;
441+ replicas.reserve (rpc_response.replicas_size ());
442+ for (const auto & rpc_replica : rpc_response.replicas ()) {
443+ ReplicaInfo replica;
444+ replica.SetReplicaID (rpc_replica.replicaid ());
445+ replica.SetCollectionID (rpc_replica.collectionid ());
446+
447+ std::vector<int64_t > partition_ids;
448+ partition_ids.reserve (rpc_replica.partition_ids_size ());
449+ partition_ids.insert (partition_ids.end (), rpc_replica.partition_ids ().begin (), rpc_replica.partition_ids ().end ());
450+ replica.SetPartitionIDs (std::move (partition_ids));
451+
452+ std::vector<int64_t > node_ids;
453+ node_ids.reserve (rpc_replica.node_ids_size ());
454+ node_ids.insert (node_ids.end (), rpc_replica.node_ids ().begin (), rpc_replica.node_ids ().end ());
455+ replica.SetNodeIDs (std::move (node_ids));
456+
457+ replica.SetResourceGroupName (rpc_replica.resource_group_name ());
458+
459+ std::unordered_map<std::string, int32_t > num_outbound_node;
460+ num_outbound_node.insert (rpc_replica.num_outbound_node ().begin (), rpc_replica.num_outbound_node ().end ());
461+ replica.SetNumOutboundNode (std::move (num_outbound_node));
462+
463+ std::vector<ShardReplica> shard_replicas;
464+ shard_replicas.reserve (rpc_replica.shard_replicas_size ());
465+ for (const auto & rpc_shard : rpc_replica.shard_replicas ()) {
466+ ShardReplica shard_replica;
467+ shard_replica.SetLeaderID (rpc_shard.leaderid ());
468+ shard_replica.SetLeaderAddress (rpc_shard.leader_addr ());
469+ shard_replica.SetChannelName (rpc_shard.dm_channel_name ());
470+
471+ std::vector<int64_t > shard_node_ids;
472+ shard_node_ids.reserve (rpc_shard.node_ids_size ());
473+ shard_node_ids.insert (shard_node_ids.end (), rpc_shard.node_ids ().begin (), rpc_shard.node_ids ().end ());
474+ shard_replica.SetNodeIDs (std::move (shard_node_ids));
475+
476+ shard_replicas.emplace_back (std::move (shard_replica));
477+ }
478+ replica.SetShardReplicas (std::move (shard_replicas));
479+
480+ replicas.emplace_back (std::move (replica));
481+ }
482+
483+ response.SetReplicas (std::move (replicas));
484+ return Status::OK ();
485+ };
486+
487+ return connection_.Invoke <proto::milvus::GetReplicasRequest, proto::milvus::GetReplicasResponse>(
488+ pre , &MilvusConnection::GetReplicas, post );
489+ }
490+
371491Status
372492MilvusClientV2Impl::RenameCollection (const RenameCollectionRequest& request) {
373493 auto pre = [&request](proto::milvus::RenameCollectionRequest& rpc_request) {
0 commit comments