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)
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,