#[macro_export]
#[doc(hidden)]
macro_rules! search_apply_op {
($col:expr, eq, $val:expr) => {
$col.eq($val)
};
($col:expr, exact, $val:expr) => {
$col.eq($val)
};
($col:expr, ne, $val:expr) => {
$col.ne($val)
};
($col:expr, gt, $val:expr) => {
$col.gt($val)
};
($col:expr, lt, $val:expr) => {
$col.lt($val)
};
($col:expr, gte, $val:expr) => {
$col.gte($val)
};
($col:expr, lte, $val:expr) => {
$col.lte($val)
};
($col:expr, like, $val:expr) => {
$col.like($val)
};
($col:expr, ilike, $val:expr) => {
$col.ilike($val)
};
($col:expr, not_like, $val:expr) => {
$col.not_like($val)
};
($col:expr, not_ilike, $val:expr) => {
$col.not_ilike($val)
};
($col:expr, contains, $val:expr) => {
$col.like(format!("%{}%", $val))
};
($col:expr, icontains, $val:expr) => {
$col.ilike(format!("%{}%", $val))
};
($col:expr, startswith, $val:expr) => {
$col.like(format!("{}%", $val))
};
($col:expr, endswith, $val:expr) => {
$col.like(format!("%{}", $val))
};
($col:expr, iexact, $val:expr) => {
$col.ilike($val)
};
}
#[macro_export]
#[doc(hidden)]
macro_rules! search_munch {
($b:expr, $entity:ty;) => {};
($b:expr, $entity:ty; ,) => {};
($b:expr, $entity:ty; join $rel:ident , $($rest:tt)*) => {
{
use sea_orm::RelationTrait;
$b = $b.join(
<$entity as sea_orm::EntityTrait>::Relation::$rel.def()
);
}
$crate::search_munch!($b, $entity; $($rest)*);
};
($b:expr, $entity:ty; left_join $rel:ident , $($rest:tt)*) => {
{
use sea_orm::RelationTrait;
$b = $b.left_join(
<$entity as sea_orm::EntityTrait>::Relation::$rel.def()
);
}
$crate::search_munch!($b, $entity; $($rest)*);
};
($b:expr, $entity:ty; $mod:ident :: $col:ident $op:ident $val:expr , $($rest:tt)*) => {
{
use sea_orm::ColumnTrait;
$b = $b.filter(
$crate::search_apply_op!($mod::Column::$col, $op, $val)
);
}
$crate::search_munch!($b, $entity; $($rest)*);
};
($b:expr, $entity:ty; $col:ident isnull , $($rest:tt)*) => {
{
use sea_orm::ColumnTrait;
$b = $b.filter(<$entity as sea_orm::EntityTrait>::Column::$col.is_null());
}
$crate::search_munch!($b, $entity; $($rest)*);
};
($b:expr, $entity:ty; $col:ident not_null , $($rest:tt)*) => {
{
use sea_orm::ColumnTrait;
$b = $b.filter(<$entity as sea_orm::EntityTrait>::Column::$col.is_not_null());
}
$crate::search_munch!($b, $entity; $($rest)*);
};
($b:expr, $entity:ty; $col:ident in [$($val:expr),+ $(,)?] , $($rest:tt)*) => {
{
use sea_orm::ColumnTrait;
let conds = vec![$(<$entity as sea_orm::EntityTrait>::Column::$col.eq($val)),+];
$b = $b.filter(sea_orm::Condition::any(conds));
}
$crate::search_munch!($b, $entity; $($rest)*);
};
($b:expr, $entity:ty; $col:ident not_in [$($val:expr),+ $(,)?] , $($rest:tt)*) => {
{
use sea_orm::ColumnTrait;
$b = $b.filter(
<$entity as sea_orm::EntityTrait>::Column::$col.is_not_in(vec![$($val),+])
);
}
$crate::search_munch!($b, $entity; $($rest)*);
};
($b:expr, $entity:ty; $col:ident in ($val:expr) , $($rest:tt)*) => {
{
use sea_orm::ColumnTrait;
$b = $b.filter(<$entity as sea_orm::EntityTrait>::Column::$col.is_in($val));
}
$crate::search_munch!($b, $entity; $($rest)*);
};
($b:expr, $entity:ty; $col:ident not_in ($val:expr) , $($rest:tt)*) => {
{
use sea_orm::ColumnTrait;
$b = $b.filter(<$entity as sea_orm::EntityTrait>::Column::$col.is_not_in($val));
}
$crate::search_munch!($b, $entity; $($rest)*);
};
($b:expr, $entity:ty; $col:ident range ($start:expr, $end:expr) , $($rest:tt)*) => {
{
use sea_orm::ColumnTrait;
$b = $b.filter(sea_orm::Condition::all([
<$entity as sea_orm::EntityTrait>::Column::$col.gte($start),
<$entity as sea_orm::EntityTrait>::Column::$col.lte($end),
]));
}
$crate::search_munch!($b, $entity; $($rest)*);
};
($b:expr, $entity:ty; $col:ident not_range ($start:expr, $end:expr) , $($rest:tt)*) => {
{
use sea_orm::ColumnTrait;
$b = $b.filter(sea_orm::Condition::any([
<$entity as sea_orm::EntityTrait>::Column::$col.lt($start),
<$entity as sea_orm::EntityTrait>::Column::$col.gt($end),
]));
}
$crate::search_munch!($b, $entity; $($rest)*);
};
($b:expr, $entity:ty; or($($col:ident $op:ident $val:expr),+ $(,)?) , $($rest:tt)*) => {
{
use sea_orm::ColumnTrait;
let mut cond = sea_orm::Condition::any();
$(
cond = cond.add(
$crate::search_apply_op!(<$entity as sea_orm::EntityTrait>::Column::$col, $op, $val)
);
)+
$b = $b.filter(cond);
}
$crate::search_munch!($b, $entity; $($rest)*);
};
($b:expr, $entity:ty; ! $col:ident $op:ident $val:expr , $($rest:tt)*) => {
{
use sea_orm::ColumnTrait;
$b = $b.exclude(
$crate::search_apply_op!(<$entity as sea_orm::EntityTrait>::Column::$col, $op, $val)
);
}
$crate::search_munch!($b, $entity; $($rest)*);
};
($b:expr, $entity:ty; asc $col:ident , $($rest:tt)*) => {
$b = $b.order_by_asc(<$entity as sea_orm::EntityTrait>::Column::$col);
$crate::search_munch!($b, $entity; $($rest)*);
};
($b:expr, $entity:ty; desc $col:ident , $($rest:tt)*) => {
$b = $b.order_by_desc(<$entity as sea_orm::EntityTrait>::Column::$col);
$crate::search_munch!($b, $entity; $($rest)*);
};
($b:expr, $entity:ty; $col:ident $op:ident $val:expr , $($rest:tt)*) => {
{
use sea_orm::ColumnTrait;
$b = $b.filter(
$crate::search_apply_op!(<$entity as sea_orm::EntityTrait>::Column::$col, $op, $val)
);
}
$crate::search_munch!($b, $entity; $($rest)*);
};
}
#[macro_export]
macro_rules! search {
(@ $form:ty => $($tt:tt)+) => {{
$crate::search!(<$form as $crate::forms::FormEntity>::Entity => $($tt)+)
}};
($entity:ty) => {{
$crate::macros::bdd::objects::Objects::<$entity>::new().all()
}};
($entity:ty => $col:ident isnull) => {{
use sea_orm::{EntityTrait, ColumnTrait};
$crate::macros::bdd::objects::Objects::<$entity>::new()
.filter(<$entity as EntityTrait>::Column::$col.is_null())
}};
($entity:ty => $col:ident not_null) => {{
use sea_orm::{EntityTrait, ColumnTrait};
$crate::macros::bdd::objects::Objects::<$entity>::new()
.filter(<$entity as EntityTrait>::Column::$col.is_not_null())
}};
($entity:ty => $col:ident in [$($val:expr),+ $(,)?]) => {{
use sea_orm::{EntityTrait, ColumnTrait, Condition};
let conds = vec![$(<$entity as EntityTrait>::Column::$col.eq($val)),+];
$crate::macros::bdd::objects::Objects::<$entity>::new()
.filter(Condition::any(conds))
}};
($entity:ty => $col:ident not_in [$($val:expr),+ $(,)?]) => {{
use sea_orm::{EntityTrait, ColumnTrait};
$crate::macros::bdd::objects::Objects::<$entity>::new()
.filter(<$entity as EntityTrait>::Column::$col.is_not_in(vec![$($val),+]))
}};
($entity:ty => $col:ident in ($val:expr)) => {{
use sea_orm::{EntityTrait, ColumnTrait};
$crate::macros::bdd::objects::Objects::<$entity>::new()
.filter(<$entity as EntityTrait>::Column::$col.is_in($val))
}};
($entity:ty => $col:ident not_in ($val:expr)) => {{
use sea_orm::{EntityTrait, ColumnTrait};
$crate::macros::bdd::objects::Objects::<$entity>::new()
.filter(<$entity as EntityTrait>::Column::$col.is_not_in($val))
}};
($entity:ty => $col:ident range ($start:expr, $end:expr)) => {{
use sea_orm::{EntityTrait, ColumnTrait, Condition};
$crate::macros::bdd::objects::Objects::<$entity>::new()
.filter(Condition::all([
<$entity as EntityTrait>::Column::$col.gte($start),
<$entity as EntityTrait>::Column::$col.lte($end),
]))
}};
($entity:ty => $col:ident not_range ($start:expr, $end:expr)) => {{
use sea_orm::{EntityTrait, ColumnTrait, Condition};
$crate::macros::bdd::objects::Objects::<$entity>::new()
.filter(Condition::any([
<$entity as EntityTrait>::Column::$col.lt($start),
<$entity as EntityTrait>::Column::$col.gt($end),
]))
}};
($entity:ty => or($($col:ident $op:ident $val:expr),+ $(,)?)) => {{
use sea_orm::{EntityTrait, ColumnTrait, Condition};
let mut cond = Condition::any();
$(
cond = cond.add(
$crate::search_apply_op!(<$entity as EntityTrait>::Column::$col, $op, $val)
);
)+
$crate::macros::bdd::objects::Objects::<$entity>::new().filter(cond)
}};
($entity:ty => ! $col:ident $op:ident $val:expr) => {{
use sea_orm::{EntityTrait, ColumnTrait};
$crate::macros::bdd::objects::Objects::<$entity>::new()
.exclude($crate::search_apply_op!(<$entity as EntityTrait>::Column::$col, $op, $val))
}};
($entity:ty => $col:ident $op:ident $val:expr) => {{
use sea_orm::{EntityTrait, ColumnTrait};
$crate::macros::bdd::objects::Objects::<$entity>::new()
.filter($crate::search_apply_op!(<$entity as EntityTrait>::Column::$col, $op, $val))
}};
($entity:ty => $($tt:tt)+) => {{
use sea_orm::{EntityTrait, ColumnTrait};
let mut b = $crate::macros::bdd::objects::Objects::<$entity>::new().all();
$crate::search_munch!(b, $entity; $($tt)+ ,);
b
}};
}