use archibald::{delete, from, insert, op, update, QueryBuilder};
use archibald::{ColumnSelector, SortDirection};
use std::collections::HashMap;
fn main() {
println!("=== Archibald Core - Basic Usage Examples ===\n");
let select_query = from("users")
.select(("id", "name", "email"))
.where_(("age", op::GT, 18)) .where_(("status", "active")) .where_(("city", "LIKE", "%York%")) .limit(10)
.offset(5);
println!("1. Basic SELECT:");
println!(" SQL: {}", select_query.to_sql().unwrap());
println!(" Parameters: {:?}\n", select_query.parameters());
let subquery_in = from("users").select(("id", "name")).where_in(
"id",
from("orders")
.select("user_id")
.where_(("status", "completed"))
.where_(("created_at", op::GT, "2024-01-01")),
);
println!("2. Subquery (WHERE IN):");
println!(" SQL: {}", subquery_in.to_sql().unwrap());
let subquery_exists = from("users").select(("id", "name", "email")).where_exists(
from("posts")
.select("1")
.where_(("posts.author_id", "users.id"))
.where_(("posts.published", true)),
);
println!(" SQL: {}", subquery_exists.to_sql().unwrap());
println!();
let join_query = from("users")
.select((
"users.name",
ColumnSelector::count().as_alias("post_count"),
ColumnSelector::avg("posts.rating").as_alias("avg_rating"),
))
.inner_join("posts", "users.id", "posts.author_id")
.where_(("users.active", true))
.group_by("users.id, users.name")
.having(("COUNT(*)", op::GT, 5))
.order_by("avg_rating", SortDirection::Desc)
.limit(20);
println!("3. JOINs with Aggregation:");
println!(" SQL: {}", join_query.to_sql().unwrap());
println!();
let mut user_data = HashMap::new();
user_data.insert("name".to_string(), "John Doe".into());
user_data.insert("email".to_string(), "john@example.com".into());
user_data.insert("age".to_string(), 30.into());
let insert_query = insert("users").values(user_data);
println!("4. INSERT:");
println!(" SQL: {}", insert_query.to_sql().unwrap());
println!(" Parameters: {:?}\n", insert_query.parameters());
let mut updates = HashMap::new();
updates.insert("email".to_string(), "newemail@example.com".into());
updates.insert("last_login".to_string(), "2024-01-15".into());
let update_query = update("users")
.set(updates)
.where_(("id", 123))
.and_where(("active", true));
println!("5. UPDATE:");
println!(" SQL: {}", update_query.to_sql().unwrap());
println!(" Parameters: {:?}\n", update_query.parameters());
let delete_query =
delete("users")
.where_(("age", op::LT, 13))
.or_where(("last_login", op::LT, "2020-01-01"));
println!("6. DELETE:");
println!(" SQL: {}", delete_query.to_sql().unwrap());
println!(" Parameters: {:?}\n", delete_query.parameters());
let postgres_fts_query = from("documents")
.select(("title", "content"))
.where_((
"content",
archibald::Operator::custom("@@"),
"search & query",
))
.limit(20);
println!("7. Custom Operators (PostgreSQL Full-Text Search):");
println!(" SQL: {}", postgres_fts_query.to_sql().unwrap());
println!();
let complex_query = from("users")
.where_(("age", op::GTE, 18)) .and_where(("status", "active")) .or_where(("role", "admin")) .and_where(("verified", true)) .select(("id", "name"));
println!("8. Complex WHERE (AND/OR combinations):");
println!(" SQL: {}", complex_query.to_sql().unwrap());
println!(" Parameters: {:?}\n", complex_query.parameters());
println!("9. Deferred Validation:");
let invalid_query = from("users")
.where_(("age", "INVALID_OPERATOR", 18))
.select(("id", "name"));
match invalid_query.to_sql() {
Ok(sql) => println!(" Unexpected success: {}", sql),
Err(e) => println!(" ✓ Caught invalid operator: {}", e),
}
println!("\n=== All examples completed successfully! ===");
}