use crate::{ColumnTrait, EntityTrait, Iterable, QueryFilter, QueryTrait, SelectHelper}; use core::fmt::Debug; use core::marker::PhantomData; pub use sea_query::JoinType; use sea_query::{Iden, IntoColumnRef, IntoIden, SelectStatement, SimpleExpr}; use std::rc::Rc; #[derive(Clone, Debug)] pub struct Select where E: EntityTrait, { pub(crate) query: SelectStatement, pub(crate) entity: PhantomData, } #[derive(Clone, Debug)] pub struct SelectTwo where E: EntityTrait, F: EntityTrait, { pub(crate) query: SelectStatement, pub(crate) entity: PhantomData<(E, F)>, } pub trait IntoSimpleExpr { fn into_simple_expr(self) -> SimpleExpr; } impl SelectHelper for Select where E: EntityTrait, { fn query(&mut self) -> &mut SelectStatement { &mut self.query } } impl QueryFilter for Select where E: EntityTrait, { type QueryStatement = SelectStatement; fn query(&mut self) -> &mut SelectStatement { &mut self.query } } impl SelectHelper for SelectTwo where E: EntityTrait, F: EntityTrait, { fn query(&mut self) -> &mut SelectStatement { &mut self.query } } impl QueryFilter for SelectTwo where E: EntityTrait, F: EntityTrait, { type QueryStatement = SelectStatement; fn query(&mut self) -> &mut SelectStatement { &mut self.query } } impl IntoSimpleExpr for C where C: ColumnTrait, { fn into_simple_expr(self) -> SimpleExpr { SimpleExpr::Column(self.as_column_ref().into_column_ref()) } } impl IntoSimpleExpr for SimpleExpr { fn into_simple_expr(self) -> SimpleExpr { self } } impl Select where E: EntityTrait, { pub(crate) fn new() -> Self { Self { query: SelectStatement::new(), entity: PhantomData, } .prepare_select() .prepare_from() } fn prepare_select(mut self) -> Self { self.query.columns(self.column_list()); self } fn column_list(&self) -> Vec<(Rc, E::Column)> { let table = Rc::new(E::default()) as Rc; E::Column::iter().map(|col| (table.clone(), col)).collect() } fn prepare_from(mut self) -> Self { self.query.from(E::default().into_iden()); self } } impl QueryTrait for Select where E: EntityTrait, { type QueryStatement = SelectStatement; fn query(&mut self) -> &mut SelectStatement { &mut self.query } fn as_query(&self) -> &SelectStatement { &self.query } fn into_query(self) -> SelectStatement { self.query } } impl QueryTrait for SelectTwo where E: EntityTrait, F: EntityTrait, { type QueryStatement = SelectStatement; fn query(&mut self) -> &mut SelectStatement { &mut self.query } fn as_query(&self) -> &SelectStatement { &self.query } fn into_query(self) -> SelectStatement { self.query } }