[Sqlalchemy-commits] [1494] sqlalchemy/branches/schema/lib/sqlalchemy/orm: fixes to dependency refac
Brought to you by:
zzzeek
From: <co...@sq...> - 2006-05-24 02:22:56
|
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head><style type="text/css"><!-- #msg dl { border: 1px #006 solid; background: #369; padding: 6px; color: #fff; } #msg dt { float: left; width: 6em; font-weight: bold; } #msg dt:after { content:':';} #msg dl, #msg dt, #msg ul, #msg li { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt; } #msg dl a { font-weight: bold} #msg dl a:link { color:#fc3; } #msg dl a:active { color:#ff0; } #msg dl a:visited { color:#cc6; } h3 { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt; font-weight: bold; } #msg pre { overflow: auto; background: #ffc; border: 1px #fc0 solid; padding: 6px; } #msg ul, pre { overflow: auto; } #patch { width: 100%; } #patch h4 {font-family: verdana,arial,helvetica,sans-serif;font-size:10pt;padding:8px;background:#369;color:#fff;margin:0;} #patch .propset h4, #patch .binary h4 {margin:0;} #patch pre {padding:0;line-height:1.2em;margin:0;} #patch .diff {width:100%;background:#eee;padding: 0 0 10px 0;overflow:auto;} #patch .propset .diff, #patch .binary .diff {padding:10px 0;} #patch span {display:block;padding:0 10px;} #patch .modfile, #patch .addfile, #patch .delfile, #patch .propset, #patch .binary, #patch .copfile {border:1px solid #ccc;margin:10px 0;} #patch ins {background:#dfd;text-decoration:none;display:block;padding:0 10px;} #patch del {background:#fdd;text-decoration:none;display:block;padding:0 10px;} #patch .lines, .info {color:#888;background:#fff;} --></style> <title>[1494] sqlalchemy/branches/schema/lib/sqlalchemy/orm: fixes to dependency refactor....better targeting for circular dep sort</title> </head> <body> <div id="msg"> <dl> <dt>Revision</dt> <dd>1494</dd> <dt>Author</dt> <dd>zzzeek</dd> <dt>Date</dt> <dd>2006-05-23 21:22:42 -0500 (Tue, 23 May 2006)</dd> </dl> <h3>Log Message</h3> <pre>fixes to dependency refactor....better targeting for circular dep sort</pre> <h3>Modified Paths</h3> <ul> <li><a href="#sqlalchemybranchesschemaexamplesadjacencytreebyroot_treepy">sqlalchemy/branches/schema/examples/adjacencytree/byroot_tree.py</a></li> <li><a href="#sqlalchemybranchesschemalibsqlalchemyormdependencypy">sqlalchemy/branches/schema/lib/sqlalchemy/orm/dependency.py</a></li> <li><a href="#sqlalchemybranchesschemalibsqlalchemyormmapperpy">sqlalchemy/branches/schema/lib/sqlalchemy/orm/mapper.py</a></li> <li><a href="#sqlalchemybranchesschemalibsqlalchemyormunitofworkpy">sqlalchemy/branches/schema/lib/sqlalchemy/orm/unitofwork.py</a></li> </ul> </div> <div id="patch"> <h3>Diff</h3> <a id="sqlalchemybranchesschemaexamplesadjacencytreebyroot_treepy"></a> <div class="modfile"><h4>Modified: sqlalchemy/branches/schema/examples/adjacencytree/byroot_tree.py (1493 => 1494)</h4> <pre class="diff"><span> <span class="info">--- sqlalchemy/branches/schema/examples/adjacencytree/byroot_tree.py 2006-05-23 23:57:29 UTC (rev 1493) +++ sqlalchemy/branches/schema/examples/adjacencytree/byroot_tree.py 2006-05-24 02:22:42 UTC (rev 1494) </span><span class="lines">@@ -5,7 +5,7 @@ </span><span class="cx"> """a more advanced example of basic_tree.py. illustrates MapperExtension objects which </span><span class="cx"> add application-specific functionality to a Mapper object.""" </span><span class="cx"> </span><del>-engine = create_engine('sqlite:///:memory:', echo = True) </del><ins>+engine = create_engine('sqlite:///:memory:', echo = "debug") </ins><span class="cx"> </span><span class="cx"> metadata = BoundMetaData(engine) </span><span class="cx"> </span><span class="lines">@@ -34,12 +34,7 @@ </span><span class="cx"> in the order they were inserted. Adds an "append" method, which appends a node to the </span><span class="cx"> dictionary as though it were a list, and also within append automatically associates </span><span class="cx"> the parent of a TreeNode with itself.""" </span><del>- def __init__(self, parent): - util.OrderedDict.__init__(self) - self.parent = parent </del><span class="cx"> def append(self, node): </span><del>- node.parent = self.parent - node._set_root(self.parent.root) </del><span class="cx"> self[node.name] = node </span><span class="cx"> def __iter__(self): </span><span class="cx"> return iter(self.values()) </span><span class="lines">@@ -54,12 +49,13 @@ </span><span class="cx"> identifiable root. Any node can return its root node and therefore the "tree" that it </span><span class="cx"> belongs to, and entire trees can be selected from the database in one query, by </span><span class="cx"> identifying their common root ID.""" </span><ins>+ children = NodeList </ins><span class="cx"> </span><span class="cx"> def __init__(self, name): </span><span class="cx"> """for data integrity, a TreeNode requires its name to be passed as a parameter </span><span class="cx"> to its constructor, so there is no chance of a TreeNode that doesnt have a name.""" </span><span class="cx"> self.name = name </span><del>- self.children = NodeList(self) </del><ins>+ self.children = NodeList() </ins><span class="cx"> self.root = self </span><span class="cx"> self.parent = None </span><span class="cx"> self.id = None </span><span class="lines">@@ -72,9 +68,10 @@ </span><span class="cx"> c._set_root(root) </span><span class="cx"> def append(self, node): </span><span class="cx"> if isinstance(node, str): </span><del>- self.children.append(TreeNode(node)) - else: - self.children.append(node) </del><ins>+ node = TreeNode(node) + node.parent = self + node._set_root(self.root) + self.children.append(node) </ins><span class="cx"> def __repr__(self): </span><span class="cx"> return self._getstring(0, False) </span><span class="cx"> def __str__(self): </span><span class="lines">@@ -89,19 +86,15 @@ </span><span class="cx"> </span><span class="cx"> class TreeLoader(MapperExtension): </span><span class="cx"> """an extension that will plug-in additional functionality to the Mapper.""" </span><del>- def create_instance(self, mapper, row, imap, class_): - """creates an instance of a TreeNode. since the TreeNode constructor requires - the 'name' argument, this method pulls the data from the database row directly.""" - return TreeNode(row[mapper.c.name], _mapper_nohistory=True) </del><span class="cx"> def after_insert(self, mapper, connection, instance): </span><span class="cx"> """runs after the insert of a new TreeNode row. The primary key of the row is not determined </span><span class="cx"> until the insert is complete, since most DB's use autoincrementing columns. If this node is </span><span class="cx"> the root node, we will take the new primary key and update it as the value of the node's </span><span class="cx"> "root ID" as well, since its root node is itself.""" </span><span class="cx"> if instance.root is instance: </span><del>- connection.execute(mapper.primarytable.update(TreeNode.c.id==instance.id, values=dict(root_node_id=instance.id))) </del><ins>+ connection.execute(mapper.mapped_table.update(TreeNode.c.id==instance.id, values=dict(root_node_id=instance.id))) </ins><span class="cx"> instance.root_id = instance.id </span><del>- def append_result(self, mapper, row, imap, result, instance, isnew, populate_existing=False): </del><ins>+ def append_result(self, mapper, session, row, imap, result, instance, isnew, populate_existing=False): </ins><span class="cx"> """runs as results from a SELECT statement are processed, and newly created or already-existing </span><span class="cx"> instances that correspond to each row are appended to result lists. This method will only </span><span class="cx"> append root nodes to the result list, and will attach child nodes to their appropriate parent </span></span></pre></div> <a id="sqlalchemybranchesschemalibsqlalchemyormdependencypy"></a> <div class="modfile"><h4>Modified: sqlalchemy/branches/schema/lib/sqlalchemy/orm/dependency.py (1493 => 1494)</h4> <pre class="diff"><span> <span class="info">--- sqlalchemy/branches/schema/lib/sqlalchemy/orm/dependency.py 2006-05-23 23:57:29 UTC (rev 1493) +++ sqlalchemy/branches/schema/lib/sqlalchemy/orm/dependency.py 2006-05-24 02:22:42 UTC (rev 1494) </span><span class="lines">@@ -117,6 +117,7 @@ </span><span class="cx"> if child is not None and self.post_update: </span><span class="cx"> uowcommit.register_object(child, postupdate=True) </span><span class="cx"> for child in childlist.deleted_items(): </span><ins>+ print "HI KEY", self.key, "OBJECT", obj, "CHILD", child </ins><span class="cx"> if not self.cascade.delete_orphan: </span><span class="cx"> self._synchronize(obj, child, None, True) </span><span class="cx"> </span><span class="lines">@@ -157,6 +158,7 @@ </span><span class="cx"> uowcommit.register_object(child) </span><span class="cx"> for child in childlist.deleted_items(): </span><span class="cx"> if not self.cascade.delete_orphan: </span><ins>+ print "PREPROCESS KEY", self.key, "OBJECT", obj, "CHILD", child </ins><span class="cx"> uowcommit.register_object(child, isdelete=False) </span><span class="cx"> elif childlist.hasparent(child) is False: </span><span class="cx"> uowcommit.register_object(child, isdelete=True) </span><span class="lines">@@ -179,7 +181,7 @@ </span><span class="cx"> uowcommit.register_dependency(self.mapper, self.parent) </span><span class="cx"> uowcommit.register_processor(self.mapper, self, self.parent) </span><span class="cx"> def process_dependencies(self, task, deplist, uowcommit, delete = False): </span><del>- #print self.mapper.table.name + " " + self.key + " " + repr(len(deplist)) + " process_dep isdelete " + repr(delete) + " direction " + repr(self.direction) </del><ins>+ #print self.mapper.mapped_table.name + " " + self.key + " " + repr(len(deplist)) + " process_dep isdelete " + repr(delete) + " direction " + repr(self.direction) </ins><span class="cx"> if delete: </span><span class="cx"> if self.post_update and not self.cascade.delete_orphan: </span><span class="cx"> # post_update means we have to update our row to not reference the child object </span></span></pre></div> <a id="sqlalchemybranchesschemalibsqlalchemyormmapperpy"></a> <div class="modfile"><h4>Modified: sqlalchemy/branches/schema/lib/sqlalchemy/orm/mapper.py (1493 => 1494)</h4> <pre class="diff"><span> <span class="info">--- sqlalchemy/branches/schema/lib/sqlalchemy/orm/mapper.py 2006-05-23 23:57:29 UTC (rev 1493) +++ sqlalchemy/branches/schema/lib/sqlalchemy/orm/mapper.py 2006-05-24 02:22:42 UTC (rev 1494) </span><span class="lines">@@ -227,10 +227,8 @@ </span><span class="cx"> # load properties from the main table object, </span><span class="cx"> # not overriding those set up in the 'properties' argument </span><span class="cx"> for column in self.mapped_table.columns: </span><del>- </del><span class="cx"> if self.columntoproperty.has_key(column): </span><span class="cx"> continue </span><del>- </del><span class="cx"> if not self.columns.has_key(column.key): </span><span class="cx"> self.columns[column.key] = column </span><span class="cx"> </span></span></pre></div> <a id="sqlalchemybranchesschemalibsqlalchemyormunitofworkpy"></a> <div class="modfile"><h4>Modified: sqlalchemy/branches/schema/lib/sqlalchemy/orm/unitofwork.py (1493 => 1494)</h4> <pre class="diff"><span> <span class="info">--- sqlalchemy/branches/schema/lib/sqlalchemy/orm/unitofwork.py 2006-05-23 23:57:29 UTC (rev 1493) +++ sqlalchemy/branches/schema/lib/sqlalchemy/orm/unitofwork.py 2006-05-24 02:22:42 UTC (rev 1494) </span><span class="lines">@@ -607,11 +607,13 @@ </span><span class="cx"> # the task corresponding to the processor's objects </span><span class="cx"> childtask = trans.get_task_by_mapper(processor.mapper) </span><span class="cx"> </span><del>- if isdelete: - childlist = childlist.unchanged_items() + childlist.deleted_items() - else: - childlist = childlist.added_items() </del><ins>+# if isdelete: +# childlist = childlist.unchanged_items() + childlist.deleted_items() +# else: +# childlist = childlist.added_items() </ins><span class="cx"> </span><ins>+ childlist = childlist.added_items() + childlist.unchanged_items() + childlist.deleted_items() + </ins><span class="cx"> for o in childlist: </span><span class="cx"> if o is None or o not in childtask.objects: </span><span class="cx"> continue </span><span class="lines">@@ -621,9 +623,9 @@ </span><span class="cx"> # create a UOWDependencyProcessor representing this pair of objects. </span><span class="cx"> # append it to a UOWTask </span><span class="cx"> if whosdep[0] is obj: </span><del>- get_dependency_task(obj, dep).append(whosdep[0], isdelete=isdelete) </del><ins>+ get_dependency_task(whosdep[0], dep).append(whosdep[0], isdelete=isdelete) </ins><span class="cx"> else: </span><del>- get_dependency_task(obj, dep).append(whosdep[1], isdelete=isdelete) </del><ins>+ get_dependency_task(whosdep[0], dep).append(whosdep[1], isdelete=isdelete) </ins><span class="cx"> else: </span><span class="cx"> get_dependency_task(obj, dep).append(obj, isdelete=isdelete) </span><span class="cx"> </span></span></pre> </div> </div> </body> </html> |