use super::FieldType;
use crate::conditions::{Binary, BinaryOperator, Column, Condition};
use crate::fields::proxy::{FieldProxy, FieldProxyImpl};
use crate::internal::field::{Field, SingleColumnField};
pub trait FieldEq<'rhs, Rhs, Any = ()>: FieldType {
type EqCond<I: FieldProxyImpl>: Condition<'rhs>;
fn field_equals<I: FieldProxyImpl>(field: FieldProxy<I>, value: Rhs) -> Self::EqCond<I>;
type NeCond<I: FieldProxyImpl>: Condition<'rhs>;
fn field_not_equals<I: FieldProxyImpl>(field: FieldProxy<I>, value: Rhs) -> Self::NeCond<I>;
}
pub trait FieldOrd<'rhs, Rhs, Any = ()>: FieldType {
type LtCond<I: FieldProxyImpl>: Condition<'rhs>;
fn field_less_than<I: FieldProxyImpl>(field: FieldProxy<I>, value: Rhs) -> Self::LtCond<I>;
type LeCond<I: FieldProxyImpl>: Condition<'rhs>;
fn field_less_equals<I: FieldProxyImpl>(field: FieldProxy<I>, value: Rhs) -> Self::LeCond<I>;
type GtCond<I: FieldProxyImpl>: Condition<'rhs>;
fn field_greater_than<I: FieldProxyImpl>(field: FieldProxy<I>, value: Rhs) -> Self::GtCond<I>;
type GeCond<I: FieldProxyImpl>: Condition<'rhs>;
fn field_greater_equals<I: FieldProxyImpl>(field: FieldProxy<I>, value: Rhs)
-> Self::GeCond<I>;
}
pub trait FieldLike<'rhs, Rhs, Any = ()>: FieldType {
type LiCond<I: FieldProxyImpl>: Condition<'rhs>;
fn field_like<I: FieldProxyImpl>(field: FieldProxy<I>, value: Rhs) -> Self::LiCond<I>;
type NlCond<I: FieldProxyImpl>: Condition<'rhs>;
fn field_not_like<I: FieldProxyImpl>(field: FieldProxy<I>, value: Rhs) -> Self::NlCond<I>;
}
pub trait FieldRegexp<'rhs, Rhs, Any = ()>: FieldType {
type ReCond<I: FieldProxyImpl>: Condition<'rhs>;
fn field_regexp<I: FieldProxyImpl>(field: FieldProxy<I>, value: Rhs) -> Self::ReCond<I>;
type NrCond<I: FieldProxyImpl>: Condition<'rhs>;
fn field_not_regexp<I: FieldProxyImpl>(field: FieldProxy<I>, value: Rhs) -> Self::NrCond<I>;
}
pub trait FieldIn<'rhs, Rhs, Any = ()>: FieldType {
type InCond<I: FieldProxyImpl>: Condition<'rhs>;
fn field_in<I: FieldProxyImpl>(field: FieldProxy<I>, value: Rhs) -> Self::InCond<I>;
type NiCond<I: FieldProxyImpl>: Condition<'rhs>;
fn field_not_in<I: FieldProxyImpl>(field: FieldProxy<I>, value: Rhs) -> Self::NiCond<I>;
}
#[cfg(feature = "postgres-only")]
pub trait FieldILike<'rhs, Rhs, Any = ()>: FieldType {
type IliCond<I: FieldProxyImpl>: Condition<'rhs>;
fn field_ilike<I: FieldProxyImpl>(field: FieldProxy<I>, value: Rhs) -> Self::IliCond<I>;
type NilCond<I: FieldProxyImpl>: Condition<'rhs>;
fn field_not_ilike<I: FieldProxyImpl>(field: FieldProxy<I>, value: Rhs) -> Self::NilCond<I>;
}
impl<'rhs, I2, T> FieldEq<'rhs, FieldProxy<I2>> for T
where
T: FieldEq<'rhs, T>,
I2: FieldProxyImpl<Field: Field<Type = T> + SingleColumnField>,
{
type EqCond<I: FieldProxyImpl> = Binary<Column<I>, Column<I2>>;
fn field_equals<I: FieldProxyImpl>(
field: FieldProxy<I>,
value: FieldProxy<I2>,
) -> Self::EqCond<I> {
Binary {
operator: BinaryOperator::Equals,
fst_arg: Column(field),
snd_arg: Column(value),
}
}
type NeCond<I: FieldProxyImpl> = Binary<Column<I>, Column<I2>>;
fn field_not_equals<I: FieldProxyImpl>(
field: FieldProxy<I>,
value: FieldProxy<I2>,
) -> Self::NeCond<I> {
Binary {
operator: BinaryOperator::NotEquals,
fst_arg: Column(field),
snd_arg: Column(value),
}
}
}
#[doc(hidden)]
#[allow(non_snake_case)] #[deprecated(note = "Use `SimpleFieldOrd` instead")]
#[macro_export]
macro_rules! impl_FieldOrd {
($lhs:ty, $rhs:ty, $into_value:expr) => {
impl<'rhs> $crate::fields::traits::cmp::FieldOrd<'rhs, $rhs> for $lhs {
type LtCond<I: $crate::fields::proxy::FieldProxyImpl>
= $crate::conditions::Binary<
$crate::conditions::Column<I>,
$crate::conditions::Value<'rhs>,
>;
fn field_less_than<I: $crate::fields::proxy::FieldProxyImpl>(
field: $crate::fields::proxy::FieldProxy<I>,
value: $rhs,
) -> Self::LtCond<I> {
$crate::conditions::Binary {
operator: $crate::conditions::BinaryOperator::Less,
fst_arg: $crate::conditions::Column(field),
#[allow(clippy::redundant_closure_call)] snd_arg: $into_value(value),
}
}
type LeCond<I: $crate::fields::proxy::FieldProxyImpl>
= $crate::conditions::Binary<
$crate::conditions::Column<I>,
$crate::conditions::Value<'rhs>,
>;
fn field_less_equals<I: $crate::fields::proxy::FieldProxyImpl>(
field: $crate::fields::proxy::FieldProxy<I>,
value: $rhs,
) -> Self::LeCond<I> {
$crate::conditions::Binary {
operator: $crate::conditions::BinaryOperator::LessOrEquals,
fst_arg: $crate::conditions::Column(field),
#[allow(clippy::redundant_closure_call)] snd_arg: $into_value(value),
}
}
type GtCond<I: $crate::fields::proxy::FieldProxyImpl>
= $crate::conditions::Binary<
$crate::conditions::Column<I>,
$crate::conditions::Value<'rhs>,
>;
fn field_greater_than<I: $crate::fields::proxy::FieldProxyImpl>(
field: $crate::fields::proxy::FieldProxy<I>,
value: $rhs,
) -> Self::GtCond<I> {
$crate::conditions::Binary {
operator: $crate::conditions::BinaryOperator::Greater,
fst_arg: $crate::conditions::Column(field),
#[allow(clippy::redundant_closure_call)] snd_arg: $into_value(value),
}
}
type GeCond<I: $crate::fields::proxy::FieldProxyImpl>
= $crate::conditions::Binary<
$crate::conditions::Column<I>,
$crate::conditions::Value<'rhs>,
>;
fn field_greater_equals<I: $crate::fields::proxy::FieldProxyImpl>(
field: $crate::fields::proxy::FieldProxy<I>,
value: $rhs,
) -> Self::GeCond<I> {
$crate::conditions::Binary {
operator: $crate::conditions::BinaryOperator::GreaterOrEquals,
fst_arg: $crate::conditions::Column(field),
#[allow(clippy::redundant_closure_call)] snd_arg: $into_value(value),
}
}
}
};
}
impl<'rhs, I2, T> FieldOrd<'rhs, FieldProxy<I2>> for T
where
T: FieldOrd<'rhs, T>,
I2: FieldProxyImpl<Field: Field<Type = T> + SingleColumnField>,
{
type LtCond<I: FieldProxyImpl> = Binary<Column<I>, Column<I2>>;
fn field_less_than<I: FieldProxyImpl>(
field: FieldProxy<I>,
value: FieldProxy<I2>,
) -> Self::LtCond<I> {
Binary {
operator: BinaryOperator::Less,
fst_arg: Column(field),
snd_arg: Column(value),
}
}
type LeCond<I: FieldProxyImpl> = Binary<Column<I>, Column<I2>>;
fn field_less_equals<I: FieldProxyImpl>(
field: FieldProxy<I>,
value: FieldProxy<I2>,
) -> Self::LeCond<I> {
Binary {
operator: BinaryOperator::LessOrEquals,
fst_arg: Column(field),
snd_arg: Column(value),
}
}
type GtCond<I: FieldProxyImpl> = Binary<Column<I>, Column<I2>>;
fn field_greater_than<I: FieldProxyImpl>(
field: FieldProxy<I>,
value: FieldProxy<I2>,
) -> Self::GtCond<I> {
Binary {
operator: BinaryOperator::Greater,
fst_arg: Column(field),
snd_arg: Column(value),
}
}
type GeCond<I: FieldProxyImpl> = Binary<Column<I>, Column<I2>>;
fn field_greater_equals<I: FieldProxyImpl>(
field: FieldProxy<I>,
value: FieldProxy<I2>,
) -> Self::GeCond<I> {
Binary {
operator: BinaryOperator::GreaterOrEquals,
fst_arg: Column(field),
snd_arg: Column(value),
}
}
}