summaryrefslogtreecommitdiff
path: root/test/orm/inheritance/test_query.py
diff options
context:
space:
mode:
Diffstat (limited to 'test/orm/inheritance/test_query.py')
-rw-r--r--test/orm/inheritance/test_query.py198
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)
+
+