[Sqlalchemy-commits] sqlalchemy: - add test profiling merge() behavior when merging l...
Brought to you by:
zzzeek
From: <co...@sq...> - 2011-08-13 02:48:56
|
details: http://hg.sqlalchemy.org/sqlalchemy/sqlalchemy/rev/8faa4a7fabfa changeset: 7797:8faa4a7fabfa user: zzzeek date: Fri Aug 12 22:48:40 2011 -0400 description: - add test profiling merge() behavior when merging lots of bidirectional collections/m2os, collections present in given merge field. This shows that the change proposed in [ticket:2221] adds over 10% method call overhead including significantly more SQL statements. diffstat: test/aaa_profiling/test_orm.py | 75 ++++++++++++++++++++++++++++++++++++++++++ 1 files changed, 75 insertions(+), 0 deletions(-) diffs (83 lines): diff -r cf051117a82f -r 8faa4a7fabfa test/aaa_profiling/test_orm.py --- a/test/aaa_profiling/test_orm.py Tue Aug 09 19:45:20 2011 -0400 +++ b/test/aaa_profiling/test_orm.py Fri Aug 12 22:48:40 2011 -0400 @@ -195,4 +195,79 @@ p.child go() +class MergeBackrefsTest(fixtures.MappedTest): + @classmethod + def define_tables(cls, metadata): + Table('a', metadata, + Column('id', Integer, primary_key=True), + Column('c_id', Integer, ForeignKey('c.id')) + ) + Table('b', metadata, + Column('id', Integer, primary_key=True), + Column('a_id', Integer, ForeignKey('a.id')) + ) + Table('c', metadata, + Column('id', Integer, primary_key=True), + ) + Table('d', metadata, + Column('id', Integer, primary_key=True), + Column('a_id', Integer, ForeignKey('a.id')) + ) + @classmethod + def setup_classes(cls): + class A(cls.Basic): + pass + class B(cls.Basic): + pass + class C(cls.Basic): + pass + class D(cls.Basic): + pass + + @classmethod + def setup_mappers(cls): + A, B, C, D = cls.classes.A, cls.classes.B, \ + cls.classes.C, cls.classes.D + a, b, c, d= cls.tables.a, cls.tables.b, \ + cls.tables.c, cls.tables.d + mapper(A, a, properties={ + 'bs':relationship(B, backref='a'), + 'c':relationship(C, backref='as'), + 'ds':relationship(D, backref='a'), + }) + mapper(B, b) + mapper(C, c) + mapper(D, d) + + @classmethod + def insert_data(cls): + A, B, C, D = cls.classes.A, cls.classes.B, \ + cls.classes.C, cls.classes.D + s = Session() + s.add_all([ + A(id=i, + bs=[B(id=(i * 50) + j) for j in xrange(1, 50)], + c=C(id=i), + ds=[D(id=(i * 50) + j) for j in xrange(1, 50)] + ) + for i in xrange(1, 50) + ]) + s.commit() + + @profiling.function_call_count(1092497, variance=.10) + def test_merge_pending_with_all_pks(self): + A, B, C, D = self.classes.A, self.classes.B, \ + self.classes.C, self.classes.D + s = Session() + for a in [ + A(id=i, + bs=[B(id=(i * 50) + j) for j in xrange(1, 50)], + c=C(id=i), + ds=[D(id=(i * 50) + j) for j in xrange(1, 50)] + ) + for i in xrange(1, 50) + ]: + s.merge(a) + + |