diesel-rs/diesel

`into_boxed` equivalent for INTERSECT

Open

#2,620 opened on Jan 12, 2021

View on GitHub
 (4 comments) (0 reactions) (0 assignees)Rust (1,003 forks)batch import
enhancementhelp wantedhole in api

Repository metrics

Stars
 (12,054 stars)
PR merge metrics
 (Avg merge 30d 16h) (30 merged PRs in 30d)

Description

I was looking to handle code that would generate INTERSECT clauses in a loop based on some input. For instance:

SELECT t.* FROM t WHERE t.foo = 'a'

INTERSECT

SELECT t.* FROM t WHERE t.foo = 'b'

INTERSECT
-- ...

(except more complicated to make the INTERSECT actually worth it)

Since https://github.com/diesel-rs/diesel/pull/2514 landed I tried this out but I think I'm running into the same issue one gets when adding filter clauses in a loop - the type of the fold accumulator changes each iteration. Specifically the two methods I tried were:

// This gets me "expected `BoxedSelectStatement`
// found `CombinationClause`"
let query_base = t.into_boxed();
let attempt_1 = (0..10).fold(query_base, |query, _| {
    query.intersect(t.filter(t::foo.eq(1)))
});

// This gets me "expected `CombinationClause<one thing>`
// found `CombinationClause<other thing>`"
let query_base = t.intersect(t.filter(t::foo.eq(1)));
let attempt_2 = (0..10).fold(query_base, |query, _| {
    query.intersect(t.filter(t::foo.eq(1)))
});

Would it be useful to have an into_boxed equivalent for intersect? Or is there already one and I just couldn't find it? Or is there another better way to achieve this functionality?

Contributor guide