Author: phd
Date: 2006-11-10 08:07:17 -0700 (Fri, 10 Nov 2006)
New Revision: 2069
Modified:
SQLObject/trunk/sqlobject/sqlbuilder.py
SQLObject/trunk/sqlobject/tests/test_subqueries.py
Log:
The patch 1592104: sqlbuilder.Select with JOINs.
Modified: SQLObject/trunk/sqlobject/sqlbuilder.py
===================================================================
--- SQLObject/trunk/sqlobject/sqlbuilder.py 2006-11-10 14:42:45 UTC (rev 2068)
+++ SQLObject/trunk/sqlobject/sqlbuilder.py 2006-11-10 15:07:17 UTC (rev 2069)
@@ -456,7 +456,7 @@
class Select(SQLExpression):
def __init__(self, items, where=NoDefault, groupBy=NoDefault,
- having=NoDefault, orderBy=NoDefault, limit=NoDefault):
+ having=NoDefault, orderBy=NoDefault, limit=NoDefault, join=NoDefault):
if type(items) is not type([]) and type(items) is not type(()):
items = [items]
self.items = items
@@ -465,10 +465,17 @@
self.having = having
self.orderBy = orderBy
self.limit = limit
+ self.join = join
def __sqlrepr__(self, db):
select = "SELECT %s" % ", ".join([sqlrepr(v, db) for v in self.items])
+ join = []
+ if self.join is not NoDefault:
+ if isinstance(self.join, SQLJoin):
+ join.append(self.join)
+ else:
+ join.extend(self.join)
tables = {}
things = list(self.items)
if self.whereClause is not NoDefault:
@@ -476,9 +483,20 @@
for thing in things:
if isinstance(thing, SQLExpression):
tables.update(tablesUsedDict(thing))
+ for j in join:
+ if j.table1 in tables: del tables[j.table1]
+ if j.table2 in tables: del tables[j.table2]
tables = tables.keys()
if tables:
select += " FROM %s" % ", ".join(tables)
+ elif join:
+ select += " FROM "
+ for j in join:
+ if tables and j.table1:
+ sep = ", "
+ else:
+ sep = " "
+ select += sep + sqlrepr(j, db)
if self.whereClause is not NoDefault:
select += " WHERE %s" % sqlrepr(self.whereClause, db)
Modified: SQLObject/trunk/sqlobject/tests/test_subqueries.py
===================================================================
--- SQLObject/trunk/sqlobject/tests/test_subqueries.py 2006-11-10 14:42:45 UTC (rev 2068)
+++ SQLObject/trunk/sqlobject/tests/test_subqueries.py 2006-11-10 15:07:17 UTC (rev 2069)
@@ -62,3 +62,16 @@
insert()
select = TestIn1.select(TestIn1.q.col1 == Select(TestIn2.q.col2, where=(TestIn2.q.col2 == "test")))
assert select.count() == 1
+
+def test_6syntax_join():
+ insert()
+ j = LEFTOUTERJOINOn(TestIn2, TestIn1, TestIn1.q.col1==TestIn2.q.col2)
+ select = TestIn1.select(TestIn1.q.col1 == Select(TestIn2.q.col2, where=(TestIn2.q.col2 == "test"), join=j))
+ assert str(select) == \
+ "SELECT test_in1.id, test_in1.col1 FROM test_in1 WHERE ((test_in1.col1) = (SELECT test_in2.col2 FROM test_in2 LEFT OUTER JOIN test_in1 ON ((test_in1.col1) = (test_in2.col2)) WHERE ((test_in2.col2) = ('test'))))"
+
+def test_6perform_join():
+ insert()
+ j = LEFTOUTERJOINOn(TestIn2, TestIn1, TestIn1.q.col1==TestIn2.q.col2)
+ select = TestIn1.select(TestIn1.q.col1 == Select(TestIn2.q.col2, where=(TestIn2.q.col2 == "test"), join=j))
+ assert select.count() == 1
|