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<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    fn accept_visitor(
72        &self,
73        _matcher: &mut dyn ExpressionVisitor,
74        _writer: &dyn SqlWriter,
75        _context: &mut Context,
76        _out: &mut DynQuery,
77    ) -> bool {
78        false
79    }
80}
81
82pub trait ExpressionCollection {
83    fn expr_iter(&self) -> impl Iterator<Item = impl Expression> + Clone;
84}
85
86impl<I> ExpressionCollection for I
87where
88    Self: Clone,
89    I: IntoIterator,
90    <I as IntoIterator>::Item: Expression,
91    <I as IntoIterator>::IntoIter: Clone,
92{
93    #[allow(refining_impl_trait)]
94    fn expr_iter(&self) -> impl Iterator<Item = <I as IntoIterator>::Item> + Clone {
95        self.clone().into_iter()
96    }
97}
98
99impl ExpressionCollection for NA {
100    fn expr_iter(&self) -> impl Iterator<Item = impl Expression> + Clone {
101        iter::empty::<&dyn Expression>()
102    }
103}