tank_core/query/builder/
mod.rs

1mod 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}