diff options
author | Mike Bayer <mike_mp@zzzcomputing.com> | 2013-06-03 21:28:53 -0400 |
---|---|---|
committer | Mike Bayer <mike_mp@zzzcomputing.com> | 2013-06-03 21:28:53 -0400 |
commit | 55fa83fd39a0cd572e7d6426b059235d18a91e9d (patch) | |
tree | 15c529afa225bb89aeadb09635fb7bc123b1cc60 /lib/sqlalchemy/sql | |
parent | 87909841c50d00b40153b1a1181a4acfea070fa8 (diff) | |
download | sqlalchemy-55fa83fd39a0cd572e7d6426b059235d18a91e9d.tar.gz |
OK this is the broken version, need to think a lot more about this
Diffstat (limited to 'lib/sqlalchemy/sql')
-rw-r--r-- | lib/sqlalchemy/sql/compiler.py | 45 | ||||
-rw-r--r-- | lib/sqlalchemy/sql/util.py | 3 |
2 files changed, 46 insertions, 2 deletions
diff --git a/lib/sqlalchemy/sql/compiler.py b/lib/sqlalchemy/sql/compiler.py index d5ba64938..6c0127ba2 100644 --- a/lib/sqlalchemy/sql/compiler.py +++ b/lib/sqlalchemy/sql/compiler.py @@ -1083,7 +1083,49 @@ class SQLCompiler(engine.Compiled): # test for "unconditional" - any statement with # no_replacement_traverse setup, i.e. query.statement, from_self(), etc. - traverse_options = {"cloned": {}, "unconditional": True} + #traverse_options = {"cloned": {}, "unconditional": True} + traverse_options = {"unconditional": True} + + cloned = {} + def thing(element, **kw): + if element in cloned: + return cloned[element] + + newelem = cloned[element] = element._clone() + + if newelem.__visit_name__ == 'join' and \ + isinstance(newelem.right, sql.FromGrouping): + selectable = sql.select([newelem.right.element], use_labels=True) + selectable = selectable.alias() + newelem.right = selectable + stop_on.append(selectable) + for c in selectable.c: + c._label = c._key_label = c.name + adapter = sql_util.ClauseAdapter(selectable, + traverse_options=traverse_options) + adapter.magic_flag = True + adapters.append(adapter) + else: + newelem._copy_internals(clone=thing, **kw) + + return newelem + + elem = thing(select) + while adapters: + adapt = adapters.pop(-1) + adapt.__traverse_options__['stop_on'].extend(stop_on) + elem = adapt.traverse(elem) + return elem + + + def _transform_select_for_nested_joins_orig(self, select): + adapters = [] + stop_on = [] + + # test for "unconditional" - any statement with + # no_replacement_traverse setup, i.e. query.statement, from_self(), etc. + #traverse_options = {"cloned": {}, "unconditional": True} + traverse_options = {"unconditional": True} def visit_join(elem): if isinstance(elem.right, sql.FromGrouping): @@ -1109,6 +1151,7 @@ class SQLCompiler(engine.Compiled): adapter.__traverse_options__['stop_on'].extend(stop_on) adapters.append(adapter) + select = visitors.cloned_traverse(select, traverse_options, {"join": visit_join}) diff --git a/lib/sqlalchemy/sql/util.py b/lib/sqlalchemy/sql/util.py index ffa07d3df..c80693706 100644 --- a/lib/sqlalchemy/sql/util.py +++ b/lib/sqlalchemy/sql/util.py @@ -832,8 +832,9 @@ class ClauseAdapter(visitors.ReplacingCloningVisitor): newcol = self.selectable.c.get(col.name) return newcol + magic_flag = False def replace(self, col): - if isinstance(col, expression.FromClause) and \ + if not self.magic_flag and isinstance(col, expression.FromClause) and \ self.selectable.is_derived_from(col): return self.selectable elif not isinstance(col, expression.ColumnElement): |