summaryrefslogtreecommitdiff
path: root/lib/sqlalchemy/sql/util.py
diff options
context:
space:
mode:
authorMike Bayer <mike_mp@zzzcomputing.com>2008-01-15 02:34:17 +0000
committerMike Bayer <mike_mp@zzzcomputing.com>2008-01-15 02:34:17 +0000
commit4870a41d277ef8638dd06d23ba20a69acf073739 (patch)
treeb896d5ac657c949e49b6ffb1a1b65f0b295989b0 /lib/sqlalchemy/sql/util.py
parent868a0584bacd26f7b7cb26c4d496af1c1c5affac (diff)
downloadsqlalchemy-4870a41d277ef8638dd06d23ba20a69acf073739.tar.gz
- select_table mapper turns straight join into aliased select + custom PK, to allow
joins onto select_table mappers - starting a generalized reduce_columns func
Diffstat (limited to 'lib/sqlalchemy/sql/util.py')
-rw-r--r--lib/sqlalchemy/sql/util.py30
1 files changed, 29 insertions, 1 deletions
diff --git a/lib/sqlalchemy/sql/util.py b/lib/sqlalchemy/sql/util.py
index c2ac26557..0989cb43e 100644
--- a/lib/sqlalchemy/sql/util.py
+++ b/lib/sqlalchemy/sql/util.py
@@ -1,5 +1,6 @@
from sqlalchemy import util, schema, topological
-from sqlalchemy.sql import expression, visitors
+from sqlalchemy.sql import expression, visitors, operators
+from itertools import chain
"""Utility functions that build upon SQL and Schema constructs."""
@@ -49,6 +50,33 @@ def find_columns(clause):
visitors.traverse(clause, visit_column=visit_column)
return cols
+
+def reduce_columns(columns, *clauses):
+ raise NotImplementedError()
+
+ # TODO !!!
+ all_proxied_cols = util.Set(chain(*[c.proxy_set for c in columns]))
+
+ columns = util.Set(columns)
+
+ equivs = {}
+ for col in columns:
+ for fk in col.foreign_keys:
+ if fk.column in all_proxied_cols:
+ for c in columns:
+ if col.references(c):
+ equivs[col] = c
+
+ if clauses:
+ def visit_binary(binary):
+ if binary.operator == operators.eq and binary.left in columns and binary.right in columns:
+ equivs[binary.left] = binary.right
+ for clause in clauses:
+ visitors.traverse(clause, visit_binary=visit_binary)
+
+ result = util.Set([c for c in columns if c not in equivs])
+ return expression.ColumnSet(result)
+
class ColumnsInClause(visitors.ClauseVisitor):
"""Given a selectable, visit clauses and determine if any columns
from the clause are in the selectable.