]> git.ipfire.org Git - thirdparty/sqlalchemy/sqlalchemy.git/commitdiff
more capability added to reduce_columns
authorMike Bayer <mike_mp@zzzcomputing.com>
Wed, 23 Jan 2008 15:16:43 +0000 (15:16 +0000)
committerMike Bayer <mike_mp@zzzcomputing.com>
Wed, 23 Jan 2008 15:16:43 +0000 (15:16 +0000)
lib/sqlalchemy/sql/util.py
test/sql/selectable.py

index cecea51d334b6997d185119727f34f69b002a396..2cd0a26fdb2663ffdf8b2f2b2fcc362d4ae9efa4 100644 (file)
@@ -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)
     
index 8a25db184260d7f375f8dde0bb4bf68f6b3d84c8..fe2f41b2bbda000962e26bda6aa77996c0675411 100755 (executable)
@@ -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,