diff options
author | Mike Bayer <mike_mp@zzzcomputing.com> | 2006-06-19 21:44:56 +0000 |
---|---|---|
committer | Mike Bayer <mike_mp@zzzcomputing.com> | 2006-06-19 21:44:56 +0000 |
commit | 4445453a0cc1ca5e9f8095a4f8f3cf1371f91220 (patch) | |
tree | a4c1b83813bec4d82358c9a60fd2d57a38a1c121 /lib/sqlalchemy/sql_util.py | |
parent | 40e9887b6dd0c1c583831882555340d00473d6b0 (diff) | |
download | sqlalchemy-4445453a0cc1ca5e9f8095a4f8f3cf1371f91220.tar.gz |
more development on using eager loads/limit/offset/join_via/order_by at the same time
Diffstat (limited to 'lib/sqlalchemy/sql_util.py')
-rw-r--r-- | lib/sqlalchemy/sql_util.py | 37 |
1 files changed, 37 insertions, 0 deletions
diff --git a/lib/sqlalchemy/sql_util.py b/lib/sqlalchemy/sql_util.py index 082b7c80f..4015fd244 100644 --- a/lib/sqlalchemy/sql_util.py +++ b/lib/sqlalchemy/sql_util.py @@ -1,5 +1,6 @@ import sqlalchemy.sql as sql import sqlalchemy.schema as schema +import sqlalchemy.util as util """utility functions that build upon SQL and Schema constructs""" @@ -70,3 +71,39 @@ class TableFinder(TableCollection, sql.ClauseVisitor): if self.check_columns: column.table.accept_visitor(self) +class ColumnFinder(sql.ClauseVisitor): + def __init__(self): + self.columns = util.Set() + def visit_column(self, c): + self.columns.add(c) + def __iter__(self): + return iter(self.columns) + +class Aliasizer(sql.ClauseVisitor): + """converts a table instance within an expression to be an alias of that table.""" + def __init__(self, *tables, **kwargs): + self.tables = {} + self.aliases = kwargs.get('aliases', {}) + for t in tables: + self.tables[t] = t + if not self.aliases.has_key(t): + self.aliases[t] = sql.alias(t) + if isinstance(t, sql.Join): + for t2 in t.columns: + self.tables[t2.table] = t2 + self.aliases[t2.table] = self.aliases[t] + self.binary = None + def get_alias(self, table): + return self.aliases[table] + def visit_compound(self, compound): + self.visit_clauselist(compound) + def visit_clauselist(self, clist): + for i in range(0, len(clist.clauses)): + if isinstance(clist.clauses[i], schema.Column) and self.tables.has_key(clist.clauses[i].table): + orig = clist.clauses[i] + clist.clauses[i] = self.get_alias(clist.clauses[i].table).corresponding_column(clist.clauses[i]) + def visit_binary(self, binary): + if isinstance(binary.left, schema.Column) and self.tables.has_key(binary.left.table): + binary.left = self.get_alias(binary.left.table).corresponding_column(binary.left) + if isinstance(binary.right, schema.Column) and self.tables.has_key(binary.right.table): + binary.right = self.get_alias(binary.right.table).corresponding_column(binary.right) |