subgraph/data_sources/sql/create_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    resolver_type::ResolverType,
9};
10
11use super::{SqlDataSource, SqlQuery};
12
13pub mod create_create_one_query;
14pub mod create_find_many_query;
15pub mod create_find_one_query;
16pub mod create_nested_query_recursive;
17pub mod create_update_many_query;
18pub mod create_update_one_query;
19pub mod create_where_clause;
20pub mod get_key_data;
21pub mod get_placeholder;
22
23#[derive(Debug, Clone)]
24pub struct JoinClauses(pub Vec<String>);
25
26impl SqlDataSource {
27    pub fn create_query(
28        input: Document,
29        resolver_type: ResolverType,
30        table_name: &str,
31        dialect: DialectEnum,
32        entity: &ServiceEntityConfig,
33        subgraph_config: &SubGraphConfig,
34    ) -> Result<SqlQuery, async_graphql::Error> {
35        debug!("Creating SQL Query");
36
37        let (_where_keys, mut where_values, value_keys, values, join_clauses) =
38            SqlDataSource::get_key_data(
39                &input,
40                entity,
41                &resolver_type,
42                &dialect,
43                &subgraph_config,
44                false,
45            )?;
46        let mut count_query = None;
47        let mut identifier_query = None;
48
49        // Generate the query string and get the where values.
50        let query = match resolver_type {
51            ResolverType::FindOne => {
52                let (query_string, combined_where_values, _combined_where_keys) =
53                    SqlDataSource::create_find_one_query(
54                        &entity,
55                        table_name,
56                        &dialect,
57                        &input,
58                        subgraph_config,
59                        Some(join_clauses),
60                    )?;
61                where_values = combined_where_values;
62                query_string
63            }
64            ResolverType::FindMany => {
65                let (query_string, combined_where_values, count_q, _combined_where_keys) =
66                    SqlDataSource::create_find_many_query(
67                        &entity,
68                        table_name,
69                        &dialect,
70                        &input,
71                        subgraph_config,
72                        Some(join_clauses),
73                        false,
74                    )?;
75                where_values = combined_where_values;
76                count_query = Some(count_q);
77                query_string
78            }
79            ResolverType::CreateOne => {
80                SqlDataSource::create_create_one_query(table_name, &value_keys, &dialect)?
81            }
82            ResolverType::UpdateOne => {
83                let (query_string, combined_where_value, _combined_where_keys, identifier_q) =
84                    SqlDataSource::create_update_one_query(
85                        &entity,
86                        table_name,
87                        &value_keys,
88                        &dialect,
89                        &input,
90                        subgraph_config,
91                    )?;
92                where_values = combined_where_value;
93                identifier_query = Some(identifier_q);
94                query_string
95            }
96            ResolverType::UpdateMany => {
97                let (query_string, combined_where_value, _combined_where_keys, identifier_q) =
98                    SqlDataSource::create_update_many_query(
99                        &entity,
100                        table_name,
101                        &value_keys,
102                        &dialect,
103                        &input,
104                        subgraph_config,
105                    )?;
106                where_values = combined_where_value;
107                identifier_query = Some(identifier_q);
108                query_string
109            }
110            _ => panic!("Invalid resolver type"),
111        };
112
113        let sql_query = SqlQuery {
114            query,
115            count_query,
116            identifier_query,
117            where_values,
118            values,
119            table: table_name.to_string(),
120        };
121
122        debug!("Query: {:?}", sql_query);
123
124        Ok(sql_query)
125    }
126}