From: Mike Bayer Date: Sat, 15 Oct 2005 18:53:10 +0000 (+0000) Subject: (no commit message) X-Git-Tag: rel_0_1_0~521 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=7e008f2f9e31eef05415d46a6dc8e33893cc96a5;p=thirdparty%2Fsqlalchemy%2Fsqlalchemy.git --- diff --git a/examples/adjacencytree/basic_tree.py b/examples/adjacencytree/basic_tree.py index 3215ea0073..62a17b8cdb 100644 --- a/examples/adjacencytree/basic_tree.py +++ b/examples/adjacencytree/basic_tree.py @@ -36,7 +36,7 @@ class TreeNode(object): def __str__(self): return self._getstring(0, False) def _getstring(self, level, expand = False): - s = (' ' * level) + "%s (%s,%s)" % (self.name, self.id,self.parent_id) + '\n' + s = (' ' * level) + "%s (%s,%s, %d)" % (self.name, self.id,self.parent_id,id(self)) + '\n' if expand: s += string.join([n._getstring(level+1, True) for n in self.children.values()], '') return s @@ -55,6 +55,15 @@ TreeNode.mapper=assignmapper(tables.trees, class_=TreeNode, properties=dict( )) +node = TreeNode('rootnode') +node.append('node1') +objectstore.commit() + +print node.print_nodes() +del node.children['node1'] +objectstore.commit() +sys.exit() + node2 = TreeNode('node2') node2.append('subnode1') node = TreeNode('rootnode') diff --git a/examples/adjacencytree/byroot_tree.py b/examples/adjacencytree/byroot_tree.py index 38feaa8d07..ac711eea2a 100644 --- a/examples/adjacencytree/byroot_tree.py +++ b/examples/adjacencytree/byroot_tree.py @@ -129,11 +129,10 @@ print "----------------------------" print node.print_nodes() -#node.name='newname' -#node.append('node4') -#node.children['node4'].append('subnode3') -#node.children['node4'].append('subnode4') -#node.children['node4'].children['subnode3'].append('subsubnode1') +node.append('node4') +node.children['node4'].append('subnode3') +node.children['node4'].append('subnode4') +node.children['node4'].children['subnode3'].append('subsubnode1') del node.children['node1'] print "\n\n\n----------------------------" @@ -149,7 +148,7 @@ print "Committing:" print "----------------------------" objectstore.commit() -raise "hi" +#sys.exit() print "\n\n\n----------------------------" print "Tree After Save:" diff --git a/lib/sqlalchemy/mapper.py b/lib/sqlalchemy/mapper.py index 05d82d3dbc..b7dedb90ae 100644 --- a/lib/sqlalchemy/mapper.py +++ b/lib/sqlalchemy/mapper.py @@ -746,7 +746,7 @@ class PropertyLoader(MapperProperty): return (obj2, obj1) def process_dependencies(self, task, deplist, uowcommit, delete = False): - #print self.mapper.table.name + " " + repr(len(deplist)) + " process_dep isdelete " + repr(delete) + print self.mapper.table.name + " " + repr(len(deplist)) + " process_dep isdelete " + repr(delete) # fucntion to set properties across a parent/child object plus an "association row", # based on a join condition diff --git a/lib/sqlalchemy/objectstore.py b/lib/sqlalchemy/objectstore.py index 32ef4fbaa5..661070207d 100644 --- a/lib/sqlalchemy/objectstore.py +++ b/lib/sqlalchemy/objectstore.py @@ -374,7 +374,10 @@ class UOWTask(object): self.iscircular = False self.circular = None self.childtasks = [] - + + def is_empty(self): + return len(self.objects) == 0 and len(self.dependencies) == 0 and len(self.childtasks) == 0 + def append(self, obj, listonly = False, childtask = None, isdelete = False): """appends an object to this task, to be either saved or deleted depending on the 'isdelete' attribute of this UOWTask. 'listonly' indicates @@ -394,52 +397,43 @@ class UOWTask(object): if isdelete: rec.isdelete = True - def execute(self, trans, isdelete = False): + def execute(self, trans): """executes this UOWTask. saves objects to be saved, processes all dependencies - that have been registered, and deletes objects to be deleted. If the UOWTask - has been marked as "circular", performs a circular dependency sort which creates - a subtree of UOWTasks which are then executed hierarchically.""" + that have been registered, and deletes objects to be deleted. """ if self.circular is not None: self.circular.execute(trans) return - print "executing " + repr(self) - saved_obj_list = self.saved_objects() - deleted_obj_list = self.deleted_objects() - self.mapper.save_obj(saved_obj_list, trans) - for dep in self.dependencies: + self.mapper.save_obj(self.tosave_objects(), trans) + for dep in self.save_dependencies(): (processor, targettask, isdelete) = dep - if isdelete: - continue - processor.process_dependencies(targettask, targettask.saved_objects(includelistonly=True), trans, delete = False) - for obj in self.saved_objects(includelistonly=True): - childtask = self.objects[obj].childtask - if childtask is not None: - childtask.execute(trans) - for dep in self.dependencies: + processor.process_dependencies(targettask, targettask.tosave_objects(), trans, delete = False) + for element in self.tosave_elements(): + if element.childtask is not None: + element.childtask.execute(trans) + for dep in self.delete_dependencies(): (processor, targettask, isdelete) = dep - if not isdelete: - continue - processor.process_dependencies(targettask, targettask.deleted_objects(includelistonly=True), trans, delete = True) + processor.process_dependencies(targettask, targettask.todelete_objects(), trans, delete = True) for child in self.childtasks: child.execute(trans) - for obj in self.deleted_objects(includelistonly=True): - childtask = self.objects[obj].childtask - if childtask is not None: - childtask.execute(trans) - self.mapper.delete_obj(deleted_obj_list, trans) - - def saved_objects(self, includelistonly=False): - if not includelistonly: - return [o for o, rec in self.objects.iteritems() if not rec.listonly and not rec.isdelete] - else: - return [o for o, rec in self.objects.iteritems() if not rec.isdelete] - def deleted_objects(self, includelistonly=False): - if not includelistonly: - return [o for o, rec in self.objects.iteritems() if not rec.listonly and rec.isdelete] - else: - return [o for o, rec in self.objects.iteritems() if rec.isdelete] - + for element in self.todelete_elements(): + if element.childtask is not None: + element.childtask.execute(trans) + self.mapper.delete_obj(self.todelete_objects(), trans) + + def tosave_elements(self): + return [rec for rec in self.objects.values() if not rec.isdelete] + def todelete_elements(self): + return [rec for rec in self.objects.values() if rec.isdelete] + def tosave_objects(self): + return [o for o, rec in self.objects.iteritems() if not rec.listonly and not rec.isdelete] + def todelete_objects(self): + return [o for o, rec in self.objects.iteritems() if not rec.listonly and rec.isdelete] + def save_dependencies(self): + return [dep for dep in self.dependencies if not dep[2]] + def delete_dependencies(self): + return [dep for dep in self.dependencies if dep[2]] + def _sort_circular_dependencies(self, trans): """for a single task, creates a hierarchical tree of "subtasks" which associate specific dependency actions with individual objects. This is used for a @@ -473,14 +467,17 @@ class UOWTask(object): return l # TODO: rework, its putting too many things in places they shouldnt be - for obj in allobjects: + for taskelement in self.objects.values(): # go through all of the dependencies on this task, and organize them # into a hash where we isolate individual objects that depend on each # other. then those individual object relationships will be grabbed # back into a hierarchical tree thing down below via make_task_tree. + obj = taskelement.obj parenttask = get_task(obj) for dep in self.dependencies: (processor, targettask, isdelete) = dep + if taskelement.isdelete is not isdelete: + continue childlist = processor.get_object_dependencies(obj, trans, passive = True) if isdelete: childlist = childlist.unchanged_items() + childlist.deleted_items() @@ -525,37 +522,40 @@ class UOWTask(object): def dump(self, indent=""): # TODO: what a mess ! s = "\n" + indent + repr(self) - s += "\n" + indent + " Save Elements:" - for o in self.objects.values(): - if not o.listonly and not o.isdelete: - s += "\n " + indent + repr(o) - if o.childtask is not None and len(o.childtask.objects) > 0 and len(o.childtask.dependencies) > 0: - s += "\n " + indent + " Circular Child Task:" - s += "\n" + o.childtask.dump(" " + indent) - s += "\n" + indent + " Dependencies:" - for dt in self.dependencies: - s += "\n " + indent + repr(dt[0].key) + "/" + (dt[2] and 'items to be deleted' or 'saved items') - if dt[2]: - val = [t for t in dt[1].objects.values() if t.isdelete] - else: - val = [t for t in dt[1].objects.values() if not t.isdelete] - for o in val: - s += "\n " + indent + repr(o) - s += "\n" + indent + " Child Tasks:" - for t in self.childtasks: - s += t.dump(depth + 2) - s += "\n" + indent + " Circular Task:" if self.circular is not None: - s += self.circular.dump(" " + indent) - else: - s += "None" - s += "\n" + indent + " Delete Elements:" - for o in self.objects.values(): - if not o.listonly and o.isdelete: - s += "\n " + indent + repr(o) - if o.childtask is not None and len(o.childtask.objects) > 0 and len(o.childtask.dependencies) > 0: - s += "\n " + indent + " Circular Child Task:" - s += "\n" + o.childtask.dump(" " + indent) + s += " Circular Representation:" + s += self.circular.dump(indent + " ") + return s + saveobj = self.tosave_elements() + if len(saveobj) > 0: + s += "\n" + indent + " Save Elements:" + for o in saveobj: + if not o.listonly: + s += "\n " + indent + repr(o) + if o.childtask is not None and not o.childtask.is_empty(): + s += o.childtask.dump(" " + indent) + if len(self.dependencies) > 0: + s += "\n" + indent + " Dependencies:" + for dt in self.dependencies: + s += "\n " + indent + repr(dt[0].key) + "/" + (dt[2] and 'items to be deleted' or 'saved items') + if dt[2]: + val = [t for t in dt[1].objects.values() if t.isdelete] + else: + val = [t for t in dt[1].objects.values() if not t.isdelete] + for o in val: + s += "\n " + indent + repr(o) + if len(self.childtasks) > 0: + s += "\n" + indent + " Child Tasks:" + for t in self.childtasks: + s += t.dump(depth + 2) + deleteobj = self.todelete_elements() + if len(deleteobj) > 0: + s += "\n" + indent + " Delete Elements:" + for o in self.objects.values(): + if not o.listonly: + s += "\n " + indent + repr(o) + if o.childtask is not None and not o.childtask.is_empty(): + s += o.childtask.dump(" " + indent) return s def __repr__(self):