use ormer::Model;
#[derive(Debug, Model)]
#[table = "sq_users"]
struct TestUser {
#[primary(auto)]
id: i32,
name: String,
age: i32,
}
#[derive(Debug, Model)]
#[table = "sq_roles"]
struct TestRole {
#[primary(auto)]
id: i32,
#[foreign(TestUser)]
uid: i32,
name: String,
}
#[test]
fn test_mapped_select_basic() {
let sql = ormer::Select::<TestUser>::new()
.filter(|u| u.name.eq("Alice"))
.map_to(|u| u.id)
.to_sql();
println!("SQL: {}", sql);
assert!(sql.starts_with("SELECT id FROM sq_users"));
assert!(sql.contains("WHERE name = ?"));
}
#[test]
fn test_mapped_select_different_column() {
let sql = ormer::Select::<TestRole>::new()
.filter(|r| r.name.eq("admin"))
.map_to(|r| r.uid)
.to_sql();
println!("SQL: {}", sql);
assert!(sql.starts_with("SELECT uid FROM sq_roles"));
assert!(sql.contains("WHERE name = ?"));
}
#[test]
fn test_mapped_select_without_filter() {
let sql = ormer::Select::<TestUser>::new().map_to(|u| u.name).to_sql();
println!("SQL: {}", sql);
assert!(sql.starts_with("SELECT name FROM sq_users"));
assert!(!sql.contains("WHERE"));
}
#[test]
fn test_mapped_select_with_order_by() {
let sql = ormer::Select::<TestUser>::new()
.filter(|u| u.age.ge(18))
.order_by(|u| u.name)
.map_to(|u| u.id)
.to_sql();
println!("SQL: {}", sql);
assert!(sql.starts_with("SELECT id FROM sq_users"));
assert!(sql.contains("WHERE age >= ?"));
assert!(sql.contains("ORDER BY name ASC"));
}
#[test]
fn test_mapped_select_with_range() {
let sql = ormer::Select::<TestUser>::new()
.filter(|u| u.age.ge(18))
.range(..10)
.map_to(|u| u.id)
.to_sql();
println!("SQL: {}", sql);
assert!(sql.starts_with("SELECT id FROM sq_users"));
assert!(sql.contains("WHERE age >= ?"));
assert!(sql.contains("LIMIT 10"));
}
#[test]
fn test_mapped_select_with_order_and_range() {
let sql = ormer::Select::<TestUser>::new()
.order_by_desc(|u| u.age)
.range(5..15)
.map_to(|u| u.name)
.to_sql();
println!("SQL: {}", sql);
assert!(sql.starts_with("SELECT name FROM sq_users"));
assert!(sql.contains("ORDER BY age DESC"));
assert!(sql.contains("LIMIT 10 OFFSET 5"));
}
#[test]
fn test_mapped_select_multiple_filters() {
let sql = ormer::Select::<TestUser>::new()
.filter(|u| u.name.eq("Alice"))
.filter(|u| u.age.ge(18))
.map_to(|u| u.id)
.to_sql();
println!("SQL: {}", sql);
assert!(sql.starts_with("SELECT id FROM sq_users"));
assert!(sql.contains("name = ?"));
assert!(sql.contains("age >= ?"));
assert!(sql.contains(" AND "));
}
#[test]
fn test_mapped_select_clone() {
let select = ormer::Select::<TestUser>::new()
.filter(|u| u.age.ge(18))
.map_to(|u| u.id);
let cloned = select.clone();
let sql1 = select.to_sql();
let sql2 = cloned.to_sql();
assert_eq!(sql1, sql2);
}
#[test]
fn test_mapped_select_clone_with_filters() {
let select = ormer::Select::<TestUser>::new()
.filter(|u| u.name.eq("Alice"))
.filter(|u| u.age.ge(18))
.order_by(|u| u.name)
.range(..5)
.map_to(|u| u.id);
let cloned = select.clone();
assert_eq!(select.to_sql(), cloned.to_sql());
}
#[test]
fn test_subquery_sql_generation() {
let subquery = ormer::Select::<TestRole>::new()
.filter(|r| r.name.eq("admin"))
.map_to(|r| r.uid);
let subquery_sql = subquery.to_sql();
println!("Subquery SQL: {}", subquery_sql);
assert!(subquery_sql.starts_with("SELECT uid FROM sq_roles"));
assert!(subquery_sql.contains("WHERE name = ?"));
}
#[test]
fn test_subquery_sql_with_multiple_filters() {
let subquery = ormer::Select::<TestRole>::new()
.filter(|r| r.name.eq("admin"))
.filter(|r| r.uid.ge(10))
.map_to(|r| r.uid);
let subquery_sql = subquery.to_sql();
println!("Subquery SQL: {}", subquery_sql);
assert!(subquery_sql.starts_with("SELECT uid FROM sq_roles"));
assert!(subquery_sql.contains("name = ?"));
assert!(subquery_sql.contains("uid >= ?"));
assert!(subquery_sql.contains(" AND "));
}
#[test]
fn test_subquery_sql_without_filter() {
let subquery = ormer::Select::<TestRole>::new().map_to(|r| r.uid);
let subquery_sql = subquery.to_sql();
println!("Subquery SQL: {}", subquery_sql);
assert!(subquery_sql.starts_with("SELECT uid FROM sq_roles"));
assert!(!subquery_sql.contains("WHERE"));
}
#[test]
fn test_subquery_sql_with_order_and_range() {
let subquery = ormer::Select::<TestRole>::new()
.filter(|r| r.name.eq("admin"))
.order_by(|r| r.uid)
.range(..10)
.map_to(|r| r.uid);
let subquery_sql = subquery.to_sql();
println!("Subquery SQL: {}", subquery_sql);
assert!(subquery_sql.starts_with("SELECT uid FROM sq_roles"));
assert!(subquery_sql.contains("WHERE name = ?"));
assert!(subquery_sql.contains("ORDER BY uid ASC"));
assert!(subquery_sql.contains("LIMIT 10"));
}
#[test]
fn test_mapped_select_string_field() {
let sql = ormer::Select::<TestUser>::new()
.filter(|u| u.age.eq(25))
.map_to(|u| u.name)
.to_sql();
println!("SQL: {}", sql);
assert!(sql.starts_with("SELECT name FROM sq_users"));
assert!(sql.contains("WHERE age = ?"));
}
#[test]
fn test_mapped_select_age_field() {
let sql = ormer::Select::<TestUser>::new()
.filter(|u| u.name.eq("Alice"))
.map_to(|u| u.age)
.to_sql();
println!("SQL: {}", sql);
assert!(sql.starts_with("SELECT age FROM sq_users"));
assert!(sql.contains("WHERE name = ?"));
}
#[test]
fn test_mapped_select_is_in_values_trait() {
use ormer::query::builder::IsInValues;
let subquery = ormer::Select::<TestRole>::new()
.filter(|r| r.name.eq("admin"))
.map_to(|r| r.uid);
let where_expr = subquery.to_in_expr("uid".to_string());
drop(where_expr);
}
#[test]
fn test_mapped_select_complex_scenario() {
let sql = ormer::Select::<TestUser>::new()
.filter(|u| u.name.eq("Alice"))
.filter(|u| u.age.ge(18))
.filter(|u| u.age.le(65))
.order_by_desc(|u| u.age)
.range(10..20)
.map_to(|u| u.id)
.to_sql();
println!("SQL: {}", sql);
assert!(sql.starts_with("SELECT id FROM sq_users"));
assert!(sql.contains("name = ?"));
assert!(sql.contains("age >= ?"));
assert!(sql.contains("age <= ?"));
assert!(sql.contains("ORDER BY age DESC"));
assert!(sql.contains("LIMIT 10 OFFSET 10"));
}
#[test]
fn test_subquery_for_in_clause() {
let subquery = ormer::Select::<TestRole>::new()
.filter(|r| r.name.eq("admin"))
.map_to(|r| r.uid);
let sql = subquery.to_sql();
println!("Subquery SQL for IN: {}", sql);
assert!(sql.starts_with("SELECT"));
assert!(sql.contains("uid"));
assert!(sql.contains("FROM sq_roles"));
}