]> git.ipfire.org Git - thirdparty/sqlalchemy/sqlalchemy.git/commitdiff
its ugly but the backwards/forwards parent/child thing works again, this time groupin...
authorMike Bayer <mike_mp@zzzcomputing.com>
Sat, 10 Sep 2005 18:23:58 +0000 (18:23 +0000)
committerMike Bayer <mike_mp@zzzcomputing.com>
Sat, 10 Sep 2005 18:23:58 +0000 (18:23 +0000)
lib/sqlalchemy/mapper.py
lib/sqlalchemy/objectstore.py

index 470ec016b947ed4ce51441a174fa5890724a3953..a12c01304e2b9015c87941006d8b4bc6e99457b6 100644 (file)
@@ -499,45 +499,44 @@ class PropertyLoader(MapperProperty):
         else:
             return sql.and_([pk == secondary.c[pk.name] for pk in primary.primary_keys])
 
-    def register_dependencies(self, obj, uow):
-        print 'hi2'
-        if self.uselist:
-            childlist = objectstore.uow().register_list_attribute(obj, self.key)
-        else:
-            childlist = objectstore.uow().register_attribute(obj, self.key)
-
+    def register_dependencies(self, objlist, uow):
         if self.secondaryjoin is not None:
-            print "hi6?"
-            # TODO: put a "row" as a dependency into the UOW somehow
             pass
         elif self.foreignkey.table == self.target:
-            print "hi4"
-            setter = ForeignKeySetter(self.parent, self.mapper, self.parent.table, self.target, self.secondary, obj)
-            def foo(obj, child):
-                setter.obj = obj
-                setter.child = child
-                setter.associationrow = {}
-                self.primaryjoin.accept_visitor(setter)
-                
-            for child in childlist.added_items():
-                uow.register_dependency(obj, child, foo)
+            uow.register_dependency(self.parent, self.mapper, self, objlist)
         elif self.foreignkey.table == self.parent.table:
-            print "hi5"
-            setter = ForeignKeySetter(self.parent, self.mapper, self.parent.table, self.target, self.secondary, None)
-
-         #   setter = ForeignKeySetter(self.mapper, self.parent, self.target, self.parent.table, self.secondary, obj)
-            def foo(obj, child):
-                print "hi7"
-                setter.obj = obj
-                setter.child = child
-                setter.associationrow = {}
-                self.primaryjoin.accept_visitor(setter)
-
-            for child in childlist.added_items():
-                uow.register_dependency(child, obj, foo)
+            uow.register_dependency(self.mapper, self.parent, self, objlist)
         else:
             raise " no foreign key ?"
 
+    def process_dependencies(self, deplist):
+
+        for obj in deplist:
+            if self.uselist:
+                childlist = objectstore.uow().register_list_attribute(obj, self.key)
+            else:
+                childlist = objectstore.uow().register_attribute(obj, self.key)
+
+            if self.secondaryjoin is not None:
+                pass
+            elif self.foreignkey.table == self.target:
+                setter = ForeignKeySetter(self.parent, self.mapper, self.parent.table, self.target, self.secondary, obj)
+                for child in childlist.added_items():
+                    setter.obj = obj
+                    setter.child = child
+                    setter.associationrow = {}
+                    self.primaryjoin.accept_visitor(setter)
+                
+            elif self.foreignkey.table == self.parent.table:
+                setter = ForeignKeySetter(self.parent, self.mapper, self.parent.table, self.target, self.secondary, None)
+                for child in childlist.added_items():
+                    setter.obj = child
+                    setter.child = obj
+                    setter.associationrow = {}
+                    self.primaryjoin.accept_visitor(setter)
+            else:
+                raise " no foreign key ?"
+        
     def save(self, obj, traverse):
         # saves child objects
         
index d6510e28627f09c2dd4d9356450aa2aa796bd141..31b3f9a22139d4ebe4ad53208a380a5d01e05433 100644 (file)
@@ -197,46 +197,48 @@ class UnitOfWork(object):
         
         # TODO: make some kinds of coherent objects here instead of tuples
         self.dependencies = {}
-        objects = []
+        
+        mappers = {}
         
         for obj in self.new:
             mapper = sqlalchemy.mapper.object_mapper(obj)
-            objects.append((obj, mapper))
-            mapper.register_dependencies(obj, self)
+            mapperlist = mappers.setdefault(mapper, [])
+            mapperlist.append(obj)
         for obj in self.dirty:
             mapper = sqlalchemy.mapper.object_mapper(obj)
-            objects.append((obj, mapper))
-            mapper.register_dependencies(obj, self)
+            mapperlist = mappers.setdefault(mapper, [])
+            mapperlist.append(obj)
 
-        def cmp(a, b):
-            if self.dependencies.has_key((a[0],b[0])):
+        for mapper in mappers.keys():
+            mapperlist = mappers[mapper]
+            mapper.register_dependencies(mapperlist, self)
+            
+        mapperlist = mappers.keys()
+        def compare(a, b):
+            if self.dependencies.has_key((a, b)):
                 return -1
-            elif self.dependencies.has_key((b[0],a[0])):
+            elif self.dependencies.has_key((b, a)):
                 return 1
             else:
                 return 0
-
-        objects.sort(cmp)
-        for rec in objects:
-            rec[1].save_obj(rec[0])
-            list = self.dependencies.setdefault(rec[0], [])
-            for dep in list:
-                dep[1](rec[0], dep[0])
-
-                
-#        for item in self.deleted:
-#            mapper = mapper.object_mapper(item)
-#        sort save instructions
-#        execute save instructions
-#           hmmmmm, as we save items, we have to populate the dependencies too
-#           then the save comes down to them and they are populated
+        mapperlist.sort(compare)
+        
+        for mapper in mapperlist:
+            obj_list = mappers[mapper]
+            deplist = self.dependencies.get(mapper, [])
+            for obj in obj_list:
+                mapper.save_obj(obj)
+            for dep in deplist:
+                (processor, list) = dep
+                processor.process_dependencies(list)
+
+        self.new.clear()
         self.dirty.clear()
-#        self.deleted.clear()
 
-    def register_dependency(self, obj, dependency, processor):
+    def register_dependency(self, obj, dependency, processor, list):
         self.dependencies[(obj, dependency)] = True
-        list = self.dependencies.setdefault(obj, [])
-        list.append((dependency, processor))
+        deplist = self.dependencies.setdefault(obj, [])
+        deplist.append((processor, list))
         
     
 uow = util.ScopedRegistry(lambda: UnitOfWork(), "thread")        
\ No newline at end of file