Skip to content

Commit

Permalink
Organize client operations, split into modules, order by CRUD (#152)
Browse files Browse the repository at this point in the history
* Separate client operations in categories, link to them

* Reorder client functions, follow CRUD principles

* Extract search operations into search module

* Extract index operations into index module

* Extract payload operations into payload module

* Add construct and connect header
  • Loading branch information
timvisee authored Jun 26, 2024
1 parent 8a589fd commit 72180dc
Show file tree
Hide file tree
Showing 9 changed files with 956 additions and 911 deletions.
180 changes: 89 additions & 91 deletions src/qdrant_client/collection.rs
Original file line number Diff line number Diff line change
Expand Up @@ -5,19 +5,18 @@ use tonic::transport::Channel;
use tonic::Status;

use crate::auth::TokenInterceptor;
use crate::prelude::{CreateCollection, DeleteCollection};
use crate::qdrant::collections_client::CollectionsClient;
use crate::qdrant::{
alias_operations, AliasOperations, ChangeAliases, CollectionClusterInfoRequest,
CollectionClusterInfoResponse, CollectionExistsRequest, CollectionOperationResponse,
CreateAlias, DeleteAlias, GetCollectionInfoRequest, GetCollectionInfoResponse,
ListAliasesRequest, ListAliasesResponse, ListCollectionAliasesRequest, ListCollectionsRequest,
ListCollectionsResponse, RenameAlias, UpdateCollection, UpdateCollectionClusterSetupRequest,
UpdateCollectionClusterSetupResponse,
CreateAlias, CreateCollection, DeleteAlias, DeleteCollection, GetCollectionInfoRequest,
GetCollectionInfoResponse, ListAliasesRequest, ListAliasesResponse,
ListCollectionAliasesRequest, ListCollectionsRequest, ListCollectionsResponse, RenameAlias,
UpdateCollection, UpdateCollectionClusterSetupRequest, UpdateCollectionClusterSetupResponse,
};
use crate::qdrant_client::{Qdrant, QdrantResult};

/// Collection operations.
/// # Collection operations
///
/// Create, update and delete collections, manage collection aliases and collection cluster
/// configuration.
Expand Down Expand Up @@ -48,31 +47,6 @@ impl Qdrant {
Ok(result)
}

/// Delete an existing collection.
///
/// ```no_run
///# use qdrant_client::{Qdrant, QdrantError};
///# async fn delete_collection(client: &Qdrant)
///# -> Result<(), QdrantError> {
/// client.delete_collection("my_collection").await?;
///# Ok(())
///# }
/// ```
///
/// Documentation: <https://qdrant.tech/documentation/concepts/collections/#delete-collection>
pub async fn delete_collection(
&self,
request: impl Into<DeleteCollection>,
) -> QdrantResult<CollectionOperationResponse> {
let delete_collection = &request.into();

self.with_collections_client(|mut collection_api| async move {
let result = collection_api.delete(delete_collection.clone()).await?;
Ok(result.into_inner())
})
.await
}

/// Create a new collection.
///
/// ```no_run
Expand Down Expand Up @@ -105,6 +79,30 @@ impl Qdrant {
.await
}

/// Get collection info.
///
/// ```no_run
///# use qdrant_client::{Qdrant, QdrantError};
///# async fn collection_info(client: &Qdrant)
///# -> Result<(), QdrantError> {
/// client.collection_info("my_collection").await?;
///# Ok(())
///# }
/// ```
///
/// Documentation: <https://qdrant.tech/documentation/concepts/collections/#collection-info>
pub async fn collection_info(
&self,
request: impl Into<GetCollectionInfoRequest>,
) -> QdrantResult<GetCollectionInfoResponse> {
let request = &request.into();
self.with_collections_client(|mut collection_api| async move {
let result = collection_api.get(request.clone()).await?;
Ok(result.into_inner())
})
.await
}

/// List all collections.
///
/// ```no_run
Expand Down Expand Up @@ -192,25 +190,26 @@ impl Qdrant {
.await
}

/// Get collection info.
/// Delete an existing collection.
///
/// ```no_run
///# use qdrant_client::{Qdrant, QdrantError};
///# async fn collection_info(client: &Qdrant)
///# async fn delete_collection(client: &Qdrant)
///# -> Result<(), QdrantError> {
/// client.collection_info("my_collection").await?;
/// client.delete_collection("my_collection").await?;
///# Ok(())
///# }
/// ```
///
/// Documentation: <https://qdrant.tech/documentation/concepts/collections/#collection-info>
pub async fn collection_info(
/// Documentation: <https://qdrant.tech/documentation/concepts/collections/#delete-collection>
pub async fn delete_collection(
&self,
request: impl Into<GetCollectionInfoRequest>,
) -> QdrantResult<GetCollectionInfoResponse> {
let request = &request.into();
request: impl Into<DeleteCollection>,
) -> QdrantResult<CollectionOperationResponse> {
let delete_collection = &request.into();

self.with_collections_client(|mut collection_api| async move {
let result = collection_api.get(request.clone()).await?;
let result = collection_api.delete(delete_collection.clone()).await?;
Ok(result.into_inner())
})
.await
Expand Down Expand Up @@ -239,27 +238,53 @@ impl Qdrant {
self.update_aliases(request.into()).await
}

/// Delete existing collection name alias.
/// List collection name aliases for all collections.
///
/// ```no_run
///# use qdrant_client::{Qdrant, QdrantError};
/// use qdrant_client::qdrant::CreateAliasBuilder;
///# async fn list_aliases(client: &Qdrant)
///# -> Result<(), QdrantError> {
/// client.list_aliases().await?;
///# Ok(())
///# }
/// ```
///
///# async fn delete_alias(client: &Qdrant)
/// This only lists collection name aliases. To list collection names, use
/// [`list_collections`](Self::list_collections).
///
/// Documentation: <https://qdrant.tech/documentation/concepts/collections/#list-all-aliases>
pub async fn list_aliases(&self) -> QdrantResult<ListAliasesResponse> {
self.with_collections_client(|mut collection_api| async move {
let result = collection_api.list_aliases(ListAliasesRequest {}).await?;
Ok(result.into_inner())
})
.await
}

/// List collection name aliases for a specific collection.
///
/// ```no_run
///# use qdrant_client::{Qdrant, QdrantError};
///# async fn list_collection_aliases(client: &Qdrant)
///# -> Result<(), QdrantError> {
/// client
/// .delete_alias("my_alias")
/// .await?;
/// client.list_collection_aliases("my_collection").await?;
///# Ok(())
///# }
/// ```
///
/// Documentation: <https://qdrant.tech/documentation/concepts/collections/#remove-alias>
pub async fn delete_alias(
/// Documentation: <https://qdrant.tech/documentation/concepts/collections/#list-collection-aliases>
pub async fn list_collection_aliases(
&self,
request: impl Into<DeleteAlias>,
) -> QdrantResult<CollectionOperationResponse> {
self.update_aliases(request.into()).await
request: impl Into<ListCollectionAliasesRequest>,
) -> QdrantResult<ListAliasesResponse> {
let request = &request.into();
self.with_collections_client(|mut collection_api| async move {
let result = collection_api
.list_collection_aliases(request.clone())
.await?;
Ok(result.into_inner())
})
.await
}

/// Rename existing collection name alias.
Expand Down Expand Up @@ -310,53 +335,27 @@ impl Qdrant {
.await
}

/// List collection name aliases for a specific collection.
/// Delete existing collection name alias.
///
/// ```no_run
///# use qdrant_client::{Qdrant, QdrantError};
///# async fn list_collection_aliases(client: &Qdrant)
///# -> Result<(), QdrantError> {
/// client.list_collection_aliases("my_collection").await?;
///# Ok(())
///# }
/// ```
///
/// Documentation: <https://qdrant.tech/documentation/concepts/collections/#list-collection-aliases>
pub async fn list_collection_aliases(
&self,
request: impl Into<ListCollectionAliasesRequest>,
) -> QdrantResult<ListAliasesResponse> {
let request = &request.into();
self.with_collections_client(|mut collection_api| async move {
let result = collection_api
.list_collection_aliases(request.clone())
.await?;
Ok(result.into_inner())
})
.await
}

/// List collection name aliases for all collections.
/// use qdrant_client::qdrant::CreateAliasBuilder;
///
/// ```no_run
///# use qdrant_client::{Qdrant, QdrantError};
///# async fn list_aliases(client: &Qdrant)
///# async fn delete_alias(client: &Qdrant)
///# -> Result<(), QdrantError> {
/// client.list_aliases().await?;
/// client
/// .delete_alias("my_alias")
/// .await?;
///# Ok(())
///# }
/// ```
///
/// This only lists collection name aliases. To list collection names, use
/// [`list_collections`](Self::list_collections).
///
/// Documentation: <https://qdrant.tech/documentation/concepts/collections/#list-all-aliases>
pub async fn list_aliases(&self) -> QdrantResult<ListAliasesResponse> {
self.with_collections_client(|mut collection_api| async move {
let result = collection_api.list_aliases(ListAliasesRequest {}).await?;
Ok(result.into_inner())
})
.await
/// Documentation: <https://qdrant.tech/documentation/concepts/collections/#remove-alias>
pub async fn delete_alias(
&self,
request: impl Into<DeleteAlias>,
) -> QdrantResult<CollectionOperationResponse> {
self.update_aliases(request.into()).await
}

/// List cluster info of a collection.
Expand Down Expand Up @@ -436,9 +435,8 @@ mod tests {

use super::*;
use crate::payload::Payload;
use crate::prelude::Distance;
use crate::qdrant::{
CountPointsBuilder, CreateCollectionBuilder, PointStruct, SearchPointsBuilder,
CountPointsBuilder, CreateCollectionBuilder, Distance, PointStruct, SearchPointsBuilder,
UpsertPointsBuilder, VectorParamsBuilder,
};

Expand Down
80 changes: 80 additions & 0 deletions src/qdrant_client/index.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,80 @@
use crate::qdrant::{
CreateFieldIndexCollection, DeleteFieldIndexCollection, PointsOperationResponse,
};
use crate::qdrant_client::{Qdrant, QdrantResult};

/// # Index operations
///
/// Manage field and payload indices in collections.
///
/// Documentation: <https://qdrant.tech/documentation/concepts/indexing/>
impl Qdrant {
/// Create payload index in a collection.
///
/// ```no_run
///# use std::collections::HashMap;
///# use qdrant_client::{Qdrant, QdrantError};
/// use qdrant_client::qdrant::{CreateFieldIndexCollectionBuilder, FieldType};
///
///# async fn create_field_index(client: &Qdrant)
///# -> Result<(), QdrantError> {
/// client
/// .create_field_index(
/// CreateFieldIndexCollectionBuilder::new(
/// "my_collection",
/// "city",
/// FieldType::Keyword,
/// ),
/// )
/// .await?;
///# Ok(())
///# }
/// ```
///
/// Documentation: <https://qdrant.tech/documentation/concepts/indexing/#payload-index>
pub async fn create_field_index(
&self,
request: impl Into<CreateFieldIndexCollection>,
) -> QdrantResult<PointsOperationResponse> {
let request = &request.into();

self.with_points_client(|mut client| async move {
let result = client.create_field_index(request.clone()).await?;
Ok(result.into_inner())
})
.await
}

/// Delete payload index from a collection.
///
/// ```no_run
///# use std::collections::HashMap;
///# use qdrant_client::{Qdrant, QdrantError};
/// use qdrant_client::qdrant::DeleteFieldIndexCollectionBuilder;
///
///# async fn create_field_index(client: &Qdrant)
///# -> Result<(), QdrantError> {
/// client
/// .delete_field_index(DeleteFieldIndexCollectionBuilder::new(
/// "my_collection",
/// "city",
/// ))
/// .await?;
///# Ok(())
///# }
/// ```
///
/// Documentation: <https://qdrant.tech/documentation/concepts/indexing/#payload-index>
pub async fn delete_field_index(
&self,
request: impl Into<DeleteFieldIndexCollection>,
) -> QdrantResult<PointsOperationResponse> {
let request = &request.into();

self.with_points_client(|mut client| async move {
let result = client.delete_field_index(request.clone()).await?;
Ok(result.into_inner())
})
.await
}
}
23 changes: 19 additions & 4 deletions src/qdrant_client/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -3,8 +3,11 @@ mod collection;
pub mod config;
mod conversions;
pub mod error;
mod index;
mod payload;
mod points;
mod query;
mod search;
mod sharding_keys;
mod snapshot;

Expand Down Expand Up @@ -60,12 +63,22 @@ pub type QdrantBuilder = QdrantConfig;
///
/// # Operations
///
/// Categories:
///
/// - [Collection operations](Self#collection-operations) - manage collections, aliases and cluster configuration
/// - [Point operations](Self#point-operations) - manage points and vectors
/// - [Payload operations](Self#payload-operations) - manage point payloads
/// - [Search operations](Self#search-operations) - search and explore points
/// - [Query operations](Self#query-operations) - query points using universal search
/// - [Index operations](Self#index-operations) - manage field and payload indices
/// - [Snapshot operations](Self#snapshot-operations) - manage instance or collection snapshots
/// - [Shard key operations](Self#sharding-key-operations) - manage shard keys
///
/// Common operations include:
///
/// - [`create_collection`](Qdrant::create_collection) - Create a new collection
/// - [`upsert_points`](Qdrant::upsert_points) - Insert or update points
/// - [`search_points`](Qdrant::search_points) - Search points with similarity search
/// - [All operations](Qdrant#implementations)
/// - [`create_collection`](Self::create_collection) - create a new collection
/// - [`upsert_points`](Self::upsert_points) - insert or update points
/// - [`search_points`](Self::search_points) - search points with similarity search
pub struct Qdrant {
/// Client configuration
pub config: QdrantConfig,
Expand All @@ -74,6 +87,8 @@ pub struct Qdrant {
channel: ChannelPool,
}

/// # Construct and connect
///
/// Methods to construct a new Qdrant client.
impl Qdrant {
/// Create a new Qdrant client.
Expand Down
Loading

0 comments on commit 72180dc

Please sign in to comment.