From: Mike Bayer Date: Wed, 23 Jan 2008 15:16:43 +0000 (+0000) Subject: more capability added to reduce_columns X-Git-Tag: rel_0_4_3~82 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=74a128c6867ef67623cc9d1de3bdfdc9b064f988;p=thirdparty%2Fsqlalchemy%2Fsqlalchemy.git more capability added to reduce_columns --- diff --git a/lib/sqlalchemy/sql/util.py b/lib/sqlalchemy/sql/util.py index cecea51d33..2cd0a26fdb 100644 --- a/lib/sqlalchemy/sql/util.py +++ b/lib/sqlalchemy/sql/util.py @@ -81,9 +81,13 @@ def reduce_columns(columns, *clauses): if clauses: def visit_binary(binary): - cols = columns.difference(omit) - if binary.operator == operators.eq and binary.left in cols and binary.right in cols: - omit.add(binary.right) + if binary.operator == operators.eq: + cols = util.Set(chain(*[c.proxy_set for c in columns.difference(omit)])) + if binary.left in cols and binary.right in cols: + for c in columns: + if c.shares_lineage(binary.right): + omit.add(c) + break for clause in clauses: visitors.traverse(clause, visit_binary=visit_binary) diff --git a/test/sql/selectable.py b/test/sql/selectable.py index 8a25db1842..fe2f41b2bb 100755 --- a/test/sql/selectable.py +++ b/test/sql/selectable.py @@ -316,6 +316,25 @@ class ReduceTest(AssertMixin): set([t1.c.t1id, t1.c.t1data, t2.c.t2data, t3.c.t3data]) ) + def test_reduce_selectable(self): + metadata = MetaData() + + engineers = Table('engineers', metadata, + Column('engineer_id', Integer, primary_key=True), + Column('engineer_name', String(50)), + ) + + managers = Table('managers', metadata, + Column('manager_id', Integer, primary_key=True), + Column('manager_name', String(50)) + ) + + s = select([engineers, managers]).where(engineers.c.engineer_name==managers.c.manager_name) + + self.assertEquals(set(sql_util.reduce_columns(list(s.c), s)), + set([s.c.engineer_id, s.c.engineer_name, s.c.manager_id]) + ) + def test_reduce_aliased_join(self): metadata = MetaData() people = Table('people', metadata,