icydb_core/db/session/sql/
mod.rs1mod aggregate;
7mod computed_projection;
8mod dispatch;
9mod explain;
10mod projection;
11mod surface;
12
13use crate::{
14 db::{
15 DbSession, EntityResponse, PagedGroupedExecutionWithTrace, PersistedRow, Query, QueryError,
16 sql::parser::parse_sql,
17 },
18 traits::{CanisterKind, EntityKind, EntityValue},
19};
20
21use crate::db::session::sql::surface::sql_statement_route_from_statement;
22
23pub use crate::db::session::sql::surface::{
24 SqlDispatchResult, SqlParsedStatement, SqlStatementRoute,
25};
26
27impl<C: CanisterKind> DbSession<C> {
28 pub fn parse_sql_statement(&self, sql: &str) -> Result<SqlParsedStatement, QueryError> {
32 let statement = parse_sql(sql).map_err(QueryError::from_sql_parse_error)?;
33 let route = sql_statement_route_from_statement(&statement);
34
35 Ok(SqlParsedStatement::new(statement, route))
36 }
37
38 pub fn sql_statement_route(&self, sql: &str) -> Result<SqlStatementRoute, QueryError> {
43 let parsed = self.parse_sql_statement(sql)?;
44
45 Ok(parsed.route().clone())
46 }
47
48 pub fn query_from_sql<E>(&self, sql: &str) -> Result<Query<E>, QueryError>
53 where
54 E: EntityKind<Canister = C>,
55 {
56 let parsed = self.parse_sql_statement(sql)?;
57 let (_, query) = Self::bind_sql_query_lane_from_parsed::<E>(&parsed)?;
58
59 Ok(query)
60 }
61
62 pub fn execute_sql<E>(&self, sql: &str) -> Result<EntityResponse<E>, QueryError>
64 where
65 E: PersistedRow<Canister = C> + EntityValue,
66 {
67 let query = self.query_from_sql::<E>(sql)?;
68 Self::ensure_sql_query_grouping(&query, false)?;
69
70 self.execute_query(&query)
71 }
72
73 pub fn execute_sql_grouped<E>(
75 &self,
76 sql: &str,
77 cursor_token: Option<&str>,
78 ) -> Result<PagedGroupedExecutionWithTrace, QueryError>
79 where
80 E: PersistedRow<Canister = C> + EntityValue,
81 {
82 let query = self.query_from_sql::<E>(sql)?;
83 Self::ensure_sql_query_grouping(&query, true)?;
84
85 self.execute_grouped(&query, cursor_token)
86 }
87}