diff --git a/cot/src/db/query.rs b/cot/src/db/query.rs index 139a7ca7..6a40f843 100644 --- a/cot/src/db/query.rs +++ b/cot/src/db/query.rs @@ -3,7 +3,7 @@ use std::marker::PhantomData; use derive_more::with_trait::Debug; -use sea_query::{ExprTrait, IntoColumnRef}; +use sea_query::{ExprTrait, IntoColumnRef, Order}; use crate::db; use crate::db::{ @@ -33,6 +33,7 @@ use crate::db::{ pub struct Query { filter: Option, limit: Option, + order_by: Option<(FieldRef, Order)>, offset: Option, phantom_data: PhantomData T>, } @@ -55,6 +56,7 @@ impl Clone for Query { Self { filter: self.filter.clone(), limit: self.limit, + order_by: self.order_by.clone(), offset: self.offset, phantom_data: PhantomData, } @@ -98,6 +100,7 @@ impl Query { Self { filter: None, limit: None, + order_by: None, offset: None, phantom_data: PhantomData, } @@ -149,6 +152,28 @@ impl Query { self } + /// Set an order for records from the query. + /// + /// # Example + /// + /// ``` + /// use cot::db::model; + /// use cot::db::query::{Expr, Query}; + /// + /// #[model] + /// struct User { + /// #[model(primary_key)] + /// id: i32, + /// age: i32, + /// } + /// + /// let query = Query::::new().order_by(User::age, Order::Asc); // or Order::Desc + /// ``` + pub fn order_by(&mut self, order_by: (FieldRef, Order)) -> &mut Self { + self.order_by = Some(order_by); + self + } + /// Set the offset for the query. /// /// # Example @@ -244,6 +269,13 @@ impl Query { } } + pub(super) fn add_order_by_to_statement(&self, statement: &mut sea_query::SelectStatement) { + if let Some(order_by) = self.order_by { + let column_name = order_by.0.identifier; + statement.order_by(column_name, order_by.1); + } + } + pub(super) fn add_offset_to_statement(&self, statement: &mut sea_query::SelectStatement) { if let Some(offset) = self.offset { statement.offset(offset);