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