diesel-rs / diesel

A safe, extensible ORM and Query Builder for Rust
https://diesel.rs
Apache License 2.0
12.57k stars 1.05k forks source link

`into_boxed` equivalent for INTERSECT #2620

Open mlodato517 opened 3 years ago

mlodato517 commented 3 years ago

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?

weiznich commented 3 years ago

This is currently not supported. In theory we could have another type that implements a boxed variant of this. That written: At least I do not have the capacity to work in any way on that at least till after the 2.0 release. Which means if anyone is interested in contributing this feature, they need to do all the design work on their own. In that case I would expect a PR with some tests + compile tests showing that this feature cannot be misused.