Skip to content
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
34 changes: 33 additions & 1 deletion cot/src/db/query.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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::{
Expand Down Expand Up @@ -33,6 +33,7 @@ use crate::db::{
pub struct Query<T> {
filter: Option<Expr>,
limit: Option<u64>,
order_by: Option<(FieldRef<T>, Order)>,
offset: Option<u64>,
phantom_data: PhantomData<fn() -> T>,
}
Expand All @@ -55,6 +56,7 @@ impl<T> Clone for Query<T> {
Self {
filter: self.filter.clone(),
limit: self.limit,
order_by: self.order_by.clone(),
offset: self.offset,
phantom_data: PhantomData,
}
Expand Down Expand Up @@ -98,6 +100,7 @@ impl<T: Model> Query<T> {
Self {
filter: None,
limit: None,
order_by: None,
offset: None,
phantom_data: PhantomData,
}
Expand Down Expand Up @@ -149,6 +152,28 @@ impl<T: Model> Query<T> {
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::<User>::new().order_by(User::age, Order::Asc); // or Order::Desc
/// ```
pub fn order_by(&mut self, order_by: (FieldRef<T>, Order)) -> &mut Self {
self.order_by = Some(order_by);
self
}

/// Set the offset for the query.
///
/// # Example
Expand Down Expand Up @@ -244,6 +269,13 @@ impl<T: Model> Query<T> {
}
}

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);
Expand Down
Loading