use anyhow::Result;
use rag_module::RagModule;
#[tokio::main]
async fn main() -> Result<()> {
println!("๐๏ธ Testing Collection Deletion Functionality\n");
let base_path = "./batch-test-data";
let user_id = "delete_test_user";
let collection_name = "test_collection_to_delete";
let rag = RagModule::new(base_path).await?;
rag.initialize().await?;
println!("๐ Step 1: Creating a test collection with sample data...");
let test_data = vec![
serde_json::json!({
"content": "Test EC2 instance for deletion demo",
"resource_type": "ec2_instance",
"instance_id": "i-test123"
}),
serde_json::json!({
"content": "Test S3 bucket for deletion demo",
"resource_type": "s3_bucket",
"bucket_name": "test-delete-bucket"
}),
serde_json::json!({
"content": "Test RDS database for deletion demo",
"resource_type": "rds_instance",
"db_identifier": "test-delete-db"
})
];
let _ingest_result = rag.ingest_aws_estate_batch(test_data, user_id, collection_name).await?;
println!("โ
Created test collection with 3 documents");
println!("\n๐ Step 2: Listing generated files before deletion...");
let user_path = std::path::Path::new(base_path).join("qdrant-data").join(user_id);
if user_path.exists() {
println!("๐ Files in user directory:");
let mut entries = tokio::fs::read_dir(&user_path).await?;
while let Some(entry) = entries.next_entry().await? {
if let Some(name) = entry.file_name().to_str() {
if name.starts_with(collection_name) {
let metadata = entry.metadata().await?;
println!(" ๐ {} ({} bytes)", name, metadata.len());
}
}
}
}
println!("\n๐๏ธ Step 3: Deleting collection '{}'...", collection_name);
rag.set_user_context(user_id).await?;
let delete_result = rag.delete_collection(collection_name, user_id).await?;
println!("\n๐ Deletion Results:");
println!("โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ");
println!("Collection: {}", delete_result.collection_name);
println!("User ID: {}", delete_result.user_id);
println!("Collection deleted: {}", if delete_result.collection_deleted { "โ
Yes" } else { "โ No" });
println!("Files removed: {}", delete_result.files_removed);
if !delete_result.removed_files.is_empty() {
println!("Removed files:");
for file in &delete_result.removed_files {
println!(" ๐๏ธ {}", file);
}
}
if !delete_result.errors.is_empty() {
println!("โ ๏ธ Errors encountered:");
for error in &delete_result.errors {
println!(" โ {}", error);
}
}
println!("\n๐ Step 4: Verifying cleanup...");
if user_path.exists() {
let mut remaining_files = Vec::new();
let mut entries = tokio::fs::read_dir(&user_path).await?;
while let Some(entry) = entries.next_entry().await? {
if let Some(name) = entry.file_name().to_str() {
if name.starts_with(collection_name) {
remaining_files.push(name.to_string());
}
}
}
if remaining_files.is_empty() {
println!("โ
All collection files have been removed");
} else {
println!("โ ๏ธ Some files remain:");
for file in remaining_files {
println!(" ๐ {}", file);
}
}
} else {
println!("โ
User directory has been cleaned up");
}
println!("\n๐งช Step 5: Testing deletion of non-existent collection...");
let non_existent_result = rag.delete_collection("non_existent_collection", user_id).await?;
println!("Non-existent collection deletion:");
println!(" Files removed: {}", non_existent_result.files_removed);
println!(" Errors: {}", non_existent_result.errors.len());
if non_existent_result.errors.is_empty() {
println!(" โ
No errors (as expected for non-existent collection)");
}
println!("\n๐ Collection deletion demo completed!");
println!("\n๐ก Usage in your code:");
println!("```rust");
println!("let result = rag.delete_collection(\"collection_name\", \"user_id\").await?;");
println!("if result.is_successful() {{");
println!(" println!(\"Successfully deleted collection with {{}} files\", result.files_removed);");
println!("}} else if result.has_partial_success() {{");
println!(" println!(\"Partial deletion: {{}} errors\", result.errors.len());");
println!("}} else {{");
println!(" println!(\"Deletion failed\");");
println!("}}");
println!("```");
Ok(())
}