subgraph/data_sources/sql/create_query/create_find_one_query/
mod.rs1use bson::Document;
2use log::error;
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
13use super::JoinClauses;
14
15impl SqlDataSource {
16 pub fn create_find_one_query(
17 entity: &ServiceEntityConfig,
18 table_name: &str,
19 dialect: &DialectEnum,
20 input: &Document,
21 subgraph_config: &SubGraphConfig,
22 join_clauses: Option<JoinClauses>,
23 ) -> Result<(String, Vec<SqlValue>, Vec<String>), async_graphql::Error> {
24 let mut query = String::new();
25 let entity_table_name = if let Some(entity_ds) = entity.data_source.clone() {
26 if entity_ds.table.is_some() {
27 entity_ds.table.unwrap()
28 } else {
29 entity.name.clone()
30 }
31 } else {
32 entity.name.clone()
33 };
34 let select_statement = format!("SELECT {}.* FROM ", entity_table_name);
35 query.push_str(&select_statement);
36 query.push_str(table_name);
37
38 let query_input = match input.get("query") {
39 Some(query_input) => query_input,
40 None => {
41 error!("Invalid Query Object: {:?}", input);
42 return Err(async_graphql::Error::new("Invalid Query Object"));
43 }
44 };
45
46 let (
47 nested_query,
48 combined_where_values,
49 combined_join_clauses,
50 combined_where_keys,
51 _offset,
52 ) = SqlDataSource::create_nested_query_recursive(
53 &vec![query_input.clone()],
54 entity,
55 dialect,
56 FilterOperator::And,
57 false,
58 None,
59 subgraph_config,
60 join_clauses,
61 false,
62 )?;
63
64 for join_clause in combined_join_clauses.0 {
65 query.push_str(&join_clause);
66 }
67
68 query.push_str(" WHERE ");
69
70 if let Some(nested_query) = nested_query {
71 query.push_str(&nested_query);
72 } else {
73 query.push_str("1 = 1");
74 }
75
76 if !query.ends_with(';') {
77 query.push(';');
78 }
79
80 Ok((query, combined_where_values, combined_where_keys))
81 }
82}