[web2py] About unary operator consistency in queries

2013-01-29 Thread Alan Etkin
With trunk, I have tested the behavior of the ~ operator, and doesn't seem 
consistent to me:

Here Bruno gives a working example of belongs negation
https://groups.google.com/d/msg/web2py/fCB9a4K9FqU/GBLwfzNnkjMJ

But the book uses this example:

rows = db((~db.person.name=='Alex') | (db.person.id3)).select()


This is wat I get in the console (with SQLite/Python 2.7.3)

 q = ~db.auth_user.id.belongs(1,2,3)
 q
Query (NOT (auth_user.id IN (1,2,3)))

 q = ~db.auth_user.id==0
 q
Query (auth_user.id DESC = 0)

 q = ~db.auth_user.id0
 q
Query (auth_user.id DESC  0)
 q.select()
Traceback (most recent call last):
  File console, line 1, in module
AttributeError: 'Query' object has no attribute 'select'
 db(q).select()
Traceback (most recent call last):
...
OperationalError: near DESC: syntax error


Note that the second and third query would return an OperationalError (the 
INVERT operator is used instead of NOT)

To avoid the error the syntax must be ~(db.auth_user.id==0), with 
parethesis.

Is this an problem with the sqlite adapter only?


-- 

--- 
You received this message because you are subscribed to the Google Groups 
web2py-users group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to web2py+unsubscr...@googlegroups.com.
For more options, visit https://groups.google.com/groups/opt_out.




Re: [web2py] About unary operator consistency in queries

2013-01-29 Thread Jonathan Lundell
On 29 Jan 2013, at 8:50 AM, Alan Etkin spame...@gmail.com wrote:
 With trunk, I have tested the behavior of the ~ operator, and doesn't seem 
 consistent to me:
 
 Here Bruno gives a working example of belongs negation
 https://groups.google.com/d/msg/web2py/fCB9a4K9FqU/GBLwfzNnkjMJ
 
 But the book uses this example:
 rows = db((~db.person.name=='Alex') | (db.person.id3)).select()
 
 This is wat I get in the console (with SQLite/Python 2.7.3)
 
  q = ~db.auth_user.id.belongs(1,2,3)
  q
 Query (NOT (auth_user.id IN (1,2,3)))
 
  q = ~db.auth_user.id==0
  q
 Query (auth_user.id DESC = 0)
 
  q = ~db.auth_user.id0
  q
 Query (auth_user.id DESC  0)
  q.select()
 Traceback (most recent call last):
   File console, line 1, in module
 AttributeError: 'Query' object has no attribute 'select'
  db(q).select()
 Traceback (most recent call last):
 ...
 OperationalError: near DESC: syntax error
 
 
 Note that the second and third query would return an OperationalError (the 
 INVERT operator is used instead of NOT)
 
 To avoid the error the syntax must be ~(db.auth_user.id==0), with parethesis.
 
 Is this an problem with the sqlite adapter only?

It's an issue with the precedence of Python operators. ~ has higher precedence 
than comparisons, so the parens are required. Python objects can override the 
functionality of operators, but not their precedence.

A similar caveat applies to the use of | or  in queries.

-- 

--- 
You received this message because you are subscribed to the Google Groups 
web2py-users group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to web2py+unsubscr...@googlegroups.com.
For more options, visit https://groups.google.com/groups/opt_out.




Re: [web2py] About unary operator consistency in queries

2013-01-29 Thread Alan Etkin


 A similar caveat applies to the use of | or  in queries.


Ok, thanks for the tips Marin and Jonathan.

I assume then that the book's example should use parenthesis for negation, 
since web2py cannot change the Python operator precedence.

-- 

--- 
You received this message because you are subscribed to the Google Groups 
web2py-users group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to web2py+unsubscr...@googlegroups.com.
For more options, visit https://groups.google.com/groups/opt_out.




Re: [web2py] About unary operator consistency in queries

2013-01-29 Thread Jonathan Lundell
On 29 Jan 2013, at 9:42 AM, Alan Etkin spame...@gmail.com wrote:
 A similar caveat applies to the use of | or  in queries.
 
 Ok, thanks for the tips Marin and Jonathan.
 
 I assume then that the book's example should use parenthesis for negation, 
 since web2py cannot change the Python operator precedence.

Yes. Instead of:

rows = db((~db.person.name=='Alex') | (db.person.id3)).select()

it should read:

rows = db(~(db.person.name=='Alex') | (db.person.id3)).select()

-- 

--- 
You received this message because you are subscribed to the Google Groups 
web2py-users group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to web2py+unsubscr...@googlegroups.com.
For more options, visit https://groups.google.com/groups/opt_out.




Re: [web2py] About unary operator consistency in queries

2013-01-29 Thread Jonathan Lundell
On 29 Jan 2013, at 9:46 AM, Jonathan Lundell jlund...@pobox.com wrote:
 On 29 Jan 2013, at 9:42 AM, Alan Etkin spame...@gmail.com wrote:
 A similar caveat applies to the use of | or  in queries.
 
 Ok, thanks for the tips Marin and Jonathan.
 
 I assume then that the book's example should use parenthesis for negation, 
 since web2py cannot change the Python operator precedence.
 
 Yes. Instead of:
 
 rows = db((~db.person.name=='Alex') | (db.person.id3)).select()
 
 it should read:
 
 rows = db(~(db.person.name=='Alex') | (db.person.id3)).select()
 

I pushed a fix, along with adding a note to the existing note on operator 
precedence.

-- 

--- 
You received this message because you are subscribed to the Google Groups 
web2py-users group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to web2py+unsubscr...@googlegroups.com.
For more options, visit https://groups.google.com/groups/opt_out.