pub mod query;
#[cfg(test)]
mod tests {
use crate::query::{
operator as op,
select::Select,
func::Func,
insert::Insert,
update::Update,
set::Pair,
delete::Delete, array::Array,
};
#[test]
fn select() {
let result = "
SELECT DISTINCT id, age, fullname FROM customer\nINNER JOIN merchant ON customer.id = merchant.customer_id\nLEFT JOIN product ON customer.id = product.customer_id\nWHERE age BETWEEN 10 AND 25\nAND fullname LIKE 'full%'\nOR fullname NOT IN ('danyal', 'danyalmh', 'danyalai')\nGROUP BY merchant_id\nHAVING COUNT(id) = 2025\nORDER BY fullname ASC, age DESC\nLIMIT 10\nOFFSET 5
";
let query =
Select::
cols(vec!["id", "age", "fullname"])
.distinct()
.from("customer")
.inner_join("merchant").on("customer.id", "customer_id")
.left_join("product").on("customer.id", "customer_id")
.where_by("age", op::between(10, 25))
.and("fullname", op::like("full%"))
.or("fullname", op::not_in(vec!["danyal", "danyalmh", "danyalai"]))
.group_by(vec!["merchant_id"])
.having(&Func::count("id"), op::eq(2025))
.order_by("fullname")
.order_by_desc("age")
.limit(10)
.offset(5)
.build();
assert_eq!(query.trim(), result.trim());
println!("\n{}\n", query);
}
#[test]
fn select_with_source() {
let query =
Select::
cols(vec!["id", "age", "fullname"])
.distinct()
.from_subquery(
Select::
cols(vec!["id", "age", "fullname"])
.from("another_table")
.where_by("age", op::gt(22))
)
.where_by("age", op::between(10, 25))
.order_by_desc("age")
.limit(10)
.offset(5)
.build();
println!("\n{}\n", query);
}
#[test]
fn insert() {
let query =
Insert::into("customer").cols(vec!["id", "age", "fullname"])
.value(Array::new().add("766dc50e").add(25).add("Danyal"))
.build();
println!("\n{}\n", query);
}
#[test]
fn insert_values() {
let query =
Insert::into("customer").cols(vec!["id", "age", "fullname"])
.values(vec![
Array::new().add("766dc50e").add(25).add("Danyal"),
Array::new().add("766dc50e").add(25).add("Danyal"),
])
.build();
println!("\n{}\n", query);
}
#[test]
fn insert_value_select() {
let query =
Insert::into("customer").cols(vec!["id", "age", "fullname"])
.source(
Select::cols(vec!["id", "age", "fullname"]).from("customer_template")
.where_by("age", op::eq(10)).limit(10)
)
.build();
println!("\n{}\n", query);
}
#[test]
pub fn update() {
let query =
Update::table("customer")
.set(vec![Pair::from("age", 100), Pair::from("fullname", "DanyalMh")])
.where_by("id", op::eq(100))
.and("fullname", op::not("DanyalMh"))
.build();
println!("\n{}\n", query)
}
#[test]
pub fn delete() {
let query =
Delete::from("customer")
.where_by("fullname", op::neq("DanyalMh"))
.or("age", op::not_between(23, 25))
.build();
println!("\n{}\n", query)
}
#[test]
pub fn delete_with_sub_query() {
let query =
Delete::from("customer")
.where_by("age", op::lt(
Select::cols(vec!["MIN(age)"]).from("athele")
))
.build();
println!("\n{}\n", query)
}
}