[Sqlalchemy-commits] [1244] sqlalchemy/trunk/lib/sqlalchemy: made order_by/group_by construction a l
Brought to you by:
zzzeek
From: <co...@sq...> - 2006-04-03 05:01:09
|
<!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>[1244] sqlalchemy/trunk/lib/sqlalchemy: made order_by/group_by construction a little more simplisitc</title> </head> <body> <div id="msg"> <dl> <dt>Revision</dt> <dd>1244</dd> <dt>Author</dt> <dd>zzzeek</dd> <dt>Date</dt> <dd>2006-04-03 00:00:53 -0500 (Mon, 03 Apr 2006)</dd> </dl> <h3>Log Message</h3> <pre>made order_by/group_by construction a little more simplisitc fix to mapper extension CompoundSelect can export all columns now, not sure if theres any advantage there</pre> <h3>Modified Paths</h3> <ul> <li><a href="#sqlalchemytrunklibsqlalchemyansisqlpy">sqlalchemy/trunk/lib/sqlalchemy/ansisql.py</a></li> <li><a href="#sqlalchemytrunklibsqlalchemydatabasesoraclepy">sqlalchemy/trunk/lib/sqlalchemy/databases/oracle.py</a></li> <li><a href="#sqlalchemytrunklibsqlalchemymappingmapperpy">sqlalchemy/trunk/lib/sqlalchemy/mapping/mapper.py</a></li> <li><a href="#sqlalchemytrunklibsqlalchemysqlpy">sqlalchemy/trunk/lib/sqlalchemy/sql.py</a></li> </ul> </div> <div id="patch"> <h3>Diff</h3> <a id="sqlalchemytrunklibsqlalchemyansisqlpy"></a> <div class="modfile"><h4>Modified: sqlalchemy/trunk/lib/sqlalchemy/ansisql.py (1243 => 1244)</h4> <pre class="diff"><span> <span class="info">--- sqlalchemy/trunk/lib/sqlalchemy/ansisql.py 2006-04-03 03:24:06 UTC (rev 1243) +++ sqlalchemy/trunk/lib/sqlalchemy/ansisql.py 2006-04-03 05:00:53 UTC (rev 1244) </span><span class="lines">@@ -233,8 +233,12 @@ </span><span class="cx"> </span><span class="cx"> def visit_compound_select(self, cs): </span><span class="cx"> text = string.join([self.get_str(c) for c in cs.selects], " " + cs.keyword + " ") </span><del>- for tup in cs.clauses: - text += " " + tup[0] + " " + self.get_str(tup[1]) </del><ins>+ group_by = self.get_str(cs.group_by_clause) + if group_by: + text += " GROUP BY " + group_by + order_by = self.get_str(cs.order_by_clause) + if order_by: + text += " ORDER BY " + order_by </ins><span class="cx"> if cs.parens: </span><span class="cx"> self.strings[cs] = "(" + text + ")" </span><span class="cx"> else: </span><span class="lines">@@ -361,11 +365,14 @@ </span><span class="cx"> if t: </span><span class="cx"> text += " \nWHERE " + t </span><span class="cx"> </span><del>- for tup in select.clauses: - ss = self.get_str(tup[1]) - if ss: - text += " " + tup[0] + " " + ss </del><ins>+ group_by = self.get_str(select.group_by_clause) + if group_by: + text += " GROUP BY " + group_by </ins><span class="cx"> </span><ins>+ order_by = self.get_str(select.order_by_clause) + if order_by: + text += " ORDER BY " + order_by + </ins><span class="cx"> if select.having is not None: </span><span class="cx"> t = self.get_str(select.having) </span><span class="cx"> if t: </span></span></pre></div> <a id="sqlalchemytrunklibsqlalchemydatabasesoraclepy"></a> <div class="modfile"><h4>Modified: sqlalchemy/trunk/lib/sqlalchemy/databases/oracle.py (1243 => 1244)</h4> <pre class="diff"><span> <span class="info">--- sqlalchemy/trunk/lib/sqlalchemy/databases/oracle.py 2006-04-03 03:24:06 UTC (rev 1243) +++ sqlalchemy/trunk/lib/sqlalchemy/databases/oracle.py 2006-04-03 05:00:53 UTC (rev 1244) </span><span class="lines">@@ -276,9 +276,8 @@ </span><span class="cx"> return </span><span class="cx"> if select.limit is not None or select.offset is not None: </span><span class="cx"> select._oracle_visit = True </span><del>- if hasattr(select, "order_by_clause"): - orderby = self.strings[select.order_by_clause] - else: </del><ins>+ orderby = self.strings[select.order_by_clause] + if not orderby: </ins><span class="cx"> # to use ROW_NUMBER(), an ORDER BY is required. so here we dig in </span><span class="cx"> # as best we can to find some column we can order by </span><span class="cx"> # TODO: try to get "oid_column" to be used here </span></span></pre></div> <a id="sqlalchemytrunklibsqlalchemymappingmapperpy"></a> <div class="modfile"><h4>Modified: sqlalchemy/trunk/lib/sqlalchemy/mapping/mapper.py (1243 => 1244)</h4> <pre class="diff"><span> <span class="info">--- sqlalchemy/trunk/lib/sqlalchemy/mapping/mapper.py 2006-04-03 03:24:06 UTC (rev 1243) +++ sqlalchemy/trunk/lib/sqlalchemy/mapping/mapper.py 2006-04-03 05:00:53 UTC (rev 1244) </span><span class="lines">@@ -1062,7 +1062,7 @@ </span><span class="cx"> if self.next is None: </span><span class="cx"> return EXT_PASS </span><span class="cx"> else: </span><del>- return self.next.populate_instance(row, imap, result, instance, isnew) </del><ins>+ return self.next.populate_instance(mapper, instance, row, identitykey, imap, isnew) </ins><span class="cx"> def before_insert(self, mapper, instance): </span><span class="cx"> """called before an object instance is INSERTed into its table. </span><span class="cx"> </span></span></pre></div> <a id="sqlalchemytrunklibsqlalchemysqlpy"></a> <div class="modfile"><h4>Modified: sqlalchemy/trunk/lib/sqlalchemy/sql.py (1243 => 1244)</h4> <pre class="diff"><span> <span class="info">--- sqlalchemy/trunk/lib/sqlalchemy/sql.py 2006-04-03 03:24:06 UTC (rev 1243) +++ sqlalchemy/trunk/lib/sqlalchemy/sql.py 2006-04-03 05:00:53 UTC (rev 1244) </span><span class="lines">@@ -733,8 +733,6 @@ </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><del>- if c is None: - raise "oh weird" + repr(self.clauses) </del><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">@@ -1141,31 +1139,19 @@ </span><span class="cx"> class SelectBaseMixin(object): </span><span class="cx"> """base class for Select and CompoundSelects""" </span><span class="cx"> def order_by(self, *clauses): </span><del>- self._append_clause('order_by_clause', "ORDER BY", *clauses) </del><ins>+ if clauses[0] is None: + self.order_by_clause = ClauseList() + elif getattr(self, 'order_by_clause', None): + self.order_by_clause = ClauseList(*(list(clauses)+list(self.order_by_clause.clauses))) + else: + self.order_by_clause = ClauseList(*clauses) </ins><span class="cx"> def group_by(self, *clauses): </span><del>- self._append_clause('group_by_clause', "GROUP BY", *clauses) - def _append_clause(self, attribute, prefix, *clauses): - if len(clauses) == 1 and clauses[0] is None: - try: - delattr(self, attribute) - except AttributeError: - pass - return - if not hasattr(self, attribute): - l = ClauseList(*clauses) - setattr(self, attribute, l) </del><ins>+ if clauses[0] is None: + self.group_by_clause = ClauseList() + elif getattr(self, 'group_by_clause', None): + self.group_by_clause = ClauseList(*(list(clauses)+list(self.group_by_clause.clauses))) </ins><span class="cx"> else: </span><del>- getattr(self, attribute).clauses += clauses - def _get_clauses(self): - # TODO: this is a little stupid. make ORDER BY/GROUP BY keywords handled by - # the compiler, make group_by_clause/order_by_clause regular attributes - 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) </del><ins>+ self.group_by_clause = ClauseList(*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">@@ -1186,23 +1172,23 @@ </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>- group_by = kwargs.get('group_by', None) - if group_by: - self.group_by(*group_by) - order_by = kwargs.get('order_by', None) - if order_by: - self.order_by(*order_by) </del><ins>+ self.group_by(*kwargs.get('group_by', [None])) + self.order_by(*kwargs.get('order_by', [None])) + </ins><span class="cx"> def _exportable_columns(self): </span><del>- return self.selects[0].columns </del><ins>+ for s in self.selects: + for c in s.c: + yield c + </ins><span class="cx"> def _proxy_column(self, column): </span><del>- self._columns[column.key] = column - if column.primary_key: - self._primary_key.append(column) - if column.foreign_key: - self._foreign_keys.append(column) </del><ins>+ if self.use_labels: + return column._make_proxy(self, name=column._label) + else: + return column._make_proxy(self, name=column.name) + </ins><span class="cx"> def accept_visitor(self, visitor): </span><del>- for tup in self.clauses: - tup[1].accept_visitor(visitor) </del><ins>+ self.order_by_clause.accept_visitor(visitor) + self.group_by_clause.accept_visitor(visitor) </ins><span class="cx"> for s in self.selects: </span><span class="cx"> s.accept_visitor(visitor) </span><span class="cx"> visitor.visit_compound_select(self) </span><span class="lines">@@ -1251,6 +1237,9 @@ </span><span class="cx"> self._correlated = None </span><span class="cx"> self._correlator = Select.CorrelatedVisitor(self, False) </span><span class="cx"> self._wherecorrelator = Select.CorrelatedVisitor(self, True) </span><ins>+ + self.group_by(*(group_by or [None])) + self.order_by(*(order_by or [None])) </ins><span class="cx"> </span><span class="cx"> if columns is not None: </span><span class="cx"> for c in columns: </span><span class="lines">@@ -1263,11 +1252,7 @@ </span><span class="cx"> </span><span class="cx"> for f in from_obj: </span><span class="cx"> self.append_from(f) </span><del>- - if group_by: - self.group_by(*group_by) - if order_by: - self.order_by(*order_by) </del><ins>+ </ins><span class="cx"> </span><span class="cx"> class CorrelatedVisitor(ClauseVisitor): </span><span class="cx"> """visits a clause, locates any Select clauses, and tells them that they should </span><span class="lines">@@ -1355,8 +1340,8 @@ </span><span class="cx"> self.whereclause.accept_visitor(visitor) </span><span class="cx"> if self.having is not None: </span><span class="cx"> self.having.accept_visitor(visitor) </span><del>- for tup in self.clauses: - tup[1].accept_visitor(visitor) </del><ins>+ self.order_by_clause.accept_visitor(visitor) + self.group_by_clause.accept_visitor(visitor) </ins><span class="cx"> visitor.visit_select(self) </span><span class="cx"> </span><span class="cx"> def union(self, other, **kwargs): </span></span></pre> </div> </div> </body> </html> |