subgraph/data_sources/sql/create_query/create_update_one_query/
mod.rs

1use 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        // Offset used for postgres WHERE key placeholders, $1, $2
44        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}