gluesql_core/query_builder/
execute.rs1use {
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}