diff options
author | Mike Bayer <mike_mp@zzzcomputing.com> | 2014-09-06 17:56:53 -0400 |
---|---|---|
committer | Mike Bayer <mike_mp@zzzcomputing.com> | 2014-09-06 17:56:53 -0400 |
commit | e80c7cc5c103788a4c7e1c479af2c37cd9c958b3 (patch) | |
tree | 87df4dd4fe620b16df15d3ff5f6b7c04ba913a74 /lib/sqlalchemy/sql/elements.py | |
parent | 4e285fd6ba2cbaf4b43e943a0e6bb45cc104cf08 (diff) | |
download | sqlalchemy-e80c7cc5c103788a4c7e1c479af2c37cd9c958b3.tar.gz |
wip for #3148
Diffstat (limited to 'lib/sqlalchemy/sql/elements.py')
-rw-r--r-- | lib/sqlalchemy/sql/elements.py | 26 |
1 files changed, 25 insertions, 1 deletions
diff --git a/lib/sqlalchemy/sql/elements.py b/lib/sqlalchemy/sql/elements.py index 870e96437..c8504f21f 100644 --- a/lib/sqlalchemy/sql/elements.py +++ b/lib/sqlalchemy/sql/elements.py @@ -675,6 +675,19 @@ class ColumnElement(operators.ColumnOperators, ClauseElement): """ + _resolve_label = None + """The name that should be used to identify this ColumnElement in a + select() object when "label resolution" logic is used; this refers + to using a string name in an expression like order_by() or group_by() + that wishes to target a labeled expression in the columns clause. + + The name is distinct from that of .name or ._label to account for the case + where anonymizing logic may be used to change the name that's actually + rendered at compile time; this attribute should hold onto the original + name that was user-assigned when producing a .label() construct. + + """ + _alt_names = () def self_group(self, against=None): @@ -691,6 +704,8 @@ class ColumnElement(operators.ColumnOperators, ClauseElement): else: return super(ColumnElement, self)._negate() + _allow_label_resolve = True + @util.memoized_property def type(self): return type_api.NULLTYPE @@ -1231,7 +1246,7 @@ class TextClause(Executable, ClauseElement): # help in those cases where text() is # interpreted in a column expression situation - key = _label = None + key = _label = _resolve_label = None def __init__( self, @@ -2869,8 +2884,13 @@ class Label(ColumnElement): :param obj: a :class:`.ColumnElement`. """ + + if isinstance(element, Label): + self._resolve_label = element._label + while isinstance(element, Label): element = element.element + if name: self.name = name else: @@ -2886,6 +2906,10 @@ class Label(ColumnElement): return self.__class__, (self.name, self._element, self._type) @util.memoized_property + def _allow_label_resolve(self): + return self.element._allow_label_resolve + + @util.memoized_property def _order_by_label_element(self): return self |