From: Mike Bayer Date: Sun, 26 Feb 2006 06:14:12 +0000 (+0000) Subject: adjustment to compile synchronizers which allows many-to-many synchronize to work... X-Git-Tag: rel_0_1_3~33 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=0e436bdbee043c651e4b389155823374aceaceed;p=thirdparty%2Fsqlalchemy%2Fsqlalchemy.git adjustment to compile synchronizers which allows many-to-many synchronize to work even when one side of the relation has both tables in it (new unittest will be added to inheritance.py to show this...) --- diff --git a/lib/sqlalchemy/mapping/properties.py b/lib/sqlalchemy/mapping/properties.py index c8f56746da..5aaa368f9e 100644 --- a/lib/sqlalchemy/mapping/properties.py +++ b/lib/sqlalchemy/mapping/properties.py @@ -171,7 +171,6 @@ class PropertyLoader(MapperProperty): else: if self.primaryjoin is None: self.primaryjoin = sql.join(parent.table, self.target).onclause - # if the foreign key wasnt specified and theres no assocaition table, try to figure # out who is dependent on who. we dont need all the foreign keys represented in the join, # just one of them. @@ -572,7 +571,10 @@ class PropertyLoader(MapperProperty): elif self.direction == PropertyLoader.MANYTOONE: self.syncrules.append(SyncRule(self.mapper, tt, pt, dest_mapper=self.parent)) else: - raise AssertionError("assert failed") + if visiting is self.primaryjoin: + self.syncrules.append(SyncRule(self.parent, pt, st, direction=PropertyLoader.ONETOMANY)) + else: + self.syncrules.append(SyncRule(self.mapper, tt, st, direction=PropertyLoader.MANYTOONE)) elif pt and st: self.syncrules.append(SyncRule(self.parent, pt, st, direction=PropertyLoader.ONETOMANY)) elif tt and st: @@ -580,8 +582,10 @@ class PropertyLoader(MapperProperty): self.syncrules = [] processor = BinaryVisitor(compile) + visiting = self.primaryjoin self.primaryjoin.accept_visitor(processor) if self.secondaryjoin is not None: + visiting = self.secondaryjoin self.secondaryjoin.accept_visitor(processor) if len(self.syncrules) == 0: raise ArgumentError("No syncrules generated for join criterion " + str(self.primaryjoin)) @@ -622,6 +626,7 @@ class PropertyLoader(MapperProperty): self.direction = direction self.dest_mapper = dest_mapper self.dest_column = dest_column + #print "SyncRule", source_mapper, source_column, dest_column, dest_mapper, direction def execute(self, source, dest, obj, child, clearkeys): if self.direction is not None: diff --git a/test/mapper.py b/test/mapper.py index 102c209667..aa0b228910 100644 --- a/test/mapper.py +++ b/test/mapper.py @@ -254,6 +254,29 @@ class PropertyTest(MapperSuperTest): au = AddressUser.mapper.get_by(user_name='jack') self.assert_(au.email_address == 'jack@gmail.com') + def testinherits2(self): + class _Order(object): + pass + class _Address(object): + pass + class AddressUser(_Address): + pass + assign_mapper(_Order, orders) + assign_mapper(_Address, addresses) + assign_mapper(AddressUser, users, inherits = _Address.mapper, + properties = { + 'orders' : relation(_Order.mapper, lazy=False) + }) + l = AddressUser.mapper.select() + jack = l[0] + self.assert_(jack.user_name=='jack') + jack.email_address = 'jack@gmail.com' + objectstore.commit() + objectstore.clear() + au = AddressUser.mapper.get_by(user_name='jack') + self.assert_(au.email_address == 'jack@gmail.com') + + class DeferredTest(MapperSuperTest): def testbasic(self):