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, 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}