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

1use 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}