From: Mike Bayer Date: Sun, 18 Nov 2007 22:19:05 +0000 (+0000) Subject: - added op() operator to instrumented attributes; i.e. X-Git-Tag: rel_0_4_1~2 X-Git-Url: http://git.ipfire.org/gitweb/gitweb.cgi?a=commitdiff_plain;h=64d0ffee96d6fd907099d4fafd1314ddc5a6e4de;p=thirdparty%2Fsqlalchemy%2Fsqlalchemy.git - added op() operator to instrumented attributes; i.e. User.name.op('ilike')('%somename%') [ticket:767] --- diff --git a/CHANGES b/CHANGES index fef0c24176..6a6963ab85 100644 --- a/CHANGES +++ b/CHANGES @@ -84,6 +84,9 @@ CHANGES "attribute_names", a list of individual attribute keynames to be refreshed or expired, allowing partial reloads of attributes on an already-loaded instance. [ticket:802] + + - added op() operator to instrumented attributes; i.e. + User.name.op('ilike')('%somename%') [ticket:767] - Mapped classes may now define __eq__, __hash__, and __nonzero__ methods with arbitrary semantics. The orm now handles all mapped instances on diff --git a/lib/sqlalchemy/sql/expression.py b/lib/sqlalchemy/sql/expression.py index fbef02857d..c7ab342722 100644 --- a/lib/sqlalchemy/sql/expression.py +++ b/lib/sqlalchemy/sql/expression.py @@ -1049,7 +1049,12 @@ class Operators(object): def __invert__(self): return self.operate(operators.inv) - + + def op(self, opstring): + def op(b): + return self.operate(operators.op, opstring, b) + return op + def clause_element(self): raise NotImplementedError() diff --git a/lib/sqlalchemy/sql/operators.py b/lib/sqlalchemy/sql/operators.py index 78159697be..4ee5f4a189 100644 --- a/lib/sqlalchemy/sql/operators.py +++ b/lib/sqlalchemy/sql/operators.py @@ -21,6 +21,9 @@ def is_(): def isnot(): raise NotImplementedError() +def op(a, opstring, b): + return a.op(opstring)(b) + def like_op(a, b): return a.like(b) diff --git a/test/orm/query.py b/test/orm/query.py index cea8d1ac2e..d60f72c639 100644 --- a/test/orm/query.py +++ b/test/orm/query.py @@ -209,6 +209,9 @@ class OperatorTest(QueryTest): "\n'" + compiled + "'\n does not match\n'" + fwd_sql + "'\n or\n'" + rev_sql + "'") + def test_op(self): + assert str(User.name.op('ilike')('17').compile(dialect=default.DefaultDialect())) == "users.name ilike :users_name" + def test_in(self): self._test(User.id.in_(['a', 'b']), "users.id IN (:users_id, :users_id_1)")