From 6840fc6bb635f78df85077beeaaca52d31836aff Mon Sep 17 00:00:00 2001 From: Mike Bayer Date: Fri, 9 May 2008 19:20:49 +0000 Subject: [PATCH] - more portable tests for eager/inheritance joins - bumped 2.4 call count for profile test_select - don't need initialize_properties() during reentrant compile() call (for now) --- lib/sqlalchemy/orm/mapper.py | 4 +++- test/orm/inheritance/query.py | 34 ++++++---------------------------- test/profiling/compiler.py | 2 +- 3 files changed, 10 insertions(+), 30 deletions(-) diff --git a/lib/sqlalchemy/orm/mapper.py b/lib/sqlalchemy/orm/mapper.py index 6d79f6cd50..f8cf4e6edc 100644 --- a/lib/sqlalchemy/orm/mapper.py +++ b/lib/sqlalchemy/orm/mapper.py @@ -347,7 +347,9 @@ class Mapper(object): _COMPILE_MUTEX.acquire() global _already_compiling if _already_compiling: - self.__initialize_properties() + # re-entrance to compile() occurs rarely, when a class-mapped construct is + # used within a ForeignKey, something that is possible + # when using the declarative layer return _already_compiling = True try: diff --git a/test/orm/inheritance/query.py b/test/orm/inheritance/query.py index 6a40efc4ac..30694d8c30 100644 --- a/test/orm/inheritance/query.py +++ b/test/orm/inheritance/query.py @@ -187,40 +187,14 @@ def make_test(select_type): def test_primary_eager_aliasing(self): sess = create_session() - # assert the SQL itself here to ensure no over-joining is taking place - if select_type == '': - self.assert_compile( - sess.query(Person).options(eagerload(Engineer.machines)).limit(2).offset(1).with_labels().statement, - "SELECT people.person_id AS people_person_id, people.company_id AS people_company_id, "\ - "people.name AS people_name, people.type AS people_type FROM people ORDER BY people.person_id LIMIT 2 OFFSET 1", - dialect=default.DefaultDialect()) - def go(): self.assertEquals(sess.query(Person).options(eagerload(Engineer.machines))[1:3].all(), all_employees[1:3]) self.assert_sql_count(testing.db, go, {'':6, 'Polymorphic':3}.get(select_type, 4)) sess = create_session() - if select_type == '': - self.assert_compile( - sess.query(Person).with_polymorphic('*').options(eagerload(Engineer.machines)).limit(2).offset(1).with_labels().statement, - "SELECT anon_1.people_person_id AS anon_1_people_person_id, anon_1.people_company_id AS anon_1_people_company_id, "\ - "anon_1.people_name AS anon_1_people_name, anon_1.people_type AS anon_1_people_type, anon_1.engineers_person_id AS "\ - "anon_1_engineers_person_id, anon_1.engineers_status AS anon_1_engineers_status, anon_1.engineers_engineer_name AS "\ - "anon_1_engineers_engineer_name, anon_1.engineers_primary_language AS anon_1_engineers_primary_language, "\ - "anon_1.managers_person_id AS anon_1_managers_person_id, anon_1.managers_status AS anon_1_managers_status, "\ - "anon_1.managers_manager_name AS anon_1_managers_manager_name, anon_1.boss_boss_id AS anon_1_boss_boss_id, "\ - "anon_1.boss_golf_swing AS anon_1_boss_golf_swing, machines_1.machine_id AS machines_1_machine_id, machines_1.name AS "\ - "machines_1_name, machines_1.engineer_id AS machines_1_engineer_id FROM (SELECT people.person_id AS people_person_id, "\ - "people.company_id AS people_company_id, people.name AS people_name, people.type AS people_type, engineers.person_id AS "\ - "engineers_person_id, engineers.status AS engineers_status, engineers.engineer_name AS engineers_engineer_name, "\ - "engineers.primary_language AS engineers_primary_language, managers.person_id AS managers_person_id, managers.status "\ - "AS managers_status, managers.manager_name AS managers_manager_name, boss.boss_id AS boss_boss_id, boss.golf_swing "\ - "AS boss_golf_swing FROM people LEFT OUTER JOIN engineers ON people.person_id = engineers.person_id LEFT OUTER JOIN "\ - "managers ON people.person_id = managers.person_id LEFT OUTER JOIN boss ON managers.person_id = boss.boss_id ORDER BY "\ - "people.person_id LIMIT 2 OFFSET 1) AS anon_1 LEFT OUTER JOIN machines AS machines_1 ON anon_1.engineers_person_id = "\ - "machines_1.engineer_id ORDER BY anon_1.people_person_id, machines_1.machine_id", - dialect=default.DefaultDialect()) + # assert the JOINs dont over JOIN + assert sess.query(Person).with_polymorphic('*').options(eagerload(Engineer.machines)).limit(2).offset(1).with_labels().statement.count().scalar() == 2 def go(): self.assertEquals(sess.query(Person).with_polymorphic('*').options(eagerload(Engineer.machines))[1:3].all(), all_employees[1:3]) @@ -802,6 +776,10 @@ class SelfReferentialM2MTest(ORMTest, AssertsCompiledSQL): "(SELECT parent.id AS parent_id, parent.cls AS parent_cls, child2.id AS child2_id FROM parent JOIN child2 ON parent.id = child2.id) "\ "AS anon_2 ON anon_2.parent_id = secondary_1.left_id ORDER BY anon_1.child1_id" , dialect=default.DefaultDialect()) + + # another way to check + assert q.limit(1).with_labels().statement.count().scalar() == 1 + assert q.first() is c1 if __name__ == "__main__": diff --git a/test/profiling/compiler.py b/test/profiling/compiler.py index cd0a29ee3d..a62c63c6b8 100644 --- a/test/profiling/compiler.py +++ b/test/profiling/compiler.py @@ -23,7 +23,7 @@ class CompileTest(TestBase, AssertsExecutionResults): def test_update(self): t1.update().compile() - @profiling.function_call_count(228, versions={'2.3': 153, '2.4':116}) + @profiling.function_call_count(228, versions={'2.3': 153, '2.4':122}) def test_select(self): s = select([t1], t1.c.c2==t2.c.c1) s.compile() -- 2.47.3