summaryrefslogtreecommitdiff
path: root/lib/sqlalchemy/sql/expression.py
diff options
context:
space:
mode:
authorMike Bayer <mike_mp@zzzcomputing.com>2012-08-27 19:40:12 -0400
committerMike Bayer <mike_mp@zzzcomputing.com>2012-08-27 19:40:12 -0400
commit7d6c1c4a95596d5d83d9187d823f88fdc46f35b6 (patch)
tree1899e61ed65a2e5e44698bf06a3342aa1e89b422 /lib/sqlalchemy/sql/expression.py
parent3a2d617f7f4232ae6f0e256e6b4327e48118ffbf (diff)
downloadsqlalchemy-7d6c1c4a95596d5d83d9187d823f88fdc46f35b6.tar.gz
- [feature] Reworked the startswith(), endswith(),
contains() operators to do a better job with negation (NOT LIKE), and also to assemble them at compilation time so that their rendered SQL can be altered, such as in the case for Firebird STARTING WITH [ticket:2470] - [feature] firebird - The "startswith()" operator renders as "STARTING WITH", "~startswith()" renders as "NOT STARTING WITH", using FB's more efficient operator. [ticket:2470]
Diffstat (limited to 'lib/sqlalchemy/sql/expression.py')
-rw-r--r--lib/sqlalchemy/sql/expression.py37
1 files changed, 3 insertions, 34 deletions
diff --git a/lib/sqlalchemy/sql/expression.py b/lib/sqlalchemy/sql/expression.py
index 0e8a46b60..2583e6510 100644
--- a/lib/sqlalchemy/sql/expression.py
+++ b/lib/sqlalchemy/sql/expression.py
@@ -2049,37 +2049,6 @@ class _DefaultColumnComparator(operators.ColumnOperators):
"""See :meth:`.ColumnOperators.__neg__`."""
return UnaryExpression(expr, operator=operators.neg)
- def _startswith_impl(self, expr, op, other, escape=None, **kw):
- """See :meth:`.ColumnOperators.startswith`."""
- # use __radd__ to force string concat behavior
- return self._boolean_compare(
- expr,
- operators.like_op,
- literal_column("'%'", type_=sqltypes.String).__radd__(
- self._check_literal(expr,
- operators.like_op, other)
- ),
- escape=escape)
-
- def _endswith_impl(self, expr, op, other, escape=None, **kw):
- """See :meth:`.ColumnOperators.endswith`."""
- return self._boolean_compare(
- expr,
- operators.like_op,
- literal_column("'%'", type_=sqltypes.String) +
- self._check_literal(expr, operators.like_op, other),
- escape=escape)
-
- def _contains_impl(self, expr, op, other, escape=None, **kw):
- """See :meth:`.ColumnOperators.contains`."""
- return self._boolean_compare(
- expr,
- operators.like_op,
- literal_column("'%'", type_=sqltypes.String) +
- self._check_literal(expr, operators.like_op, other) +
- literal_column("'%'", type_=sqltypes.String),
- escape=escape)
-
def _match_impl(self, expr, op, other, **kw):
"""See :meth:`.ColumnOperators.match`."""
return self._boolean_compare(expr, operators.match_op,
@@ -2124,6 +2093,9 @@ class _DefaultColumnComparator(operators.ColumnOperators):
"eq": (_boolean_compare, operators.ne),
"like_op": (_boolean_compare, operators.notlike_op),
"ilike_op": (_boolean_compare, operators.notilike_op),
+ "contains_op": (_boolean_compare, operators.notcontains_op),
+ "startswith_op": (_boolean_compare, operators.notstartswith_op),
+ "endswith_op": (_boolean_compare, operators.notendswith_op),
"desc_op": (_scalar, desc),
"asc_op": (_scalar, asc),
"nullsfirst_op": (_scalar, nullsfirst),
@@ -2133,9 +2105,6 @@ class _DefaultColumnComparator(operators.ColumnOperators):
"match_op": (_match_impl,),
"distinct_op": (_distinct_impl,),
"between_op": (_between_impl, ),
- "contains_op": (_contains_impl, ),
- "startswith_op": (_startswith_impl,),
- "endswith_op": (_endswith_impl,),
"neg": (_neg_impl,),
"getitem": (_unsupported_impl,),
}