summaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorMike Bayer <mike_mp@zzzcomputing.com>2007-01-19 20:32:13 +0000
committerMike Bayer <mike_mp@zzzcomputing.com>2007-01-19 20:32:13 +0000
commit8a48ee2c8c0a28c059e8d60ef1da4c8b2ddf0738 (patch)
tree5050844ba68ed0a94d5ada36f87160aad7029920 /lib
parentddecef10715d9cdd05c568f81ade052c12330488 (diff)
downloadsqlalchemy-8a48ee2c8c0a28c059e8d60ef1da4c8b2ddf0738.tar.gz
- changed "BooleanExpression" to subclass from "BinaryExpression", so that boolean
expressions can also follow column-clause behaviors (i.e. label(), etc). - query.select() had to become more picky about what it considers to be a full "selectable" and what it considers to be a fragment that represents a WHERE criterion - looks for the presence of a FromClause now (which is still pretty liberal, since i originally intended the check to be for select() only). the previous exception-catch method also added a little stack tracing overhead anyway.
Diffstat (limited to 'lib')
-rw-r--r--lib/sqlalchemy/orm/query.py8
-rw-r--r--lib/sqlalchemy/sql.py17
2 files changed, 11 insertions, 14 deletions
diff --git a/lib/sqlalchemy/orm/query.py b/lib/sqlalchemy/orm/query.py
index 5d82b594f..ce2f78bb7 100644
--- a/lib/sqlalchemy/orm/query.py
+++ b/lib/sqlalchemy/orm/query.py
@@ -241,12 +241,10 @@ class Query(object):
ret = self.extension.select(self, arg=arg, **kwargs)
if ret is not mapper.EXT_PASS:
return ret
- try:
- s = arg._selectable()
- except AttributeError:
- return self.select_whereclause(whereclause=arg, **kwargs)
+ if isinstance(arg, sql.FromClause):
+ return self.select_statement(arg, **kwargs)
else:
- return self.select_statement(s, **kwargs)
+ return self.select_whereclause(whereclause=arg, **kwargs)
def select_whereclause(self, whereclause=None, params=None, **kwargs):
"""given a WHERE criterion, create a SELECT statement, execute and return the resulting instances."""
diff --git a/lib/sqlalchemy/sql.py b/lib/sqlalchemy/sql.py
index dbd119fd1..e0bae905a 100644
--- a/lib/sqlalchemy/sql.py
+++ b/lib/sqlalchemy/sql.py
@@ -1076,8 +1076,14 @@ class _BinaryClause(ClauseElement):
self.left.compare(other.left) and self.right.compare(other.right)
)
-class _BooleanExpression(_BinaryClause):
- """represents a boolean expression, which is only useable in WHERE criterion."""
+class _BinaryExpression(_BinaryClause, ColumnElement):
+ """represents a binary expression, which can be in a WHERE criterion or in the column list
+ of a SELECT. By adding "ColumnElement" to its inherited list, it becomes a Selectable
+ unit which can be placed in the column list of a SELECT."""
+ pass
+
+class _BooleanExpression(_BinaryExpression):
+ """represents a boolean expression."""
def __init__(self, *args, **kwargs):
self.negate = kwargs.pop('negate', None)
super(_BooleanExpression, self).__init__(*args, **kwargs)
@@ -1087,13 +1093,6 @@ class _BooleanExpression(_BinaryClause):
else:
return super(_BooleanExpression, self)._negate()
-class _BinaryExpression(_BinaryClause, ColumnElement):
- """represents a binary expression, which can be in a WHERE criterion or in the column list
- of a SELECT. By adding "ColumnElement" to its inherited list, it becomes a Selectable
- unit which can be placed in the column list of a SELECT."""
- pass
-
-
class Join(FromClause):
def __init__(self, left, right, onclause=None, isouter = False):
self.left = left._selectable()