Skip to content

Instantly share code, notes, and snippets.

@rj76
Created August 20, 2022 18:16
Show Gist options
  • Save rj76/05a91b548ca19d395d65e313f52d6c89 to your computer and use it in GitHub Desktop.
Save rj76/05a91b548ca19d395d65e313f52d6c89 to your computer and use it in GitHub Desktop.
Function to create a subselect so it can be used in Diesel's select()
use diesel::prelude::*;
use diesel::backend::Backend;
use diesel::expression::{Expression, AsExpression, Selectable, ValidGrouping};
use diesel::query_builder::{AstPass, Query, QueryFragment};
use diesel::{QueryResult};
use diesel::pg::Pg;
use diesel::sql_types::{SingleValue};
use crate::schema::{order_order, order_status};
pub struct Subquery<T> {
subquery: T,
alias: String,
}
impl<T> QueryFragment<Pg> for Subquery<T>
where
T: QueryFragment<Pg>,
{
fn walk_ast<'b>(&'b self, mut out: AstPass<'_, 'b, Pg>) -> QueryResult<()> {
self.subquery.walk_ast(out.reborrow())?;
out.push_sql(" AS ");
out.push_identifier(self.alias.as_str()).expect("Error adding alias");
Ok(())
}
}
impl<T> Expression for Subquery<T>
where T: Expression
{
type SqlType = T::SqlType;
}
impl<T> AppearsOnTable<order_order::table> for Subquery<T>
where T: Expression
{}
impl<T> SelectableExpression<order_order::table> for Subquery<T>
where T: Expression
{}
impl<T, GB> ValidGrouping<GB> for Subquery<T>
where T: Expression + ValidGrouping<GB>
{
type IsAggregate = T::IsAggregate;
}
impl<T, DB: Backend> Selectable<DB> for Subquery<T>
where T: QueryFragment<DB> + Expression + Selectable<DB>
{
type SelectExpression = order_status::id;
fn construct_selection() -> Self::SelectExpression {
order_status::id
}
}
pub fn get_subquery_for_select<T>(subquery: T, alias: String) -> Subquery<T> {
Subquery {
subquery,
alias
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment