Skip to main content

gluesql_core/query_builder/
execute.rs

1use {
2    super::Build,
3    crate::{
4        ast::Statement,
5        executor::Payload,
6        plan::StatementPlan,
7        prelude::Glue,
8        result::Result,
9        store::{GStore, GStoreMut, Planner},
10    },
11};
12
13pub trait Execute<T: GStore + GStoreMut + Planner>
14where
15    Self: Sized + Build,
16{
17    fn execute(self, glue: &mut Glue<T>) -> Result<Payload> {
18        let statement = self.build()?;
19        let statement = glue.storage.plan(statement)?;
20
21        glue.execute_stmt(&statement)
22    }
23}
24
25impl<T: GStore + GStoreMut + Planner, B: Build> Execute<T> for B {}
26
27impl Build for Statement {
28    fn build(self) -> Result<StatementPlan> {
29        Ok(self.into())
30    }
31}
32
33impl Build for StatementPlan {
34    fn build(self) -> Result<StatementPlan> {
35        Ok(self)
36    }
37}
38
39#[cfg(test)]
40mod tests {
41    use {
42        crate::{
43            parse_sql::parse, plan::StatementPlan, query_builder::Build, translate::translate,
44        },
45        pretty_assertions::assert_eq,
46    };
47
48    #[test]
49    fn builds_statement_plan_from_statement() {
50        let statement = translate(&parse("SELECT 1").unwrap()[0]).unwrap();
51        let expected = StatementPlan::from(statement.clone());
52
53        assert_eq!(statement.build(), Ok(expected));
54    }
55}