From: Mike Bayer Date: Fri, 16 May 2008 21:27:51 +0000 (+0000) Subject: auto exists remembers to alias in the case of explicit selectable with of_type()... X-Git-Tag: rel_0_5beta1~66 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=e314a548bd506385cfc51bffc16741e01b046f77;p=thirdparty%2Fsqlalchemy%2Fsqlalchemy.git auto exists remembers to alias in the case of explicit selectable with of_type(), [ticket:1047] --- diff --git a/lib/sqlalchemy/orm/properties.py b/lib/sqlalchemy/orm/properties.py index 8d31963c3e..a357aa437e 100644 --- a/lib/sqlalchemy/orm/properties.py +++ b/lib/sqlalchemy/orm/properties.py @@ -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 diff --git a/test/orm/inheritance/query.py b/test/orm/inheritance/query.py index 5ef8bb1f96..62d315e71a 100644 --- a/test/orm/inheritance/query.py +++ b/test/orm/inheritance/query.py @@ -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')