orm_rs/nodes/
node_where.rs1use 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}