Skip to content

Commit 3f31a40

Browse files
authored
Implement describe_index_stats (#28)
## Problem `describe_index_stats` was not implemented. ## Solution I implemented a new function `describe_index_stats` for `Index`, which optionally takes in a `MetadataFilter` struct. ## Type of Change - [ ] Bug fix (non-breaking change which fixes an issue) - [x] New feature (non-breaking change which adds functionality) - [ ] Breaking change (fix or feature that would cause existing functionality to not work as expected) - [ ] This change requires a documentation update - [ ] Infrastructure change (CI configs, etc) - [ ] Non-code change (docs, etc) - [ ] None of the above: (explain here) ## Test Plan New and existing test cases should pass.
1 parent 2a337cb commit 3f31a40

File tree

4 files changed

+127
-23
lines changed

4 files changed

+127
-23
lines changed

codegen/apis

Submodule apis updated from 4de4456 to d1c2230

pinecone_sdk/src/pinecone/data.rs

Lines changed: 47 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,8 @@ use tonic::service::Interceptor;
88
use tonic::transport::Channel;
99
use tonic::{Request, Status};
1010

11-
pub use pb::{ListResponse, UpsertResponse, Vector};
11+
pub use pb::{ListResponse, DescribeIndexStatsResponse, UpsertResponse, Vector};
12+
pub use prost_types::{value::Kind, Struct as MetadataFilter, Value};
1213

1314
/// Generated protobuf module for data plane.
1415
pub mod pb {
@@ -53,7 +54,7 @@ impl Index {
5354
/// ### Example
5455
/// ```no_run
5556
/// use pinecone_sdk::pinecone::PineconeClient;
56-
/// use pinecone_sdk::pinecone::data::pb::Vector;
57+
/// use pinecone_sdk::pinecone::data::Vector;
5758
/// # use pinecone_sdk::utils::errors::PineconeError;
5859
///
5960
/// # #[tokio::main]
@@ -141,6 +142,50 @@ impl Index {
141142

142143
Ok(response)
143144
}
145+
146+
/// The describe_index_stats operation returns statistics about the index.
147+
///
148+
/// ### Arguments
149+
/// * `filter: Option<MetadataFilter>` - An optional filter to specify which vectors to return statistics for. Note that the filter is only supported by pod indexes.
150+
///
151+
/// ### Return
152+
/// * Returns a `Result<DescribeIndexStatsResponse, PineconeError>` object.
153+
///
154+
/// ### Example
155+
/// ```no_run
156+
/// use pinecone_sdk::pinecone::PineconeClient;
157+
/// use pinecone_sdk::pinecone::data::{Value, Kind, MetadataFilter};
158+
/// use std::collections::BTreeMap;
159+
/// # use pinecone_sdk::utils::errors::PineconeError;
160+
///
161+
/// # #[tokio::main]
162+
/// # async fn main() -> Result<(), PineconeError>{
163+
/// let pinecone = PineconeClient::new(None, None, None, None).unwrap();
164+
///
165+
/// let mut index = pinecone.index("index-host").await.unwrap();
166+
///
167+
/// let mut filter = BTreeMap::new();
168+
/// filter.insert("field".to_string(), Value { kind: Some(Kind::StringValue("value".to_string())) });
169+
///
170+
/// let response = index.describe_index_stats(Some(MetadataFilter { fields: filter })).await.unwrap();
171+
/// # Ok(())
172+
/// # }
173+
/// ```
174+
pub async fn describe_index_stats(
175+
&mut self,
176+
filter: Option<MetadataFilter>,
177+
) -> Result<DescribeIndexStatsResponse, PineconeError> {
178+
let request = pb::DescribeIndexStatsRequest { filter };
179+
180+
let response = self
181+
.connection
182+
.describe_index_stats(request)
183+
.await
184+
.map_err(|e| PineconeError::DataPlaneError { status: e })?
185+
.into_inner();
186+
187+
Ok(response)
188+
}
144189
}
145190

146191
impl PineconeClient {

pinecone_sdk/src/utils/errors.rs

Lines changed: 19 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -198,61 +198,61 @@ impl std::fmt::Display for PineconeError {
198198
"Unknown response error: status: {}, message: {}",
199199
status, message
200200
)
201-
}
201+
},
202202
PineconeError::ResourceAlreadyExistsError { source } => {
203203
write!(f, "Resource already exists error: {}", source)
204-
}
204+
},
205205
PineconeError::UnprocessableEntityError { source } => {
206206
write!(f, "Unprocessable entity error: {}", source)
207-
}
207+
},
208208
PineconeError::PendingCollectionError { source } => {
209209
write!(f, "Pending collection error: {}", source)
210-
}
210+
},
211211
PineconeError::InternalServerError { source } => {
212212
write!(f, "Internal server error: {}", source)
213-
}
213+
},
214214
PineconeError::ReqwestError { source } => {
215215
write!(f, "Reqwest error: {}", source.to_string())
216-
}
216+
},
217217
PineconeError::SerdeError { source } => {
218218
write!(f, "Serde error: {}", source.to_string())
219-
}
219+
},
220220
PineconeError::IoError { message } => {
221221
write!(f, "IO error: {}", message)
222-
}
222+
},
223223
PineconeError::BadRequestError { source } => {
224224
write!(f, "Bad request error: {}", source)
225-
}
225+
},
226226
PineconeError::UnauthorizedError { source } => {
227227
write!(f, "Unauthorized error: status: {}", source)
228-
}
228+
},
229229
PineconeError::PodQuotaExceededError { source } => {
230230
write!(f, "Pod quota exceeded error: {}", source)
231-
}
231+
},
232232
PineconeError::CollectionsQuotaExceededError { source } => {
233233
write!(f, "Collections quota exceeded error: {}", source)
234-
}
234+
},
235235
PineconeError::InvalidCloudError { source } => {
236236
write!(f, "Invalid cloud error: status: {}", source)
237-
}
237+
},
238238
PineconeError::InvalidRegionError { source } => {
239239
write!(f, "Invalid region error: {}", source)
240-
}
240+
},
241241
PineconeError::CollectionNotFoundError { source } => {
242242
write!(f, "Collection not found error: {}", source)
243-
}
243+
},
244244
PineconeError::IndexNotFoundError { source } => {
245245
write!(f, "Index not found error: status: {}", source)
246-
}
246+
},
247247
PineconeError::APIKeyMissingError { message } => {
248248
write!(f, "API key missing error: {}", message)
249-
}
249+
},
250250
PineconeError::InvalidHeadersError { message } => {
251251
write!(f, "Invalid headers error: {}", message)
252-
}
252+
},
253253
PineconeError::TimeoutError { message } => {
254254
write!(f, "Timeout error: {}", message)
255-
}
255+
},
256256
PineconeError::ConnectionError { source } => {
257257
write!(f, "Connection error: {}", source)
258258
}

