'apply the given filtering criterion to a copy
of this :class:`.Query`, using SQL expressions.
e.g.::
session.query(MyClass).filter(MyClass.name == \'some name\')
Multiple criteria are joined together by AND::
session.query(MyClass).\
filter(MyClass.name == \'some name\', MyClass.id > 5)
The criterion is any SQL expression object applicable to the
WHERE clause of a select.   String expressions are coerced
into SQL expression constructs via the :func:`.text` construct.
.. versionchanged:: 0.7.5
Multiple criteria joined by AND.
.. seealso::
:meth:`.Query.filter_by` - filter on keyword expressions.'

@_generative(_no_statement_condition, _no_limit_offset)
def filter(self, *criterion):

    for criterion in list(criterion):
        criterion = expression._literal_as_text(criterion)
        criterion = self._adapt_clause(criterion, True, True)
        if (self._criterion is not None):
            self._criterion = (self._criterion & criterion)
        else:
            self._criterion = criterion
