use amaters_core::{CipherBlob, Key};
use amaters_sdk_rust::{AmateRSClient, query};
use std::time::Instant;
#[tokio::main]
async fn main() -> anyhow::Result<()> {
tracing_subscriber::fmt::init();
println!("=== AmateRS SDK Batch Operations Example ===\n");
println!("Connecting to server...");
let client = AmateRSClient::connect("http://localhost:50051").await?;
println!("Connected!\n");
println!("Example 1: Batch insert");
let users = vec![
("alice", "Alice's data"),
("bob", "Bob's data"),
("charlie", "Charlie's data"),
("dave", "Dave's data"),
("eve", "Eve's data"),
];
let mut queries = Vec::new();
for (username, data) in &users {
let key = Key::from_str(&format!("user:{}", username));
let value = CipherBlob::new(data.as_bytes().to_vec());
queries.push(query("users").set(key, value));
}
println!(" Inserting {} users in batch...", users.len());
let start = Instant::now();
let results = client.execute_batch(queries).await?;
let elapsed = start.elapsed();
println!(" ✓ Batch completed: {} operations", results.len());
println!(" Time elapsed: {:?}", elapsed);
println!();
println!("Example 2: Mixed batch operations");
let queries = vec![
query("users").set(
Key::from_str("user:frank"),
CipherBlob::new(b"Frank's data".to_vec()),
),
query("users").get(Key::from_str("user:alice")),
query("users").delete(Key::from_str("user:bob")),
query("users").set(
Key::from_str("user:grace"),
CipherBlob::new(b"Grace's data".to_vec()),
),
];
println!(" Executing mixed batch (set, get, delete, set)...");
let start = Instant::now();
let results = client.execute_batch(queries).await?;
let elapsed = start.elapsed();
println!(" ✓ Batch completed: {} operations", results.len());
println!(" Time elapsed: {:?}", elapsed);
println!();
println!("Example 3: Large batch insert");
let batch_size = 100;
let mut queries = Vec::new();
for i in 0..batch_size {
let key = Key::from_str(&format!("data:{:04}", i));
let value = CipherBlob::new(format!("Data item {}", i).into_bytes());
queries.push(query("data").set(key, value));
}
println!(" Inserting {} items in batch...", batch_size);
let start = Instant::now();
let results = client.execute_batch(queries).await?;
let elapsed = start.elapsed();
println!(" ✓ Batch completed: {} operations", results.len());
println!(" Time elapsed: {:?}", elapsed);
println!(
" Average time per operation: {:?}",
elapsed / batch_size as u32
);
println!();
println!("Example 4: Batch insert with encrypted data");
let data_items: [(usize, &[u8]); 5] = [
(0, b"sensitive data 1"),
(1, b"sensitive data 2"),
(2, b"sensitive data 3"),
(3, b"sensitive data 4"),
(4, b"sensitive data 5"),
];
println!(" Preparing {} encrypted items...", data_items.len());
let mut queries = Vec::new();
for (i, data) in &data_items {
let key = Key::from_str(&format!("encrypted:{}", i));
let cipher = CipherBlob::new(data.to_vec());
queries.push(query("encrypted").set(key, cipher));
}
println!(" Inserting {} encrypted items in batch...", queries.len());
let start = Instant::now();
let results = client.execute_batch(queries).await?;
let batch_elapsed = start.elapsed();
println!(" ✓ Batch completed: {} operations", results.len());
println!(" Batch insert time: {:?}", batch_elapsed);
println!();
println!("Example 5: Batch delete (range simulation)");
let mut queries = Vec::new();
for i in 0..10 {
let key = Key::from_str(&format!("data:{:04}", i));
queries.push(query("data").delete(key));
}
println!(" Deleting {} items in batch...", queries.len());
let start = Instant::now();
let results = client.execute_batch(queries).await?;
let elapsed = start.elapsed();
println!(" ✓ Batch completed: {} operations", results.len());
println!(" Time elapsed: {:?}", elapsed);
println!();
println!("Example 6: Performance comparison - Sequential vs Batch");
let test_size = 10;
println!(" Sequential: Inserting {} items one by one...", test_size);
let start = Instant::now();
for i in 0..test_size {
let key = Key::from_str(&format!("seq:{}", i));
let value = CipherBlob::new(format!("Sequential {}", i).into_bytes());
client.set("perf", &key, &value).await?;
}
let sequential_time = start.elapsed();
println!(" ✓ Sequential time: {:?}", sequential_time);
println!(
" Average per operation: {:?}",
sequential_time / test_size
);
println!(" Batch: Inserting {} items in one batch...", test_size);
let mut queries = Vec::new();
for i in 0..test_size {
let key = Key::from_str(&format!("batch:{}", i));
let value = CipherBlob::new(format!("Batch {}", i).into_bytes());
queries.push(query("perf").set(key, value));
}
let start = Instant::now();
let _results = client.execute_batch(queries).await?;
let batch_time = start.elapsed();
println!(" ✓ Batch time: {:?}", batch_time);
println!(" Average per operation: {:?}", batch_time / test_size);
if sequential_time > batch_time {
let speedup = sequential_time.as_secs_f64() / batch_time.as_secs_f64();
println!("\n Performance Summary:");
println!(
" Batch operations are {:.2}x faster than sequential!",
speedup
);
println!(" Time saved: {:?}", sequential_time - batch_time);
}
println!();
client.close();
println!("Done!");
Ok(())
}