[Sqlalchemy-commits] [1426] sqlalchemy/branches/schema/lib/sqlalchemy: completely removed usage of "
Brought to you by:
zzzeek
From: <co...@sq...> - 2006-05-08 18:28:29
|
<!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>[1426] sqlalchemy/branches/schema/lib/sqlalchemy: completely removed usage of "column.original" from Mapper, uses _get_col_by_original totally.</title> </head> <body> <div id="msg"> <dl> <dt>Revision</dt> <dd>1426</dd> <dt>Author</dt> <dd>zzzeek</dd> <dt>Date</dt> <dd>2006-05-08 13:28:08 -0500 (Mon, 08 May 2006)</dd> </dl> <h3>Log Message</h3> <pre>completely removed usage of "column.original" from Mapper, uses _get_col_by_original totally.</pre> <h3>Modified Paths</h3> <ul> <li><a href="#sqlalchemybranchesschemalibsqlalchemyenginebasepy">sqlalchemy/branches/schema/lib/sqlalchemy/engine/base.py</a></li> <li><a href="#sqlalchemybranchesschemalibsqlalchemyormmapperpy">sqlalchemy/branches/schema/lib/sqlalchemy/orm/mapper.py</a></li> <li><a href="#sqlalchemybranchesschemalibsqlalchemysqlpy">sqlalchemy/branches/schema/lib/sqlalchemy/sql.py</a></li> </ul> </div> <div id="patch"> <h3>Diff</h3> <a id="sqlalchemybranchesschemalibsqlalchemyenginebasepy"></a> <div class="modfile"><h4>Modified: sqlalchemy/branches/schema/lib/sqlalchemy/engine/base.py (1425 => 1426)</h4> <pre class="diff"><span> <span class="info">--- sqlalchemy/branches/schema/lib/sqlalchemy/engine/base.py 2006-05-08 17:40:17 UTC (rev 1425) +++ sqlalchemy/branches/schema/lib/sqlalchemy/engine/base.py 2006-05-08 18:28:08 UTC (rev 1426) </span><span class="lines">@@ -496,7 +496,7 @@ </span><span class="cx"> if self.connection.close_with_result and self.dialect.supports_autoclose_results: </span><span class="cx"> self.connection.close() </span><span class="cx"> def _get_col(self, row, key): </span><del>- if isinstance(key, schema.Column) or isinstance(key, sql.ColumnElement): </del><ins>+ if isinstance(key, sql.ColumnElement): </ins><span class="cx"> try: </span><span class="cx"> rec = self.props[key._label.lower()] </span><span class="cx"> #print "GOT IT FROM LABEL FOR ", key._label </span></span></pre></div> <a id="sqlalchemybranchesschemalibsqlalchemyormmapperpy"></a> <div class="modfile"><h4>Modified: sqlalchemy/branches/schema/lib/sqlalchemy/orm/mapper.py (1425 => 1426)</h4> <pre class="diff"><span> <span class="info">--- sqlalchemy/branches/schema/lib/sqlalchemy/orm/mapper.py 2006-05-08 17:40:17 UTC (rev 1425) +++ sqlalchemy/branches/schema/lib/sqlalchemy/orm/mapper.py 2006-05-08 18:28:08 UTC (rev 1426) </span><span class="lines">@@ -191,7 +191,7 @@ </span><span class="cx"> # table columns mapped to lists of MapperProperty objects </span><span class="cx"> # using a list allows a single column to be defined as </span><span class="cx"> # populating multiple object attributes </span><del>- self.columntoproperty = {} </del><ins>+ self.columntoproperty = TranslatingDict(self.select_table) </ins><span class="cx"> </span><span class="cx"> # load custom properties </span><span class="cx"> if properties is not None: </span><span class="lines">@@ -204,7 +204,7 @@ </span><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><del>- if self.columntoproperty.has_key(column.original): </del><ins>+ if self.columntoproperty.has_key(column): </ins><span class="cx"> continue </span><span class="cx"> </span><span class="cx"> prop = self.props.get(column.key, None) </span><span class="lines">@@ -227,9 +227,8 @@ </span><span class="cx"> </span><span class="cx"> # its a ColumnProperty - match the ultimate table columns </span><span class="cx"> # back to the property </span><del>- for c in column.orig_set: - proplist = self.columntoproperty.setdefault(c.original, []) - proplist.append(prop) </del><ins>+ proplist = self.columntoproperty.setdefault(column, []) + proplist.append(prop) </ins><span class="cx"> </span><span class="cx"> if not non_primary and (not mapper_registry.has_key(self.class_key) or self.is_primary or (inherits is not None and inherits._is_primary_mapper())): </span><span class="cx"> sessionlib.global_attributes.reset_class_managed(self.class_) </span><span class="lines">@@ -253,12 +252,6 @@ </span><span class="cx"> if getattr(prop, 'key', None) is None: </span><span class="cx"> prop.init(key, self) </span><span class="cx"> </span><del>- # this prints a summary of the object attributes and how they - # will be mapped to table columns - #print "mapper %s, columntoproperty:" % (self.class_.__name__) - #for key, value in self.columntoproperty.iteritems(): - # print key.table.name, key.key, [(v.key, v) for v in value] - </del><span class="cx"> def add_polymorphic_mapping(self, key, class_or_mapper, entity_name=None): </span><span class="cx"> if isinstance(class_or_mapper, type): </span><span class="cx"> class_or_mapper = class_mapper(class_or_mapper, entity_name=entity_name) </span><span class="lines">@@ -363,9 +356,8 @@ </span><span class="cx"> self.props[key] = prop </span><span class="cx"> if isinstance(prop, ColumnProperty): </span><span class="cx"> for col in prop.columns: </span><del>- for c in col.orig_set: - proplist = self.columntoproperty.setdefault(c.original, []) - proplist.append(prop) </del><ins>+ proplist = self.columntoproperty.setdefault(col, []) + proplist.append(prop) </ins><span class="cx"> </span><span class="cx"> if init: </span><span class="cx"> prop.init(key, self) </span><span class="lines">@@ -520,7 +512,7 @@ </span><span class="cx"> </span><span class="cx"> def _getpropbycolumn(self, column, raiseerror=True): </span><span class="cx"> try: </span><del>- prop = self.columntoproperty[column.original] </del><ins>+ prop = self.columntoproperty[column] </ins><span class="cx"> except KeyError: </span><span class="cx"> try: </span><span class="cx"> prop = self.props[column.key] </span><span class="lines">@@ -540,7 +532,7 @@ </span><span class="cx"> return prop.getattr(obj) </span><span class="cx"> </span><span class="cx"> def _setattrbycolumn(self, obj, column, value): </span><del>- self.columntoproperty[column.original][0].setattr(obj, value) </del><ins>+ self.columntoproperty[column][0].setattr(obj, value) </ins><span class="cx"> </span><span class="cx"> def primary_mapper(self): </span><span class="cx"> return mapper_registry[self.class_key] </span><span class="lines">@@ -610,7 +602,7 @@ </span><span class="cx"> value = self._getattrbycolumn(obj, col) </span><span class="cx"> if value is not None: </span><span class="cx"> params[col.key] = value </span><del>- elif self.effective_polymorphic_on is not None and col.original is self.effective_polymorphic_on.original: </del><ins>+ elif self.effective_polymorphic_on is not None and self.effective_polymorphic_on.shares_lineage(col): </ins><span class="cx"> if isinsert: </span><span class="cx"> value = self.polymorphic_identity </span><span class="cx"> if col.default is None or value is not None: </span><span class="lines">@@ -742,7 +734,7 @@ </span><span class="cx"> def _has_pks(self, table): </span><span class="cx"> try: </span><span class="cx"> for k in self.pks_by_table[table]: </span><del>- if not self.columntoproperty.has_key(k.original): </del><ins>+ if not self.columntoproperty.has_key(k): </ins><span class="cx"> return False </span><span class="cx"> else: </span><span class="cx"> return True </span><span class="lines">@@ -1033,6 +1025,30 @@ </span><span class="cx"> if self.next is not None: </span><span class="cx"> self.next.before_delete(mapper, connection, instance) </span><span class="cx"> </span><ins>+class TranslatingDict(dict): + """a dictionary that stores ColumnElement objects as keys. incoming ColumnElement + keys are translated against those of an underling FromClause for all operations. + This way the columns from any Selectable that is derived from or underlying this + TranslatingDict's selectable can be used as keys.""" + def __init__(self, selectable): + super(TranslatingDict, self).__init__() + self.selectable = selectable + def __getitem__(self, col): + ourcol = self.selectable._get_col_by_original(col) + return super(TranslatingDict, self).__getitem__(ourcol) + def has_key(self, col): + ourcol = self.selectable._get_col_by_original(col) + return super(TranslatingDict, self).has_key(ourcol) + def __setitem__(self, col, value): + ourcol = self.selectable._get_col_by_original(col) + return super(TranslatingDict, self).__setitem__(ourcol, value) + def __contains__(self, col): + ourcol = self.selectable._get_col_by_original(col) + return super(TranslatingDict, self).__contains__(ourcol) + def setdefault(self, col, value): + ourcol = self.selectable._get_col_by_original(col) + return super(TranslatingDict, self).setdefault(ourcol, value) + </ins><span class="cx"> class ClassKey(object): </span><span class="cx"> """keys a class and an entity name to a mapper, via the mapper_registry""" </span><span class="cx"> def __init__(self, class_, entity_name): </span></span></pre></div> <a id="sqlalchemybranchesschemalibsqlalchemysqlpy"></a> <div class="modfile"><h4>Modified: sqlalchemy/branches/schema/lib/sqlalchemy/sql.py (1425 => 1426)</h4> <pre class="diff"><span> <span class="info">--- sqlalchemy/branches/schema/lib/sqlalchemy/sql.py 2006-05-08 17:40:17 UTC (rev 1425) +++ sqlalchemy/branches/schema/lib/sqlalchemy/sql.py 2006-05-08 18:28:08 UTC (rev 1426) </span><span class="lines">@@ -626,7 +626,12 @@ </span><span class="cx"> return self.__original </span><span class="cx"> orig_set = property(_get_orig_set, _set_orig_set,doc="""a Set containing Table-bound, non-proxied ColumnElements for which this ColumnElement is a proxy. In all cases except for a column proxied from a Union (i.e. CompoundSelect), this set will be just one element.""") </span><span class="cx"> original = property(_get_original, doc="Scalar version of orig_set, which is usually one element. If orig_set contains multiple columns, this will represent just one of the columns.") </span><del>- </del><ins>+ def shares_lineage(self, othercolumn): + for c in self.orig_set: + if c in othercolumn.orig_set: + return True + else: + return False </ins><span class="cx"> def _make_proxy(self, selectable, name=None): </span><span class="cx"> """creates a new ColumnElement representing this ColumnElement as it appears in the select list </span><span class="cx"> of an enclosing selectable. The default implementation returns a ColumnClause if a name is given, </span></span></pre> </div> </div> </body> </html> |