Author: phd
Date: 2008-03-03 09:09:49 -0700 (Mon, 03 Mar 2008)
New Revision: 3282
Modified:
SQLObject/trunk/docs/News.txt
SQLObject/trunk/sqlobject/converters.py
SQLObject/trunk/sqlobject/inheritance/__init__.py
SQLObject/trunk/sqlobject/sqlbuilder.py
SQLObject/trunk/sqlobject/sresults.py
SQLObject/trunk/sqlobject/tests/test_sqlbuilder_importproxy.py
Log:
Applied a patch 1673015 by Leandro Lucarella:
use sets instead of dicts in tablesUsed. Dropped tablesUsedDict function;
instead there is tablesUsedSet that returns a set of strings.
Modified: SQLObject/trunk/docs/News.txt
===================================================================
--- SQLObject/trunk/docs/News.txt 2008-03-03 16:09:00 UTC (rev 3281)
+++ SQLObject/trunk/docs/News.txt 2008-03-03 16:09:49 UTC (rev 3282)
@@ -40,8 +40,6 @@
* SQLBuilder Joins handle SQLExpression tables (not just str/SQLObject/Alias)
and properly sqlrepr.
-* SQLBuilder tablesUsedDict handles sqlrepr'able objects.
-
* Added SQLBuilder ImportProxy. It allows one to ignore the circular import
issues with referring to SQLObject classes in other files - it uses the
classregistry as the string class names for FK/Joins do, but specifically
@@ -80,6 +78,11 @@
* MySQLConnection (and DB URI) accept a number of SSL-related parameters:
ssl_key, ssl_cert, ssl_ca, ssl_capath.
+* Use sets instead of dicts in tablesUsed. Dropped tablesUsedDict function;
+ instead there is tablesUsedSet that returns a set of strings.
+
+* SQLBuilder tablesUsedSet handles sqlrepr'able objects.
+
SQLObject 0.9.4
===============
Modified: SQLObject/trunk/sqlobject/converters.py
===================================================================
--- SQLObject/trunk/sqlobject/converters.py 2008-03-03 16:09:00 UTC (rev 3281)
+++ SQLObject/trunk/sqlobject/converters.py 2008-03-03 16:09:49 UTC (rev 3282)
@@ -154,20 +154,11 @@
registerConverter(tuple, SequenceConverter)
registerConverter(list, SequenceConverter)
registerConverter(dict, SequenceConverter)
-try:
- set, frozenset
-except NameError:
- pass
-else:
- registerConverter(set, SequenceConverter)
- registerConverter(frozenset, SequenceConverter)
-try:
- from sets import Set, ImmutableSet
-except ImportError:
- pass
-else:
- registerConverter(Set, SequenceConverter)
- registerConverter(ImmutableSet, SequenceConverter)
+registerConverter(set, SequenceConverter)
+registerConverter(frozenset, SequenceConverter)
+from sets import Set, ImmutableSet
+registerConverter(Set, SequenceConverter)
+registerConverter(ImmutableSet, SequenceConverter)
if hasattr(time, 'struct_time'):
def StructTimeConverter(value, db):
Modified: SQLObject/trunk/sqlobject/inheritance/__init__.py
===================================================================
--- SQLObject/trunk/sqlobject/inheritance/__init__.py 2008-03-03 16:09:00 UTC (rev 3281)
+++ SQLObject/trunk/sqlobject/inheritance/__init__.py 2008-03-03 16:09:49 UTC (rev 3282)
@@ -5,17 +5,16 @@
makeProperties, getterName, setterName
import iteration
-
-def tablesUsedDict(obj, db):
- if hasattr(obj, "tablesUsedDict"):
- return obj.tablesUsedDict(db)
- elif isinstance(obj, (tuple, list)):
- d = {}
+def tablesUsedSet(obj, db):
+ if hasattr(obj, "tablesUsedSet"):
+ return obj.tablesUsedSet(db)
+ elif isinstance(obj, (tuple, list, set, frozenset)):
+ s = set()
for component in obj:
- d.update(tablesUsedDict(component, db))
- return d
+ s.update(tablesUsedSet(component, db))
+ return s
else:
- return {}
+ return set()
class InheritableSelectResults(SelectResults):
@@ -28,14 +27,14 @@
dbName = (ops.get('connection',None) or sourceClass._connection).dbName
- tablesDict = tablesUsedDict(clause, dbName)
- tablesDict[str(sourceClass.sqlmeta.table)] = 1
+ tablesSet = tablesUsedSet(clause, dbName)
+ tablesSet.add(str(sourceClass.sqlmeta.table))
orderBy = ops.get('orderBy')
if inheritedTables:
for tableName in inheritedTables:
- tablesDict[str(tableName)] = 1
+ tablesSet.add(str(tableName))
if orderBy and not isinstance(orderBy, basestring):
- tablesDict.update(tablesUsedDict(orderBy, dbName))
+ tablesSet.update(tablesUsedSet(orderBy, dbName))
#DSM: if this class has a parent, we need to link it
#DSM: and be sure the parent is in the table list.
#DSM: The following code is before clauseTables
@@ -47,7 +46,7 @@
allClasses = classregistry.registry(
sourceClass.sqlmeta.registry).allClasses()
for registryClass in allClasses:
- if str(registryClass.sqlmeta.table) in tablesDict:
+ if str(registryClass.sqlmeta.table) in tablesSet:
#DSM: By default, no parents are needed for the clauses
tableRegistry[registryClass] = registryClass
tableRegistryCopy = tableRegistry.copy()
@@ -74,7 +73,7 @@
parentClass = currentClass.sqlmeta.parentClass
parentClause.append(currentClass.q.id == parentClass.q.id)
currentClass = parentClass
- tablesDict[str(currentClass.sqlmeta.table)] = 1
+ tablesSet.add(str(currentClass.sqlmeta.table))
clause = reduce(sqlbuilder.AND, parentClause, clause)
super(InheritableSelectResults, self).__init__(sourceClass,
Modified: SQLObject/trunk/sqlobject/sqlbuilder.py
===================================================================
--- SQLObject/trunk/sqlobject/sqlbuilder.py 2008-03-03 16:09:00 UTC (rev 3281)
+++ SQLObject/trunk/sqlobject/sqlbuilder.py 2008-03-03 16:09:49 UTC (rev 3282)
@@ -182,15 +182,15 @@
return []
def tablesUsed(self, db):
- return self.tablesUsedDict(db).keys()
- def tablesUsedDict(self, db):
- tables = {}
+ return self.tablesUsedSet(db)
+ def tablesUsedSet(self, db):
+ tables = set()
for table in self.tablesUsedImmediate():
if hasattr(table, '__sqlrepr__'):
table = sqlrepr(table, db)
- tables[table] = 1
+ tables.add(table)
for component in self.components():
- tables.update(tablesUsedDict(component, db))
+ tables.update(tablesUsedSet(component, db))
return tables
def tablesUsedImmediate(self):
return []
@@ -204,9 +204,9 @@
registerConverter(SQLExpression, SQLExprConverter)
-def tablesUsedDict(obj, db):
- if hasattr(obj, "tablesUsedDict"):
- return obj.tablesUsedDict(db)
+def tablesUsedSet(obj, db):
+ if hasattr(obj, "tablesUsedSet"):
+ return obj.tablesUsedSet(db)
else:
return {}
@@ -613,22 +613,21 @@
join.append(_join)
else:
join.extend(_join)
- tables = {}
+ tables = set()
for x in self.ops['staticTables']:
if isinstance(x, SQLExpression):
x = sqlrepr(x, db)
- tables[x] = 1
+ tables.add(x)
things = list(self.ops['items']) + join
if self.ops['clause'] is not NoDefault:
things.append(self.ops['clause'])
for thing in things:
if isinstance(thing, SQLExpression):
- tables.update(tablesUsedDict(thing, db))
+ tables.update(tablesUsedSet(thing, db))
for j in join:
t1, t2 = sqlrepr(j.table1, db), sqlrepr(j.table2, db)
- if t1 in tables: del tables[t1]
- if t2 in tables: del tables[t2]
- tables = tables.keys()
+ if t1 in tables: tables.remove(t1)
+ if t2 in tables: tables.remove(t2)
if tables:
select += " FROM %s" % ", ".join(tables)
elif join:
Modified: SQLObject/trunk/sqlobject/sresults.py
===================================================================
--- SQLObject/trunk/sqlobject/sresults.py 2008-03-03 16:09:00 UTC (rev 3281)
+++ SQLObject/trunk/sqlobject/sresults.py 2008-03-03 16:09:49 UTC (rev 3282)
@@ -31,13 +31,13 @@
ops["start"] = 0
ops["end"] = ops.pop("limit")
- tablesDict = sqlbuilder.tablesUsedDict(self.clause, self._getConnection().dbName)
+ tablesSet = sqlbuilder.tablesUsedSet(self.clause, self._getConnection().dbName)
if clauseTables:
for table in clauseTables:
- tablesDict[table] = 1
+ tablesSet.add(table)
self.clauseTables = clauseTables
# Explicitly post-adding-in sqlmeta.table, sqlbuilder.Select will handle sqlrepr'ing and dupes
- self.tables = tablesDict.keys() + [sourceClass.sqlmeta.table]
+ self.tables = list(tablesSet) + [sourceClass.sqlmeta.table]
def queryForSelect(self):
columns = [self.sourceClass.q.id] + [getattr(self.sourceClass.q, x.name) for x in self.sourceClass.sqlmeta.columnList]
Modified: SQLObject/trunk/sqlobject/tests/test_sqlbuilder_importproxy.py
===================================================================
--- SQLObject/trunk/sqlobject/tests/test_sqlbuilder_importproxy.py 2008-03-03 16:09:00 UTC (rev 3281)
+++ SQLObject/trunk/sqlobject/tests/test_sqlbuilder_importproxy.py 2008-03-03 16:09:49 UTC (rev 3282)
@@ -6,46 +6,46 @@
def testSimple():
nyi = ImportProxy('NotYetImported')
x = nyi.q.name
-
+
class NotYetImported(SQLObject):
name = StringCol(dbName='a_name')
-
+
y = nyi.q.name
-
+
assert str(x) == 'not_yet_imported.a_name'
assert str(y) == 'not_yet_imported.a_name'
def testAddition():
nyi = ImportProxy('NotYetImported2')
x = nyi.q.name+nyi.q.name
-
+
class NotYetImported2(SQLObject):
name = StringCol(dbName='a_name')
-
+
assert str(x) == '((not_yet_imported2.a_name) + (not_yet_imported2.a_name))'
-
+
def testOnView():
nyi = ImportProxy('NotYetImportedV')
x = nyi.q.name
-
+
class NotYetImported3(SQLObject):
name = StringCol(dbName='a_name')
-
+
class NotYetImportedV(ViewSQLObject):
class sqlmeta:
idName = NotYetImported3.q.id
name = StringCol(dbName=NotYetImported3.q.name)
-
+
assert str(x) == 'not_yet_imported_v.name'
-
+
def testAlias():
nyi = ImportProxy('NotYetImported4')
y = Alias(nyi, 'y')
x = y.q.name
-
+
class NotYetImported4(SQLObject):
name = StringCol(dbName='a_name')
-
+
assert str(y) == 'not_yet_imported4 y'
- assert tablesUsedDict(x, None).keys() == ['not_yet_imported4 y']
- assert str(x) == 'y.a_name'
\ No newline at end of file
+ assert tablesUsedSet(x, None) == set(['not_yet_imported4 y'])
+ assert str(x) == 'y.a_name'
|