Skip to main content

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, ExpressionVisitor, 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_expr: 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(self) -> InsertIntoQueryBuilder<NA, NA> {
37        InsertIntoQueryBuilder {
38            values: Default::default(),
39            update: Default::default(),
40            _update: Default::default(),
41        }
42    }
43    pub fn create_table<E: Entity>(self) -> CreateTableQueryBuilder<E, NA> {
44        CreateTableQueryBuilder {
45            if_not_exists: Default::default(),
46            _table: Default::default(),
47            _e: Default::default(),
48        }
49    }
50    pub fn drop_table<E: Entity>(self) -> DropTableQueryBuilder<E, NA> {
51        DropTableQueryBuilder {
52            if_exists: Default::default(),
53            _table: Default::default(),
54            _e: Default::default(),
55        }
56    }
57}
58
59#[derive(Default, Debug)]
60pub struct NA;
61
62impl OpPrecedence for NA {
63    fn precedence(&self, _writer: &dyn SqlWriter) -> i32 {
64        0
65    }
66}
67
68impl Expression for NA {
69    fn write_query(&self, _writer: &dyn SqlWriter, _context: &mut Context, _out: &mut DynQuery) {}
70    fn accept_visitor(
71        &self,
72        _matcher: &mut dyn ExpressionVisitor,
73        _writer: &dyn SqlWriter,
74        _context: &mut Context,
75        _out: &mut DynQuery,
76    ) -> bool {
77        false
78    }
79}
80
81pub trait ExpressionCollection {
82    fn expr_iter(&self) -> impl Iterator<Item = impl Expression> + Clone;
83}
84
85impl<I> ExpressionCollection for I
86where
87    Self: Clone,
88    I: IntoIterator,
89    <I as IntoIterator>::Item: Expression,
90    <I as IntoIterator>::IntoIter: Clone,
91{
92    #[allow(refining_impl_trait)]
93    fn expr_iter(&self) -> impl Iterator<Item = <I as IntoIterator>::Item> + Clone {
94        self.clone().into_iter()
95    }
96}
97
98impl ExpressionCollection for NA {
99    fn expr_iter(&self) -> impl Iterator<Item = impl Expression> + Clone {
100        iter::empty::<&dyn Expression>()
101    }
102}