orm_rs/builds/
query_builder.rs1use 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#[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}