#![allow(dead_code)]
use crate::utils::ensure_test_table;
use ion_binary_rs::IonValue;
use qldb::DocumentCollection;
use qldb::QldbClient;
use rand::distributions::Alphanumeric;
use rand::thread_rng;
use rand::Rng;
const DOCUMENTS_TO_INSERT_FOR_TESTING: usize = 800;
const DOCUMENTS_PER_QUERY: usize = 40;
const INSERT_LOOP_COUNT: usize = DOCUMENTS_TO_INSERT_FOR_TESTING / DOCUMENTS_PER_QUERY;
pub async fn cursor_800_documents_with_client(client: QldbClient) {
let test_table = ensure_test_table(&client).await;
let documents_model = format!("cursor_800_documents{}", rand_string());
let table = test_table.clone();
let _ = client
.transaction_within(|tx| async move {
let _ = tx.query(&format!("CREATE INDEX ON {} (Model)", &table)).execute().await;
Ok(())
})
.await;
println!("Model {}", documents_model);
for _ in 0..INSERT_LOOP_COUNT {
let table = test_table.clone();
let model = documents_model.clone();
client.transaction_within(|tx| async move {
let mut query = tx.query(&format!("INSERT INTO {} << ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ? >>", &table));
for _ in 0..DOCUMENTS_PER_QUERY {
query = query.param(get_qldb_struct(&model))
}
query.execute().await.unwrap();
Ok(())
}).await.unwrap();
}
let table = test_table.clone();
let model = documents_model.clone();
client
.transaction_within(|tx| async move {
let mut cursor = tx
.query(&format!("SELECT * FROM {} WHERE Model = ?", &table))
.param(model)
.get_cursor()
.unwrap();
let mut counter: u64 = 0;
let mut result: DocumentCollection = Default::default();
while let Some(values) = cursor.load_more().await.unwrap() {
counter += 1;
result.extend(values.into_iter());
}
assert!(counter > 1);
assert_eq!(result.len(), 800);
Ok(())
})
.await
.unwrap();
let table = test_table.clone();
let model = documents_model.clone();
client
.transaction_within(|tx| async move {
let result = tx
.query(&format!("SELECT * FROM {} WHERE Model = ?", &table))
.param(model)
.execute()
.await
.unwrap();
assert_eq!(result.len(), 800);
Ok(())
})
.await
.unwrap();
}
macro_rules! hashmap(
{ $($key:expr => $value:expr),+ } => {
{
let mut m = ::std::collections::HashMap::new();
$(
m.insert($key, $value);
)+
m
}
};
);
fn get_qldb_struct(name: &str) -> IonValue {
IonValue::Struct(hashmap!(
"Model".to_string() => IonValue::String(name.to_string()),
"Type".to_string() => IonValue::String("Sedan".to_string()),
"Color".to_string() => IonValue::String("White".to_string()),
"VIN".to_string() => IonValue::String("1C4RJFAG0FC625797".to_string()),
"Make".to_string() => IonValue::String("Mercedes".to_string()),
"Year".to_string() => IonValue::Integer(2019)
))
}
fn rand_string() -> String {
thread_rng()
.sample_iter(&Alphanumeric)
.take(30)
.map(char::from)
.collect()
}