On Jul 31, 2013, at 10:53 PM, Matt Murphy <[email protected]> wrote:
>
> When I look at the SQL that is created it looks like this:
>
> FROM components
> WHERE NOT (components.major < %(major_1)s OR components.major = %(major_2)s
> AND components.minor < %(minor_1)s OR components.major = %(major_3)s AND
> components.minor = %(minor_2)s AND components.tiny < %(tiny_1)s OR
> components.major = %(major_4)s AND components.minor = %(minor_3)s AND
> components.tiny = %(tiny_2)s AND components.phase < %(phase_1)s OR
> components.major = %(major_5)s AND components.minor = %(minor_4)s AND
> components.tiny = %(tiny_3)s AND components.phase = %(phase_2)s AND
> components.build < %(build_1)s)
>
> My first assumption was that each argument in an and_ or an or_ would be
> wrapped in parenthesis, but they are not. Is there any way to wrap my
> statements in parenthesis in the SQL? This query does not work because all
> the statements are executed together.
the parenthesis are rendered using operator precedence. AND takes higher
precedence than OR, so parenthesis don't render for that. "a AND b OR c AND d
OR e AND f ...." is equivalent to "(a AND b) OR (c AND d) OR (e AND f) ....".
here's a demonstration:
import itertools
for a, b, c, d, e, f in itertools.product(*[(True, False) for i in range(6)]):
print(a, b, c, d, e, f)
assert (a and b) or (c and d) or (e and f) == (a and b or c and d or e and
f)
assert (a and b and c) or (d and e and f) == (a and b and c or d and e and
f)
assert (a and b and c and d) or (e and f) == (a and b and c and d or e and
f)
there's a call self_group() that will force the parenthesis, and_(a, b,
c).self_group() but it shouldn't be needed.
signature.asc
Description: Message signed with OpenPGP using GPGMail
