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
########################################
|