Skip to content

Instantly share code, notes, and snippets.

@rj76
Created August 20, 2022 18:16
Show Gist options
  • Select an option

  • Save rj76/05a91b548ca19d395d65e313f52d6c89 to your computer and use it in GitHub Desktop.

Select an option

Save rj76/05a91b548ca19d395d65e313f52d6c89 to your computer and use it in GitHub Desktop.

Revisions

  1. rj76 created this gist Aug 20, 2022.
    63 changes: 63 additions & 0 deletions create_subselect.rs
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,63 @@
    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
    }
    }