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