orm_rs/nodes/
node_where.rs

1use serde_json::{Value as JsonValue, Result};
2use regex::Regex;
3
4#[derive(Debug)]
5pub struct NodeWhere {
6    condition: JsonValue
7}
8impl NodeWhere {
9    pub fn new(condition: JsonValue) -> Self {
10        Self {
11            condition
12        }
13    }
14    pub fn to_sql(&self, table_name: &str) -> Result<String> {
15        let mut vec = vec![];
16        if let JsonValue::Object(map_value) = &self.condition {
17            for key in map_value.keys() {
18                let column = if Regex::new(r"\.").unwrap().is_match(key) {
19                    format!("'{}'", key)
20                } else {
21                    format!("`{}`.`{}`", table_name, key)
22                };
23                if let Some(json_value) = map_value.get(key) {
24                    match json_value {
25                        JsonValue::Array(value) => {
26                            let mut values = vec![];
27                            for json_value in value.iter() {
28                                match json_value {
29                                    JsonValue::String(value) => {
30                                        values.push(format!("'{}'", value));
31                                    },
32                                    JsonValue::Number(value) => {
33                                        values.push(format!("{}", value));
34                                    },
35                                    _ => ()
36                                }
37                            }
38                            if values.len() > 0 {
39                                vec.push(format!("{} in [{}]", column, values.join(",")));
40                            }
41                        },
42                        JsonValue::String(value) => {
43                            vec.push(format!("{} = '{}'", column, value));
44                        },
45                        JsonValue::Number(value) => {
46                            vec.push(format!("{} = {}", column, value));
47                        },
48                        JsonValue::Bool(value) => {
49                            let value = if *value {1} else {0};
50                            vec.push(format!("{} = {}", column, value));
51                        },
52                        JsonValue::Null => {
53                            vec.push(format!("{} IS NULL", column));
54                        },
55                        _ => ()
56                    }
57                }
58            }
59        }
60        Ok(vec.join(" and "))
61    }
62}
63
64#[cfg(test)]
65mod tests {
66    use super::*;
67    use serde_json::json;
68    #[test]
69    fn it_works() {
70        let node_where = NodeWhere::new(json!({
71            "active": true,
72            "age": 18,
73            "gender": ["male", "female"],
74            "profile": null
75        }));
76        assert_eq!(node_where.to_sql("users").unwrap(), "`users`.`active` = 1 and `users`.`age` = 18 and `users`.`gender` in ['male','female'] and `users`.`profile` IS NULL");
77    }
78}