use bytes::BytesMut;
use qail_qdrant::prelude::Distance;
use qail_qdrant::{QdrantDriver, QdrantResult};
use qail_qdrant::encoder;
const COLLECTION_NAME: &str = "grpc_test_collection";
#[tokio::main]
async fn main() -> QdrantResult<()> {
println!("=== QAIL Qdrant gRPC Integration Test ===\n");
println!("1. Connecting to Qdrant gRPC (localhost:6334)...");
let mut driver = match QdrantDriver::connect("localhost", 6334).await {
Ok(d) => {
println!(" ✓ Connected via gRPC/HTTP2");
d
}
Err(e) => {
println!(" ✗ Failed to connect: {}", e);
println!("\n Make sure Qdrant is running:");
println!(" docker run -p 6333:6333 -p 6334:6334 qdrant/qdrant");
return Err(e);
}
};
println!("\n2. Creating collection '{}' (via REST)...", COLLECTION_NAME);
let mut rest_driver = qail_qdrant::QdrantDriver::connect("localhost", 6333).await?;
let _ = rest_driver.delete_collection(COLLECTION_NAME).await;
rest_driver
.create_collection(COLLECTION_NAME, 4, Distance::Cosine, false)
.await?;
println!(" ✓ Collection created with 4D vectors, Cosine distance");
println!("\n3. Upserting test points...");
let points = vec![
qail_qdrant::Point::new_num(1, vec![0.1, 0.2, 0.3, 0.4])
.with_payload("name", "Product A"),
qail_qdrant::Point::new_num(2, vec![0.2, 0.3, 0.4, 0.5])
.with_payload("name", "Product B"),
qail_qdrant::Point::new_num(3, vec![0.9, 0.8, 0.7, 0.6])
.with_payload("name", "Product C"),
];
rest_driver.upsert(COLLECTION_NAME, &points, true).await?;
println!(" ✓ Inserted 3 points");
println!("\n4. Searching via gRPC (zero-copy encoding)...");
let query_vector = vec![0.15, 0.25, 0.35, 0.45];
let mut buf = BytesMut::with_capacity(1024);
encoder::encode_search_proto(
&mut buf,
COLLECTION_NAME,
&query_vector,
3, None, None, );
println!(" Encoded {} bytes of protobuf", buf.len());
println!(" First 20 bytes: {:02x?}", &buf[..20.min(buf.len())]);
let results = driver.search(COLLECTION_NAME, &query_vector, 3, None).await?;
println!(" ✓ Got {} results", results.len());
for (i, point) in results.iter().enumerate() {
println!(" {}. ID: {:?}, Score: {:.4}", i + 1, point.id, point.score);
}
println!("\n5. Cleaning up...");
rest_driver.delete_collection(COLLECTION_NAME).await?;
println!(" ✓ Collection deleted");
println!("\n=== All tests passed! ===");
Ok(())
}