gluesql_core/ast_builder/
select.rs

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