sql_query_builder/concat/
mod.rs

1use crate::fmt;
2
3pub(crate) mod mysql;
4pub(crate) mod non_standard;
5pub(crate) mod sql_standard;
6pub(crate) mod sqlite;
7
8pub trait Concat {
9  fn concat(&self, fmts: &fmt::Formatter) -> String;
10
11  fn concat_raw(&self, query: String, fmts: &fmt::Formatter, items: &Vec<String>) -> String {
12    if items.is_empty() {
13      return query;
14    }
15    let fmt::Formatter { lb, space, .. } = fmts;
16    let raw_sql = items.join(space).trim().to_string();
17
18    format!("{query}{raw_sql}{space}{lb}")
19  }
20}
21
22pub(crate) fn concat_raw_before_after<Clause: PartialEq>(
23  items_before: &Vec<(Clause, String)>,
24  items_after: &Vec<(Clause, String)>,
25  query: String,
26  fmts: &fmt::Formatter,
27  clause: Clause,
28  sql: String,
29) -> String {
30  let fmt::Formatter { space, .. } = fmts;
31  let raw_before = raw_queries(items_before, &clause).join(space).trim().to_string();
32  let raw_after = raw_queries(items_after, &clause).join(space).trim().to_string();
33  let space_after = if raw_after.is_empty() == false { space } else { "" };
34  let space_before = if raw_before.is_empty() == false { space } else { "" };
35
36  format!("{query}{raw_before}{space_before}{sql}{raw_after}{space_after}")
37}
38
39pub(crate) fn raw_queries<Clause: PartialEq>(raw_list: &Vec<(Clause, String)>, clause: &Clause) -> Vec<String> {
40  raw_list
41    .iter()
42    .filter(|item| item.0 == *clause)
43    .map(|item| item.1.clone())
44    .collect::<Vec<_>>()
45}