diff options
Diffstat (limited to 'test/orm/inheritance/test_query.py')
-rw-r--r-- | test/orm/inheritance/test_query.py | 198 |
1 files changed, 198 insertions, 0 deletions
diff --git a/test/orm/inheritance/test_query.py b/test/orm/inheritance/test_query.py index 243ed4a7b..c74ddcad6 100644 --- a/test/orm/inheritance/test_query.py +++ b/test/orm/inheritance/test_query.py @@ -1115,3 +1115,201 @@ class SelfReferentialM2MTest(_base.MappedTest, AssertsCompiledSQL): assert q.first() is c1 +class EagerToSubclassTest(_base.MappedTest): + """Test eagerloads to subclass mappers""" + + run_setup_classes = 'once' + run_setup_mappers = 'once' + run_inserts = 'once' + run_deletes = None + + @classmethod + def define_tables(cls, metadata): + Table('parent', metadata, + Column('id', Integer, primary_key=True, test_needs_autoincrement=True), + Column('data', String(10)), + ) + + Table('base', metadata, + Column('id', Integer, primary_key=True, test_needs_autoincrement=True), + Column('type', String(10)), + ) + + Table('sub', metadata, + Column('id', Integer, ForeignKey('base.id'), primary_key=True), + Column('data', String(10)), + Column('parent_id', Integer, ForeignKey('parent.id'), nullable=False) + ) + + @classmethod + @testing.resolve_artifact_names + def setup_classes(cls): + class Parent(_base.ComparableEntity): + pass + + class Base(_base.ComparableEntity): + pass + + class Sub(Base): + pass + + @classmethod + @testing.resolve_artifact_names + def setup_mappers(cls): + mapper(Parent, parent, properties={ + 'children':relation(Sub) + }) + mapper(Base, base, polymorphic_on=base.c.type, polymorphic_identity='b') + mapper(Sub, sub, inherits=Base, polymorphic_identity='s') + + @classmethod + @testing.resolve_artifact_names + def insert_data(cls): + sess = create_session() + p1 = Parent(data='p1', children=[Sub(data='s1'), Sub(data='s2'), Sub(data='s3')]) + p2 = Parent(data='p2', children=[Sub(data='s4'), Sub(data='s5')]) + sess.add(p1) + sess.add(p2) + sess.flush() + + @testing.resolve_artifact_names + def test_eagerload(self): + sess = create_session() + def go(): + eq_( + sess.query(Parent).options(eagerload(Parent.children)).all(), + [ + Parent(data='p1', children=[Sub(data='s1'), Sub(data='s2'), Sub(data='s3')]), + Parent(data='p2', children=[Sub(data='s4'), Sub(data='s5')]) + ] + ) + self.assert_sql_count(testing.db, go, 1) + + @testing.resolve_artifact_names + def test_contains_eager(self): + sess = create_session() + def go(): + eq_( + sess.query(Parent).join(Parent.children).options(contains_eager(Parent.children)).all(), + [ + Parent(data='p1', children=[Sub(data='s1'), Sub(data='s2'), Sub(data='s3')]), + Parent(data='p2', children=[Sub(data='s4'), Sub(data='s5')]) + ] + ) + self.assert_sql_count(testing.db, go, 1) + +class SubClassEagerToSubclassTest(_base.MappedTest): + """Test eagerloads from subclass to subclass mappers""" + + run_setup_classes = 'once' + run_setup_mappers = 'once' + run_inserts = 'once' + run_deletes = None + + @classmethod + def define_tables(cls, metadata): + Table('parent', metadata, + Column('id', Integer, primary_key=True, test_needs_autoincrement=True), + Column('type', String(10)), + ) + + Table('subparent', metadata, + Column('id', Integer, ForeignKey('parent.id'), primary_key=True), + Column('data', String(10)), + ) + + Table('base', metadata, + Column('id', Integer, primary_key=True, test_needs_autoincrement=True), + Column('type', String(10)), + ) + + Table('sub', metadata, + Column('id', Integer, ForeignKey('base.id'), primary_key=True), + Column('data', String(10)), + Column('subparent_id', Integer, ForeignKey('subparent.id'), nullable=False) + ) + + @classmethod + @testing.resolve_artifact_names + def setup_classes(cls): + class Parent(_base.ComparableEntity): + pass + + class Subparent(Parent): + pass + + class Base(_base.ComparableEntity): + pass + + class Sub(Base): + pass + + @classmethod + @testing.resolve_artifact_names + def setup_mappers(cls): + mapper(Parent, parent, polymorphic_on=parent.c.type, polymorphic_identity='b') + mapper(Subparent, subparent, inherits=Parent, polymorphic_identity='s', properties={ + 'children':relation(Sub) + }) + mapper(Base, base, polymorphic_on=base.c.type, polymorphic_identity='b') + mapper(Sub, sub, inherits=Base, polymorphic_identity='s') + + @classmethod + @testing.resolve_artifact_names + def insert_data(cls): + sess = create_session() + p1 = Subparent(data='p1', children=[Sub(data='s1'), Sub(data='s2'), Sub(data='s3')]) + p2 = Subparent(data='p2', children=[Sub(data='s4'), Sub(data='s5')]) + sess.add(p1) + sess.add(p2) + sess.flush() + + @testing.resolve_artifact_names + def test_eagerload(self): + sess = create_session() + def go(): + eq_( + sess.query(Subparent).options(eagerload(Subparent.children)).all(), + [ + Subparent(data='p1', children=[Sub(data='s1'), Sub(data='s2'), Sub(data='s3')]), + Subparent(data='p2', children=[Sub(data='s4'), Sub(data='s5')]) + ] + ) + self.assert_sql_count(testing.db, go, 1) + + sess.expunge_all() + def go(): + eq_( + sess.query(Subparent).options(eagerload("children")).all(), + [ + Subparent(data='p1', children=[Sub(data='s1'), Sub(data='s2'), Sub(data='s3')]), + Subparent(data='p2', children=[Sub(data='s4'), Sub(data='s5')]) + ] + ) + self.assert_sql_count(testing.db, go, 1) + + @testing.resolve_artifact_names + def test_contains_eager(self): + sess = create_session() + def go(): + eq_( + sess.query(Subparent).join(Subparent.children).options(contains_eager(Subparent.children)).all(), + [ + Subparent(data='p1', children=[Sub(data='s1'), Sub(data='s2'), Sub(data='s3')]), + Subparent(data='p2', children=[Sub(data='s4'), Sub(data='s5')]) + ] + ) + self.assert_sql_count(testing.db, go, 1) + sess.expunge_all() + + def go(): + eq_( + sess.query(Subparent).join(Subparent.children).options(contains_eager("children")).all(), + [ + Subparent(data='p1', children=[Sub(data='s1'), Sub(data='s2'), Sub(data='s3')]), + Subparent(data='p2', children=[Sub(data='s4'), Sub(data='s5')]) + ] + ) + self.assert_sql_count(testing.db, go, 1) + + |