#![cfg(any(feature = "sqlite", feature = "postgresql", feature = "mysql"))]
pub mod _test_common;
define_test_user_with_score!(TestSubqueryUser, "test_subquery_users_1");
define_test_user_with_score!(TestSubqueryPost, "test_subquery_posts_1");
#[test]
fn test_subquery_basic_sql() {
use ormer::Select;
let subquery = Select::<TestSubqueryPost>::new().map_to(|p| p.age);
let sql = Select::<TestSubqueryUser>::new()
.filter(|u| u.age.is_in(subquery))
.to_sql();
println!("BASIC SUBQUERY SQL: {}", sql);
assert!(sql.contains("SELECT age"));
assert!(sql.contains("FROM test_subquery_posts_1"));
assert!(sql.contains("WHERE age IN ("));
}
#[test]
fn test_subquery_with_filter_sql() {
use ormer::Select;
let subquery = Select::<TestSubqueryUser>::new()
.filter(|u| u.score.gt(80))
.map_to(|u| u.age);
let sql = Select::<TestSubqueryPost>::new()
.filter(|p| p.age.is_in(subquery))
.to_sql();
println!("FILTERED SUBQUERY SQL: {}", sql);
assert!(sql.contains("SELECT age"));
assert!(sql.contains("FROM test_subquery_users_1"));
assert!(sql.contains("WHERE score >"));
assert!(sql.contains("WHERE age IN ("));
}
#[test]
fn test_subquery_nested_sql() {
use ormer::Select;
let inner_subquery = Select::<TestSubqueryUser>::new()
.filter(|u| u.age.gt(20))
.map_to(|u| u.age);
let outer_subquery = Select::<TestSubqueryPost>::new()
.filter(|p| p.age.is_in(inner_subquery))
.map_to(|p| p.age);
let sql = Select::<TestSubqueryUser>::new()
.filter(|u| u.age.is_in(outer_subquery))
.to_sql();
println!("NESTED SUBQUERY SQL: {}", sql);
assert!(sql.contains("WHERE age IN ("));
let in_count = sql.matches("IN (").count();
assert_eq!(in_count, 2, "Should have 2 IN clauses for nested subquery");
}
#[test]
fn test_subquery_with_params() {
use ormer::Select;
use ormer::abstract_layer::DbType;
let subquery = Select::<TestSubqueryUser>::new()
.filter(|u| u.age.gt(25))
.map_to(|u| u.age);
#[cfg(feature = "sqlite")]
let db_type = DbType::Sqlite;
#[cfg(all(not(feature = "sqlite"), feature = "postgresql"))]
let db_type = DbType::PostgreSQL;
#[cfg(all(
not(feature = "sqlite"),
not(feature = "postgresql"),
feature = "mysql"
))]
let db_type = DbType::MySQL;
let (sql, params) = Select::<TestSubqueryPost>::new()
.filter(|p| p.age.is_in(subquery))
.to_sql_with_params(db_type);
println!("SUBQUERY WITH PARAMS SQL: {}", sql);
println!("Params: {:?}", params);
assert!(sql.contains("WHERE age >"));
assert!(sql.contains("?") || sql.contains("$1"));
assert!(!params.is_empty(), "Should have parameters");
}