My point is that the queries aren't composable, but the predicates are. Think of predicates as basic operations, and "SELECT * FROM X WHERE predicate" as a functor.
Then "composing" Select(P) with Select(Q) is identical to Select(P "composed with" Q).
Composition works, you just need to think of it the right way.
Then "composing" Select(P) with Select(Q) is identical to Select(P "composed with" Q).
Composition works, you just need to think of it the right way.