gluesql_core/ast_builder/
select.rs1mod filter;
2mod group_by;
3mod having;
4mod join;
5mod limit;
6mod offset;
7mod offset_limit;
8mod order_by;
9mod project;
10mod root;
11mod values;
12
13use {
14 super::Build,
15 crate::{
16 ast::{Query, Select, SetExpr, Statement},
17 result::Result,
18 },
19};
20pub use {
21 filter::FilterNode,
22 group_by::GroupByNode,
23 having::HavingNode,
24 join::{HashJoinNode, JoinConstraintNode, JoinNode},
25 limit::LimitNode,
26 offset::OffsetNode,
27 offset_limit::OffsetLimitNode,
28 order_by::OrderByNode,
29 project::ProjectNode,
30 root::{SelectNode, select},
31 values::{ValuesNode, values},
32};
33
34pub trait Prebuild<T> {
35 fn prebuild(self) -> Result<T>;
36}
37
38impl<T: Prebuild<Select>> Prebuild<Query> for T {
39 fn prebuild(self) -> Result<Query> {
40 let select = self.prebuild()?;
41 let body = SetExpr::Select(Box::new(select));
42 let query = Query {
43 body,
44 order_by: Vec::new(),
45 limit: None,
46 offset: None,
47 };
48
49 Ok(query)
50 }
51}
52
53impl<T: Prebuild<Query>> Build for T {
54 fn build(self) -> Result<Statement> {
55 let query = self.prebuild()?;
56
57 Ok(Statement::Query(query))
58 }
59}