diff --git a/src/executor/cursor.rs b/src/executor/cursor.rs index 4f9ed8a2c..34545c5d8 100644 --- a/src/executor/cursor.rs +++ b/src/executor/cursor.rs @@ -1,7 +1,7 @@ use crate::{ ConnectionTrait, DbErr, EntityTrait, FromQueryResult, Identity, IdentityOf, IntoIdentity, - PartialModelTrait, PrimaryKeyToColumn, QuerySelect, Select, SelectModel, SelectThree, - SelectThreeModel, SelectTwo, SelectTwoModel, SelectorTrait, Topology, + PartialModelTrait, PrimaryKeyToColumn, QuerySelect, Select, SelectFour, SelectFourModel, + SelectModel, SelectThree, SelectThreeModel, SelectTwo, SelectTwoModel, SelectorTrait, Topology, }; use sea_query::{ Condition, DynIden, Expr, ExprTrait, IntoValueTuple, Order, SeaRc, SelectStatement, SimpleExpr, @@ -404,6 +404,21 @@ where type Selector = SelectThreeModel; } +impl CursorTrait for SelectFour +where + E: EntityTrait, + F: EntityTrait, + G: EntityTrait, + H: EntityTrait, + M: FromQueryResult + Sized + Send + Sync, + N: FromQueryResult + Sized + Send + Sync, + O: FromQueryResult + Sized + Send + Sync, + P: FromQueryResult + Sized + Send + Sync, + TOP: Topology, +{ + type Selector = SelectFourModel; +} + impl SelectTwo where E: EntityTrait, @@ -502,6 +517,65 @@ where } } +impl SelectFour +where + E: EntityTrait, + F: EntityTrait, + G: EntityTrait, + H: EntityTrait, + M: FromQueryResult + Sized + Send + Sync, + N: FromQueryResult + Sized + Send + Sync, + O: FromQueryResult + Sized + Send + Sync, + P: FromQueryResult + Sized + Send + Sync, + TOP: Topology, +{ + /// Convert into a cursor using column of first entity + pub fn cursor_by(self, order_columns: C) -> Cursor> + where + C: IdentityOf, + { + let mut cursor = Cursor::new( + self.query, + SeaRc::new(E::default()), + order_columns.identity_of(), + ); + { + let primary_keys: Vec<(DynIden, Identity)> = ::iter() + .map(|pk| { + ( + SeaRc::new(F::default()), + Identity::Unary(SeaRc::new(pk.into_column())), + ) + }) + .collect(); + cursor.set_secondary_order_by(primary_keys); + } + { + let primary_keys: Vec<(DynIden, Identity)> = ::iter() + .map(|pk| { + ( + SeaRc::new(G::default()), + Identity::Unary(SeaRc::new(pk.into_column())), + ) + }) + .collect(); + cursor.set_secondary_order_by(primary_keys); + } + { + let primary_keys: Vec<(DynIden, Identity)> = ::iter() + .map(|pk| { + ( + SeaRc::new(H::default()), + Identity::Unary(SeaRc::new(pk.into_column())), + ) + }) + .collect(); + cursor.set_secondary_order_by(primary_keys); + } + cursor + } +} + #[cfg(test)] #[cfg(feature = "mock")] mod tests {