[SQL-CVS] r2616 - in SQLObject/trunk/sqlobject: . tests
SQLObject is a Python ORM.
Brought to you by:
ianbicking,
phd
|
From: <sub...@co...> - 2007-05-01 01:50:45
|
Author: luke
Date: 2007-04-30 19:50:42 -0600 (Mon, 30 Apr 2007)
New Revision: 2616
Added:
SQLObject/trunk/sqlobject/tests/test_sqlbuilder_joins_instances.py
Modified:
SQLObject/trunk/sqlobject/main.py
SQLObject/trunk/sqlobject/sqlbuilder.py
SQLObject/trunk/sqlobject/tests/test_select_through.py
SQLObject/trunk/sqlobject/views.py
Log:
Merged fixes from branches/cache-deps-on-views for sresults.throughTo and joins/instances as .q. expressions
Modified: SQLObject/trunk/sqlobject/main.py
===================================================================
--- SQLObject/trunk/sqlobject/main.py 2007-05-01 01:35:15 UTC (rev 2615)
+++ SQLObject/trunk/sqlobject/main.py 2007-05-01 01:50:42 UTC (rev 2616)
@@ -1615,7 +1615,13 @@
cls._connection = value
setConnection = classmethod(setConnection)
+ def __sqlrepr__(self, db):
+ return sqlbuilder.sqlrepr(self.__class__.q.id==self.id)
+
+ def tablesUsedImmediate(self):
+ return [self.__class__.q]
+
def capitalize(name):
return name[0].capitalize() + name[1:]
Modified: SQLObject/trunk/sqlobject/sqlbuilder.py
===================================================================
--- SQLObject/trunk/sqlobject/sqlbuilder.py 2007-05-01 01:35:15 UTC (rev 2615)
+++ SQLObject/trunk/sqlobject/sqlbuilder.py 2007-05-01 01:50:42 UTC (rev 2616)
@@ -349,7 +349,6 @@
registerConverter(UnicodeField, SQLExprConverter)
-
class Table(SQLExpression):
FieldClass = Field
@@ -381,17 +380,43 @@
if attr.startswith('__'):
raise AttributeError
if attr == 'id':
- return self.FieldClass(self.tableName, self.soClass.sqlmeta.idName, attr)
+ return self._getattrFromID(attr)
+ elif attr+'ID' in self.soClass.sqlmeta.columns:
+ column = self.soClass.sqlmeta.columns[attr+'ID']
+ return self._getattrFromForeignKey(column, attr)
+ elif attr in [x.joinMethodName for x in self.soClass.sqlmeta.joins]:
+ join = [x for x in self.soClass.sqlmeta.joins if x.joinMethodName == attr][0]
+ return self._getattrFromJoin(join, attr)
elif attr not in self.soClass.sqlmeta.columns:
raise AttributeError("%s instance has no attribute '%s'" % (self.soClass.__name__, attr))
else:
column = self.soClass.sqlmeta.columns[attr]
if hasattr(column, "dbEncoding"):
- return self.UnicodeFieldClass(self.tableName, column.dbName,
- attr, column)
+ return self._getattrFromUnicodeColumn(column, attr)
else:
- return self.FieldClass(self.tableName, column.dbName, attr)
+ return self._getattrFromColumn(column, attr)
+ def _getattrFromID(self, attr):
+ return self.FieldClass(self.tableName, self.soClass.sqlmeta.idName, attr)
+
+ def _getattrFromForeignKey(self, column, attr):
+ ret = getattr(self, column.name)==getattr(self.soClass, '_SO_class_'+column.foreignKey).q.id
+ print column
+ return ret
+
+ def _getattrFromJoin(self, join, attr):
+ if hasattr(join, 'otherColumn'):
+ return AND(join.otherClass.q.id == Field(join.intermediateTable, join.otherColumn),
+ Field(join.intermediateTable, join.joinColumn) == self.soClass.q.id)
+ else:
+ return getattr(join.otherClass.q, join.joinColumn)==self.soClass.q.id
+
+ def _getattrFromColumn(self, column, attr):
+ return self.FieldClass(self.tableName, column.dbName, attr)
+
+ def _getattrFromUnicodeColumn(self, column, attr):
+ return self.UnicodeFieldClass(self.tableName, column.dbName, attr, column)
+
class TableSpace:
TableClass = Table
Modified: SQLObject/trunk/sqlobject/tests/test_select_through.py
===================================================================
--- SQLObject/trunk/sqlobject/tests/test_select_through.py 2007-05-01 01:35:15 UTC (rev 2615)
+++ SQLObject/trunk/sqlobject/tests/test_select_through.py 2007-05-01 01:50:42 UTC (rev 2616)
@@ -48,6 +48,7 @@
def testThroughRelatedJoin():
assert list(threes[0].twos.throughTo.threes) == [threes[0], threes[1]]
+ assert list(SRThrough3.select(SRThrough3.q.id==threes[0].id).throughTo.twos) == list(threes[0].twos)
def testThroughFKAndJoin():
assert list(threes[0].ones.throughTo.three.throughTo.twos) == [twos[0]]
\ No newline at end of file
Copied: SQLObject/trunk/sqlobject/tests/test_sqlbuilder_joins_instances.py (from rev 2534, SQLObject/branches/cache-deps-on-views/sqlobject/tests/test_sqlbuilder_joins_instances.py)
===================================================================
--- SQLObject/trunk/sqlobject/tests/test_sqlbuilder_joins_instances.py (rev 0)
+++ SQLObject/trunk/sqlobject/tests/test_sqlbuilder_joins_instances.py 2007-05-01 01:50:42 UTC (rev 2616)
@@ -0,0 +1,62 @@
+from sqlobject import *
+from sqlobject.sqlbuilder import *
+from sqlobject.tests.dbtest import *
+
+''' Testing for expressing join, foreign keys, and instance identity in SQLBuilder expressions.
+'''
+
+class SBPerson(SQLObject):
+ name = StringCol()
+ addresses = SQLMultipleJoin('SBAddress', joinColumn='personID')
+ sharedAddresses = SQLRelatedJoin('SBAddress', addRemoveName='SharedAddress')
+
+class SBAddress(SQLObject):
+ city = StringCol()
+ person = ForeignKey('SBPerson')
+ sharedPeople = SQLRelatedJoin('SBPerson')
+
+
+def setup_module(mod):
+ setupClass([SBPerson, SBAddress])
+ mod.ppl = inserts(SBPerson, [('James',),
+ ('Julia',)],
+ 'name')
+ mod.adds = inserts(SBAddress, [('London',mod.ppl[0].id),
+ ('Chicago',mod.ppl[1].id),
+ ('Abu Dhabi', mod.ppl[1].id)],
+ 'city personID')
+ mod.ppl[0].addSharedAddress(mod.adds[0])
+ mod.ppl[0].addSharedAddress(mod.adds[1])
+ mod.ppl[1].addSharedAddress(mod.adds[0])
+
+def testJoin():
+ assert list(SBPerson.select(AND(SBPerson.q.addresses,SBAddress.q.city=='London'))) == \
+ list(SBPerson.select(AND(SBPerson.q.id==SBAddress.q.personID, SBAddress.q.city=='London'))) == \
+ list(SBAddress.selectBy(city='London').throughTo.person)
+
+def testFK():
+ assert list(SBPerson.select(AND(SBAddress.q.person, SBAddress.q.city=='London'))) == \
+ list(SBPerson.select(AND(SBPerson.q.id==SBAddress.q.personID, SBAddress.q.city=='London')))
+
+def testJoin2():
+ assert list(SBAddress.select(AND(SBPerson.q.addresses, SBPerson.q.name=='Julia'))) == \
+ list(SBAddress.select(AND(SBPerson.q.id==SBAddress.q.personID, SBPerson.q.name=='Julia'))) == \
+ list(SBPerson.selectBy(name='Julia').throughTo.addresses)
+
+def testFK2():
+ assert list(SBAddress.select(AND(SBAddress.q.person, SBPerson.q.name=='Julia'))) == \
+ list(SBAddress.select(AND(SBPerson.q.id==SBAddress.q.personID, SBPerson.q.name=='Julia')))
+
+def testRelatedJoin():
+ assert list(SBAddress.select(AND(SBAddress.q.sharedPeople, SBPerson.q.name=='Julia'))) == \
+ list(SBPerson.selectBy(name='Julia').throughTo.sharedAddresses) == \
+ list(ppl[1].sharedAddresses)
+
+def testInstance():
+ assert list(SBAddress.select(AND(SBAddress.q.person, ppl[0]))) == \
+ list(SBAddress.select(AND(SBPerson.q.id==SBAddress.q.personID, SBPerson.q.id==ppl[0].id))) == \
+ list(ppl[0].addresses)
+
+def testInstance2():
+ assert list(SBAddress.select(AND(SBPerson.q.addresses, ppl[0]))) == \
+ list(SBAddress.select(AND(SBPerson.q.id==SBAddress.q.personID, SBPerson.q.id==ppl[0].id)))
\ No newline at end of file
Modified: SQLObject/trunk/sqlobject/views.py
===================================================================
--- SQLObject/trunk/sqlobject/views.py 2007-05-01 01:35:15 UTC (rev 2615)
+++ SQLObject/trunk/sqlobject/views.py 2007-05-01 01:50:42 UTC (rev 2616)
@@ -32,25 +32,18 @@
def __getattr__(self, attr):
if attr == 'sqlmeta':
raise AttributeError
- alias = self.soClass.sqlmeta.alias
- if attr.startswith('__'):
- raise AttributeError
- if attr == 'id':
- return self.FieldClass(alias, self.tableName, 'id', attr)
- elif attr not in self.soClass.sqlmeta.columns:
- raise AttributeError("%s instance has no attribute '%s'" % (self.soClass.__name__, attr))
- else:
- column = self.soClass.sqlmeta.columns[attr]
- if hasattr(column, "dbEncoding"):
- return self.UnicodeFieldClass(alias, self.tableName, column.name,
- attr, column)
- else:
- return self.FieldClass(alias, self.tableName, column.name, attr)
+ return SQLObjectTable.__getattr__(self, attr)
-class ViewSQLObjectMeta(sqlmeta):
- pass
+ def _getattrFromID(self, attr):
+ return self.FieldClass(self.soClass.sqlmeta.alias, self.tableName, 'id', attr)
+ def _getattrFromColumn(self, column, attr):
+ return self.FieldClass(self.soClass.sqlmeta.alias, self.tableName, column.name, attr)
+ def _getattrFromUnicodeColumn(self, column, attr):
+ return self.UnicodeFieldClass(self.soClass.sqlmeta.alias, self.tableName, column.name, attr, column)
+
+
class ViewSQLObject(SQLObject):
'''A SQLObject class that derives all it's values from other SQLObject classes.
Columns on subclasses should use SQLBuilder constructs for dbName,
@@ -61,9 +54,6 @@
See test_views.py for simple examples.
'''
- class sqlmeta(ViewSQLObjectMeta):
- pass
-
def __classinit__(cls, new_attrs):
SQLObject.__classinit__(cls, new_attrs)
# like is_base
|