(
query: rq::RelationalQuery,
dialect: Option<Dialect>,
)
| 15 | use crate::{Result, Target}; |
| 16 | |
| 17 | pub(in super::super) fn compile_query( |
| 18 | query: rq::RelationalQuery, |
| 19 | dialect: Option<Dialect>, |
| 20 | ) -> Result<(pq::SqlQuery, Context)> { |
| 21 | debug::log_stage(debug::Stage::Sql(debug::StageSql::Anchor)); |
| 22 | |
| 23 | let dialect = if let Some(dialect) = dialect { |
| 24 | dialect |
| 25 | } else { |
| 26 | let target = query.def.other.get("target"); |
| 27 | let Target::Sql(maybe_dialect) = target |
| 28 | .map(|s| Target::from_str(s)) |
| 29 | .transpose()? |
| 30 | .unwrap_or_default(); |
| 31 | maybe_dialect.unwrap_or_default() |
| 32 | }; |
| 33 | |
| 34 | let (anchor, main_relation) = AnchorContext::of(query); |
| 35 | |
| 36 | let mut ctx = Context::new(dialect, anchor); |
| 37 | |
| 38 | // compile main relation that will recursively compile CTEs |
| 39 | let main_relation = compile_relation(main_relation.into(), &mut ctx)?; |
| 40 | |
| 41 | // attach CTEs |
| 42 | let ctes = ctx.ctes.drain(..).collect_vec(); |
| 43 | |
| 44 | let query = pq::SqlQuery { |
| 45 | main_relation, |
| 46 | ctes, |
| 47 | }; |
| 48 | debug::log_entry(|| debug::DebugEntryKind::ReprPq(query.clone())); |
| 49 | |
| 50 | debug::log_stage(debug::Stage::Sql(debug::StageSql::Postprocess)); |
| 51 | let query = postprocess::postprocess(query, &mut ctx); |
| 52 | debug::log_entry(|| debug::DebugEntryKind::ReprPq(query.clone())); |
| 53 | |
| 54 | Ok((query, ctx)) |
| 55 | } |
| 56 | |
| 57 | fn compile_relation(relation: RelationAdapter, ctx: &mut Context) -> Result<pq::SqlRelation> { |
| 58 | log::trace!("compiling relation {relation:#?}"); |
no test coverage detected