diff options
Diffstat (limited to 'test')
| -rw-r--r-- | test/aaa_profiling/test_orm.py | 91 | ||||
| -rw-r--r-- | test/ext/test_serializer.py | 1 | ||||
| -rw-r--r-- | test/profiles.txt | 16 |
3 files changed, 107 insertions, 1 deletions
diff --git a/test/aaa_profiling/test_orm.py b/test/aaa_profiling/test_orm.py index 209bc02e3..e2df85a33 100644 --- a/test/aaa_profiling/test_orm.py +++ b/test/aaa_profiling/test_orm.py @@ -1,12 +1,16 @@ +from sqlalchemy import and_ from sqlalchemy import ForeignKey from sqlalchemy import inspect from sqlalchemy import Integer +from sqlalchemy import join from sqlalchemy import String from sqlalchemy import testing +from sqlalchemy.orm import aliased from sqlalchemy.orm import Bundle from sqlalchemy.orm import configure_mappers from sqlalchemy.orm import defaultload from sqlalchemy.orm import defer +from sqlalchemy.orm import join as orm_join from sqlalchemy.orm import joinedload from sqlalchemy.orm import Load from sqlalchemy.orm import mapper @@ -818,6 +822,93 @@ class JoinedEagerLoadTest(fixtures.MappedTest): go() +class JoinConditionTest(fixtures.DeclarativeMappedTest): + @classmethod + def setup_classes(cls): + class A(cls.DeclarativeBasic): + __tablename__ = "a" + + id = Column(Integer, primary_key=True) + b_id = Column(ForeignKey("b.id")) + b = relationship("B") + + class B(cls.DeclarativeBasic): + __tablename__ = "b" + + id = Column(Integer, primary_key=True) + d_id = Column(ForeignKey("d.id")) + + class C(cls.DeclarativeBasic): + __tablename__ = "c" + + id = Column(Integer, primary_key=True) + a_id = Column(ForeignKey("a.id")) + d_id = Column(ForeignKey("d.id")) + + class D(cls.DeclarativeBasic): + __tablename__ = "d" + + id = Column(Integer, primary_key=True) + + j = join(B, D, B.d_id == D.id).join(C, C.d_id == D.id) + + A.d = relationship( + "D", + secondary=j, + primaryjoin=and_(A.b_id == B.id, A.id == C.a_id), + secondaryjoin=D.id == B.d_id, + uselist=False, + viewonly=True, + ) + + def test_a_to_b_plain(self): + A, B = self.classes("A", "B") + + # should not use aliasing or adaption so should be cheap + @profiling.function_call_count(times=50) + def go(): + orm_join(A, B, A.b) + + go() + + def test_a_to_b_aliased(self): + A, B = self.classes("A", "B") + + a1 = aliased(A) + + # uses aliasing, therefore adaption which is expensive + @profiling.function_call_count(times=50) + def go(): + orm_join(a1, B, a1.b) + + go() + + def test_a_to_d(self): + A, D = self.classes("A", "D") + + # the join condition between A and D uses a secondary selectable with + # overlap so incurs aliasing, which is expensive, there is also a check + # that determines that this overlap exists which is not currently + # cached + @profiling.function_call_count(times=50) + def go(): + orm_join(A, D, A.d) + + go() + + def test_a_to_d_aliased(self): + A, D = self.classes("A", "D") + + a1 = aliased(A) + + # aliased, uses adaption therefore expensive + @profiling.function_call_count(times=50) + def go(): + orm_join(a1, D, a1.d) + + go() + + class BranchedOptionTest(fixtures.MappedTest): @classmethod def define_tables(cls, metadata): diff --git a/test/ext/test_serializer.py b/test/ext/test_serializer.py index e5490146c..e6c7b717f 100644 --- a/test/ext/test_serializer.py +++ b/test/ext/test_serializer.py @@ -243,7 +243,6 @@ class SerializeTest(AssertsCompiledSQL, fixtures.MappedTest): j2 = serializer.loads(serializer.dumps(j, -1), users.metadata) assert j2.left is j.left assert j2.right is j.right - assert j2._target_adapter._next @testing.exclude( "sqlite", "<=", (3, 5, 9), "id comparison failing on the buildbot" diff --git a/test/profiles.txt b/test/profiles.txt index 493f27698..89c01f5d1 100644 --- a/test/profiles.txt +++ b/test/profiles.txt @@ -543,6 +543,22 @@ test.aaa_profiling.test_orm.DeferOptionsTest.test_defer_many_cols 3.7_postgresql test.aaa_profiling.test_orm.DeferOptionsTest.test_defer_many_cols 3.7_sqlite_pysqlite_dbapiunicode_cextensions 23259 test.aaa_profiling.test_orm.DeferOptionsTest.test_defer_many_cols 3.7_sqlite_pysqlite_dbapiunicode_nocextensions 30268 +# TEST: test.aaa_profiling.test_orm.JoinConditionTest.test_a_to_b_aliased + +test.aaa_profiling.test_orm.JoinConditionTest.test_a_to_b_aliased 3.7_sqlite_pysqlite_dbapiunicode_nocextensions 10313 + +# TEST: test.aaa_profiling.test_orm.JoinConditionTest.test_a_to_b_plain + +test.aaa_profiling.test_orm.JoinConditionTest.test_a_to_b_plain 3.7_sqlite_pysqlite_dbapiunicode_nocextensions 3256 + +# TEST: test.aaa_profiling.test_orm.JoinConditionTest.test_a_to_d + +test.aaa_profiling.test_orm.JoinConditionTest.test_a_to_d 3.7_sqlite_pysqlite_dbapiunicode_nocextensions 106798 + +# TEST: test.aaa_profiling.test_orm.JoinConditionTest.test_a_to_d_aliased + +test.aaa_profiling.test_orm.JoinConditionTest.test_a_to_d_aliased 3.7_sqlite_pysqlite_dbapiunicode_nocextensions 104564 + # TEST: test.aaa_profiling.test_orm.JoinedEagerLoadTest.test_build_query test.aaa_profiling.test_orm.JoinedEagerLoadTest.test_build_query 2.7_mssql_pyodbc_dbapiunicode_nocextensions 439163 |
