Skip to main content

rust_ef/change_executor/
sql_gen.rs

1//! Standalone SQL generation helpers (for use by simplified callers).
2
3use 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}