So far I have not needed this but it sounds logical.
And an easy patch as given.

e = ~db.person.name
e is an expression meaning "person.name DESC"

so e = ~e
should be "person.name"
not "person.name DESC DESC"

+1 from me

Denes.

On Nov 29, 10:17 am, mdipierro <[email protected]> wrote:
> This should be automatic behavior in the new dal (dal.py).
> I do not think it is work spending time changing this in the current
> dal (sql.py).
>
> 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.
>
>

Reply via email to