Skip to main content

rust_ef/change_executor/
sql_gen.rs

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