[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() |