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