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

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