use stoolap::Database;
#[test]
fn test_query_cache_basic() {
let db = Database::open("memory://").expect("Failed to create database");
db.execute(
"CREATE TABLE cache_test (id INTEGER PRIMARY KEY, name TEXT, value FLOAT)",
(),
)
.expect("Failed to create table");
db.execute("INSERT INTO cache_test VALUES (1, 'test-name', 10.5)", ())
.expect("Failed to insert test row");
let count: i64 = db
.query_one("SELECT COUNT(*) FROM cache_test", ())
.expect("Failed to count rows");
assert_eq!(count, 1, "Expected 1 row but got {}", count);
for i in 0..5 {
let rows = db
.query("SELECT * FROM cache_test", ())
.expect("Query failed");
let row_count = rows.count();
assert_eq!(
row_count, 1,
"Iteration {}: Expected 1 row, got {}",
i, row_count
);
}
let rows = db
.query("SELECT * FROM cache_test WHERE id = $1", (1,))
.expect("Parameterized query failed");
assert_eq!(rows.count(), 1);
let rows = db
.query("SELECT * FROM cache_test WHERE id = $1", (2,))
.expect("Second parameterized query failed");
assert_eq!(rows.count(), 0);
let query_strings = vec![
"SELECT * FROM cache_test",
"SELECT name, value FROM cache_test",
"SELECT id FROM cache_test",
"SELECT * FROM cache_test", ];
for q in query_strings {
let _rows = db
.query(q, ())
.unwrap_or_else(|_| panic!("Query failed on '{}'", q));
}
}
#[test]
fn test_query_cache_multiple_tables() {
let db = Database::open("memory://").expect("Failed to create database");
db.execute(
"CREATE TABLE table_a (id INTEGER PRIMARY KEY, name TEXT)",
(),
)
.expect("Failed to create table_a");
db.execute(
"CREATE TABLE table_b (id INTEGER PRIMARY KEY, value INTEGER)",
(),
)
.expect("Failed to create table_b");
db.execute("INSERT INTO table_a VALUES (1, 'Alice'), (2, 'Bob')", ())
.expect("Failed to insert into table_a");
db.execute("INSERT INTO table_b VALUES (1, 100), (2, 200)", ())
.expect("Failed to insert into table_b");
for _ in 0..3 {
let rows_a = db
.query("SELECT * FROM table_a", ())
.expect("Query table_a failed");
assert_eq!(rows_a.count(), 2);
let rows_b = db
.query("SELECT * FROM table_b", ())
.expect("Query table_b failed");
assert_eq!(rows_b.count(), 2);
}
}
#[test]
fn test_query_cache_where_clauses() {
let db = Database::open("memory://").expect("Failed to create database");
db.execute(
"CREATE TABLE products (id INTEGER PRIMARY KEY, name TEXT, price FLOAT)",
(),
)
.expect("Failed to create table");
db.execute(
"INSERT INTO products VALUES (1, 'Apple', 1.50), (2, 'Banana', 0.75), (3, 'Cherry', 2.00)",
(),
)
.expect("Failed to insert");
let rows1 = db
.query("SELECT * FROM products WHERE price > 1.0", ())
.unwrap();
assert_eq!(rows1.count(), 2);
let rows2 = db
.query("SELECT * FROM products WHERE price < 1.0", ())
.unwrap();
assert_eq!(rows2.count(), 1);
let rows3 = db
.query("SELECT * FROM products WHERE price > 1.0", ())
.unwrap();
assert_eq!(rows3.count(), 2);
}
#[test]
fn test_query_cache_aggregations() {
let db = Database::open("memory://").expect("Failed to create database");
db.execute(
"CREATE TABLE sales (id INTEGER PRIMARY KEY, amount FLOAT, category TEXT)",
(),
)
.expect("Failed to create table");
db.execute(
"INSERT INTO sales VALUES (1, 100.0, 'A'), (2, 200.0, 'A'), (3, 150.0, 'B')",
(),
)
.expect("Failed to insert");
let sum: f64 = db.query_one("SELECT SUM(amount) FROM sales", ()).unwrap();
assert!((sum - 450.0).abs() < 0.01);
let count: i64 = db.query_one("SELECT COUNT(*) FROM sales", ()).unwrap();
assert_eq!(count, 3);
let sum2: f64 = db.query_one("SELECT SUM(amount) FROM sales", ()).unwrap();
assert!((sum2 - 450.0).abs() < 0.01);
}
#[test]
fn test_query_cache_with_dml() {
let db = Database::open("memory://").expect("Failed to create database");
db.execute("CREATE TABLE items (id INTEGER PRIMARY KEY, name TEXT)", ())
.expect("Failed to create table");
db.execute("INSERT INTO items VALUES (1, 'Item1')", ())
.unwrap();
let count: i64 = db.query_one("SELECT COUNT(*) FROM items", ()).unwrap();
assert_eq!(count, 1);
db.execute("INSERT INTO items VALUES (2, 'Item2')", ())
.unwrap();
let count: i64 = db.query_one("SELECT COUNT(*) FROM items", ()).unwrap();
assert_eq!(count, 2);
}
#[test]
fn test_query_cache_whitespace_normalization() {
let db = Database::open("memory://").expect("Failed to create database");
db.execute("CREATE TABLE test (id INTEGER PRIMARY KEY)", ())
.unwrap();
db.execute("INSERT INTO test VALUES (1)", ()).unwrap();
let queries = vec![
"SELECT * FROM test",
"SELECT * FROM test",
"SELECT * FROM test ",
" SELECT * FROM test",
"SELECT\t*\tFROM\ttest",
];
for q in queries {
let rows = db
.query(q, ())
.unwrap_or_else(|_| panic!("Query failed: '{}'", q));
assert_eq!(rows.count(), 1, "Query '{}' should return 1 row", q);
}
}