subgraph/data_sources/sql/create_query/create_update_one_query/
mod.rs1use bson::Document;
2use log::debug;
3
4use crate::{
5 configuration::subgraph::{
6 data_sources::sql::DialectEnum, entities::ServiceEntityConfig, SubGraphConfig,
7 },
8 data_sources::sql::SqlDataSource,
9 filter_operator::FilterOperator,
10 sql_value::SqlValue,
11};
12
13impl SqlDataSource {
14 pub fn create_update_one_query(
15 entity: &ServiceEntityConfig,
16 table_name: &str,
17 value_keys: &Vec<String>,
18 dialect: &DialectEnum,
19 input: &Document,
20 subgraph_config: &SubGraphConfig,
21 ) -> Result<(String, Vec<SqlValue>, Vec<String>, String), async_graphql::Error> {
22 debug!("Creating Update One Query");
23
24 let mut query = String::new();
25 query.push_str("UPDATE ");
26 query.push_str(table_name);
27 query.push_str(" SET ");
28
29 let mut identifier_query = String::new();
30 let primary_key_field = ServiceEntityConfig::get_primary_key_field(entity)?;
31 identifier_query
32 .push_str(format!("SELECT {} FROM {}", primary_key_field.name, table_name).as_str());
33
34 for i in 0..value_keys.len() {
35 query.push_str(&value_keys[i]);
36 query.push_str(" = ");
37 query.push_str(SqlDataSource::get_placeholder(dialect, Some(i as i32)).as_str());
38 if i != value_keys.len() - 1 {
39 query.push_str(", ");
40 }
41 }
42
43 let offset = Some(value_keys.len() as i32);
45
46 query.push_str(" WHERE ");
47 identifier_query.push_str(" WHERE ");
48
49 let query_input = input.get("query").unwrap();
50 let (
51 nested_query,
52 combined_where_values,
53 _combined_join_values,
54 combined_where_keys,
55 _offset,
56 ) = SqlDataSource::create_nested_query_recursive(
57 &vec![query_input.clone()],
58 entity,
59 dialect,
60 FilterOperator::And,
61 false,
62 offset,
63 subgraph_config,
64 None,
65 false,
66 )?;
67
68 if let Some(nested_query) = nested_query {
69 query.push_str(nested_query.as_str());
70 identifier_query.push_str(nested_query.as_str());
71 } else {
72 return Err(async_graphql::Error::from("No filter provided"));
73 }
74
75 query.push_str(" LIMIT 1");
76
77 if !query.ends_with(';') {
78 query.push(';');
79 }
80
81 if !identifier_query.ends_with(';') {
82 identifier_query.push(';');
83 }
84
85 Ok((
86 query,
87 combined_where_values,
88 combined_where_keys,
89 identifier_query,
90 ))
91 }
92}