I apologize for my too quick previous dismissal. On a second thought this is a good idea. Your patch is in trunk.
massimo On Nov 29, 9:09 am, iiijjjiii <[email protected]> wrote: > Does it make sense to modify the gluon.sql Expression __invert__ > method so a double invert is possible. > > Currently this produces an error: > > print db().select(db.person.name, orderby=~~db.person.name) > > ProgrammingError: (1064, "You have an error in your SQL syntax; > check the manual that corresponds to your MySQL server version for the > right syntax to use near 'DESC' at line 1") > > The cause of the error is obvious when you look at the SQL query. > > SELECT person.name FROM person ORDER BY person.name DESC DESC > > The second invert adds an additional 'DESC' which makes the query > invalid. > > I tried this and it worked. > > def __invert__(self): > if str(self)[-5:] == ' DESC': > return Expression(str(self)[:-5], None, None) > else: > return Expression(str(self) + ' DESC', None, None) > > To explain why a double invert is useful, I have a function that > returns the rows from a query and the order of the rows is determined > by parameters. > > def people(order_expr, reverse=False) > if False: > orderby = order_expr > else: > orderby = ~order_expr > return db().select(db.person.ALL, orderby=order_by) > > It is used in a report. Each field in the report has a default order > expression. The default order direction for most fields is ascending, > but for some fields, eg updated_on, the default order is more > intuitive as descending. The report will allow the user to switch the > direction with a click. The code simply toggles the reverse parameter. > I'd like the function to handle any of these combinations. > > people(db.person.name) > people(db.person.name, reverse=True) > people(~db.person.updated_on) > people(~db.person.updated_on, reverse=True) > > I am not familiar with the web2py code enough to be aware of the > effects of changing the __invert__ so my suggestion might have some > unwanted results. Hopefully others can provide input.