pinecone_sdk/tests/integration_test.rs

Lines changed: 60 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,10 @@
11
use openapi::models::index_model::Metric as OpenApiMetric;
22
use openapi::models::serverless_spec::Cloud as OpenApiCloud;
33
use pinecone_sdk::pinecone::control::{Cloud, Metric, WaitPolicy};
4-
use pinecone_sdk::pinecone::data::Vector;
4+
use pinecone_sdk::pinecone::data::{Kind, Value, Vector, MetadataFilter};
55
use pinecone_sdk::pinecone::PineconeClient;
66
use pinecone_sdk::utils::errors::PineconeError;
7+
use std::collections::BTreeMap;
78
use std::time::Duration;
89
use std::vec;
910

@@ -494,6 +495,64 @@ async fn test_upsert() -> Result<(), PineconeError> {
494495
Ok(())
495496
}
496497

498+
#[tokio::test]
499+
async fn test_describe_index_stats_with_filter() -> Result<(), PineconeError> {
500+
let pinecone = PineconeClient::new(None, None, None, None).unwrap();
501+
502+
let host = pinecone
503+
.describe_index(&get_pod_index())
504+
.await
505+
.unwrap()
506+
.host;
507+
508+
let mut index = pinecone
509+
.index(host.as_str())
510+
.await
511+
.expect("Failed to target index");
512+
513+
let mut filter = BTreeMap::new();
514+
filter.insert(
515+
"id".to_string(),
516+
Value {
517+
kind: Some(Kind::BoolValue(false)),
518+
},
519+
);
520+
521+
let describe_index_stats_response = index
522+
.describe_index_stats(Some(MetadataFilter { fields: filter }))
523+
.await
524+
.expect("Failed to describe index stats");
525+
526+
assert_eq!(describe_index_stats_response.dimension, 12);
527+
528+
Ok(())
529+
}
530+
531+
#[tokio::test]
532+
async fn test_describe_index_stats_no_filter() -> Result<(), PineconeError> {
533+
let pinecone = PineconeClient::new(None, None, None, None).unwrap();
534+
535+
let host = pinecone
536+
.describe_index(&get_serverless_index())
537+
.await
538+
.unwrap()
539+
.host;
540+
541+
let mut index = pinecone
542+
.index(host.as_str())
543+
.await
544+
.expect("Failed to target index");
545+
546+
let describe_index_stats_response = index
547+
.describe_index_stats(None)
548+
.await
549+
.expect("Failed to describe index stats");
550+
551+
assert_eq!(describe_index_stats_response.dimension, 4);
552+
553+
Ok(())
554+
}
555+
497556
#[tokio::test]
498557
async fn test_list_vectors() -> Result<(), PineconeError> {
499558
let pinecone = PineconeClient::new(None, None, None, None).unwrap();

0 commit comments

Comments
 (0)