[SQL-CVS] r752 - in trunk/SQLObject/sqlobject: . tests
SQLObject is a Python ORM.
Brought to you by:
ianbicking,
phd
|
From: <sub...@co...> - 2005-04-26 13:52:52
|
Author: phd
Date: 2005-04-26 13:52:45 +0000 (Tue, 26 Apr 2005)
New Revision: 752
Added:
trunk/SQLObject/sqlobject/tests/test_SQLMultipleJoin.py
trunk/SQLObject/sqlobject/tests/test_SQLRelatedJoin.py
Modified:
trunk/SQLObject/sqlobject/joins.py
Log:
Added SQLMultipleJoin and SQLRelatedJoin colusmns that return SelectResults
instead of lists.
Modified: trunk/SQLObject/sqlobject/joins.py
===================================================================
--- trunk/SQLObject/sqlobject/joins.py 2005-04-26 13:33:38 UTC (rev 751)
+++ trunk/SQLObject/sqlobject/joins.py 2005-04-26 13:52:45 UTC (rev 752)
@@ -4,7 +4,7 @@
import classregistry
from col import popKey
-__all__ = ['MultipleJoin', 'RelatedJoin']
+__all__ = ['MultipleJoin', 'SQLMultipleJoin', 'RelatedJoin', 'SQLRelatedJoin']
def getID(obj):
try:
@@ -35,7 +35,7 @@
def withClass(self, soClass):
if self.kw.has_key('joinMethodName'):
self._joinMethodName = self.kw['joinMethodName']
- del self.kw['joinMethodName']
+ del self.kw['joinMethodName']
return self.baseClass(soClass=soClass,
joinMethodName=self._joinMethodName,
**self.kw)
@@ -133,9 +133,20 @@
conn = None
return self._applyOrderBy([self.otherClass.get(id, conn) for (id,) in ids if id is not None], self.otherClass)
+class SOSQLMultipleJoin(SOMultipleJoin):
+
+ def performJoin(self, inst):
+ results=self.otherClass.select(getattr(self.otherClass.q, self.soClass.sqlmeta.style.dbColumnToPythonAttr(self.joinColumn))==inst.id)
+ if self.orderBy is NoDefault:
+ self.orderBy = self.otherClass.sqlmeta.defaultOrder
+ return results.orderBy(self.orderBy)
+
class MultipleJoin(Join):
baseClass = SOMultipleJoin
+class SQLMultipleJoin(Join):
+ baseClass = SOSQLMultipleJoin
+
# This is a many-to-many join, with an intermediary table
class SORelatedJoin(SOMultipleJoin):
@@ -191,9 +202,34 @@
self.otherColumn,
getID(other))
+class SOSQLRelatedJoin(SORelatedJoin):
+ def performJoin(self, inst):
+ options={
+ 'otherTable' : self.otherClass.sqlmeta.table,
+ 'otherID' : self.otherClass.sqlmeta.idName,
+ 'interTable' : self.intermediateTable,
+ 'table' : self.soClass.sqlmeta.table,
+ 'ID' : self.soClass.sqlmeta.idName,
+ 'joinCol' : self.joinColumn,
+ 'otherCol' : self.otherColumn,
+ 'idValue' : inst.id,
+ }
+ results = self.otherClass.select('''\
+%(otherTable)s.%(otherID)s = %(interTable)s.%(otherCol)s and
+%(interTable)s.%(joinCol)s = %(table)s.%(ID)s and
+%(table)s.%(ID)s = %(idValue)s''' % options, clauseTables=(
+ options['table'],
+ options['otherTable'],
+ options['interTable'],
+ ))
+ # TODO (michelts), apply order by on the selection
+ return results
+
class RelatedJoin(MultipleJoin):
baseClass = SORelatedJoin
+class SQLRelatedJoin(RelatedJoin):
+ baseClass = SOSQLRelatedJoin
+
def capitalize(name):
return name[0].capitalize() + name[1:]
-
Added: trunk/SQLObject/sqlobject/tests/test_SQLMultipleJoin.py
===================================================================
--- trunk/SQLObject/sqlobject/tests/test_SQLMultipleJoin.py 2005-04-26 13:33:38 UTC (rev 751)
+++ trunk/SQLObject/sqlobject/tests/test_SQLMultipleJoin.py 2005-04-26 13:52:45 UTC (rev 752)
@@ -0,0 +1,44 @@
+from sqlobject import *
+from sqlobject.tests.dbtest import *
+
+class Race(SQLObject):
+ name = StringCol()
+ fightersAsList = MultipleJoin('RFighter')
+ fightersAsSResult = SQLMultipleJoin('RFighter')
+
+class RFighter(SQLObject):
+ name = StringCol()
+ race = ForeignKey('Race')
+ power = IntCol()
+
+def createAllTables():
+ setupClass(Race)
+ setupClass(RFighter)
+
+def test_1():
+ createAllTables()
+ # create some races
+ human=Race(name='human')
+ saiyajin=Race(name='saiyajin')
+ hibrid=Race(name='hibrid (human with sayajin)')
+ namek=Race(name='namekuseijin')
+ # create some fighters
+ gokou=RFighter(name='Gokou (Kakaruto)', race=saiyajin, power=10)
+ vegeta=RFighter(name='Vegeta', race=saiyajin, power=9)
+ krilim=RFighter(name='Krilim', race=human, power=3)
+ yancha=RFighter(name='Yancha', race=human, power=2)
+ jackiechan=RFighter(name='Jackie Chan', race=human, power=2)
+ gohan=RFighter(name='Gohan', race=hibrid, power=8)
+ goten=RFighter(name='Goten', race=hibrid, power=7)
+ trunks=RFighter(name='Trunks', race=hibrid, power=8)
+ picollo=RFighter(name='Picollo', race=namek, power=6)
+ neil=RFighter(name='Neil', race=namek, power=5)
+
+ # testing the SQLMultipleJoin stuff
+ for i, j in zip(human.fightersAsList, human.fightersAsSResult):
+ assert i is j # the 2 ways should give the same result
+ assert namek.fightersAsSResult.count() == len(namek.fightersAsList)
+ assert saiyajin.fightersAsSResult.max('power') == 10
+ assert trunks in hibrid.fightersAsSResult
+ assert picollo not in hibrid.fightersAsSResult
+ assert hibrid.fightersAsSResult.sum('power') == 23
Added: trunk/SQLObject/sqlobject/tests/test_SQLRelatedJoin.py
===================================================================
--- trunk/SQLObject/sqlobject/tests/test_SQLRelatedJoin.py 2005-04-26 13:33:38 UTC (rev 751)
+++ trunk/SQLObject/sqlobject/tests/test_SQLRelatedJoin.py 2005-04-26 13:52:45 UTC (rev 752)
@@ -0,0 +1,44 @@
+from sqlobject import *
+from sqlobject.tests.dbtest import *
+
+class Fighter(SQLObject):
+ class sqlmeta:
+ idName='fighter_id' # test on a non-standard way
+ name = StringCol()
+ tourtments = RelatedJoin('Tourtment')
+
+class Tourtment(SQLObject):
+ class sqlmeta:
+ table='competition' # test on a non-standard way
+ name = StringCol()
+ fightersAsList = RelatedJoin('Fighter')
+ fightersAsSResult = SQLRelatedJoin('Fighter')
+
+def createAllTables():
+ setupClass(Fighter)
+ setupClass(Tourtment)
+
+def test_1():
+ createAllTables()
+ # create some tourtments
+ t1=Tourtment(name='Tourtment #1')
+ t2=Tourtment(name='Tourtment #2')
+ t3=Tourtment(name='Tourtment #3')
+ # create some fighters
+ gokou=Fighter(name='gokou')
+ vegeta=Fighter(name='vegeta')
+ gohan=Fighter(name='gohan')
+ trunks=Fighter(name='trunks')
+ # relating them
+ t1.addFighter(gokou)
+ t1.addFighter(vegeta)
+ t1.addFighter(gohan)
+ t2.addFighter(gokou)
+ t2.addFighter(vegeta)
+ t2.addFighter(trunks)
+ t3.addFighter(gohan)
+ t3.addFighter(trunks)
+ # do some selects
+ for i, j in zip(t1.fightersAsList, t1.fightersAsSResult):
+ assert i is j
+ assert len(t2.fightersAsList) == t2.fightersAsSResult.count()
|