]> git.ipfire.org Git - thirdparty/sqlalchemy/sqlalchemy.git/commitdiff
- figured out what the from_self() thing was about, part of query.statement, but...
authorMike Bayer <mike_mp@zzzcomputing.com>
Sun, 2 Jun 2013 23:48:30 +0000 (19:48 -0400)
committerMike Bayer <mike_mp@zzzcomputing.com>
Sun, 2 Jun 2013 23:48:30 +0000 (19:48 -0400)
like to improve upon query.statement needing to do this

lib/sqlalchemy/orm/query.py
lib/sqlalchemy/sql/compiler.py
lib/sqlalchemy/sql/util.py
lib/sqlalchemy/sql/visitors.py

index 25ffb0127e5bd6ab8d84de5c5f4ec49415e58c31..66d208a74202852281f6996a31b0c7ede5ef21df 100644 (file)
@@ -447,6 +447,8 @@ class Query(object):
                         statement
         if self._params:
             stmt = stmt.params(self._params)
+
+
         # TODO: there's no tests covering effects of
         # the annotation not being there
         return stmt._annotate({'no_replacement_traverse': True})
index 27e883c8619c6bce556b52c3a3e2fb0ae0589bd7..ff041d5e4b7e765b3bdb1c96eee53e1c298ba33c 100644 (file)
@@ -1080,7 +1080,7 @@ class SQLCompiler(engine.Compiled):
     def _transform_select_for_nested_joins(self, select):
         adapters = []
 
-        traverse_options = {"cloned": {}}
+        traverse_options = {"cloned": {}, "unconditional": True}
 
         def visit_join(elem):
             if isinstance(elem.right, sql.FromGrouping):
@@ -1095,19 +1095,13 @@ class SQLCompiler(engine.Compiled):
                     c._label = c._key_label = c.name
 
                 elem.right = selectable
-                import pdb
-                pdb.set_trace()
                 adapter = sql_util.ClauseAdapter(selectable,
                                         traverse_options=traverse_options)
-                adapter.__traverse_options__.pop('stop_on')
                 adapters.append(adapter)
 
         select = visitors.cloned_traverse(select,
                                     traverse_options, {"join": visit_join})
 
-        if adapters:
-            import pdb
-            pdb.set_trace()
         for adap in reversed(adapters):
             select = adap.traverse(select)
         return select
index 6a267752e9e5bc3fbf7255ea7d6da023547fe302..ffa07d3df5fcc875687156e521ed77fa8e72ec20 100644 (file)
@@ -833,7 +833,6 @@ class ClauseAdapter(visitors.ReplacingCloningVisitor):
         return newcol
 
     def replace(self, col):
-        print "COL!", col
         if isinstance(col, expression.FromClause) and \
             self.selectable.is_derived_from(col):
             return self.selectable
index 31ac686e33d0c2925b133f465f9ed77ea0eeb274..c5a45ffd4a79cd330ccd2f19067edf2cf8813bc1 100644 (file)
@@ -286,10 +286,12 @@ def replacement_traverse(obj, opts, replace):
 
     cloned = util.column_dict()
     stop_on = util.column_set([id(x) for x in opts.get('stop_on', [])])
+    unconditional = opts.get('unconditional', False)
 
     def clone(elem, **kw):
         if id(elem) in stop_on or \
-            'no_replacement_traverse' in elem._annotations:
+            (not unconditional
+                    and 'no_replacement_traverse' in elem._annotations):
             return elem
         else:
             newelem = replace(elem)