Refactor Query traits
This commit is contained in:
parent
f26e95c9e3
commit
b308486192
@ -1,4 +1,4 @@
|
|||||||
use crate::{EntityTrait, Identity, IntoIdentity, Iterable, Select, SelectHelper};
|
use crate::{EntityTrait, Identity, IntoIdentity, Iterable, QuerySelect, Select};
|
||||||
use core::marker::PhantomData;
|
use core::marker::PhantomData;
|
||||||
use sea_query::{DynIden, IntoIden, JoinType};
|
use sea_query::{DynIden, IntoIden, JoinType};
|
||||||
use std::fmt::Debug;
|
use std::fmt::Debug;
|
||||||
|
@ -3,9 +3,13 @@ use crate::{
|
|||||||
RelationDef,
|
RelationDef,
|
||||||
};
|
};
|
||||||
use sea_query::{Alias, Expr, IntoCondition, SelectExpr, SelectStatement, SimpleExpr};
|
use sea_query::{Alias, Expr, IntoCondition, SelectExpr, SelectStatement, SimpleExpr};
|
||||||
pub use sea_query::{Condition, ConditionalStatement, DynIden, JoinType, Order, SeaRc};
|
pub use sea_query::{
|
||||||
|
Condition, ConditionalStatement, DynIden, JoinType, Order, OrderedStatement, SeaRc,
|
||||||
|
};
|
||||||
|
|
||||||
|
pub trait QuerySelect: Sized {
|
||||||
|
type QueryStatement;
|
||||||
|
|
||||||
pub trait SelectHelper: Sized {
|
|
||||||
fn query(&mut self) -> &mut SelectStatement;
|
fn query(&mut self) -> &mut SelectStatement;
|
||||||
|
|
||||||
/// Clear the selection list
|
/// Clear the selection list
|
||||||
@ -81,6 +85,45 @@ pub trait SelectHelper: Sized {
|
|||||||
self
|
self
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[doc(hidden)]
|
||||||
|
fn join_join(mut self, join: JoinType, rel: RelationDef, via: Option<RelationDef>) -> Self {
|
||||||
|
if let Some(via) = via {
|
||||||
|
self = self.join(join, via)
|
||||||
|
}
|
||||||
|
self.join(join, rel)
|
||||||
|
}
|
||||||
|
|
||||||
|
#[doc(hidden)]
|
||||||
|
fn join_join_rev(mut self, join: JoinType, rel: RelationDef, via: Option<RelationDef>) -> Self {
|
||||||
|
self = self.join_rev(join, rel);
|
||||||
|
if let Some(via) = via {
|
||||||
|
self = self.join_rev(join, via)
|
||||||
|
}
|
||||||
|
self
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Join via [`RelationDef`].
|
||||||
|
fn join(mut self, join: JoinType, rel: RelationDef) -> Self {
|
||||||
|
self.query()
|
||||||
|
.join(join, rel.to_tbl.clone(), join_condition(rel));
|
||||||
|
self
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Join via [`RelationDef`] but in reverse direction.
|
||||||
|
/// Assume when there exist a relation A to B.
|
||||||
|
/// You can reverse join B from A.
|
||||||
|
fn join_rev(mut self, join: JoinType, rel: RelationDef) -> Self {
|
||||||
|
self.query()
|
||||||
|
.join(join, rel.from_tbl.clone(), join_condition(rel));
|
||||||
|
self
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pub trait QueryOrder: Sized {
|
||||||
|
type QueryStatement: OrderedStatement;
|
||||||
|
|
||||||
|
fn query(&mut self) -> &mut SelectStatement;
|
||||||
|
|
||||||
/// Add an order_by expression
|
/// Add an order_by expression
|
||||||
/// ```
|
/// ```
|
||||||
/// use sea_orm::{entity::*, query::*, tests_cfg::cake, sea_query::MysqlQueryBuilder};
|
/// use sea_orm::{entity::*, query::*, tests_cfg::cake, sea_query::MysqlQueryBuilder};
|
||||||
@ -143,39 +186,6 @@ pub trait SelectHelper: Sized {
|
|||||||
.order_by_expr(col.into_simple_expr(), Order::Desc);
|
.order_by_expr(col.into_simple_expr(), Order::Desc);
|
||||||
self
|
self
|
||||||
}
|
}
|
||||||
|
|
||||||
#[doc(hidden)]
|
|
||||||
fn join_join(mut self, join: JoinType, rel: RelationDef, via: Option<RelationDef>) -> Self {
|
|
||||||
if let Some(via) = via {
|
|
||||||
self = self.join(join, via)
|
|
||||||
}
|
|
||||||
self.join(join, rel)
|
|
||||||
}
|
|
||||||
|
|
||||||
#[doc(hidden)]
|
|
||||||
fn join_join_rev(mut self, join: JoinType, rel: RelationDef, via: Option<RelationDef>) -> Self {
|
|
||||||
self = self.join_rev(join, rel);
|
|
||||||
if let Some(via) = via {
|
|
||||||
self = self.join_rev(join, via)
|
|
||||||
}
|
|
||||||
self
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Join via [`RelationDef`].
|
|
||||||
fn join(mut self, join: JoinType, rel: RelationDef) -> Self {
|
|
||||||
self.query()
|
|
||||||
.join(join, rel.to_tbl.clone(), join_condition(rel));
|
|
||||||
self
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Join via [`RelationDef`] but in reverse direction.
|
|
||||||
/// Assume when there exist a relation A to B.
|
|
||||||
/// You can reverse join B from A.
|
|
||||||
fn join_rev(mut self, join: JoinType, rel: RelationDef) -> Self {
|
|
||||||
self.query()
|
|
||||||
.join(join, rel.from_tbl.clone(), join_condition(rel));
|
|
||||||
self
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
pub trait QueryFilter: Sized {
|
pub trait QueryFilter: Sized {
|
||||||
@ -244,9 +254,11 @@ fn join_condition(rel: RelationDef) -> SimpleExpr {
|
|||||||
(Identity::Unary(o1), Identity::Unary(f1)) => {
|
(Identity::Unary(o1), Identity::Unary(f1)) => {
|
||||||
Expr::tbl(SeaRc::clone(&from_tbl), o1).equals(SeaRc::clone(&to_tbl), f1)
|
Expr::tbl(SeaRc::clone(&from_tbl), o1).equals(SeaRc::clone(&to_tbl), f1)
|
||||||
}
|
}
|
||||||
(Identity::Binary(o1, o2), Identity::Binary(f1, f2)) => Expr::tbl(SeaRc::clone(&from_tbl), o1)
|
(Identity::Binary(o1, o2), Identity::Binary(f1, f2)) => {
|
||||||
|
Expr::tbl(SeaRc::clone(&from_tbl), o1)
|
||||||
.equals(SeaRc::clone(&to_tbl), f1)
|
.equals(SeaRc::clone(&to_tbl), f1)
|
||||||
.and(Expr::tbl(SeaRc::clone(&from_tbl), o2).equals(SeaRc::clone(&to_tbl), f2)),
|
.and(Expr::tbl(SeaRc::clone(&from_tbl), o2).equals(SeaRc::clone(&to_tbl), f2))
|
||||||
|
}
|
||||||
_ => panic!("Owner key and foreign key mismatch"),
|
_ => panic!("Owner key and foreign key mismatch"),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
use crate::{EntityTrait, Related, Select, SelectHelper, SelectTwo};
|
use crate::{EntityTrait, QuerySelect, Related, Select, SelectTwo};
|
||||||
pub use sea_query::JoinType;
|
pub use sea_query::JoinType;
|
||||||
|
|
||||||
impl<E> Select<E>
|
impl<E> Select<E>
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
use crate::{ColumnTrait, EntityTrait, Iterable, QueryFilter, QueryTrait, SelectHelper};
|
use crate::{ColumnTrait, EntityTrait, Iterable, QueryFilter, QueryOrder, QuerySelect, QueryTrait};
|
||||||
use core::fmt::Debug;
|
use core::fmt::Debug;
|
||||||
use core::marker::PhantomData;
|
use core::marker::PhantomData;
|
||||||
pub use sea_query::JoinType;
|
pub use sea_query::JoinType;
|
||||||
@ -27,16 +27,9 @@ pub trait IntoSimpleExpr {
|
|||||||
fn into_simple_expr(self) -> SimpleExpr;
|
fn into_simple_expr(self) -> SimpleExpr;
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<E> SelectHelper for Select<E>
|
macro_rules! impl_trait {
|
||||||
where
|
( $trait: ident ) => {
|
||||||
E: EntityTrait,
|
impl<E> $trait for Select<E>
|
||||||
{
|
|
||||||
fn query(&mut self) -> &mut SelectStatement {
|
|
||||||
&mut self.query
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
impl<E> QueryFilter for Select<E>
|
|
||||||
where
|
where
|
||||||
E: EntityTrait,
|
E: EntityTrait,
|
||||||
{
|
{
|
||||||
@ -47,17 +40,7 @@ where
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<E, F> SelectHelper for SelectTwo<E, F>
|
impl<E, F> $trait for SelectTwo<E, F>
|
||||||
where
|
|
||||||
E: EntityTrait,
|
|
||||||
F: EntityTrait,
|
|
||||||
{
|
|
||||||
fn query(&mut self) -> &mut SelectStatement {
|
|
||||||
&mut self.query
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
impl<E, F> QueryFilter for SelectTwo<E, F>
|
|
||||||
where
|
where
|
||||||
E: EntityTrait,
|
E: EntityTrait,
|
||||||
F: EntityTrait,
|
F: EntityTrait,
|
||||||
@ -68,6 +51,12 @@ where
|
|||||||
&mut self.query
|
&mut self.query
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
impl_trait!(QuerySelect);
|
||||||
|
impl_trait!(QueryFilter);
|
||||||
|
impl_trait!(QueryOrder);
|
||||||
|
|
||||||
impl<C> IntoSimpleExpr for C
|
impl<C> IntoSimpleExpr for C
|
||||||
where
|
where
|
||||||
|
Loading…
x
Reference in New Issue
Block a user