use stoolap::Database;
#[test]
fn test_scan_with_where_clause() {
let db = Database::open("memory://scan_where").expect("Failed to create database");
db.execute(
"CREATE TABLE test_scan_table (id INTEGER PRIMARY KEY, val TEXT, active BOOLEAN)",
(),
)
.expect("Failed to create table");
db.execute(
"INSERT INTO test_scan_table (id, val, active) VALUES (1, 'value1', true)",
(),
)
.expect("Failed to insert data");
db.execute(
"INSERT INTO test_scan_table (id, val, active) VALUES (2, 'value2', false)",
(),
)
.expect("Failed to insert data");
db.execute(
"INSERT INTO test_scan_table (id, val, active) VALUES (3, 'value3', true)",
(),
)
.expect("Failed to insert data");
let result = db
.query("SELECT val, active FROM test_scan_table WHERE id = 1", ())
.expect("Failed to execute query");
let mut rows_found = 0;
for row in result {
let row = row.expect("Failed to get row");
let val: String = row.get(0).unwrap();
let active: bool = row.get(1).unwrap();
assert_eq!(val, "value1", "Expected val='value1'");
assert!(active, "Expected active=true");
rows_found += 1;
}
assert_eq!(rows_found, 1, "Expected exactly 1 row");
}
#[test]
fn test_extra_columns_in_where() {
let db = Database::open("memory://scan_extra_where").expect("Failed to create database");
db.execute("CREATE TABLE complex_table (id INTEGER PRIMARY KEY, name TEXT, age INTEGER, active BOOLEAN, status TEXT)", ())
.expect("Failed to create table");
db.execute("INSERT INTO complex_table (id, name, age, active, status) VALUES (1, 'John', 25, true, 'employed')", ())
.expect("Failed to insert data");
db.execute("INSERT INTO complex_table (id, name, age, active, status) VALUES (2, 'Jane', 30, false, 'unemployed')", ())
.expect("Failed to insert data");
db.execute("INSERT INTO complex_table (id, name, age, active, status) VALUES (3, 'Bob', 40, true, 'retired')", ())
.expect("Failed to insert data");
let result = db
.query(
"SELECT name, status FROM complex_table WHERE id = 1 AND age > 20 AND active = true",
(),
)
.expect("Failed to execute query");
let mut rows_found = 0;
for row in result {
let row = row.expect("Failed to get row");
let name: String = row.get(0).unwrap();
let status: String = row.get(1).unwrap();
assert_eq!(name, "John", "Expected name='John'");
assert_eq!(status, "employed", "Expected status='employed'");
rows_found += 1;
}
assert_eq!(rows_found, 1, "Expected exactly 1 row");
}
#[test]
fn test_select_star_with_where() {
let db = Database::open("memory://scan_star_where").expect("Failed to create database");
db.execute(
"CREATE TABLE star_test (id INTEGER PRIMARY KEY, name TEXT, value INTEGER)",
(),
)
.expect("Failed to create table");
db.execute(
"INSERT INTO star_test (id, name, value) VALUES (1, 'first', 100)",
(),
)
.expect("Failed to insert data");
db.execute(
"INSERT INTO star_test (id, name, value) VALUES (2, 'second', 200)",
(),
)
.expect("Failed to insert data");
db.execute(
"INSERT INTO star_test (id, name, value) VALUES (3, 'third', 300)",
(),
)
.expect("Failed to insert data");
let result = db
.query("SELECT * FROM star_test WHERE value > 150", ())
.expect("Failed to execute query");
let mut count = 0;
for row in result {
let row = row.expect("Failed to get row");
let id: i64 = row.get(0).unwrap();
let value: i64 = row.get(2).unwrap();
assert!(value > 150, "Expected value > 150");
assert!(id == 2 || id == 3, "Expected id 2 or 3");
count += 1;
}
assert_eq!(count, 2, "Expected 2 rows with value > 150");
}
#[test]
fn test_where_multiple_conditions() {
let db = Database::open("memory://scan_multi_cond").expect("Failed to create database");
db.execute(
"CREATE TABLE range_test (id INTEGER PRIMARY KEY, value INTEGER)",
(),
)
.expect("Failed to create table");
for i in 1..=10 {
db.execute(
&format!(
"INSERT INTO range_test (id, value) VALUES ({}, {})",
i,
i * 10
),
(),
)
.expect("Failed to insert data");
}
let result = db
.query(
"SELECT id FROM range_test WHERE value >= 30 AND value <= 70",
(),
)
.expect("Failed to execute query");
let mut ids: Vec<i64> = Vec::new();
for row in result {
let row = row.expect("Failed to get row");
let id: i64 = row.get(0).unwrap();
ids.push(id);
}
assert_eq!(ids.len(), 5, "Expected 5 rows in range");
}
#[test]
fn test_where_or_conditions() {
let db = Database::open("memory://scan_or_where").expect("Failed to create database");
db.execute(
"CREATE TABLE or_test (id INTEGER PRIMARY KEY, category TEXT, active BOOLEAN)",
(),
)
.expect("Failed to create table");
db.execute(
"INSERT INTO or_test (id, category, active) VALUES (1, 'A', true)",
(),
)
.expect("Failed to insert data");
db.execute(
"INSERT INTO or_test (id, category, active) VALUES (2, 'B', false)",
(),
)
.expect("Failed to insert data");
db.execute(
"INSERT INTO or_test (id, category, active) VALUES (3, 'C', true)",
(),
)
.expect("Failed to insert data");
db.execute(
"INSERT INTO or_test (id, category, active) VALUES (4, 'A', false)",
(),
)
.expect("Failed to insert data");
let result = db
.query(
"SELECT id, category FROM or_test WHERE category = 'A' OR active = true ORDER BY id",
(),
)
.expect("Failed to execute query");
let mut results: Vec<(i64, String)> = Vec::new();
for row in result {
let row = row.expect("Failed to get row");
let id: i64 = row.get(0).unwrap();
let cat: String = row.get(1).unwrap();
results.push((id, cat));
}
assert_eq!(results.len(), 3, "Expected 3 rows matching OR condition");
}