elif_orm/query/
select.rs

1//! Query Builder SELECT operations
2
3use super::builder::QueryBuilder;
4
5impl<M> QueryBuilder<M> {
6    /// Add SELECT fields to the query
7    pub fn select(mut self, fields: &str) -> Self {
8        if fields == "*" {
9            self.select_fields.push("*".to_string());
10        } else {
11            self.select_fields.extend(
12                fields
13                    .split(',')
14                    .map(|f| f.trim().to_string())
15                    .collect::<Vec<String>>(),
16            );
17        }
18        self
19    }
20
21    /// Add SELECT DISTINCT to the query
22    pub fn select_distinct(mut self, fields: &str) -> Self {
23        self.distinct = true;
24        self.select(fields)
25    }
26
27    /// Set the FROM table
28    pub fn from(mut self, table: &str) -> Self {
29        self.from_tables = vec![table.to_string()];
30        self
31    }
32
33    /// Add aggregate functions to SELECT
34    pub fn select_count(mut self, column: &str, alias: Option<&str>) -> Self {
35        let select_expr = if let Some(alias) = alias {
36            format!("COUNT({}) AS {}", column, alias)
37        } else {
38            format!("COUNT({})", column)
39        };
40        self.select_fields.push(select_expr);
41        self
42    }
43
44    /// Add SUM aggregate
45    pub fn select_sum(mut self, column: &str, alias: Option<&str>) -> Self {
46        let select_expr = if let Some(alias) = alias {
47            format!("SUM({}) AS {}", column, alias)
48        } else {
49            format!("SUM({})", column)
50        };
51        self.select_fields.push(select_expr);
52        self
53    }
54
55    /// Add AVG aggregate
56    pub fn select_avg(mut self, column: &str, alias: Option<&str>) -> Self {
57        let select_expr = if let Some(alias) = alias {
58            format!("AVG({}) AS {}", column, alias)
59        } else {
60            format!("AVG({})", column)
61        };
62        self.select_fields.push(select_expr);
63        self
64    }
65
66    /// Add MIN aggregate
67    pub fn select_min(mut self, column: &str, alias: Option<&str>) -> Self {
68        let select_expr = if let Some(alias) = alias {
69            format!("MIN({}) AS {}", column, alias)
70        } else {
71            format!("MIN({})", column)
72        };
73        self.select_fields.push(select_expr);
74        self
75    }
76
77    /// Add MAX aggregate
78    pub fn select_max(mut self, column: &str, alias: Option<&str>) -> Self {
79        let select_expr = if let Some(alias) = alias {
80            format!("MAX({}) AS {}", column, alias)
81        } else {
82            format!("MAX({})", column)
83        };
84        self.select_fields.push(select_expr);
85        self
86    }
87
88    /// Add custom SELECT expression
89    pub fn select_raw(mut self, expression: &str) -> Self {
90        self.select_fields.push(expression.to_string());
91        self
92    }
93}