]> git.ipfire.org Git - thirdparty/sqlalchemy/sqlalchemy.git/commitdiff
adjustment to compile synchronizers which allows many-to-many synchronize to work...
authorMike Bayer <mike_mp@zzzcomputing.com>
Sun, 26 Feb 2006 06:14:12 +0000 (06:14 +0000)
committerMike Bayer <mike_mp@zzzcomputing.com>
Sun, 26 Feb 2006 06:14:12 +0000 (06:14 +0000)
lib/sqlalchemy/mapping/properties.py
test/mapper.py

index c8f56746da28169b23122bc7cd7a6872e85c1e99..5aaa368f9ed5ebc0f20dc36fc404dd9284b6342d 100644 (file)
@@ -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:
index 102c20966729a37e7054043a73ecfa0e7d50ca59..aa0b2289102f3bbdc96e785fdf9fe3b1888ee859 100644 (file)
@@ -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):