summaryrefslogtreecommitdiff
path: root/lib/sqlalchemy/sql/expression.py
diff options
context:
space:
mode:
authorMike Bayer <mike_mp@zzzcomputing.com>2013-06-04 16:21:25 -0400
committerMike Bayer <mike_mp@zzzcomputing.com>2013-06-04 16:21:25 -0400
commit51e1019f610f083ac4d8c850589cdf52cff044da (patch)
treedb56526f4fd2fb9d0e63c6dbef151075f248ca5c /lib/sqlalchemy/sql/expression.py
parentfa3d18a47cb6f307b18da880a5f8f4c06a6023b4 (diff)
downloadsqlalchemy-51e1019f610f083ac4d8c850589cdf52cff044da.tar.gz
here's the flat join thing. it just works. Changing the existing compiled SQL assertions
might even be most of the tests we need (though dedicated sql tests would be needed anyway)
Diffstat (limited to 'lib/sqlalchemy/sql/expression.py')
-rw-r--r--lib/sqlalchemy/sql/expression.py19
1 files changed, 14 insertions, 5 deletions
diff --git a/lib/sqlalchemy/sql/expression.py b/lib/sqlalchemy/sql/expression.py
index edab9e290..633a3ddba 100644
--- a/lib/sqlalchemy/sql/expression.py
+++ b/lib/sqlalchemy/sql/expression.py
@@ -795,7 +795,7 @@ def intersect_all(*selects, **kwargs):
return CompoundSelect(CompoundSelect.INTERSECT_ALL, *selects, **kwargs)
-def alias(selectable, name=None):
+def alias(selectable, name=None, flat=False):
"""Return an :class:`.Alias` object.
An :class:`.Alias` represents any :class:`.FromClause`
@@ -2634,7 +2634,7 @@ class FromClause(Selectable):
return Join(self, right, onclause, True)
- def alias(self, name=None):
+ def alias(self, name=None, flat=False):
"""return an alias of this :class:`.FromClause`.
This is shorthand for calling::
@@ -3971,7 +3971,7 @@ class Join(FromClause):
def bind(self):
return self.left.bind or self.right.bind
- def alias(self, name=None):
+ def alias(self, name=None, flat=False):
"""return an alias of this :class:`.Join`.
Used against a :class:`.Join` object,
@@ -3999,7 +3999,16 @@ class Join(FromClause):
aliases.
"""
- return self.select(use_labels=True, correlate=False).alias(name)
+ if flat:
+ assert name is None, "Can't send name argument with flat"
+ left_a, right_a = self.left.alias(), self.right.alias()
+ adapter = sqlutil.ClauseAdapter(left_a).\
+ chain(sqlutil.ClauseAdapter(right_a))
+
+ return left_a.join(right_a,
+ adapter.traverse(self.onclause), isouter=self.isouter)
+ else:
+ return self.select(use_labels=True, correlate=False).alias(name)
@property
def _hide_froms(self):
@@ -4129,7 +4138,7 @@ class CTE(Alias):
self._restates = _restates
super(CTE, self).__init__(selectable, name=name)
- def alias(self, name=None):
+ def alias(self, name=None, flat=False):
return CTE(
self.original,
name=name,