sql_query_builder/concat/
mod.rs1use 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}