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