Update of /cvsroot/sqlobject/SQLObject/SQLObject
In directory sc8-pr-cvs1:/tmp/cvs-serv4120/SQLObject
Modified Files:
DBConnection.py Join.py SQLBuilder.py SQLObject.py
Log Message:
* Made descending ordering work
* Made ordering with joins more robust
Index: DBConnection.py
===================================================================
RCS file: /cvsroot/sqlobject/SQLObject/SQLObject/DBConnection.py,v
retrieving revision 1.34
retrieving revision 1.35
diff -C2 -d -r1.34 -r1.35
*** DBConnection.py 24 May 2003 21:17:17 -0000 1.34
--- DBConnection.py 26 Jun 2003 08:33:56 -0000 1.35
***************
*** 174,194 ****
ops = select.ops
! def clauseList(lst):
if type(lst) not in (type([]), type(())):
lst = [lst]
! return [clauseQuote(i) for i in lst]
def clauseQuote(s):
if type(s) is type(""):
assert SQLBuilder.sqlIdentifier(s), "Strings in clauses are expected to be column identifiers. I got: %r" % s
if select.sourceClass._SO_columnDict.has_key(s):
s = select.sourceClass._SO_columnDict[s].dbName
! return s
else:
! return SQLBuilder.sqlRepr(s)
if order and ops.get('groupBy'):
! q = "%s GROUP BY %s" % (q, ", ".join(clauseList(ops['groupBy'])))
if order and ops.get('dbOrderBy'):
! q = "%s ORDER BY %s" % (q, ", ".join(clauseList(ops['dbOrderBy'])))
start = ops.get('start', 0)
--- 174,206 ----
ops = select.ops
! def clauseList(lst, desc=False):
if type(lst) not in (type([]), type(())):
lst = [lst]
! lst = [clauseQuote(i) for i in lst]
! if desc:
! lst = [SQLBuilder.DESC(i) for i in lst]
! return ', '.join([SQLBuilder.sqlRepr(i) for i in lst])
!
def clauseQuote(s):
if type(s) is type(""):
+ if s.startswith('-'):
+ desc = True
+ s = s[1:]
+ else:
+ desc = False
assert SQLBuilder.sqlIdentifier(s), "Strings in clauses are expected to be column identifiers. I got: %r" % s
if select.sourceClass._SO_columnDict.has_key(s):
s = select.sourceClass._SO_columnDict[s].dbName
! if desc:
! return SQLBuilder.DESC(SQLBuilder.SQLConstant(s))
! else:
! return SQLBuilder.SQLConstant(s)
else:
! return s
if order and ops.get('groupBy'):
! q = "%s GROUP BY %s" % (q, clauseList(ops['groupBy']))
if order and ops.get('dbOrderBy'):
! q = "%s ORDER BY %s" % (q, clauseList(ops['dbOrderBy'], ops.get('reversed', False)))
start = ops.get('start', 0)
Index: Join.py
===================================================================
RCS file: /cvsroot/sqlobject/SQLObject/SQLObject/Join.py,v
retrieving revision 1.3
retrieving revision 1.4
diff -C2 -d -r1.3 -r1.4
*** Join.py 4 Jun 2003 05:19:05 -0000 1.3
--- Join.py 26 Jun 2003 08:33:56 -0000 1.4
***************
*** 1,3 ****
! from SQLBuilder import NoDefault
import Style
import SQLObject
--- 1,4 ----
! import SQLBuilder
! NoDefault = SQLBuilder.NoDefault
import Style
import SQLObject
***************
*** 52,59 ****
if self.orderBy is not None:
def sorter(a, b, attr=self.orderBy):
return cmp(getattr(a, attr),
getattr(b, attr))
! results.sort(sorter)
return results
# This is a one-to-many
--- 53,85 ----
if self.orderBy is not None:
def sorter(a, b, attr=self.orderBy):
+ if attr.startswith('-'):
+ return -sorter(a, b, attr=attr[1:])
return cmp(getattr(a, attr),
getattr(b, attr))
! results.sort(self._sorter(self.orderBy))
return results
+
+ def _sorter(self, orderBy):
+ if isinstance(orderBy, tuple) or isinstance(orderBy, list):
+ if len(orderBy) == 1:
+ orderBy = orderBy[0]
+ else:
+ fhead = self._sorter(orderBy[0])
+ frest = self._sorter(orderBy[1:])
+ return lambda a, b, fhead=fhead, frest=frest: fhead(a, b) or frest(a, b)
+ if isinstance(orderBy, SQLBuilder.DESC) \
+ and isinstance(orderBy.expr, SQLBuilder.SQLObjectField):
+ orderBy = '-' + orderBy.expr.original
+ elif isinstance(orderBy, SQLBuilder.SQLObjectField):
+ orderBy = orderBy.original
+ # @@: but we don't handle more complex expressions for orderings
+ if orderBy.startswith('-'):
+ orderBy = orderBy[1:]
+ def sorter(a, b, attr=orderBy):
+ return cmp(getattr(b, attr), getattr(a, attr))
+ else:
+ def sorter(a, b, attr=orderBy):
+ return cmp(getattr(a, attr), getattr(b, attr))
+ return sorter
# This is a one-to-many
Index: SQLBuilder.py
===================================================================
RCS file: /cvsroot/sqlobject/SQLObject/SQLObject/SQLBuilder.py,v
retrieving revision 1.5
retrieving revision 1.6
diff -C2 -d -r1.5 -r1.6
*** SQLBuilder.py 5 May 2003 17:35:19 -0000 1.5
--- SQLBuilder.py 26 Jun 2003 08:33:56 -0000 1.6
***************
*** 358,365 ****
def __getattr__(self, attr):
if attr == 'id':
! return Table.__getattr__(self, self.soClass._idName)
else:
! return Table.__getattr__(
! self, self.soClass._SO_columnDict[attr].dbName)
class Field(SQLExpression):
--- 358,366 ----
def __getattr__(self, attr):
if attr == 'id':
! return SQLObjectField(self.tableName, self.soClass._idName, attr)
else:
! return SQLObjectField(self.tableName,
! self.soClass._SO_columnDict[attr].dbName,
! attr)
class Field(SQLExpression):
***************
*** 374,377 ****
--- 375,383 ----
return executor.field(self.tableName, self.fieldName)
+ class SQLObjectField(Field):
+ def __init__(self, tableName, fieldName, original):
+ self.original = original
+ Field.__init__(self, tableName, fieldName)
+
class ConstantSpace:
def __getattr__(self, attr):
***************
*** 517,520 ****
--- 523,536 ----
## SQL Builtins
########################################
+
+ class DESC(SQLExpression):
+
+ def __init__(self, expr):
+ self.expr = expr
+
+ def sqlRepr(self):
+ if isinstance(self.expr, DESC):
+ return sqlRepr(self.expr.expr)
+ return '%s DESC' % sqlRepr(self.expr)
def AND(*ops):
Index: SQLObject.py
===================================================================
RCS file: /cvsroot/sqlobject/SQLObject/SQLObject/SQLObject.py,v
retrieving revision 1.45
retrieving revision 1.46
diff -C2 -d -r1.45 -r1.46
*** SQLObject.py 4 Jun 2003 05:20:05 -0000 1.45
--- SQLObject.py 26 Jun 2003 08:33:56 -0000 1.46
***************
*** 846,853 ****
def select(cls, clause=None, clauseTables=None,
orderBy=NoDefault, groupBy=None, limit=None,
! lazyColumns=False):
return SelectResults(cls, clause, clauseTables=clauseTables,
orderBy=orderBy, groupBy=groupBy,
! limit=limit, lazyColumns=lazyColumns)
select = classmethod(select)
--- 846,854 ----
def select(cls, clause=None, clauseTables=None,
orderBy=NoDefault, groupBy=None, limit=None,
! lazyColumns=False, reversed=False):
return SelectResults(cls, clause, clauseTables=clauseTables,
orderBy=orderBy, groupBy=groupBy,
! limit=limit, lazyColumns=lazyColumns,
! reversed=reversed)
select = classmethod(select)
***************
*** 979,984 ****
orderBy = self.ops['orderBy']
if orderBy is not None:
if sourceClass._SO_columnDict.has_key(orderBy):
! self.ops['dbOrderBy'] = sourceClass._SO_columnDict[orderBy].dbName
def clone(self, **newOps):
--- 980,994 ----
orderBy = self.ops['orderBy']
if orderBy is not None:
+ if isinstance(orderBy, str) and orderBy.startswith('-'):
+ orderBy = orderBy[1:]
+ desc = True
+ else:
+ desc = False
if sourceClass._SO_columnDict.has_key(orderBy):
! self.ops['dbOrderBy'] = sourceClass._SO_columnDict[orderBy].dbName
! else:
! self.ops['dbOrderBy'] = orderBy
! if desc:
! self.ops['dbOrderBy'] = '-' + self.ops['dbOrderBy']
def clone(self, **newOps):
***************
*** 1002,1005 ****
--- 1012,1018 ----
def lazyColumns(self, value):
return self.clone(lazyColumns=value)
+
+ def reversed(self):
+ self.clone(reversed=not self.ops.get('reversed', False))
def __getitem__(self, value):
|