tank_core/query/builder/
mod.rs1mod create_table;
2mod drop_table;
3mod insert_into;
4mod select;
5
6pub use create_table::*;
7pub use drop_table::*;
8pub use insert_into::*;
9pub use select::*;
10
11use crate::{Context, DynQuery, Entity, Expression, OpPrecedence, SqlWriter};
12use std::iter;
13
14#[derive(Default, Debug)]
15pub struct QueryBuilder;
16
17impl QueryBuilder {
18 pub fn new() -> Self {
19 Self {}
20 }
21 pub fn select<Select: ExpressionCollection>(
22 self,
23 select: Select,
24 ) -> SelectQueryBuilder<Select, NA, NA, NA, NA, NA, NA> {
25 SelectQueryBuilder {
26 select,
27 from: Default::default(),
28 where_condition: Default::default(),
29 group_by: Default::default(),
30 having: Default::default(),
31 order_by: Default::default(),
32 limit: Default::default(),
33 _l: Default::default(),
34 }
35 }
36 pub fn insert_into<E: Entity>(self) -> InsertIntoQueryBuilder<E, NA, NA> {
37 InsertIntoQueryBuilder {
38 values: Default::default(),
39 update: Default::default(),
40 _table: Default::default(),
41 _update: Default::default(),
42 }
43 }
44 pub fn create_table<E: Entity>(self) -> CreateTableQueryBuilder<E, NA> {
45 CreateTableQueryBuilder {
46 if_not_exists: Default::default(),
47 _table: Default::default(),
48 _e: Default::default(),
49 }
50 }
51 pub fn drop_table<E: Entity>(self) -> DropTableQueryBuilder<E, NA> {
52 DropTableQueryBuilder {
53 if_exists: Default::default(),
54 _table: Default::default(),
55 _e: Default::default(),
56 }
57 }
58}
59
60#[derive(Default, Debug)]
61pub struct NA;
62
63impl OpPrecedence for NA {
64 fn precedence(&self, _writer: &dyn SqlWriter) -> i32 {
65 0
66 }
67}
68
69impl Expression for NA {
70 fn write_query(&self, _writer: &dyn SqlWriter, _context: &mut Context, _out: &mut DynQuery) {}
71}
72
73pub trait ExpressionCollection {
74 fn expr_iter(&self) -> impl Iterator<Item = impl Expression> + Clone;
75}
76
77impl<I> ExpressionCollection for I
78where
79 Self: Clone,
80 I: IntoIterator,
81 <I as IntoIterator>::Item: Expression,
82 <I as IntoIterator>::IntoIter: Clone,
83{
84 #[allow(refining_impl_trait)]
85 fn expr_iter(&self) -> impl Iterator<Item = <I as IntoIterator>::Item> + Clone {
86 self.clone().into_iter()
87 }
88}
89
90impl ExpressionCollection for NA {
91 fn expr_iter(&self) -> impl Iterator<Item = impl Expression> + Clone {
92 iter::empty::<&dyn Expression>()
93 }
94}