From 86bc4434e7ec3ce590dd49baf3d718f05e8968e1 Mon Sep 17 00:00:00 2001 From: xelab04 Date: Tue, 24 Feb 2026 22:04:00 +0400 Subject: [PATCH 1/2] add basic code for ordering --- cot/src/db/query.rs | 33 ++++++++++++++++++++++++++++++++- 1 file changed, 32 insertions(+), 1 deletion(-) diff --git a/cot/src/db/query.rs b/cot/src/db/query.rs index 139a7ca7..7e69307e 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<(String, 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("age", Order::Asc); // or Order::Desc + /// ``` + pub fn order_by(&mut self, order_by: (String, Order)) -> &mut Self { + self.order_by = Some(self.order_by); + self + } + /// Set the offset for the query. /// /// # Example @@ -244,6 +269,12 @@ impl Query { } } + pub(super) fn add_order_by_to_statement(&self, statement: &mut sea_query::SelectStatement) { + if let Some(order_by) = self.order_by { + statement.order_by(order_by.0, 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); From 8fb90e8cca17e5b32eea4377d71277a4ee916934 Mon Sep 17 00:00:00 2001 From: alex Date: Wed, 11 Mar 2026 13:12:43 +0400 Subject: [PATCH 2/2] change ordering to use fieldref instead of string --- cot/src/db/query.rs | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/cot/src/db/query.rs b/cot/src/db/query.rs index 7e69307e..6a40f843 100644 --- a/cot/src/db/query.rs +++ b/cot/src/db/query.rs @@ -33,7 +33,7 @@ use crate::db::{ pub struct Query { filter: Option, limit: Option, - order_by: Option<(String, Order)>, + order_by: Option<(FieldRef, Order)>, offset: Option, phantom_data: PhantomData T>, } @@ -167,10 +167,10 @@ impl Query { /// age: i32, /// } /// - /// let query = Query::::new().order_by("age", Order::Asc); // or Order::Desc + /// let query = Query::::new().order_by(User::age, Order::Asc); // or Order::Desc /// ``` - pub fn order_by(&mut self, order_by: (String, Order)) -> &mut Self { - self.order_by = Some(self.order_by); + pub fn order_by(&mut self, order_by: (FieldRef, Order)) -> &mut Self { + self.order_by = Some(order_by); self } @@ -271,7 +271,8 @@ impl Query { pub(super) fn add_order_by_to_statement(&self, statement: &mut sea_query::SelectStatement) { if let Some(order_by) = self.order_by { - statement.order_by(order_by.0, order_by.1); + let column_name = order_by.0.identifier; + statement.order_by(column_name, order_by.1); } }