orm_rs/builds/
query_builder.rs

1use serde_json::Value as JsonValue;
2use regex::Regex;
3use crate::nodes::NodesType;
4use crate::nodes::{NodeWhere};
5use crate::traits::ModelAble;
6
7use std::vec::Vec;
8// use std::collections::HashMap;
9
10#[allow(dead_code)]
11enum ClearableStatement {
12    With, Select, Columns, HintComments, Where, Union, Join, Group, Order, Having, Limit, Offset, Counter, Counters,
13}
14#[allow(dead_code)]
15enum LockModes {
16    ForShare, ForUpdate
17}
18#[allow(dead_code)]
19#[derive(Debug)]
20pub struct QueryBuilder {
21    table_name: String,
22    columns: Vec<String>,
23    wheres: Vec<NodesType>,
24    groups: Vec<NodesType>,
25    havings: Vec<NodesType>,
26}
27
28impl QueryBuilder {
29    pub fn new<T: ModelAble>() -> Self {
30        let table_name = T::table_name();
31        Self {
32            table_name: table_name.clone(),
33            columns: vec![format!("`{}`.*", table_name.clone())],
34            wheres: vec![],
35            groups: vec![],
36            havings: vec![],
37        }
38    }
39    pub fn except(&mut self, columns: Vec<&'static str>) -> &mut Self {
40        for &val in &columns {
41            match val {
42                "where" => self.wheres = vec![],
43                _ => {}
44            }
45        }
46        self
47    }
48    pub fn r#where(&mut self, condition: JsonValue) -> &mut Self {
49        self.wheres.push(NodesType::Where(NodeWhere::new(condition)));
50        self
51    }
52    pub fn select(&mut self, columns: Vec<&'static str>) -> &mut Self {
53        self.columns = columns.iter().map(|&value| {
54            if Regex::new(r"\.").unwrap().is_match(value) {
55                format!("{}", value)
56            } else {
57                format!("`{}`.`{}`", self.table_name, value)
58            }
59        }).collect();
60        self
61    }
62    pub fn to_sql(&self) -> String {
63        let mut sql = format!("SELECT {} FROM `{}`", self.columns.join(", "), self.table_name);
64        if self.wheres.len() > 0 {
65            let where_sql: Vec<String> = self.wheres.iter().filter_map(|val| {
66                let NodesType::Where(node_where) = val;
67                Some(node_where.to_sql(&self.table_name))
68            }).map(|value| value.unwrap()).collect();
69            sql = format!("{} WHERE {}", sql, where_sql.join(" AND "))
70        }
71        sql
72    }
73}