#![cfg(any(feature = "sqlite", feature = "postgresql", feature = "mysql"))]
mod _test_common;
define_test_user_for_join!(TestUser, "test_subquery_users_1");
define_test_role!(TestRole, "test_subquery_roles_1");
#[allow(dead_code)]
async fn test_mapped_select_basic_impl(config: &_test_common::DbConfig) {
let sql = ormer::Select::<TestUser>::new()
.filter(|u| u.name.eq("Alice"))
.map_to(|u| u.id)
.to_sql_with_params(config.0);
println!("SQL: {}", sql.0);
assert!(sql.0.starts_with("SELECT id FROM test_subquery_users_1"));
assert!(sql.0.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 test_subquery_roles_1"));
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 test_subquery_users_1"));
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 test_subquery_users_1"));
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 test_subquery_users_1"));
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 test_subquery_users_1"));
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 test_subquery_users_1"));
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 test_subquery_roles_1"));
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 test_subquery_roles_1"));
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 test_subquery_roles_1"));
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 test_subquery_roles_1"));
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 test_subquery_users_1"));
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 test_subquery_users_1"));
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 test_subquery_users_1"));
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 test_subquery_roles_1"));
}