[Sqlalchemy-commits] [1007] sqlalchemy/branches/new_eagerload/test: almost there
Brought to you by:
zzzeek
From: <co...@sq...> - 2006-02-22 07:44:02
|
<!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>[1007] sqlalchemy/branches/new_eagerload/test: almost there</title> </head> <body> <div id="msg"> <dl> <dt>Revision</dt> <dd>1007</dd> <dt>Author</dt> <dd>zzzeek</dd> <dt>Date</dt> <dd>2006-02-20 13:05:11 -0600 (Mon, 20 Feb 2006)</dd> </dl> <h3>Log Message</h3> <pre>almost there</pre> <h3>Modified Paths</h3> <ul> <li><a href="#sqlalchemybranchesnew_eagerloadlibsqlalchemymappingpropertiespy">sqlalchemy/branches/new_eagerload/lib/sqlalchemy/mapping/properties.py</a></li> <li><a href="#sqlalchemybranchesnew_eagerloadlibsqlalchemyschemapy">sqlalchemy/branches/new_eagerload/lib/sqlalchemy/schema.py</a></li> <li><a href="#sqlalchemybranchesnew_eagerloadlibsqlalchemysqlpy">sqlalchemy/branches/new_eagerload/lib/sqlalchemy/sql.py</a></li> <li><a href="#sqlalchemybranchesnew_eagerloadtestmapperpy">sqlalchemy/branches/new_eagerload/test/mapper.py</a></li> </ul> </div> <div id="patch"> <h3>Diff</h3> <a id="sqlalchemybranchesnew_eagerloadlibsqlalchemymappingpropertiespy"></a> <div class="modfile"><h4>Modified: sqlalchemy/branches/new_eagerload/lib/sqlalchemy/mapping/properties.py (1006 => 1007)</h4> <pre class="diff"><span> <span class="info">--- sqlalchemy/branches/new_eagerload/lib/sqlalchemy/mapping/properties.py 2006-02-20 16:34:02 UTC (rev 1006) +++ sqlalchemy/branches/new_eagerload/lib/sqlalchemy/mapping/properties.py 2006-02-20 19:05:11 UTC (rev 1007) </span><span class="lines">@@ -747,31 +747,23 @@ </span><span class="cx"> self.eagertarget = self.target.alias() </span><span class="cx"> if self.secondary: </span><span class="cx"> self.eagersecondary = self.secondary.alias() </span><del>- aliasizer = Aliasizer(self.target, aliases={ </del><ins>+ self.aliasizer = Aliasizer(self.target, self.secondary, aliases={ </ins><span class="cx"> self.target:self.eagertarget, </span><span class="cx"> self.secondary:self.eagersecondary </span><span class="cx"> }) </span><del>- self.eagersecondary = self.secondaryjoin.copy_container() - self.eagersecondary.accept_visitor(aliasizer) </del><ins>+ self.eagersecondaryjoin = self.secondaryjoin.copy_container() + self.eagersecondaryjoin.accept_visitor(self.aliasizer) </ins><span class="cx"> self.eagerprimary = self.primaryjoin.copy_container() </span><del>- self.eagerprimary.accept_visitor(aliasizer) </del><ins>+ self.eagerprimary.accept_visitor(self.aliasizer) </ins><span class="cx"> else: </span><del>- aliasizer = Aliasizer(self.target, aliases={self.target:self.eagertarget}) </del><ins>+ self.aliasizer = Aliasizer(self.target, aliases={self.target:self.eagertarget}) </ins><span class="cx"> self.eagerprimary = self.primaryjoin.copy_container() </span><del>- self.eagerprimary.accept_visitor(aliasizer) </del><ins>+ self.eagerprimary.accept_visitor(self.aliasizer) </ins><span class="cx"> </span><span class="cx"> if self.order_by: </span><del>- print "LALA" - self.eager_order_by = [o.copy_container() for o in util.to_list(self.order_by)] - for i in range(0, len(self.eager_order_by)): - if isinstance(self.eager_order_by[i], schema.Column): - self.eager_order_by[i] = self.eagertarget._get_col_by_original(self.eager_order_by[i]) - print "derp", self.eager_order_by[i] - else: - self.eager_order_by[i].accept_visitor(aliasizer) </del><ins>+ self.eager_order_by = self._aliasize_orderby(self.order_by) </ins><span class="cx"> else: </span><del>- print "HOHO" - self.eager_order_by = self.order_by </del><ins>+ self.eager_order_by = None </ins><span class="cx"> </span><span class="cx"> eagerprops = [] </span><span class="cx"> for key, prop in self.mapper.props.iteritems(): </span><span class="lines">@@ -800,8 +792,19 @@ </span><span class="cx"> print "new eagertqarget", p.eagertarget.name, (p.secondary and p.secondary.name or "none"), p.parent.table.name </span><span class="cx"> finally: </span><span class="cx"> del recursion_stack[self.target] </span><del>- - </del><ins>+ + def _aliasize_orderby(self, orderby, copy=True): + if copy: + orderby = [o.copy_container() for o in util.to_list(orderby)] + else: + orderby = util.to_list(orderby) + for i in range(0, len(orderby)): + if isinstance(orderby[i], schema.Column): + orderby[i] = self.eagertarget._get_col_by_original(orderby[i]) + else: + orderby[i].accept_visitor(self.aliasizer) + return orderby + </ins><span class="cx"> def setup(self, key, statement, eagertable=None, **options): </span><span class="cx"> """add a left outer join to the statement thats being constructed""" </span><span class="cx"> </span><span class="lines">@@ -811,9 +814,9 @@ </span><span class="cx"> towrap = self.parent.table </span><span class="cx"> </span><span class="cx"> if self.secondaryjoin is not None: </span><del>- statement._outerjoin = sql.outerjoin(towrap, self.secondary, self.eagerprimary).outerjoin(self.eagertarget, self.eagersecondary) </del><ins>+ statement._outerjoin = sql.outerjoin(towrap, self.eagersecondary, self.eagerprimary).outerjoin(self.eagertarget, self.eagersecondaryjoin) </ins><span class="cx"> if self.order_by is False and self.secondary.default_order_by() is not None: </span><del>- statement.order_by(*self.secondary.default_order_by()) </del><ins>+ statement.order_by(*self.eagersecondary.default_order_by()) </ins><span class="cx"> else: </span><span class="cx"> statement._outerjoin = towrap.outerjoin(self.eagertarget, self.eagerprimary) </span><span class="cx"> if self.order_by is False and self.eagertarget.default_order_by() is not None: </span><span class="lines">@@ -821,14 +824,8 @@ </span><span class="cx"> </span><span class="cx"> if self.eager_order_by: </span><span class="cx"> statement.order_by(*util.to_list(self.eager_order_by)) </span><del>- elif statement.order_by: - # for i in range(0, len(statement.order_by)): - # if isinstance(statement.order_by[i], schema.Column): - # statement.order_by[i] = self.eagertarget._get_col_by_original(statement.order_by[i]) - # else: - # pass -# statement.order_by[i].accept_visitor(aliasizer) - print "YUP OB", statement.order_by </del><ins>+ elif getattr(statement, 'order_by_clause', None): + self._aliasize_orderby(statement.order_by_clause, False) </ins><span class="cx"> </span><span class="cx"> statement.append_from(statement._outerjoin) </span><span class="cx"> for key, value in self.mapper.props.iteritems(): </span><span class="lines">@@ -935,28 +932,26 @@ </span><span class="cx"> for t in tables: </span><span class="cx"> self.tables[t] = t </span><span class="cx"> self.binary = None </span><del>- self.match = False </del><span class="cx"> self.aliases = kwargs.get('aliases', {}) </span><del>- </del><span class="cx"> def get_alias(self, table): </span><span class="cx"> try: </span><span class="cx"> return self.aliases[table] </span><span class="cx"> except: </span><span class="cx"> return self.aliases.setdefault(table, sql.alias(table)) </span><del>- </del><span class="cx"> def visit_compound(self, compound): </span><del>- for i in range(0, len(compound.clauses)): - if isinstance(compound.clauses[i], schema.Column) and self.tables.has_key(compound.clauses[i].table): - compound.clauses[i] = self.get_alias(compound.clauses[i].table)._get_col_by_original(compound.clauses[i]) - self.match = True - </del><ins>+ self.visit_clauselist(compound) + def visit_clauselist(self, clist): + for i in range(0, len(clist.clauses)): + if isinstance(clist.clauses[i], schema.Column) and self.tables.has_key(clist.clauses[i].table): + orig = clist.clauses[i] + clist.clauses[i] = self.get_alias(clist.clauses[i].table)._get_col_by_original(clist.clauses[i]) + if clist.clauses[i] is None: + raise "cant get orig for " + str(orig) + " against table " + orig.table.name + " " + self.get_alias(orig.table).name </ins><span class="cx"> def visit_binary(self, binary): </span><span class="cx"> if isinstance(binary.left, schema.Column) and self.tables.has_key(binary.left.table): </span><span class="cx"> binary.left = self.get_alias(binary.left.table)._get_col_by_original(binary.left) </span><del>- self.match = True </del><span class="cx"> if isinstance(binary.right, schema.Column) and self.tables.has_key(binary.right.table): </span><span class="cx"> binary.right = self.get_alias(binary.right.table)._get_col_by_original(binary.right) </span><del>- self.match = True </del><span class="cx"> </span><span class="cx"> class BinaryVisitor(sql.ClauseVisitor): </span><span class="cx"> def __init__(self, func): </span></span></pre></div> <a id="sqlalchemybranchesnew_eagerloadlibsqlalchemyschemapy"></a> <div class="modfile"><h4>Modified: sqlalchemy/branches/new_eagerload/lib/sqlalchemy/schema.py (1006 => 1007)</h4> <pre class="diff"><span> <span class="info">--- sqlalchemy/branches/new_eagerload/lib/sqlalchemy/schema.py 2006-02-20 16:34:02 UTC (rev 1006) +++ sqlalchemy/branches/new_eagerload/lib/sqlalchemy/schema.py 2006-02-20 19:05:11 UTC (rev 1007) </span><span class="lines">@@ -372,7 +372,7 @@ </span><span class="cx"> </span><span class="cx"> def references(self, table): </span><span class="cx"> """returns True if the given table is referenced by this ForeignKey.""" </span><del>- return table._get_col_by_original(self.column) is not None </del><ins>+ return table._get_col_by_original(self.column, False) is not None </ins><span class="cx"> </span><span class="cx"> def _init_column(self): </span><span class="cx"> # ForeignKey inits its remote column as late as possible, so tables can </span></span></pre></div> <a id="sqlalchemybranchesnew_eagerloadlibsqlalchemysqlpy"></a> <div class="modfile"><h4>Modified: sqlalchemy/branches/new_eagerload/lib/sqlalchemy/sql.py (1006 => 1007)</h4> <pre class="diff"><span> <span class="info">--- sqlalchemy/branches/new_eagerload/lib/sqlalchemy/sql.py 2006-02-20 16:34:02 UTC (rev 1006) +++ sqlalchemy/branches/new_eagerload/lib/sqlalchemy/sql.py 2006-02-20 19:05:11 UTC (rev 1007) </span><span class="lines">@@ -564,12 +564,19 @@ </span><span class="cx"> return Join(self, right, isouter = True, *args, **kwargs) </span><span class="cx"> def alias(self, name=None): </span><span class="cx"> return Alias(self, name) </span><del>- def _get_col_by_original(self, column): </del><ins>+ def _get_col_by_original(self, column, raiseerr=True): </ins><span class="cx"> """given a column which is a schema.Column object attached to a schema.Table object </span><span class="cx"> (i.e. an "original" column), return the Column object from this </span><span class="cx"> Selectable which corresponds to that original Column, or None if this Selectable </span><span class="cx"> does not contain the column.""" </span><del>- return self.original_columns.get(column.original, None) </del><ins>+ try: + return self.original_columns[column.original] + except KeyError: + if not raiseerr: + return None + else: + raise InvalidRequestError("cant get orig for " + str(column) + " with table " + column.table.id + " from table " + self.id) + </ins><span class="cx"> def _get_exported_attribute(self, name): </span><span class="cx"> try: </span><span class="cx"> return getattr(self, name) </span><span class="lines">@@ -596,6 +603,8 @@ </span><span class="cx"> for co in column.columns: </span><span class="cx"> cp = self._proxy_column(co) </span><span class="cx"> self._orig_cols[co.original] = cp </span><ins>+ if getattr(self, 'oid_column', None): + self._orig_cols[self.oid_column.original] = self.oid_column </ins><span class="cx"> def _exportable_columns(self): </span><span class="cx"> return [] </span><span class="cx"> def _proxy_column(self, column): </span><span class="lines">@@ -700,6 +709,8 @@ </span><span class="cx"> self.clauses.append(clause) </span><span class="cx"> def accept_visitor(self, visitor): </span><span class="cx"> for c in self.clauses: </span><ins>+ if c is None: + raise "oh weird" + repr(self.clauses) </ins><span class="cx"> c.accept_visitor(visitor) </span><span class="cx"> visitor.visit_clauselist(self) </span><span class="cx"> def _get_from_objects(self): </span><span class="lines">@@ -1080,6 +1091,9 @@ </span><span class="cx"> self._orig_cols= {} </span><span class="cx"> for c in self.columns: </span><span class="cx"> self._orig_cols[c.original] = c </span><ins>+ oid = self.oid_column + if oid is not None: + self._orig_cols[oid.original] = oid </ins><span class="cx"> return self._orig_cols </span><span class="cx"> </span><span class="cx"> oid_column = property(_oid_col) </span><span class="lines">@@ -1139,13 +1153,17 @@ </span><span class="cx"> if not hasattr(self, attribute): </span><span class="cx"> l = ClauseList(*clauses) </span><span class="cx"> setattr(self, attribute, l) </span><del>- self.append_clause(prefix, l) </del><ins>+ #self.append_clause(prefix, l) </ins><span class="cx"> else: </span><span class="cx"> getattr(self, attribute).clauses += clauses </span><del>- def append_clause(self, keyword, clause): - if type(clause) == str: - clause = TextClause(clause) - self.clauses.append((keyword, clause)) </del><ins>+ def _get_clauses(self): + x =[] + if getattr(self, 'group_by_clause', None): + x.append(("GROUP BY", self.group_by_clause)) + if getattr(self, 'order_by_clause', None): + x.append(("ORDER BY", self.order_by_clause)) + return x + clauses = property(_get_clauses) </ins><span class="cx"> def select(self, whereclauses = None, **params): </span><span class="cx"> return select([self], whereclauses, **params) </span><span class="cx"> def _get_from_objects(self): </span><span class="lines">@@ -1164,7 +1182,6 @@ </span><span class="cx"> for s in self.selects: </span><span class="cx"> s.group_by(None) </span><span class="cx"> s.order_by(None) </span><del>- self.clauses = [] </del><span class="cx"> group_by = kwargs.get('group_by', None) </span><span class="cx"> if group_by: </span><span class="cx"> self.group_by(*group_by) </span><span class="lines">@@ -1218,7 +1235,6 @@ </span><span class="cx"> # indicates if this select statement is a subquery as a criterion </span><span class="cx"> # inside of a WHERE clause </span><span class="cx"> self.is_where = False </span><del>- self.clauses = [] </del><span class="cx"> </span><span class="cx"> self.distinct = distinct </span><span class="cx"> self._text = None </span></span></pre></div> <a id="sqlalchemybranchesnew_eagerloadtestmapperpy"></a> <div class="modfile"><h4>Modified: sqlalchemy/branches/new_eagerload/test/mapper.py (1006 => 1007)</h4> <pre class="diff"><span> <span class="info">--- sqlalchemy/branches/new_eagerload/test/mapper.py 2006-02-20 16:34:02 UTC (rev 1006) +++ sqlalchemy/branches/new_eagerload/test/mapper.py 2006-02-20 19:05:11 UTC (rev 1007) </span><span class="lines">@@ -538,7 +538,7 @@ </span><span class="cx"> self.assert_result(l, User, *user_all_result) </span><span class="cx"> objectstore.clear() </span><span class="cx"> m = mapper(Item, orderitems, is_primary=True, properties = dict( </span><del>- keywords = relation(mapper(Keyword, keywords), itemkeywords, lazy = False), </del><ins>+ keywords = relation(mapper(Keyword, keywords), itemkeywords, lazy = False, order_by=[keywords.c.keyword_id]), </ins><span class="cx"> )) </span><span class="cx"> l = m.select((Item.c.item_name=='item 2') | (Item.c.item_name=='item 5') | (Item.c.item_name=='item 3'), order_by=[Item.c.item_id], limit=2) </span><span class="cx"> self.assert_result(l, Item, *[item_keyword_result[1], item_keyword_result[2]]) </span><span class="lines">@@ -660,7 +660,7 @@ </span><span class="cx"> items = orderitems </span><span class="cx"> </span><span class="cx"> m = mapper(Item, items, properties = dict( </span><del>- keywords = relation(mapper(Keyword, keywords), itemkeywords, lazy=False), </del><ins>+ keywords = relation(mapper(Keyword, keywords), itemkeywords, lazy=False, order_by=[keywords.c.keyword_id]), </ins><span class="cx"> )) </span><span class="cx"> l = m.select() </span><span class="cx"> self.assert_result(l, Item, *item_keyword_result) </span><span class="lines">@@ -679,7 +679,7 @@ </span><span class="cx"> </span><span class="cx"> m = mapper(Item, items, </span><span class="cx"> properties = dict( </span><del>- keywords = relation(mapper(Keyword, keywords), itemkeywords, lazy = False), </del><ins>+ keywords = relation(mapper(Keyword, keywords), itemkeywords, lazy = False, order_by=[keywords.c.keyword_id]), </ins><span class="cx"> )) </span><span class="cx"> </span><span class="cx"> m = mapper(Order, orders, properties = dict( </span></span></pre> </div> </div> </body> </html> |