summaryrefslogtreecommitdiff
path: root/test
diff options
context:
space:
mode:
Diffstat (limited to 'test')
-rw-r--r--test/aaa_profiling/test_orm.py91
-rw-r--r--test/ext/test_serializer.py1
-rw-r--r--test/profiles.txt16
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