Author: phd
Date: 2008-03-03 09:09:00 -0700 (Mon, 03 Mar 2008)
New Revision: 3281
Modified:
SQLObject/branches/0.10/docs/News.txt
SQLObject/branches/0.10/sqlobject/inheritance/__init__.py
SQLObject/branches/0.10/sqlobject/sqlbuilder.py
SQLObject/branches/0.10/sqlobject/sresults.py
SQLObject/branches/0.10/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/branches/0.10/docs/News.txt
===================================================================
--- SQLObject/branches/0.10/docs/News.txt 2008-03-03 13:28:10 UTC (rev 3280)
+++ SQLObject/branches/0.10/docs/News.txt 2008-03-03 16:09:00 UTC (rev 3281)
@@ -32,8 +32,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
@@ -72,6 +70,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 tablesUsedDict handles sqlrepr'able objects.
+
SQLObject 0.9.4
===============
Modified: SQLObject/branches/0.10/sqlobject/inheritance/__init__.py
===================================================================
--- SQLObject/branches/0.10/sqlobject/inheritance/__init__.py 2008-03-03 13:28:10 UTC (rev 3280)
+++ SQLObject/branches/0.10/sqlobject/inheritance/__init__.py 2008-03-03 16:09:00 UTC (rev 3281)
@@ -5,17 +5,22 @@
makeProperties, getterName, setterName
import iteration
+try:
+ set
+except NameError: # Python 2.3
+ from sets import Set, ImmutableSet
+ set, frozenset = Set, ImmutableSet
-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 +33,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 +52,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 +79,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/branches/0.10/sqlobject/sqlbuilder.py
===================================================================
--- SQLObject/branches/0.10/sqlobject/sqlbuilder.py 2008-03-03 13:28:10 UTC (rev 3280)
+++ SQLObject/branches/0.10/sqlobject/sqlbuilder.py 2008-03-03 16:09:00 UTC (rev 3281)
@@ -67,6 +67,12 @@
class NoDefault:
pass
+try:
+ set
+except NameError: # Python 2.3
+ from sets import Set, ImmutableSet
+ set, frozenset = Set, ImmutableSet
+
import re, fnmatch
import operator
import threading
@@ -182,15 +188,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 +210,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 +619,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/branches/0.10/sqlobject/sresults.py
===================================================================
--- SQLObject/branches/0.10/sqlobject/sresults.py 2008-03-03 13:28:10 UTC (rev 3280)
+++ SQLObject/branches/0.10/sqlobject/sresults.py 2008-03-03 16:09:00 UTC (rev 3281)
@@ -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/branches/0.10/sqlobject/tests/test_sqlbuilder_importproxy.py
===================================================================
--- SQLObject/branches/0.10/sqlobject/tests/test_sqlbuilder_importproxy.py 2008-03-03 13:28:10 UTC (rev 3280)
+++ SQLObject/branches/0.10/sqlobject/tests/test_sqlbuilder_importproxy.py 2008-03-03 16:09:00 UTC (rev 3281)
@@ -3,49 +3,55 @@
from sqlobject.views import *
from sqlobject.sqlbuilder import ImportProxy, Alias
+try:
+ set
+except NameError: # Python 2.3
+ from sets import Set
+ set = Set
+
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'
|