From: Mike Bayer Date: Sat, 10 Sep 2005 18:23:58 +0000 (+0000) Subject: its ugly but the backwards/forwards parent/child thing works again, this time groupin... X-Git-Tag: rel_0_1_0~759 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=7f040fa53fcba1d2031f5adecfd499727bb4c723;p=thirdparty%2Fsqlalchemy%2Fsqlalchemy.git its ugly but the backwards/forwards parent/child thing works again, this time grouping the different kinds of inserts together --- diff --git a/lib/sqlalchemy/mapper.py b/lib/sqlalchemy/mapper.py index 470ec016b9..a12c01304e 100644 --- a/lib/sqlalchemy/mapper.py +++ b/lib/sqlalchemy/mapper.py @@ -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 diff --git a/lib/sqlalchemy/objectstore.py b/lib/sqlalchemy/objectstore.py index d6510e2862..31b3f9a221 100644 --- a/lib/sqlalchemy/objectstore.py +++ b/lib/sqlalchemy/objectstore.py @@ -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