[SQL-CVS] r103 - in trunk/SQLObject: sqlobject tests
SQLObject is a Python ORM.
Brought to you by:
ianbicking,
phd
From: <sub...@co...> - 2004-04-14 20:35:22
|
Author: sweafty Date: 2004-04-14 12:38:33 -0400 (Wed, 14 Apr 2004) New Revision: 103 Modified: trunk/SQLObject/sqlobject/dbconnection.py trunk/SQLObject/sqlobject/main.py trunk/SQLObject/tests/test.py Log: Accumulate functions in SelectResults: sum(), count() Modified: trunk/SQLObject/sqlobject/dbconnection.py =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D --- trunk/SQLObject/sqlobject/dbconnection.py 2004-04-05 02:41:54 UTC (re= v 102) +++ trunk/SQLObject/sqlobject/dbconnection.py 2004-04-14 16:38:33 UTC (re= v 103) @@ -236,9 +236,14 @@ return Iteration(self, self.getConnection(), select, keepConnection=3DFalse) =20 - def countSelect(self, select): - q =3D "SELECT COUNT(*) FROM %s WHERE" % \ - ", ".join(select.tables) + def accumulateSelect(self, select, expression): + """ Apply an accumulate function (like SUM, COUNT, ..) + to the select object. + Return the value resulting from the SQL accumulate function + as an integer. + """ + q =3D "SELECT %s" % expression + q +=3D " FROM %s WHERE" % ", ".join(select.tables) q =3D self._addWhereClause(select, q, limit=3D0, order=3D0) val =3D int(self.queryOne(q)[0]) return val Modified: trunk/SQLObject/sqlobject/main.py =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D --- trunk/SQLObject/sqlobject/main.py 2004-04-05 02:41:54 UTC (rev 102) +++ trunk/SQLObject/sqlobject/main.py 2004-04-14 16:38:33 UTC (rev 103) @@ -1191,15 +1191,35 @@ conn =3D self.ops.get('connection', self.sourceClass._connection= ) return conn.iterSelect(self) =20 + def accumulate(self, expression): + """ Use an accumulate expression to select result + using another SQL select through current + connection. + Return the accumulate result + """ + conn =3D self.ops.get('connection', self.sourceClass._connection= ) + return conn.accumulateSelect(self,expression) + def count(self): - conn =3D self.ops.get('connection', self.sourceClass._connection= ) - count =3D conn.countSelect(self) + """ Counting elements of current select results """ + count =3D self.accumulate('COUNT(*)') if self.ops.get('start'): count -=3D self.ops['start'] if self.ops.get('end'): count =3D min(self.ops['end'] - self.ops.get('start', 0), co= unt) return count =20 + def sum(self, attribute): + """ Making the sum of a given select result attribute. + `attribute` can be a column name (like 'a_column') + or a dot-q attribute (like Table.q.aColumn) + """ + if type(attribute) =3D=3D type(''): + expression =3D 'SUM(%s)' % attribute + else: + expression =3D sqlbuilder.func.SUM(attribute) + return self.accumulate(expression) + class SQLObjectState(object): =20 def __init__(self, soObject): Modified: trunk/SQLObject/tests/test.py =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D --- trunk/SQLObject/tests/test.py 2004-04-05 02:41:54 UTC (rev 102) +++ trunk/SQLObject/tests/test.py 2004-04-14 16:38:33 UTC (rev 103) @@ -499,6 +499,17 @@ def counterEqual(self, counters, value): self.assertEquals([(c.n1, c.n2) for c in counters], value) =20 + def accumulateEqual(self, func, counters, value): + self.assertEqual(func([ c.n1 for c in counters]), value) + + def test1(self): + self.accumulateEqual(sum,Counter2.select('n1', orderBy=3D'n1'), + sum(range(10)) * 10) + + def test2(self): + self.accumulateEqual(len,Counter2.select('all'), 100) + + =20 ######################################## ## Dynamic column tests ######################################## |