Author: phd
Date: 2007-01-23 09:24:31 -0700 (Tue, 23 Jan 2007)
New Revision: 2233
Added:
SQLObject/trunk/sqlobject/inheritance/tests/test_aggregates.py
Modified:
SQLObject/trunk/sqlobject/inheritance/__init__.py
Log:
Fixed aggregators and accumulators with inheritance.
Modified: SQLObject/trunk/sqlobject/inheritance/__init__.py
===================================================================
--- SQLObject/trunk/sqlobject/inheritance/__init__.py 2007-01-23 15:16:43 UTC (rev 2232)
+++ SQLObject/trunk/sqlobject/inheritance/__init__.py 2007-01-23 16:24:31 UTC (rev 2233)
@@ -19,7 +19,6 @@
elif isinstance(obj, (tuple, list)):
d = {}
for component in obj:
- print component
d.update(tablesUsedDict(component))
return d
else:
@@ -29,12 +28,16 @@
class InheritableSelectResults(SelectResults):
IterationClass = iteration.InheritableIteration
- def __init__(self, sourceClass, clause, clauseTables=None, **ops):
+ def __init__(self, sourceClass, clause, clauseTables=None,
+ inheritedTables=None, **ops):
if clause is None or isinstance(clause, str) and clause == 'all':
clause = sqlbuilder.SQLTrueClause
tablesDict = tablesUsedDict(clause)
tablesDict[sourceClass.sqlmeta.table] = 1
orderBy = ops.get('orderBy')
+ if inheritedTables:
+ for tableName in inheritedTables:
+ tablesDict[tableName] = 1
if orderBy and not isinstance(orderBy, basestring):
tablesDict.update(tablesUsedDict(orderBy))
#DSM: if this class has a parent, we need to link it
@@ -81,6 +84,16 @@
super(InheritableSelectResults, self).__init__(sourceClass,
clause, clauseTables, **ops)
+ def accumulateMany(self, *attributes, **kw):
+ if kw.get("skipInherited"):
+ return super(InheritableSelectResults, self).accumulateMany(*attributes)
+ tables = []
+ for func_name, attribute in attributes:
+ if not isinstance(attribute, basestring):
+ tables.append(attribute.tableName)
+ clone = self.__class__(self.sourceClass, self.clause,
+ self.clauseTables, inheritedTables=tables, **self.ops)
+ return clone.accumulateMany(skipInherited=True, *attributes)
class InheritableSQLMeta(sqlmeta):
def addColumn(sqlmeta, columnDef, changeSchema=False, connection=None, childUpdate=False):
Added: SQLObject/trunk/sqlobject/inheritance/tests/test_aggregates.py
===================================================================
--- SQLObject/trunk/sqlobject/inheritance/tests/test_aggregates.py (rev 0)
+++ SQLObject/trunk/sqlobject/inheritance/tests/test_aggregates.py 2007-01-23 16:24:31 UTC (rev 2233)
@@ -0,0 +1,20 @@
+from sqlobject import *
+from sqlobject.inheritance import *
+from sqlobject.tests.dbtest import *
+
+class TestAggregate1(InheritableSQLObject):
+ value1 = IntCol()
+
+class TestAggregate2(TestAggregate1):
+ value2 = IntCol()
+
+def test_aggregates():
+ setupClass([TestAggregate1, TestAggregate2])
+
+ TestAggregate1(value1=1)
+ TestAggregate2(value1=2, value2=12)
+
+ assert TestAggregate1.select().max("value1") == 2
+ assert TestAggregate2.select().max("value1") == 2
+ raises(Exception, TestAggregate2.select().max, "value2")
+ assert TestAggregate2.select().max(TestAggregate2.q.value2) == 12
|