rust_ef/change_executor/
sql_gen.rs1use crate::metadata::EntityTypeMeta;
4use crate::provider::{DbValue, IDatabaseProvider};
5use std::collections::HashMap;
6
7pub fn generate_insert_sql(
8 provider: &dyn IDatabaseProvider,
9 meta: &EntityTypeMeta,
10 _property_values: &HashMap<String, DbValue>,
11) -> String {
12 let gen = provider.sql_generator();
13 let scalar_props: Vec<_> = meta.mapped_scalar_properties().collect();
14 let columns: Vec<&str> = scalar_props
15 .iter()
16 .map(|p| p.column_name.as_ref())
17 .collect();
18 if columns.is_empty() {
19 return String::new();
20 }
21 gen.insert(meta.table_name.as_ref(), &columns, true)
22}
23
24pub fn generate_update_sql(
25 provider: &dyn IDatabaseProvider,
26 meta: &EntityTypeMeta,
27 property_values: &HashMap<String, DbValue>,
28 primary_key_values: &HashMap<String, DbValue>,
29) -> String {
30 let gen = provider.sql_generator();
31 let set_columns: Vec<&str> = property_values
32 .keys()
33 .filter(|k| !primary_key_values.contains_key(*k))
34 .map(|k| k.as_str())
35 .collect();
36 if set_columns.is_empty() || primary_key_values.is_empty() {
37 return String::new();
38 }
39 let where_parts: Vec<String> = primary_key_values
40 .keys()
41 .enumerate()
42 .map(|(i, k)| {
43 format!(
44 "{} = {}",
45 gen.quote_identifier(k),
46 gen.parameter_placeholder(i + 1)
47 )
48 })
49 .collect();
50 gen.update(
51 meta.table_name.as_ref(),
52 &set_columns,
53 &where_parts.join(" AND "),
54 )
55}
56
57pub fn generate_delete_sql(
58 provider: &dyn IDatabaseProvider,
59 meta: &EntityTypeMeta,
60 primary_key_values: &HashMap<String, DbValue>,
61) -> String {
62 let gen = provider.sql_generator();
63 if primary_key_values.is_empty() {
64 return String::new();
65 }
66 let where_parts: Vec<String> = primary_key_values
67 .keys()
68 .enumerate()
69 .map(|(i, k)| {
70 format!(
71 "{} = {}",
72 gen.quote_identifier(k),
73 gen.parameter_placeholder(i + 1)
74 )
75 })
76 .collect();
77 gen.delete(meta.table_name.as_ref(), &where_parts.join(" AND "))
78}
79
80pub fn collect_insert_params(
81 meta: &EntityTypeMeta,
82 property_values: &HashMap<String, DbValue>,
83) -> Vec<DbValue> {
84 meta.mapped_scalar_properties()
85 .map(|p| {
86 property_values
87 .get(p.field_name.as_ref())
88 .cloned()
89 .unwrap_or(DbValue::Null)
90 })
91 .collect()
92}
93
94pub fn collect_update_params(
95 property_values: &HashMap<String, DbValue>,
96 primary_key_values: &HashMap<String, DbValue>,
97 set_keys: &[String],
98) -> Vec<DbValue> {
99 let mut params: Vec<DbValue> = set_keys
100 .iter()
101 .filter(|k| !primary_key_values.contains_key(*k))
102 .map(|k| property_values.get(k).cloned().unwrap_or(DbValue::Null))
103 .collect();
104 for v in primary_key_values.values() {
105 params.push(v.clone());
106 }
107 params
108}
109
110pub fn collect_delete_params(primary_key_values: &HashMap<String, DbValue>) -> Vec<DbValue> {
111 primary_key_values.values().cloned().collect()
112}