Author: luke
Date: 2007-02-21 14:57:38 -0700 (Wed, 21 Feb 2007)
New Revision: 2341
Modified:
SQLObject/branches/sqlbuilder-views/sqlobject/sresults.py
SQLObject/branches/sqlbuilder-views/sqlobject/tests/test_views.py
SQLObject/branches/sqlbuilder-views/sqlobject/views.py
Log:
View alias-renaming using sqlmeta.table works in subclass situations now, and COUNT DISTINCT over views now sqlrepr's the id field
Modified: SQLObject/branches/sqlbuilder-views/sqlobject/sresults.py
===================================================================
--- SQLObject/branches/sqlbuilder-views/sqlobject/sresults.py 2007-02-21 21:39:09 UTC (rev 2340)
+++ SQLObject/branches/sqlbuilder-views/sqlobject/sresults.py 2007-02-21 21:57:38 UTC (rev 2341)
@@ -211,9 +211,7 @@
# COUNT(DISTINCT column) is supported by MySQL and PostgreSQL,
# but not by SQLite. Perhaps more portable would be subquery:
# SELECT COUNT(*) FROM (SELECT DISTINCT id FROM table)
- count = self.accumulate('COUNT(DISTINCT %s.%s)' % (
- self.sourceClass.sqlmeta.table,
- self.sourceClass.sqlmeta.idName))
+ count = self.accumulate('COUNT(DISTINCT %s)' % self._getConnection().sqlrepr(self.sourceClass.q.id))
else:
count = self.accumulate('COUNT(*)')
if self.ops.get('start'):
Modified: SQLObject/branches/sqlbuilder-views/sqlobject/tests/test_views.py
===================================================================
--- SQLObject/branches/sqlbuilder-views/sqlobject/tests/test_views.py 2007-02-21 21:39:09 UTC (rev 2340)
+++ SQLObject/branches/sqlbuilder-views/sqlobject/tests/test_views.py 2007-02-21 21:57:38 UTC (rev 2341)
@@ -43,7 +43,10 @@
number = StringCol(dbName=ViewPhone.q.number)
timesCalled = IntCol(dbName=func.COUNT(PhoneCall.q.toID))
minutesCalled = IntCol(dbName=func.SUM(PhoneCall.q.minutes))
-
+
+class ViewPhoneMore2(ViewPhoneMore):
+ class sqlmeta:
+ table = 'vpm'
def setup_module(mod):
@@ -74,6 +77,9 @@
assert q.count('phone_call.minutes AS minutes')
assert q.count('phone_number.number AS number')
+def testAliasOverride():
+ assert str(sqlrepr(ViewPhoneMore2.q.id)) == 'vpm.id'
+
def checkAttr(cls, id, attr, value):
assert getattr(cls.get(id), attr) == value
@@ -109,4 +115,9 @@
def testSelect2():
s = ViewPhone.select(ViewPhone.q.number==phones[0].number)
- assert s.getOne().phoneNumber == phones[0]
\ No newline at end of file
+ assert s.getOne().phoneNumber == phones[0]
+
+def testDistinctCount():
+ # This test is for SelectResults non-* based count when distinct
+ # We're really just checking this doesn't raise anything due to lack of sqlrepr'ing
+ assert ViewPhone.select(distinct=True).count() == 2
\ No newline at end of file
Modified: SQLObject/branches/sqlbuilder-views/sqlobject/views.py
===================================================================
--- SQLObject/branches/sqlbuilder-views/sqlobject/views.py 2007-02-21 21:39:09 UTC (rev 2340)
+++ SQLObject/branches/sqlbuilder-views/sqlobject/views.py 2007-02-21 21:57:38 UTC (rev 2341)
@@ -67,7 +67,7 @@
and sqlmeta should specify:
idName as a SQLBuilder construction
clause as SQLBuilder clause for specifying join conditions or other restrictions
- alias as an optional alternate name (as table is typically used for SQLObjects)
+ table as an optional alternate name for the class alias
See test_views.py for simple examples.
'''
@@ -78,7 +78,9 @@
SQLObject.__classinit__(cls, new_attrs)
# like is_base
if cls.__name__ != 'ViewSQLObject':
- if not getattr(cls.sqlmeta, 'alias', None):
+ if getattr(cls.sqlmeta, 'table', None):
+ cls.sqlmeta.alias = cls.sqlmeta.table
+ else:
cls.sqlmeta.alias = cls.sqlmeta.style.pythonClassToDBTable(cls.__name__)
alias = cls.sqlmeta.alias
columns = [ColumnAS(cls.sqlmeta.idName, 'id')]
|