Skip to content

Instantly share code, notes, and snippets.

@carols10cents
Last active April 3, 2018 23:09
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save carols10cents/b29aef239f0264e96dd3939a5531cae3 to your computer and use it in GitHub Desktop.
Save carols10cents/b29aef239f0264e96dd3939a5531cae3 to your computer and use it in GitHub Desktop.

I currently have this working diesel code:

    let recent_downloads = sql::<Nullable<BigInt>>("SUM(crate_downloads.downloads)");
    let most_recently_downloaded = crates
        .left_join(
            crate_downloads::table.on(id.eq(crate_downloads::crate_id)
                .and(crate_downloads::date.gt(date(now - 90.days())))),
        )
        .group_by(id)
        .order(recent_downloads.desc().nulls_last())
        .limit(10)
        .select(ALL_COLUMNS)
        .load::<Crate>(&*conn)?;

I want to move the group_by, order, and limit within a subselect that I join on instead of joining on crate_downloads::table, to ultimately generate SQL that functions like this:

 select crates.* from crates join (
        select crate_downloads.crate_id, sum(crate_downloads.downloads)
        from crate_downloads
        where crate_downloads.date > date(current_timestamp - interval '90 days')
        group by crate_downloads.crate_id
        order by sum(crate_downloads.downloads) desc nulls last
        limit 10
) cd on crates.id = cd.crate_id;

The first step I took was removing a bunch of the diesel code, until I got to this, which compiles:

    let most_recently_downloaded = crates
        .left_join(
            (
                crate_downloads::table
            ).on(id.eq(crate_downloads::crate_id)),
        )
        .select(ALL_COLUMNS)
        .load::<Crate>(&*conn)?;

Then I started adding in what I want to change and I got to this, which does not compile:

    let most_recently_downloaded = crates
        .left_join(
            (
                crate_downloads::table
                    .filter(crate_downloads::date.gt(date(now - 90.days())))
                    .select(crate_downloads::crate_id)
            ).on(id.eq(crate_downloads::crate_id)),
        )
        .select(ALL_COLUMNS)
        .load::<Crate>(&*conn)?;

The error I get is:

error[E0599]: no method named `on` found for type `diesel::query_builder::SelectStatement<schema::crate_downloads::table, diesel::query_builder::select_clause::SelectClause<schema::crate_downloads::columns::crate_id>, diesel::query_builder::distinct_clause::NoDistinctClause, diesel::query_builder::where_clause::WhereClause<diesel::expression::operators::Gt<schema::crate_downloads::columns::date, diesel::dsl::date_t<diesel::expression::ops::Sub<diesel::dsl::now, diesel::expression::bound::Bound<diesel::sql_types::Interval, diesel::data_types::PgInterval>>>>>>` in the current scope
  --> src/controllers/krate/metadata.rs:67:15
   |
67 |             ).on(id.eq(crate_downloads::crate_id)),
   |               ^^
   |
   = note: the method `on` exists but the following trait bounds were not satisfied:
           `diesel::query_builder::SelectStatement<schema::crate_downloads::table, diesel::query_builder::select_clause::SelectClause<schema::crate_downloads::columns::crate_id>, diesel::query_builder::distinct_clause::NoDistinctClause, diesel::query_builder::where_clause::WhereClause<diesel::expression::operators::Gt<schema::crate_downloads::columns::date, diesel::dsl::date_t<diesel::expression::ops::Sub<diesel::dsl::now, diesel::expression::bound::Bound<diesel::sql_types::Interval, diesel::data_types::PgInterval>>>>>> : diesel::JoinOnDsl`
           `&diesel::query_builder::SelectStatement<schema::crate_downloads::table, diesel::query_builder::select_clause::SelectClause<schema::crate_downloads::columns::crate_id>, diesel::query_builder::distinct_clause::NoDistinctClause, diesel::query_builder::where_clause::WhereClause<diesel::expression::operators::Gt<schema::crate_downloads::columns::date, diesel::dsl::date_t<diesel::expression::ops::Sub<diesel::dsl::now, diesel::expression::bound::Bound<diesel::sql_types::Interval, diesel::data_types::PgInterval>>>>>> : diesel::JoinOnDsl`
           `&mut diesel::query_builder::SelectStatement<schema::crate_downloads::table, diesel::query_builder::select_clause::SelectClause<schema::crate_downloads::columns::crate_id>, diesel::query_builder::distinct_clause::NoDistinctClause, diesel::query_builder::where_clause::WhereClause<diesel::expression::operators::Gt<schema::crate_downloads::columns::date, diesel::dsl::date_t<diesel::expression::ops::Sub<diesel::dsl::now, diesel::expression::bound::Bound<diesel::sql_types::Interval, diesel::data_types::PgInterval>>>>>> : diesel::JoinOnDsl`
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment