elif_orm/query/
ordering.rs

1//! Query Builder ORDER BY, GROUP BY, HAVING operations
2
3use super::builder::QueryBuilder;
4use super::types::*;
5use serde_json::Value;
6
7impl<M> QueryBuilder<M> {
8    /// Add ORDER BY clause (ascending)
9    pub fn order_by(mut self, column: &str) -> Self {
10        self.order_by
11            .push((column.to_string(), OrderDirection::Asc));
12        self
13    }
14
15    /// Add ORDER BY clause (descending)
16    pub fn order_by_desc(mut self, column: &str) -> Self {
17        self.order_by
18            .push((column.to_string(), OrderDirection::Desc));
19        self
20    }
21
22    /// Add GROUP BY clause
23    pub fn group_by(mut self, column: &str) -> Self {
24        self.group_by.push(column.to_string());
25        self
26    }
27
28    /// Add HAVING clause with equals
29    pub fn having_eq<T: Into<Value>>(mut self, column: &str, value: T) -> Self {
30        self.having_conditions.push(WhereCondition {
31            column: column.to_string(),
32            operator: QueryOperator::Equal,
33            value: Some(value.into()),
34            values: Vec::new(),
35        });
36        self
37    }
38
39    /// Add HAVING clause with custom operator and value  
40    pub fn having<T: Into<Value>>(
41        mut self,
42        column: &str,
43        operator: QueryOperator,
44        value: T,
45    ) -> Self {
46        self.having_conditions.push(WhereCondition {
47            column: column.to_string(),
48            operator,
49            value: Some(value.into()),
50            values: Vec::new(),
51        });
52        self
53    }
54
55    /// Add raw HAVING clause
56    pub fn having_raw(mut self, raw_condition: &str) -> Self {
57        self.having_conditions.push(WhereCondition {
58            column: "".to_string(), // Empty column for raw conditions
59            operator: QueryOperator::Raw,
60            value: Some(Value::String(raw_condition.to_string())),
61            values: Vec::new(),
62        });
63        self
64    }
65}