diesel-rs/diesel

`into_boxed` equivalent for INTERSECT

Open

#2620 aperta il 12 gen 2021

Vedi su GitHub
 (4 commenti) (0 reazioni) (0 assegnatari)Rust (1003 fork)batch import
enhancementhelp wantedhole in api

Metriche repository

Star
 (12.054 star)
Metriche merge PR
 (Merge medio 30g 16h) (30 PR mergiate in 30 g)

Descrizione

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?

Guida contributor