subgraph/data_sources/sql/create_query/create_update_many_query/
mod.rs1use 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}