]> git.ipfire.org Git - thirdparty/sqlalchemy/sqlalchemy.git/commitdiff
auto exists remembers to alias in the case of explicit selectable with of_type()...
authorMike Bayer <mike_mp@zzzcomputing.com>
Fri, 16 May 2008 21:27:51 +0000 (21:27 +0000)
committerMike Bayer <mike_mp@zzzcomputing.com>
Fri, 16 May 2008 21:27:51 +0000 (21:27 +0000)
lib/sqlalchemy/orm/properties.py
test/orm/inheritance/query.py

index 8d31963c3edcbbc09dc044a0284d848beed9b547..a357aa437eb7fe8140e4da37101e881152449b3b 100644 (file)
@@ -342,9 +342,11 @@ class PropertyLoader(StrategizedProperty):
             if getattr(self, '_of_type', None):
                 target_mapper = self._of_type
                 to_selectable = target_mapper._with_polymorphic_selectable
+                if self.prop._is_self_referential():
+                    to_selectable = to_selectable.alias()
             else:
                 to_selectable = None
-            
+
             pj, sj, source, dest, secondary, target_adapter = self.prop._create_joins(dest_polymorphic=True, dest_selectable=to_selectable)
 
             for k in kwargs:
@@ -767,7 +769,7 @@ class PropertyLoader(StrategizedProperty):
                 aliased = True
             else:
                 dest_selectable = self.mapper.mapped_table
-                
+            
             if self._is_self_referential() and source_selectable is None:
                 dest_selectable = dest_selectable.alias()
                 aliased = True
index 5ef8bb1f9650b6a3d202d92ae6b73103b0064969..62d315e71ab33e32a09b927b4562dcc6fafc2a5a 100644 (file)
@@ -647,6 +647,15 @@ class SelfReferentialTest(ORMTest):
         sess.clear()
         
         self.assertEquals(sess.query(Engineer).filter(Engineer.reports_to.has(Person.name=='dogbert')).first(), Engineer(name='dilbert'))
+
+    def test_oftype_aliases_in_exists(self):
+        e1 = Engineer(name='dilbert', primary_language='java')
+        e2 = Engineer(name='wally', primary_language='c++', reports_to=e1)
+        sess = create_session()
+        sess.add_all([e1, e2])
+        sess.flush()
+        
+        self.assertEquals(sess.query(Engineer).filter(Engineer.reports_to.of_type(Engineer).has(Engineer.name=='dilbert')).first(), e2)
         
     def test_join(self):
         p1 = Person(name='dogbert')