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

1use crate::{
2    configuration::subgraph::data_sources::sql::DialectEnum, data_sources::sql::SqlDataSource,
3    filter_operator::FilterOperator, sql_value::SqlValue,
4};
5use log::{debug, error, trace};
6
7impl SqlDataSource {
8    pub fn create_where_clause(
9        where_keys: &Vec<String>,
10        dialect: &DialectEnum,
11        mut pg_param_offset: Option<i32>,
12        where_values: &Vec<SqlValue>,
13        filter_operator: FilterOperator,
14    ) -> Result<(String, i32), async_graphql::Error> {
15        debug!("Creating Where Clause");
16        trace!("Where Keys: {:?}", where_keys);
17        trace!("Where Values: {:?}", where_values);
18        let parameterized_query = if !where_keys.is_empty() {
19            let mut query = String::new();
20
21            for i in 0..where_keys.len() {
22                query.push_str(&where_keys[i]);
23
24                // If where_values[i] does not exist, return error.
25                if where_values.len() <= i {
26                    error!("Where value for key does not exist: {}", where_keys[i]);
27                    return Err(async_graphql::Error::new(format!(
28                        "Where value for key does not exist.",
29                    )));
30                }
31
32                let is_list = match where_values[i] {
33                    SqlValue::StringList(_) | SqlValue::IntList(_) | SqlValue::BoolList(_) => true,
34                    _ => false,
35                };
36
37                if is_list {
38                    query.push_str(" IN (");
39                } else {
40                    let sql_operator = FilterOperator::get_sql_operator(&filter_operator);
41                    query.push_str(sql_operator);
42                }
43
44                // This is used to offset the placeholder index for postgres.
45                // It is incremented by the number of placeholders added to the query.
46                let index = if pg_param_offset.is_some() {
47                    trace!("Existing Pg Param Offset: {:?}", pg_param_offset);
48                    Some(i as i32 + pg_param_offset.unwrap())
49                } else {
50                    trace!("No Existing Pg Param Offset");
51                    Some(0)
52                };
53
54                match where_values[i] {
55                    SqlValue::StringList(_) | SqlValue::IntList(_) | SqlValue::BoolList(_) => {
56                        let placeholder_count = match where_values[i] {
57                            SqlValue::StringList(ref list) => list.len(),
58                            SqlValue::IntList(ref list) => list.len(),
59                            SqlValue::BoolList(ref list) => list.len(),
60                            SqlValue::UUIDList(ref list) => list.len(),
61                            SqlValue::DateTimeList(ref list) => list.len(),
62                            _ => 0,
63                        };
64
65                        for j in 0..placeholder_count {
66                            query.push_str(&SqlDataSource::get_placeholder(dialect, index));
67                            if j != placeholder_count - 1 {
68                                query.push_str(", ");
69                            }
70                        }
71
72                        pg_param_offset =
73                            Some(pg_param_offset.unwrap_or(0) + placeholder_count as i32 - 1);
74                    }
75                    _ => query.push_str(&SqlDataSource::get_placeholder(dialect, index)),
76                };
77
78                if is_list {
79                    query.push_str(")");
80                }
81
82                if i != where_keys.len() - 1 {
83                    query.push_str(" AND ");
84                }
85            }
86            pg_param_offset = Some(pg_param_offset.unwrap_or(0) + where_keys.len() as i32);
87            query
88        } else {
89            String::new()
90        };
91        trace!("Where Clause: {}", parameterized_query);
92        trace!("Parameter Offset: {:?}", pg_param_offset.unwrap_or(0));
93        Ok((parameterized_query, pg_param_offset.unwrap_or(0)))
94    }
95}