]> git.ipfire.org Git - thirdparty/sqlalchemy/sqlalchemy.git/commitdiff
here's the flat join thing. it just works. Changing the existing compiled SQL...
authorMike Bayer <mike_mp@zzzcomputing.com>
Tue, 4 Jun 2013 20:21:25 +0000 (16:21 -0400)
committerMike Bayer <mike_mp@zzzcomputing.com>
Tue, 4 Jun 2013 20:21:25 +0000 (16:21 -0400)
might even be most of the tests we need (though dedicated sql tests would be needed anyway)

lib/sqlalchemy/orm/strategies.py
lib/sqlalchemy/orm/util.py
lib/sqlalchemy/sql/expression.py

index cabfb35b96b440dd18cf5f95b5f34e3b29125cee..baaf4cb92983ebce68457de6e51c0bc0c154270c 100644 (file)
@@ -1089,7 +1089,8 @@ class JoinedLoader(AbstractRelationshipLoader):
             to_adapt = with_poly_info.entity
         else:
             to_adapt = orm_util.AliasedClass(self.mapper,
-                                use_mapper_path=True)
+                                use_mapper_path=True,
+                                flat=True)
         clauses = orm_util.ORMAdapter(
                     to_adapt,
                     equivalents=self.mapper._equivalent_columns,
index bd8228f2c1cd39b39dbc29d7574625a8a72dba78..3da6e89e3fcc9acd53346111d467a3c43ab57104 100644 (file)
@@ -493,6 +493,7 @@ class AliasedClass(object):
     """
     def __init__(self, cls, alias=None,
                             name=None,
+                            flat=False,
                             adapt_on_names=False,
                             #  TODO: None for default here?
                             with_polymorphic_mappers=(),
@@ -501,7 +502,7 @@ class AliasedClass(object):
                             use_mapper_path=False):
         mapper = _class_to_mapper(cls)
         if alias is None:
-            alias = mapper._with_polymorphic_selectable.alias(name=name)
+            alias = mapper._with_polymorphic_selectable.alias(name=name, flat=flat)
         self._aliased_insp = AliasedInsp(
             self,
             mapper,
@@ -837,7 +838,7 @@ def with_polymorphic(base, classes, selectable=False,
                     _with_polymorphic_args(classes, selectable,
                                 innerjoin=innerjoin)
     if aliased:
-        selectable = selectable.alias()
+        selectable = selectable.alias(flat=True)
     return AliasedClass(base,
                 selectable,
                 with_polymorphic_mappers=mappers,
index edab9e2901274546d3fad34207f525e44fbada8e..633a3ddba7b7bca4328cac01455a8dbd354e7a86 100644 (file)
@@ -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,