diff options
author | Mike Bayer <mike_mp@zzzcomputing.com> | 2008-01-15 02:34:17 +0000 |
---|---|---|
committer | Mike Bayer <mike_mp@zzzcomputing.com> | 2008-01-15 02:34:17 +0000 |
commit | 4870a41d277ef8638dd06d23ba20a69acf073739 (patch) | |
tree | b896d5ac657c949e49b6ffb1a1b65f0b295989b0 /lib/sqlalchemy/sql/util.py | |
parent | 868a0584bacd26f7b7cb26c4d496af1c1c5affac (diff) | |
download | sqlalchemy-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.py | 30 |
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. |