]> git.ipfire.org Git - thirdparty/sqlalchemy/sqlalchemy.git/commitdiff
(no commit message)
authorMike Bayer <mike_mp@zzzcomputing.com>
Sat, 15 Oct 2005 18:53:10 +0000 (18:53 +0000)
committerMike Bayer <mike_mp@zzzcomputing.com>
Sat, 15 Oct 2005 18:53:10 +0000 (18:53 +0000)
examples/adjacencytree/basic_tree.py
examples/adjacencytree/byroot_tree.py
lib/sqlalchemy/mapper.py
lib/sqlalchemy/objectstore.py

index 3215ea007330bcb301ce1523b0b40310a29cb81e..62a17b8cdb268a6faa8fb38b23ae91e21efb327c 100644 (file)
@@ -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')
index 38feaa8d07af40ada8ccb9f2d0948ef2a31ad125..ac711eea2a491fb7bdb41e6dadca147e32d7bd50 100644 (file)
@@ -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:"
index 05d82d3dbcf408a6a87a85dd61288bfc5d2de8ec..b7dedb90aebbc44b58344c52f9012f86da4fbba6 100644 (file)
@@ -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
index 32ef4fbaa5b32b5db18f62a8f2cca63d4e1194db..661070207dc16b023f680d8241fdc93e9c035e4b 100644 (file)
@@ -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):