rust_ef/change_executor/
sql_gen.rs1use crate::entity_snapshot::EntitySnapshot;
4use crate::metadata::EntityTypeMeta;
5use crate::provider::{DbValue, IDatabaseProvider};
6
7pub fn generate_insert_sql(
8 provider: &dyn IDatabaseProvider,
9 meta: &EntityTypeMeta,
10 _property_values: &EntitySnapshot,
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: &EntitySnapshot,
28 primary_key_values: &EntitySnapshot,
29) -> String {
30 let gen = provider.sql_generator();
31 let set_columns: Vec<&str> = property_values
32 .iter()
33 .map(|(k, _)| k)
34 .filter(|k| primary_key_values.get(k).is_none())
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 .iter()
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: &EntitySnapshot,
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 .iter()
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: &EntitySnapshot,
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: &EntitySnapshot,
96 primary_key_values: &EntitySnapshot,
97 set_keys: &[String],
98) -> Vec<DbValue> {
99 let mut params: Vec<DbValue> = set_keys
100 .iter()
101 .filter(|k| primary_key_values.get(k.as_str()).is_none())
102 .map(|k| {
103 property_values
104 .get(k.as_str())
105 .cloned()
106 .unwrap_or(DbValue::Null)
107 })
108 .collect();
109 for (_, v) in primary_key_values.iter() {
110 params.push(v.clone());
111 }
112 params
113}
114
115pub fn collect_delete_params(primary_key_values: &EntitySnapshot) -> Vec<DbValue> {
116 primary_key_values.iter().map(|(_, v)| v.clone()).collect()
117}